648540858
2021-11-12 eca1e05aeed3c51cce36bbce80c71bc3cbcea87d
维护目录订阅消息与接口
6个文件已修改
282 ■■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java
@@ -71,7 +71,7 @@
            logger.warn("不支持方法{}的request", method);
            return;
        }
        requestProcessorMap.get(requestEvent.getRequest().getMethod()).process(requestEvent);
        requestProcessorMap.get(method).process(requestEvent);
    }
    /**
@@ -143,17 +143,18 @@
    @Override
    public void processIOException(IOExceptionEvent exceptionEvent) {
//        System.out.println("processIOException");
    }
    @Override
    public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) {
//        System.out.println("processTransactionTerminated");
    }
    @Override
    public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {
        CallIdHeader callId = dialogTerminatedEvent.getDialog().getCallId();
        System.out.println("processDialogTerminated:::::" + callId);
    }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java
@@ -125,7 +125,8 @@
        Response response = getMessageFactory().createResponse(statusCode, evt.getRequest());
        ServerTransaction serverTransaction = getServerTransaction(evt);
        serverTransaction.sendResponse(response);
        if (statusCode >= 200) {
        if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) {
            if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
        }
    }
@@ -135,7 +136,7 @@
        response.setReasonPhrase(msg);
        ServerTransaction serverTransaction = getServerTransaction(evt);
        serverTransaction.sendResponse(response);
        if (statusCode >= 200) {
        if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) {
            if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
        }
    }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
@@ -253,87 +253,52 @@
                    if (channelDeviceElement == null) {
                        continue;
                    }
                    String channelDeviceId = channelDeviceElement.getTextTrim();
                    Element channdelNameElement = itemDevice.element("Name");
                    String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim().toString() : "";
                    Element statusElement = itemDevice.element("Status");
                    String status = statusElement != null ? statusElement.getTextTrim().toString() : "ON";
                    DeviceChannel deviceChannel = new DeviceChannel();
                    deviceChannel.setName(channelName);
                    deviceChannel.setChannelId(channelDeviceId);
                    // ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR的兼容性处理
                    if (status.equals("ON") || status.equals("On") || status.equals("ONLINE")) {
                        deviceChannel.setStatus(1);
                    }
                    if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) {
                        deviceChannel.setStatus(0);
                    Element eventElement = itemDevice.element("Event");
                    switch (eventElement.getText().toUpperCase()) {
                        case "ON" : // 上线
                            logger.info("收到来自设备【{}】的通道上线【{}】通知", device.getDeviceId(), channelId);
                            storager.deviceChannelOnline(deviceId, channelId);
                            // 回复200 OK
                            responseAck(evt, Response.OK);
                            break;
                        case "OFF" : // 离线
                            logger.info("收到来自设备【{}】的通道离线【{}】通知", device.getDeviceId(), channelId);
                            storager.deviceChannelOffline(deviceId, channelId);
                            // 回复200 OK
                            responseAck(evt, Response.OK);
                            break;
                        case "VLOST" : // 视频丢失
                            logger.info("收到来自设备【{}】的通道视频丢失【{}】通知", device.getDeviceId(), channelId);
                            storager.deviceChannelOffline(deviceId, channelId);
                            // 回复200 OK
                            responseAck(evt, Response.OK);
                            break;
                        case "DEFECT" : // 故障
                            // 回复200 OK
                            responseAck(evt, Response.OK);
                            break;
                        case "ADD" : // 增加
                            logger.info("收到来自设备【{}】的增加通道【{}】通知", device.getDeviceId(), channelId);
                            DeviceChannel deviceChannel = channelContentHander(itemDevice, channelId);
                            storager.updateChannel(deviceId, deviceChannel);
                            responseAck(evt, Response.OK);
                            break;
                        case "DEL" : // 删除
                            logger.info("收到来自设备【{}】的删除通道【{}】通知", device.getDeviceId(), channelId);
                            storager.delChannel(deviceId, channelId);
                            responseAck(evt, Response.OK);
                            break;
                        case "UPDATE" : // 更新
                            logger.info("收到来自设备【{}】的更新通道【{}】通知", device.getDeviceId(), channelId);
                            DeviceChannel channel = channelContentHander(itemDevice, channelId);
                            storager.updateChannel(deviceId, channel);
                            responseAck(evt, Response.OK);
                            break;
                        default:
                            responseAck(evt, Response.BAD_REQUEST, "event not found");
                    }
                    deviceChannel.setManufacture(XmlUtil.getText(itemDevice, "Manufacturer"));
                    deviceChannel.setModel(XmlUtil.getText(itemDevice, "Model"));
                    deviceChannel.setOwner(XmlUtil.getText(itemDevice, "Owner"));
                    deviceChannel.setCivilCode(XmlUtil.getText(itemDevice, "CivilCode"));
                    deviceChannel.setBlock(XmlUtil.getText(itemDevice, "Block"));
                    deviceChannel.setAddress(XmlUtil.getText(itemDevice, "Address"));
                    if (XmlUtil.getText(itemDevice, "Parental") == null
                            || XmlUtil.getText(itemDevice, "Parental") == "") {
                        deviceChannel.setParental(0);
                    } else {
                        deviceChannel.setParental(Integer.parseInt(XmlUtil.getText(itemDevice, "Parental")));
                    }
                    deviceChannel.setParentId(XmlUtil.getText(itemDevice, "ParentID"));
                    if (XmlUtil.getText(itemDevice, "SafetyWay") == null
                            || XmlUtil.getText(itemDevice, "SafetyWay") == "") {
                        deviceChannel.setSafetyWay(0);
                    } else {
                        deviceChannel.setSafetyWay(Integer.parseInt(XmlUtil.getText(itemDevice, "SafetyWay")));
                    }
                    if (XmlUtil.getText(itemDevice, "RegisterWay") == null
                            || XmlUtil.getText(itemDevice, "RegisterWay") == "") {
                        deviceChannel.setRegisterWay(1);
                    } else {
                        deviceChannel.setRegisterWay(Integer.parseInt(XmlUtil.getText(itemDevice, "RegisterWay")));
                    }
                    deviceChannel.setCertNum(XmlUtil.getText(itemDevice, "CertNum"));
                    if (XmlUtil.getText(itemDevice, "Certifiable") == null
                            || XmlUtil.getText(itemDevice, "Certifiable") == "") {
                        deviceChannel.setCertifiable(0);
                    } else {
                        deviceChannel.setCertifiable(Integer.parseInt(XmlUtil.getText(itemDevice, "Certifiable")));
                    }
                    if (XmlUtil.getText(itemDevice, "ErrCode") == null
                            || XmlUtil.getText(itemDevice, "ErrCode") == "") {
                        deviceChannel.setErrCode(0);
                    } else {
                        deviceChannel.setErrCode(Integer.parseInt(XmlUtil.getText(itemDevice, "ErrCode")));
                    }
                    deviceChannel.setEndTime(XmlUtil.getText(itemDevice, "EndTime"));
                    deviceChannel.setSecrecy(XmlUtil.getText(itemDevice, "Secrecy"));
                    deviceChannel.setIpAddress(XmlUtil.getText(itemDevice, "IPAddress"));
                    if (XmlUtil.getText(itemDevice, "Port") == null || XmlUtil.getText(itemDevice, "Port") == "") {
                        deviceChannel.setPort(0);
                    } else {
                        deviceChannel.setPort(Integer.parseInt(XmlUtil.getText(itemDevice, "Port")));
                    }
                    deviceChannel.setPassword(XmlUtil.getText(itemDevice, "Password"));
                    if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Longitude"))) {
                        deviceChannel.setLongitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Longitude")));
                    } else {
                        deviceChannel.setLongitude(0.00);
                    }
                    if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Latitude"))) {
                        deviceChannel.setLatitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Latitude")));
                    } else {
                        deviceChannel.setLatitude(0.00);
                    }
                    if (XmlUtil.getText(itemDevice, "PTZType") == null
                            || XmlUtil.getText(itemDevice, "PTZType") == "") {
                        deviceChannel.setPTZType(0);
                    } else {
                        deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType")));
                    }
                    deviceChannel.setHasAudio(true); // 默认含有音频,播放时再检查是否有音频及是否AAC
                    storager.updateChannel(device.getDeviceId(), deviceChannel);
                }
                // RequestMessage msg = new RequestMessage();
@@ -341,8 +306,7 @@
                // msg.setType(DeferredResultHolder.CALLBACK_CMD_CATALOG);
                // msg.setData(device);
                // deferredResultHolder.invokeResult(msg);
                // 回复200 OK
                responseAck(evt, Response.OK);
                if (offLineDetector.isOnline(deviceId)) {
                    publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE);
                }
@@ -352,6 +316,88 @@
        }
    }
    public DeviceChannel channelContentHander(Element itemDevice, String channelId){
        Element channdelNameElement = itemDevice.element("Name");
        String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim().toString() : "";
        Element statusElement = itemDevice.element("Status");
        String status = statusElement != null ? statusElement.getTextTrim().toString() : "ON";
        DeviceChannel deviceChannel = new DeviceChannel();
        deviceChannel.setName(channelName);
        deviceChannel.setChannelId(channelId);
        // ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR的兼容性处理
        if (status.equals("ON") || status.equals("On") || status.equals("ONLINE")) {
            deviceChannel.setStatus(1);
        }
        if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) {
            deviceChannel.setStatus(0);
        }
        deviceChannel.setManufacture(XmlUtil.getText(itemDevice, "Manufacturer"));
        deviceChannel.setModel(XmlUtil.getText(itemDevice, "Model"));
        deviceChannel.setOwner(XmlUtil.getText(itemDevice, "Owner"));
        deviceChannel.setCivilCode(XmlUtil.getText(itemDevice, "CivilCode"));
        deviceChannel.setBlock(XmlUtil.getText(itemDevice, "Block"));
        deviceChannel.setAddress(XmlUtil.getText(itemDevice, "Address"));
        if (XmlUtil.getText(itemDevice, "Parental") == null
                || XmlUtil.getText(itemDevice, "Parental") == "") {
            deviceChannel.setParental(0);
        } else {
            deviceChannel.setParental(Integer.parseInt(XmlUtil.getText(itemDevice, "Parental")));
        }
        deviceChannel.setParentId(XmlUtil.getText(itemDevice, "ParentID"));
        if (XmlUtil.getText(itemDevice, "SafetyWay") == null
                || XmlUtil.getText(itemDevice, "SafetyWay") == "") {
            deviceChannel.setSafetyWay(0);
        } else {
            deviceChannel.setSafetyWay(Integer.parseInt(XmlUtil.getText(itemDevice, "SafetyWay")));
        }
        if (XmlUtil.getText(itemDevice, "RegisterWay") == null
                || XmlUtil.getText(itemDevice, "RegisterWay") == "") {
            deviceChannel.setRegisterWay(1);
        } else {
            deviceChannel.setRegisterWay(Integer.parseInt(XmlUtil.getText(itemDevice, "RegisterWay")));
        }
        deviceChannel.setCertNum(XmlUtil.getText(itemDevice, "CertNum"));
        if (XmlUtil.getText(itemDevice, "Certifiable") == null
                || XmlUtil.getText(itemDevice, "Certifiable") == "") {
            deviceChannel.setCertifiable(0);
        } else {
            deviceChannel.setCertifiable(Integer.parseInt(XmlUtil.getText(itemDevice, "Certifiable")));
        }
        if (XmlUtil.getText(itemDevice, "ErrCode") == null
                || XmlUtil.getText(itemDevice, "ErrCode") == "") {
            deviceChannel.setErrCode(0);
        } else {
            deviceChannel.setErrCode(Integer.parseInt(XmlUtil.getText(itemDevice, "ErrCode")));
        }
        deviceChannel.setEndTime(XmlUtil.getText(itemDevice, "EndTime"));
        deviceChannel.setSecrecy(XmlUtil.getText(itemDevice, "Secrecy"));
        deviceChannel.setIpAddress(XmlUtil.getText(itemDevice, "IPAddress"));
        if (XmlUtil.getText(itemDevice, "Port") == null || XmlUtil.getText(itemDevice, "Port") == "") {
            deviceChannel.setPort(0);
        } else {
            deviceChannel.setPort(Integer.parseInt(XmlUtil.getText(itemDevice, "Port")));
        }
        deviceChannel.setPassword(XmlUtil.getText(itemDevice, "Password"));
        if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Longitude"))) {
            deviceChannel.setLongitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Longitude")));
        } else {
            deviceChannel.setLongitude(0.00);
        }
        if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Latitude"))) {
            deviceChannel.setLatitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Latitude")));
        } else {
            deviceChannel.setLatitude(0.00);
        }
        if (XmlUtil.getText(itemDevice, "PTZType") == null
                || XmlUtil.getText(itemDevice, "PTZType") == "") {
            deviceChannel.setPTZType(0);
        } else {
            deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType")));
        }
        deviceChannel.setHasAudio(true); // 默认含有音频,播放时再检查是否有音频及是否AAC
        return deviceChannel;
    }
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
@@ -98,6 +98,13 @@
    public DeviceChannel queryChannel(String deviceId, String channelId);
    /**
     * 删除通道
     * @param deviceId 设备ID
     * @param channelId 通道ID
     */
    public int delChannel(String deviceId, String channelId);
    /**
     * 获取多个设备
     * @param page 当前页数
     * @param count 每页数量
@@ -387,4 +394,16 @@
     * @return
     */
    Device queryVideoDeviceByChannelId(String channelId);
    /**
     * 通道上线
     * @param channelId 通道ID
     */
    void deviceChannelOnline(String deviceId, String channelId);
    /**
     * 通道离线
     * @param channelId 通道ID
     */
    void deviceChannelOffline(String deviceId, String channelId);
}
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
@@ -74,6 +74,9 @@
    @Delete("DELETE FROM device_channel WHERE deviceId=#{deviceId}")
    int cleanChannelsByDeviceId(String deviceId);
    @Delete("DELETE FROM device_channel WHERE deviceId=#{deviceId} AND channelId=#{channelId}")
    int del(String deviceId, String channelId);
    @Update(value = {"UPDATE device_channel SET streamId=null WHERE deviceId=#{deviceId} AND channelId=#{channelId}"})
    void stopPlay(String deviceId, String channelId);
@@ -104,5 +107,11 @@
    List<ChannelReduce> queryChannelListInAll(String query, Boolean online, Boolean hasSubChannel, String platformId, Boolean inPlatform);
    @Select("SELECT * FROM device_channel WHERE channelId=#{channelId}")
    List<DeviceChannel> queryChannelByChannelId(String channelId);
    List<DeviceChannel> queryChannelByChannelId( String channelId);
    @Update(value = {"UPDATE device_channel SET status=0 WHERE deviceId=#{deviceId} AND channelId=#{channelId}"})
    void offline(String deviceId,  String channelId);
    @Update(value = {"UPDATE device_channel SET status=1 WHERE deviceId=#{deviceId} AND channelId=#{channelId}"})
    void online(String deviceId,  String channelId);
}
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
@@ -1,14 +1,12 @@
package com.genersoft.iot.vmp.storager.impl;
import java.text.SimpleDateFormat;
import java.util.*;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import com.genersoft.iot.vmp.storager.dao.*;
import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce;
import com.github.pagehelper.PageHelper;
@@ -18,11 +16,15 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**    
 * @description:视频设备数据存储-jdbc实现
@@ -138,6 +140,16 @@
    }
    @Override
    public void deviceChannelOnline(String deviceId, String channelId) {
        deviceChannelMapper.online(deviceId, channelId);
    }
    @Override
    public void deviceChannelOffline(String deviceId, String channelId) {
        deviceChannelMapper.offline(deviceId, channelId);
    }
    @Override
    public void startPlay(String deviceId, String channelId, String streamId) {
        deviceChannelMapper.startPlay(deviceId, channelId, streamId);
    }
@@ -183,6 +195,11 @@
        return deviceChannelMapper.queryChannel(deviceId, channelId);
    }
    @Override
    public int delChannel(String deviceId, String channelId) {
        return deviceChannelMapper.del(deviceId, channelId);
    }
    /**
     * 获取多个设备
@@ -624,8 +641,9 @@
        return streamProxyMapper.selectForEnableInMediaServer(id, enable);
    }
    @Override
    public Device queryVideoDeviceByChannelId(String channelId) {
    public Device queryVideoDeviceByChannelId( String channelId) {
        Device result = null;
        List<DeviceChannel> channelList = deviceChannelMapper.queryChannelByChannelId(channelId);
        if (channelList.size() == 1) {