lawrencehj
2021-03-14 32fbfd8d1e77e8745482b6df487f7f0acdd2721b
增加上级平台查询DeviceInfo和DeviceStatus的响应功能
1个文件已修改
96 ■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java 96 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
@@ -5,6 +5,7 @@
import java.util.*;
import javax.sip.header.FromHeader;
import javax.sip.header.HeaderAddress;
import javax.sip.InvalidArgumentException;
import javax.sip.RequestEvent;
import javax.sip.SipException;
@@ -12,6 +13,7 @@
import javax.sip.message.Response;
import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.VManageBootstrap;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.UserSetup;
@@ -114,10 +116,10 @@
                logger.info("接收到Catalog消息");
                processMessageCatalogList(evt);
            } else if (MESSAGE_DEVICE_INFO.equals(cmd)) {
                logger.info("接收到DeviceInfo消息");
                //DeviceInfo消息处理
                processMessageDeviceInfo(evt);
            } else if (MESSAGE_DEVICE_STATUS.equals(cmd)) {
                logger.info("接收到DeviceStatus消息");
                // DeviceStatus消息处理
                processMessageDeviceStatus(evt);
            } else if (MESSAGE_DEVICE_CONTROL.equals(cmd)) {
                logger.info("接收到DeviceControl消息");
@@ -211,27 +213,48 @@
    private void processMessageDeviceStatus(RequestEvent evt) {
        try {
            Element rootElement = getRootElement(evt);
            String deviceId = XmlUtil.getText(rootElement, "DeviceID");
            // 检查设备是否存在, 不存在则不回复
            if (storager.exists(deviceId)) {
                // 回复200 OK
                responseAck(evt);
                JSONObject json = new JSONObject();
                XmlUtil.node2Json(rootElement, json);
                if (logger.isDebugEnabled()) {
                    logger.debug(json.toJSONString());
                }
                RequestMessage msg = new RequestMessage();
                msg.setDeviceId(deviceId);
                msg.setType(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS);
                msg.setData(json);
                deferredResultHolder.invokeResult(msg);
            String name = rootElement.getName();
            Element deviceIdElement = rootElement.element("DeviceID");
            String deviceId = deviceIdElement.getText();
                if (offLineDetector.isOnline(deviceId)) {
                    publisher.onlineEventPublish(deviceId, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
            if (name.equalsIgnoreCase("Query")) { // 区分是Response——查询响应,还是Query——查询请求
                logger.info("接收到DeviceStatus查询消息");
                FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
                String platformId = ((SipUri) fromHeader.getAddress().getURI()).getUser();
                    if (platformId == null) {
                    response404Ack(evt);
                    return;
                } else {
                    // 回复200 OK
                    responseAck(evt);
                    String sn = rootElement.element("SN").getText();
                    ParentPlatform parentPlatform = storager.queryParentPlatById(platformId);
                    cmderFroPlatform.deviceStatusResponse(parentPlatform, sn, fromHeader.getTag());
                }
            } else {
                logger.info("接收到DeviceStatus应答消息");
                // 检查设备是否存在, 不存在则不回复
                if (storager.exists(deviceId)) {
                    // 回复200 OK
                    responseAck(evt);
                    JSONObject json = new JSONObject();
                    XmlUtil.node2Json(rootElement, json);
                    if (logger.isDebugEnabled()) {
                        logger.debug(json.toJSONString());
                    }
                    RequestMessage msg = new RequestMessage();
                    msg.setDeviceId(deviceId);
                    msg.setType(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS);
                    msg.setData(json);
                    deferredResultHolder.invokeResult(msg);
                    if (offLineDetector.isOnline(deviceId)) {
                        publisher.onlineEventPublish(deviceId, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
                    } else {
                    }
                }
            }
        } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
            e.printStackTrace();
        }
@@ -263,6 +286,25 @@
                deferredResultHolder.invokeResult(msg);
            } else {
                // 此处是上级发出的DeviceControl指令
                if (XmlUtil.getText(rootElement, "TeleBoot").equals("Boot") && false) {    // 远程启动功能:需要在重新启动程序后先对SipStack解绑
                    String platformId = ((SipUri) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
                    logger.info("执行远程启动命令");
                    ParentPlatform parentPlatform = storager.queryParentPlatById(platformId);
                    cmderFroPlatform.unregister(parentPlatform, null, null);
                    Thread restartThread = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Thread.sleep(1000);
                                VManageBootstrap.restart();
                            } catch (InterruptedException ignored) {
                            }
                        }
                    });
                    restartThread.setDaemon(false);
                    restartThread.start();
                }
            }
        } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
            e.printStackTrace();
@@ -374,9 +416,21 @@
            Element deviceIdElement = rootElement.element("DeviceID");
            String deviceId = deviceIdElement.getTextTrim().toString();
            if (requestName.equals("Query")) {
                // 回复200 OK
                responseAck(evt);
                logger.info("接收到DeviceInfo查询消息");
                FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
                String platformId = ((SipUri) fromHeader.getAddress().getURI()).getUser();
                    if (platformId == null) {
                    response404Ack(evt);
                    return;
                } else {
                    // 回复200 OK
                    responseAck(evt);
                    String sn = rootElement.element("SN").getText();
                    ParentPlatform parentPlatform = storager.queryParentPlatById(platformId);
                    cmderFroPlatform.deviceInfoResponse(parentPlatform, sn, fromHeader.getTag());
                }
            } else {
                logger.info("接收到DeviceInfo应答消息");
                Device device = storager.queryVideoDevice(deviceId);
                if (device == null) {
                    return;