|
@ -1,8 +1,6 @@
|
|
package com.yihu.jw.care.util;
|
|
package com.yihu.jw.care.util;
|
|
|
|
|
|
import com.yihu.jw.care.dao.device.BaseMqttCallbackRecordDao;
|
|
import com.yihu.jw.care.dao.device.BaseMqttCallbackRecordDao;
|
|
import com.yihu.jw.entity.care.device.BaseMqttCallbackRecordDO;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import org.eclipse.paho.client.mqttv3.*;
|
|
import org.eclipse.paho.client.mqttv3.*;
|
|
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
|
|
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
@ -11,6 +9,10 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Scanner;
|
|
import java.util.concurrent.ScheduledExecutorService;
|
|
import java.util.concurrent.ScheduledExecutorService;
|
|
|
|
|
|
/**
|
|
/**
|
|
@ -22,7 +24,7 @@ public class MQTTKXClientUtil {
|
|
private static Logger logger = LoggerFactory.getLogger(MQTTKXClientUtil.class);
|
|
private static Logger logger = LoggerFactory.getLogger(MQTTKXClientUtil.class);
|
|
|
|
|
|
public static final String HOST = "tcp://121.40.135.79";
|
|
public static final String HOST = "tcp://121.40.135.79";
|
|
public static final String deviceId = "18202a08724e5573";
|
|
|
|
|
|
public static final String deviceId = "18183412724e5573";
|
|
public static final Integer qos = 1;
|
|
public static final Integer qos = 1;
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
@ -30,24 +32,71 @@ public class MQTTKXClientUtil {
|
|
@Autowired
|
|
@Autowired
|
|
private BaseMqttCallbackRecordDao mqttCallbackRecordDao;
|
|
private BaseMqttCallbackRecordDao mqttCallbackRecordDao;
|
|
|
|
|
|
/* 1、心跳保活,设置为30s:
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18202a08724e5573/cmd/ipcam_keep_alive" -u admin -P admin -m "30"
|
|
|
|
|
|
|
|
2、订阅:
|
|
|
|
mosquitto_sub -h 121.40.135.79 -t "device/18202a08724e5573/response/+"
|
|
|
|
|
|
|
|
3、开启视频推流:
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18202a08724e5573/cmd/ipcam_video_start" -u admin -P admin -m "1"
|
|
|
|
|
|
|
|
6、解析步骤2的payload,获取直播SourceURL:
|
|
|
|
如:http://121.40.135.79/live/18202a08724e5573_1673488105807/hls.m3u8
|
|
|
|
|
|
/**
|
|
|
|
* 获取凯旋摄像头列表
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
public List<Map<String,Object>> getDeviceList(){
|
|
|
|
String sql = "select dict_code code,dict_value name from wlyy_hospital_sys_dict where dict_name = 'mqttkxVideoDevice' order by sort";
|
|
|
|
List<Map<String,Object>> list = jdbcTemplate.queryForList(sql);
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
|
5、关闭视频推流:
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18202a08724e5573/cmd/ipcam_video_start" -u admin -P admin -m "0"*/
|
|
|
|
|
|
/* 1、心跳保活,设置为30s:
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18183412724e5573/cmd/ipcam_keep_alive" -u admin -P admin -m "30"
|
|
|
|
2、订阅:
|
|
|
|
mosquitto_sub -h 121.40.135.79 -t "device/18183412724e5573/response/+"
|
|
|
|
3、开启视频推流:
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18183412724e5573/cmd/ipcam_video_start" -u admin -P admin -m "1"
|
|
|
|
6、解析步骤2的payload,获取直播SourceURL:
|
|
|
|
如:http://121.40.135.79/live/18183412724e5573_1673488105807/hls.m3u8
|
|
|
|
5、关闭视频推流:
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18183412724e5573/cmd/ipcam_video_start" -u admin -P admin -m "0"
|
|
|
|
5、开启音频推流:[优化中]
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18183412724e5573/cmd/ipcam_audio_start" -u admin -P admin -m "1"
|
|
|
|
6、关闭音频推流(静音):[优化中]
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18183412724e5573/cmd/ipcam_audio_start" -u admin -P admin -m "1"
|
|
|
|
7、固件升级:[临时测试使用,后续调整OTA升级策略]
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18183412724e5573/cmd/ipcam_upgrade_firmware" -u admin -P admin -m "http://192.168.168.218:8866/9.20230116.zip"
|
|
|
|
8、视频画面截图保存:
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18183412724e5573/cmd/ipcam_jpeg_snapshot" -u admin -P admin -m "1"
|
|
|
|
9、控制云台复位(校准):
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18183412724e5573/cmd/ipcam_motor_reset" -u admin -P admin -m "0"
|
|
|
|
10、控制云台左移:
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18183412724e5573/cmd/ipcam_motor_left" -u admin -P admin -m "0"
|
|
|
|
11、控制云台右移:
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18183412724e5573/cmd/ipcam_motor_right" -u admin -P admin -m "0"
|
|
|
|
12、控制云台上移:
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18183412724e5573/cmd/ipcam_motor_up" -u admin -P admin -m "0"
|
|
|
|
13、控制云台下移:
|
|
|
|
mosquitto_pub -h 121.40.135.79 -t "device/18183412724e5573/cmd/ipcam_motor_down" -u admin -P admin -m "0"*/
|
|
|
|
|
|
public static final String ipcam_keep_alive = "device/{deviceId}/cmd/ipcam_keep_alive";
|
|
public static final String ipcam_keep_alive = "device/{deviceId}/cmd/ipcam_keep_alive";
|
|
public static final String TOPIC = "device/{deviceId}/response/+";
|
|
public static final String TOPIC = "device/{deviceId}/response/+";
|
|
public static final String ipcam_video_start = "device/{deviceId}/cmd/ipcam_video_start";
|
|
public static final String ipcam_video_start = "device/{deviceId}/cmd/ipcam_video_start";
|
|
|
|
public static final String ipcam_audio_start = "device/{deviceId}/cmd/ipcam_audio_start";
|
|
|
|
public static final String ipcam_upgrade_firmware = "device/{deviceId}/cmd/ipcam_upgrade_firmware";
|
|
|
|
public static final String ipcam_jpeg_snapshot = "device/{deviceId}/cmd/ipcam_jpeg_snapshot";
|
|
|
|
public static final String ipcam_motor_reset = "device/{deviceId}/cmd/ipcam_motor_reset";
|
|
|
|
public static final String ipcam_motor_left = "device/{deviceId}/cmd/ipcam_motor_left";
|
|
|
|
public static final String ipcam_motor_right = "device/{deviceId}/cmd/ipcam_motor_right";
|
|
|
|
public static final String ipcam_motor_up = "device/{deviceId}/cmd/ipcam_motor_up";
|
|
|
|
public static final String ipcam_motor_down = "device/{deviceId}/cmd/ipcam_motor_down";
|
|
|
|
public static Map<String,String> commandMap = new HashMap<>();
|
|
|
|
|
|
|
|
static {
|
|
|
|
commandMap.put("ipcam_keep_alive",ipcam_keep_alive);
|
|
|
|
commandMap.put("TOPIC",TOPIC);
|
|
|
|
commandMap.put("ipcam_video_start",ipcam_video_start);
|
|
|
|
commandMap.put("ipcam_audio_start",ipcam_audio_start);
|
|
|
|
commandMap.put("ipcam_upgrade_firmware",ipcam_upgrade_firmware);
|
|
|
|
commandMap.put("ipcam_jpeg_snapshot",ipcam_jpeg_snapshot);
|
|
|
|
commandMap.put("ipcam_motor_reset",ipcam_motor_reset);
|
|
|
|
commandMap.put("ipcam_motor_left",ipcam_motor_left);
|
|
|
|
commandMap.put("ipcam_motor_right",ipcam_motor_right);
|
|
|
|
commandMap.put("ipcam_motor_up",ipcam_motor_up);
|
|
|
|
commandMap.put("ipcam_motor_down",ipcam_motor_down);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static final String clientid = String.valueOf(System.currentTimeMillis());;
|
|
private static final String clientid = String.valueOf(System.currentTimeMillis());;
|
|
@ -88,18 +137,18 @@ public class MQTTKXClientUtil {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void messageArrived(String topic, MqttMessage message) throws Exception {
|
|
public void messageArrived(String topic, MqttMessage message) throws Exception {
|
|
// subscribe后得到的消息会执行到这里面
|
|
|
|
BaseMqttCallbackRecordDO mqttCallbackRecordDO = new BaseMqttCallbackRecordDO();
|
|
|
|
if(StringUtils.isNotBlank(topic)){
|
|
|
|
String[] deviceId = topic.split("//");
|
|
|
|
if(deviceId.length>1){
|
|
|
|
mqttCallbackRecordDO.setDeviceId(deviceId[1]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
mqttCallbackRecordDO.setTopic(topic);
|
|
|
|
mqttCallbackRecordDO.setPayload(new String(message.getPayload()));
|
|
|
|
mqttCallbackRecordDao.save(mqttCallbackRecordDO);
|
|
|
|
logger.info("接收消息主题 : " + topic+","+"接收消息内容 : " + new String(message.getPayload()));
|
|
logger.info("接收消息主题 : " + topic+","+"接收消息内容 : " + new String(message.getPayload()));
|
|
|
|
// subscribe后得到的消息会执行到这里面
|
|
|
|
// BaseMqttCallbackRecordDO mqttCallbackRecordDO = new BaseMqttCallbackRecordDO();
|
|
|
|
// if(StringUtils.isNotBlank(topic)){
|
|
|
|
// String[] deviceId = topic.split("//");
|
|
|
|
// if(deviceId.length>1){
|
|
|
|
// mqttCallbackRecordDO.setDeviceId(deviceId[1]);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// mqttCallbackRecordDO.setTopic(topic);
|
|
|
|
// mqttCallbackRecordDO.setPayload(new String(message.getPayload()));
|
|
|
|
// mqttCallbackRecordDao.save(mqttCallbackRecordDO);
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@ -135,6 +184,26 @@ public class MQTTKXClientUtil {
|
|
getClient().publish(topic, message);
|
|
getClient().publish(topic, message);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 通用方法
|
|
|
|
* @param open
|
|
|
|
* @param deviceId
|
|
|
|
* @param command
|
|
|
|
* @throws Exception
|
|
|
|
*/
|
|
|
|
public void common(String open,String deviceId,String command) throws Exception{
|
|
|
|
String payload = open;//
|
|
|
|
MqttMessage message = new MqttMessage(payload.getBytes("UTF-8"));
|
|
|
|
// 设置消息的服务质量
|
|
|
|
message.setQos(qos);
|
|
|
|
message.setRetained(true);
|
|
|
|
// 发布消息
|
|
|
|
String topic = commandMap.get(command).replace("{deviceId}",deviceId);
|
|
|
|
logger.info(topic);
|
|
|
|
getClient().publish(topic, message);
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
* 心跳
|
|
* 心跳
|
|
*/
|
|
*/
|
|
@ -161,35 +230,72 @@ public class MQTTKXClientUtil {
|
|
getClient().subscribe(topic1, Qos);
|
|
getClient().subscribe(topic1, Qos);
|
|
}
|
|
}
|
|
|
|
|
|
// public static void main(String[] args) throws Exception {
|
|
|
|
// try {
|
|
|
|
// MQTTKXClientUtil mqttkxClientUtil = new MQTTKXClientUtil();
|
|
|
|
// mqttkxClientUtil.start();
|
|
|
|
// logger.info("启动监听mqtt");
|
|
|
|
// // 心跳
|
|
|
|
// heart(client,deviceId);
|
|
|
|
//
|
|
|
|
// //订阅消息
|
|
|
|
// subscribe(client,deviceId);
|
|
|
|
//
|
|
|
|
// Scanner scanner = new Scanner(System.in);
|
|
|
|
// System.out.println("请输入1-3数字");
|
|
|
|
// String username = scanner.nextLine();
|
|
|
|
// if("1".equals(username)){
|
|
|
|
// //开启直播
|
|
|
|
// logger.info("开启直播");
|
|
|
|
// ipcam_video_start(client,"1",deviceId);
|
|
|
|
// }
|
|
|
|
// System.out.println("请输入密码");
|
|
|
|
// String password = scanner.nextLine();
|
|
|
|
// if("2".equals(password)){
|
|
|
|
// //关闭直播
|
|
|
|
// logger.info("关闭直播");
|
|
|
|
// ipcam_video_start(client,"0",deviceId);
|
|
|
|
// }
|
|
|
|
// }catch (Exception e){
|
|
|
|
// e.printStackTrace();
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
|
|
try {
|
|
|
|
MQTTKXClientUtil mqttkxClientUtil = new MQTTKXClientUtil();
|
|
|
|
mqttkxClientUtil.start();
|
|
|
|
logger.info("启动监听mqtt");
|
|
|
|
// 心跳
|
|
|
|
mqttkxClientUtil.heart(deviceId);
|
|
|
|
|
|
|
|
//订阅消息
|
|
|
|
mqttkxClientUtil.subscribe(deviceId);
|
|
|
|
boolean flag = true;
|
|
|
|
Scanner scanner = new Scanner(System.in);
|
|
|
|
while (flag){
|
|
|
|
System.out.println("请输入3-13数字");
|
|
|
|
String username = scanner.nextLine();
|
|
|
|
switch (username){
|
|
|
|
case "3":
|
|
|
|
logger.info("开启视频推流");
|
|
|
|
mqttkxClientUtil.common("1",deviceId,"ipcam_video_start");
|
|
|
|
break;
|
|
|
|
case "4":
|
|
|
|
logger.info("关闭视频推流");
|
|
|
|
mqttkxClientUtil.common("0",deviceId,"ipcam_video_start");
|
|
|
|
break;
|
|
|
|
case "5":
|
|
|
|
logger.info("开启音频推流");
|
|
|
|
mqttkxClientUtil.common("1",deviceId,"ipcam_audio_start");
|
|
|
|
break;
|
|
|
|
case "6":
|
|
|
|
logger.info("关闭音频推流");
|
|
|
|
mqttkxClientUtil.common("0",deviceId,"ipcam_audio_start");
|
|
|
|
break;
|
|
|
|
case "8":
|
|
|
|
logger.info("视频画面截图保存");
|
|
|
|
mqttkxClientUtil.common("1",deviceId,"ipcam_jpeg_snapshot");
|
|
|
|
break;
|
|
|
|
case "9":
|
|
|
|
logger.info("控制云台复位(校准)");
|
|
|
|
mqttkxClientUtil.common("0",deviceId,"ipcam_motor_reset");
|
|
|
|
break;
|
|
|
|
case "10":
|
|
|
|
logger.info("控制云台左移");
|
|
|
|
mqttkxClientUtil.common("0",deviceId,"ipcam_motor_left");
|
|
|
|
break;
|
|
|
|
case "11":
|
|
|
|
logger.info("控制云台右移");
|
|
|
|
mqttkxClientUtil.common("0",deviceId,"ipcam_motor_right");
|
|
|
|
break;
|
|
|
|
case "12":
|
|
|
|
logger.info("控制云台上移");
|
|
|
|
mqttkxClientUtil.common("0",deviceId,"ipcam_motor_up");
|
|
|
|
break;
|
|
|
|
case "13":
|
|
|
|
logger.info("控制云台下移");
|
|
|
|
mqttkxClientUtil.common("0",deviceId,"ipcam_motor_down");
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
flag = false;
|
|
|
|
System.out.println("结束");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}catch (Exception e){
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
}
|