648540858
2021-11-12 eca1e05aeed3c51cce36bbce80c71bc3cbcea87d
维护目录订阅消息与接口
6个文件已修改
156 ■■■■ 已修改文件
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 86 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java 28 ●●●● 补丁 | 查看 | 原始文档 | 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,14 +253,77 @@
                    if (channelDeviceElement == null) {
                        continue;
                    }
                    String channelDeviceId = channelDeviceElement.getTextTrim();
                    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");
                    }
                }
                // RequestMessage msg = new RequestMessage();
                // msg.setDeviceId(deviceId);
                // msg.setType(DeferredResultHolder.CALLBACK_CMD_CATALOG);
                // msg.setData(device);
                // deferredResultHolder.invokeResult(msg);
                if (offLineDetector.isOnline(deviceId)) {
                    publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE);
                }
            }
        } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
            e.printStackTrace();
        }
    }
    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(channelDeviceId);
        deviceChannel.setChannelId(channelId);
                    // ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR的兼容性处理
                    if (status.equals("ON") || status.equals("On") || status.equals("ONLINE")) {
                        deviceChannel.setStatus(1);
@@ -333,25 +396,8 @@
                        deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType")));
                    }
                    deviceChannel.setHasAudio(true); // 默认含有音频,播放时再检查是否有音频及是否AAC
                    storager.updateChannel(device.getDeviceId(), deviceChannel);
        return deviceChannel;
                }
                // RequestMessage msg = new RequestMessage();
                // msg.setDeviceId(deviceId);
                // 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);
                }
            }
        } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
            e.printStackTrace();
        }
    }
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);
@@ -105,4 +108,10 @@
    @Select("SELECT * FROM device_channel WHERE channelId=#{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,6 +641,7 @@
        return streamProxyMapper.selectForEnableInMediaServer(id, enable);
    }
    @Override
    public Device queryVideoDeviceByChannelId(String channelId) {
        Device result = null;