Przeglądaj źródła

refactor: 移除无用 todo 以及修复注释中的错别字

kindring 1 rok temu
rodzic
commit
ec60967969

+ 4 - 0
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java

@@ -58,10 +58,14 @@ public class DeferredResultHolder {
 	public static final String CALLBACK_CMD_BROADCAST = "CALLBACK_BROADCAST";
 
 	public static final String CALLBACK_CMD_BROADCAST_INVITE = "CALLBACK_BROADCAST_INVITE";
+
+	public static final String CALLBACK_CMD_HFY_CODE = "CALLBACK_HFY_CODE";
+
 	private Map<String, Map<String, DeferredResultEx>> map = new ConcurrentHashMap<>();
 
 	/**
 	 * 获取所有的key
+	 *
 	 * @return
 	 */
 	public Set<String> getKeys() {

+ 1 - 0
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/RequestMessage.java

@@ -5,6 +5,7 @@ public class RequestMessage {
     public RequestMessage() {
     }
 
+
     public RequestMessage(String key, String id) {
         this.id = id;
         this.key = key;

+ 31 - 19
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java

@@ -292,35 +292,47 @@ public interface ISIPCommander {
 	
 	/**
 	 * 查询报警信息
-	 * 
-	 * @param device		视频设备
-	 * @param startPriority	报警起始级别(可选)
-	 * @param endPriority	报警终止级别(可选)
-	 * @param alarmMethod	报警方式条件(可选)
-	 * @param alarmType		报警类型
-	 * @param startTime		报警发生起始时间(可选)
-	 * @param endTime		报警发生终止时间(可选)
-	 * @return				true = 命令发送成功
+	 *
+	 * @param device        视频设备
+	 * @param startPriority    报警起始级别(可选)
+	 * @param endPriority    报警终止级别(可选)
+	 * @param alarmMethod    报警方式条件(可选)
+	 * @param alarmType        报警类型
+	 * @param startTime        报警发生起始时间(可选)
+	 * @param endTime        报警发生终止时间(可选)
+	 * @return true = 命令发送成功
 	 */
 	void alarmInfoQuery(Device device, String startPriority, String endPriority, String alarmMethod,
-							String alarmType, String startTime, String endTime, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
-	
+						String alarmType, String startTime, String endTime, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
+
 	/**
 	 * 查询设备配置
-	 * 
-	 * @param device 		视频设备
-	 * @param channelId		通道编码(可选)
-	 * @param configType	配置类型:
+	 *
+	 * @param device     视频设备
+	 * @param channelId  通道编码(可选)
+	 * @param configType 配置类型:
 	 */
-	void deviceConfigQuery(Device device, String channelId, String configType,  SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
-	
+	void deviceConfigQuery(Device device, String channelId, String configType, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
+
+
+	/**
+	 * 查询设备绑定码
+	 *
+	 * @param device
+	 * @param errorHook
+	 * @throws InvalidArgumentException
+	 * @throws SipException
+	 * @throws ParseException
+	 */
+	void queryBindCode(Device device, ErrorHook errorHook) throws InvalidArgumentException, SipException, ParseException;
+
 	/**
 	 * 查询设备预置位置
-	 * 
+	 *
 	 * @param device 视频设备
 	 */
 	void presetQuery(Device device, String channelId, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
-	
+
 	/**
 	 * 查询移动设备位置数据
 	 * 

+ 52 - 43
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java

@@ -975,20 +975,9 @@ public class SIPCommander implements ISIPCommander {
      */
     @Override
     public void recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException {
-        StringBuffer cmdXml = new StringBuffer(200);
-        String charset = device.getCharset();
-        cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
-        cmdXml.append("<Control>\r\n");
-        cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
-        cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
-        if (ObjectUtils.isEmpty(channelId)) {
-            cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
-        } else {
-            cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
-        }
+        StringBuffer cmdXml = devControlHeaderXml(device, channelId);
         cmdXml.append("<RecordCmd>" + recordCmdStr + "</RecordCmd>\r\n");
         cmdXml.append("</Control>\r\n");
-
         
 
         Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
@@ -1087,6 +1076,17 @@ public class SIPCommander implements ISIPCommander {
     @Override
     public void iFrameCmd(Device device, String channelId) throws InvalidArgumentException, SipException, ParseException {
 
+
+        StringBuffer cmdXml = devControlHeaderXml(device, channelId);
+        cmdXml.append("<IFameCmd>Send</IFameCmd>\r\n");
+        cmdXml.append("</Control>\r\n");
+
+
+        Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()), device.getTransport()));
+        sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request);
+    }
+
+    private StringBuffer devControlHeaderXml(Device device, String channelId) {
         StringBuffer cmdXml = new StringBuffer(200);
         String charset = device.getCharset();
         cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
@@ -1098,13 +1098,7 @@ public class SIPCommander implements ISIPCommander {
         } else {
             cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
         }
-        cmdXml.append("<IFameCmd>Send</IFameCmd>\r\n");
-        cmdXml.append("</Control>\r\n");
-
-        
-
-        Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
-        sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request);
+        return cmdXml;
     }
 
     /**
@@ -1119,17 +1113,7 @@ public class SIPCommander implements ISIPCommander {
     @Override
     public void homePositionCmd(Device device, String channelId, String enabled, String resetTime, String presetIndex, SipSubscribe.Event errorEvent,SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException {
 
-        StringBuffer cmdXml = new StringBuffer(200);
-        String charset = device.getCharset();
-        cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
-        cmdXml.append("<Control>\r\n");
-        cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
-        cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
-        if (ObjectUtils.isEmpty(channelId)) {
-            cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
-        } else {
-            cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
-        }
+        StringBuffer cmdXml = devControlHeaderXml(device, channelId);
         cmdXml.append("<HomePosition>\r\n");
         if (NumericUtil.isInteger(enabled) && (!enabled.equals("0"))) {
             cmdXml.append("<Enabled>1</Enabled>\r\n");
@@ -1381,12 +1365,47 @@ public class SIPCommander implements ISIPCommander {
         }
         cmdXml.append("</Query>\r\n");
 
-        
 
-        Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
+        Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()), device.getTransport()));
         sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
     }
 
+
+    public void queryBindCode(Device device, ErrorHook errorHook) throws InvalidArgumentException, SipException, ParseException {
+        StringBuffer cmdXml = new StringBuffer(200);
+        String charset = device.getCharset();
+        cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
+        cmdXml.append("<Query>\r\n");
+        cmdXml.append("<CmdType>HfyCode</CmdType>\r\n");
+        cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
+        cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
+        cmdXml.append("</Query>\r\n");
+
+        Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()), device.getTransport()));
+        if (request == null) {
+            errorHook.run(WVPResult.fail(
+                    ErrorCode.ERROR_DATA,
+                    "无法获取到对应的sip配置信息,domain:" + device.getDomain()
+            ));
+            return;
+        }
+        sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request,
+                (err -> {
+                    logger.warn("查询合方圆专属code失败 {}", err.msg);
+                    errorHook.run(WVPResult.fail(
+                            ErrorCode.ERR_Invite_fail,
+                            "命令发送失败: "
+                    ));
+                }), e -> {
+                    // 这里为例避免一个通道的点播只有一个callID这个参数使用一个固定值
+                    ResponseEvent responseEvent = (ResponseEvent) e.event;
+                    SIPResponse response = (SIPResponse) responseEvent.getResponse();
+                    errorHook.run(WVPResult.success());
+                });
+        errorHook.run(WVPResult.success());
+
+    }
+
     /**
      * 查询设备配置
      *
@@ -1634,17 +1653,7 @@ public class SIPCommander implements ISIPCommander {
     @Override
     public void dragZoomCmd(Device device, String channelId, String cmdString) throws InvalidArgumentException, SipException, ParseException {
 
-        StringBuffer dragXml = new StringBuffer(200);
-        String charset = device.getCharset();
-        dragXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
-        dragXml.append("<Control>\r\n");
-        dragXml.append("<CmdType>DeviceControl</CmdType>\r\n");
-        dragXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
-        if (ObjectUtils.isEmpty(channelId)) {
-            dragXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
-        } else {
-            dragXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
-        }
+        StringBuffer dragXml = devControlHeaderXml(device, channelId);
         dragXml.append(cmdString);
         dragXml.append("</Control>\r\n");
         

+ 1 - 1
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java

@@ -191,9 +191,9 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
                 device.setRegisterTime(DateUtil.getNow());
                 deviceService.online(device);
 
-
                 if (sipUserConfig.isEnableBindFlag()) {
                     logger.info("[sip注册成功] 设备:{} 连接的域启用绑定, 尝试获取设备绑定码中");
+
                     deviceService.loadBindCode(device);
                 }
             } else {

+ 79 - 0
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/HfyCodeResponseMessageHandler.java

@@ -0,0 +1,79 @@
+package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
+import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
+import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
+import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
+import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
+import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler;
+import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
+import com.genersoft.iot.vmp.service.IDeviceService;
+import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
+import gov.nist.javax.sip.message.SIPRequest;
+import org.dom4j.Element;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.InvalidArgumentException;
+import javax.sip.RequestEvent;
+import javax.sip.SipException;
+import javax.sip.message.Response;
+import java.text.ParseException;
+
+@Component
+public class HfyCodeResponseMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler {
+
+    private Logger logger = LoggerFactory.getLogger(HfyCodeResponseMessageHandler.class);
+    private final String cmdType = "HfyCode";
+
+    @Autowired
+    private ResponseMessageHandler responseMessageHandler;
+
+    @Autowired
+    private DeferredResultHolder deferredResultHolder;
+
+    @Autowired
+    private IDeviceService deviceService;
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        responseMessageHandler.addHandler(cmdType, this);
+    }
+
+    @Override
+    public void handForDevice(RequestEvent evt, Device device, Element rootElement) {
+
+        try {
+            responseAck((SIPRequest) evt.getRequest(), Response.OK);
+            Element deviceIdElement = rootElement.element("DeviceID");
+            Element hfyCodeElement = rootElement.element("HfyCode");
+
+            if (hfyCodeElement == null) {
+                // 设备码为空的处理逻辑
+                logger.info("[绑定码回复] 无法解析到设备绑定码");
+                return;
+            }
+            logger.info("[绑定码回复] 收到设备绑定码: {}", hfyCodeElement.getText());
+            String key = DeferredResultHolder.CALLBACK_CMD_ALARM + device.getDeviceId();
+            // 获取 hfyCode
+            RequestMessage msg = new RequestMessage(
+                    key, WVPResult.success(hfyCodeElement)
+            );
+            deferredResultHolder.invokeAllResult(msg);
+            // 保存数据
+            deviceService.updateBindCode(device, hfyCodeElement.getText());
+        } catch (ParseException | SipException | InvalidArgumentException e) {
+            logger.error("[绑定码回复] 解析或返回 ok 失败: {}", e.getMessage());
+        }
+    }
+
+    @Override
+    public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) {
+
+    }
+}

+ 3 - 2
src/main/java/com/genersoft/iot/vmp/service/impl/AccountServiceImpl.java

@@ -26,7 +26,8 @@ public class AccountServiceImpl implements IAccountService {
     private DeviceMapper deviceMapper;
 
     /**
-     * 注册设备
+     * 注册用户
+     *
      * @param name
      * @param account
      * @param password
@@ -37,7 +38,7 @@ public class AccountServiceImpl implements IAccountService {
        if (userAccount != null) {
            return false;
        }
-       // 注册设备
+        // 注册用户
        return accountMapper.register(name, account, password) > 0;
     }
 

+ 67 - 3
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java

@@ -1,6 +1,9 @@
 package com.genersoft.iot.vmp.service.impl;
 
 import com.genersoft.iot.vmp.common.HfyAiInfo;
+import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
+import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
 import com.genersoft.iot.vmp.storager.dao.HfyDevAiMapper;
 import com.genersoft.iot.vmp.conf.SipConfig;
 import com.genersoft.iot.vmp.common.VideoManagerConstants;
@@ -21,16 +24,17 @@ import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
 import com.genersoft.iot.vmp.storager.dao.DeviceMapper;
 import com.genersoft.iot.vmp.storager.dao.PlatformChannelMapper;
 import com.genersoft.iot.vmp.utils.DateUtil;
-import com.genersoft.iot.vmp.vmanager.bean.BaseTree;
-import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
+import com.genersoft.iot.vmp.vmanager.bean.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.TransactionStatus;
 import org.springframework.util.ObjectUtils;
+import org.springframework.web.context.request.async.DeferredResult;
 
 import javax.sip.InvalidArgumentException;
 import javax.sip.SipException;
@@ -39,7 +43,9 @@ import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.UUID;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText;
 
@@ -57,6 +63,9 @@ public class DeviceServiceImpl implements IDeviceService {
     @Autowired
     private ISIPCommander sipCommander;
 
+    @Autowired
+    private SIPCommander cmder;
+
     @Autowired
     private CatalogResponseMessageHandler catalogResponseMessageHandler;
 
@@ -99,10 +108,16 @@ public class DeviceServiceImpl implements IDeviceService {
     @Autowired
     private SipConfig sipConfig;
 
+    @Autowired
+    private DeferredResultHolder resultHolder;
+
+    @Autowired
+    private DeferredResultHolder deferredResultHolder;
+
     @Override
     public void online(Device device) {
         logger.info("[设备上线] deviceId:{}->{}:{}", device.getDeviceId(), device.getIp(), device.getPort());
-        logger.info("[test] sipBaseUrl={}:{}",sipConfig.getIp(),sipConfig.getPort());
+        logger.info("[test] sipBaseUrl={}:{}", sipConfig.getIp(), sipConfig.getPort());
         Device deviceInRedis = redisCatchStorage.getDevice(device.getDeviceId());
         Device deviceInDb = deviceMapper.getDeviceByDeviceId(device.getDeviceId());
 
@@ -693,6 +708,55 @@ public class DeviceServiceImpl implements IDeviceService {
 
     public void loadBindCode(Device device) {
 
+        ErrorHook cmdSendHook = wvpResult ->
+        {
+
+            if (wvpResult.getCode() != ErrorCode.SUCCESS.getCode()) {
+                logger.warn("[查询设备绑定码] 异常 {}:{}", wvpResult.getCode(), wvpResult.getMsg());
+                return;
+            }
+            logger.info("[查询设备绑定码] 命令发送成功 {}", wvpResult);
+        };
+
+        try {
+            sipCommander.queryBindCode(device, cmdSendHook);
+        } catch (Exception e) {
+            logger.error("[查询设备绑定码] 严重异常 err:{}", e.getMessage());
+        }
+    }
+
+
+    /**
+     * 创建 DeferredResult 的
+     *
+     * @param keyStr
+     * @param timeout
+     * @param eventHook
+     * @param timeoutMessage
+     * @param successMessage
+     * @return
+     */
+    public RequestMessage createDeferredResultAndCallback(String keyStr, int timeout, ErrorHook eventHook, String timeoutMessage, String successMessage) {
+        DeferredResult<WVPResult> result =
+                new DeferredResult<>(timeout * 10L);
+        DeferredResultEx<WVPResult> deferredResultEx = new DeferredResultEx<>(result);
+        String uuid = UUID.randomUUID().toString();
+        RequestMessage msg = new RequestMessage();
+        msg.setId(uuid);
+        msg.setKey(keyStr);
+        result.onTimeout(() -> {
+            logger.warn(timeoutMessage);
+            msg.setData(WVPResult.fail(ErrorCode.ERR_TIMEOUT, timeoutMessage));
+            resultHolder.invokeResult(msg);
+        });
+
+        result.onCompletion(() -> {
+            logger.warn(successMessage);
+            eventHook.run((WVPResult) result.getResult());
+        });
+
+        resultHolder.put(keyStr, uuid, deferredResultEx);
+        return msg;
     }
 
     // 更新设备 绑定码

+ 0 - 1
src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java

@@ -19,7 +19,6 @@ public class WVPResult<T> implements Cloneable{
     }
 
 
-    // todo 返回结果携带搜索结果等页数
     public WVPResult(int code, String msg, T data, int page, int limit, long total) {
         this.code = code;
         this.msg = msg;

+ 2 - 2
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/aiLib/AiControl.java

@@ -195,7 +195,7 @@ public class AiControl {
             result.setCode(ErrorCode.ERROR400.getCode());
             result.setMsg("未接收到上传文件.待处理");
         }else{
-            // todo 制作存储预警信息的 controller
+            //
             storager.saveAlarm(deviceId,channelId,arithmetic, results_recoInfos,uploads,
                     firmware_version,timestamp,battery,signal,temp_env,temp_cpu,ccid);
             result.setCode(ErrorCode.SUCCESS.getCode());
@@ -218,5 +218,5 @@ public class AiControl {
         if(upload1!=null&&!upload1.isEmpty()){ uploads.add(upload1); }
         if(upload2!=null&&!upload2.isEmpty()){ uploads.add(upload2); }
     }
-    // todo ai库特征码上传
+    //
 }

+ 1 - 0
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java

@@ -625,6 +625,7 @@ public class DeviceQuery {
             logger.error("[命令发送失败] 设备报警查询: {}", e.getMessage());
             throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage());
         }
+
         DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L);
         result.onTimeout(() -> {
             logger.warn(String.format("设备报警查询超时"));

+ 4 - 3
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java

@@ -44,7 +44,8 @@ public class ApiDeviceController {
     // private DeviceOffLineDetector offLineDetector;
 
     /**
-     * 分页获取设备列表 TODO 现在直接返回,尚未实现分页
+     * 分页获取设备列表
+     *
      * @param start
      * @param limit
      * @param q
@@ -140,11 +141,11 @@ public class ApiDeviceController {
             deviceJOSNChannel.put("DeviceID", deviceChannelExtend.getDeviceId());
             deviceJOSNChannel.put("DeviceName", deviceChannelExtend.getDeviceName());
             deviceJOSNChannel.put("DeviceOnline", deviceChannelExtend.getDeviceOnline() == 1);
-            deviceJOSNChannel.put("Channel", 0); // TODO 自定义序号
+            deviceJOSNChannel.put("Channel", 0);
             deviceJOSNChannel.put("Name", deviceChannelExtend.getName());
             deviceJOSNChannel.put("Custom", false);
             deviceJOSNChannel.put("CustomName", "");
-            deviceJOSNChannel.put("SubCount", deviceChannelExtend.getSubCount()); // TODO ? 子节点数, SubCount > 0 表示该通道为子目录
+            deviceJOSNChannel.put("SubCount", deviceChannelExtend.getSubCount());
             deviceJOSNChannel.put("SnapURL", "");
             deviceJOSNChannel.put("Manufacturer ", deviceChannelExtend.getManufacture());
             deviceJOSNChannel.put("Model", deviceChannelExtend.getModel());

+ 10 - 9
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java

@@ -54,15 +54,16 @@ public class ApiStreamController {
 
     /**
      * 实时直播 - 开始直播
-     * @param serial 设备编号
-     * @param channel 通道序号 默认值: 1
-     * @param code 通道编号,通过 /api/v1/device/channellist 获取的 ChannelList.ID, 该参数和 channel 二选一传递即可
-     * @param cdn TODO 转推 CDN 地址, 形如: [rtmp|rtsp]://xxx, encodeURIComponent
-     * @param audio TODO 是否开启音频, 默认 开启
-     * @param transport 流传输模式, 默认 UDP
-     * @param checkchannelstatus TODO 是否检查通道状态, 默认 false, 表示 拉流前不检查通道状态是否在线
-     * @param transportmode TODO 当 transport=TCP 时有效, 指示流传输主被动模式, 默认被动
-     * @param timeout TODO 拉流超时(秒),
+     *
+     * @param serial             设备编号
+     * @param channel            通道序号 默认值: 1
+     * @param code               通道编号,通过 /api/v1/device/channellist 获取的 ChannelList.ID, 该参数和 channel 二选一传递即可
+     * @param cdn                转推 CDN 地址, 形如: [rtmp|rtsp]://xxx, encodeURIComponent
+     * @param audio              是否开启音频, 默认 开启
+     * @param transport          流传输模式, 默认 UDP
+     * @param checkchannelstatus 是否检查通道状态, 默认 false, 表示 拉流前不检查通道状态是否在线
+     * @param transportmode      当 transport=TCP 时有效, 指示流传输主被动模式, 默认被动
+     * @param timeout            拉流超时(秒),
      * @return
      */
     @RequestMapping(value = "/start")

+ 1 - 1
src/main/resources/all-application.yml

@@ -111,7 +111,7 @@ sip:
     register-time-interval: 60
     # [可选] 云台控制速度
     ptz-speed: 50
-    # TODO [可选] 收到心跳后自动上线, 重启服务后会将所有设备置为离线,默认false,等待注册后上线。设置为true则收到心跳设置为上线。
+    #  [可选] 收到心跳后自动上线, 重启服务后会将所有设备置为离线,默认false,等待注册后上线。设置为true则收到心跳设置为上线。
     # keepalliveToOnline: false
     # 是否存储alarm信息
     alarm: false

+ 1 - 1
src/main/resources/application.yml

@@ -135,7 +135,7 @@ sip:
     register-time-interval: 60
     # [可选] 云台控制速度
     ptz-speed: 50
-    # TODO [可选] 收到心跳后自动上线, 重启服务后会将所有设备置为离线,默认false,等待注册后上线。设置为true则收到心跳设置为上线。
+    #  [可选] 收到心跳后自动上线, 重启服务后会将所有设备置为离线,默认false,等待注册后上线。设置为true则收到心跳设置为上线。
     # keepalliveToOnline: false
     # 是否存储alarm信息
     alarm: false

+ 22 - 1
设备绑定机制.md

@@ -93,4 +93,25 @@
 1. 设备发送连接请求
 2. 平台根据域将设备分配至不同的管理账户下
 3. 对应域的管理员账户能够看自己域下方的设备
-4. 普通用户只能看自己的设备
+4. 普通用户只能看自己的设备
+
+## sip交互
+
+> 设备注册
+> -> 服务端处理
+> -> 是否为对应域
+> -> 下发命令
+> -> 设备响应
+> -> 服务端处理存储
+
+### 下发sip Message HfyBind
+
+### 上发 xml
+
+```xml
+
+<Respone>
+    <DeviceID></DeviceID>
+    <HfyCode></HfyCode>
+</Respone>
+```