Merge branch 'wvp-28181-2.0' into wvp-28181-2.0
| | |
| | | |
| | | <groupId>com.genersoft</groupId> |
| | | <artifactId>wvp-pro</artifactId> |
| | | <version>2.6.6</version> |
| | | <version>2.6.7</version> |
| | | <name>web video platform</name> |
| | | <description>国标28181视频平台</description> |
| | | |
| | |
| | | alter table media_server |
| | | drop column streamNoneReaderDelayMS; |
| | | |
| | | alter table media_server |
| | | drop column sendRtpPortRange; |
| | | |
| | | alter table stream_proxy |
| | | add enable_disable_none_reader bit(1) default null; |
| | | |
| | | -- 2.6.6->2.6.7 |
| | | alter table device |
| | | add mediaServerId varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'auto'; |
| | | |
| | | alter table device |
| | | add custom_name varchar(255) default null; |
| | | |
| | | alter table device |
| | | add sdpIp varchar(50) default null; |
| | | |
| | | alter table device |
| | | add localIp varchar(50) default null; |
| | | |
| | | alter table device |
| | | add password varchar(255) default null; |
| | | |
| | | alter table device |
| | | modify ip varchar(50) null; |
| | | |
| | | alter table device |
| | | modify port int null; |
| | | |
| | | alter table device |
| | | modify expires int null; |
| | | |
| | | alter table device |
| | | modify subscribeCycleForCatalog int null; |
| | | |
| | | alter table device |
| | | modify hostAddress varchar(50) null; |
| | | |
| | | alter table stream_proxy |
| | | change enable_hls enable_audio bit null; |
| | | |
| | | |
| | | add keepaliveIntervalTime int default null; |
| | |
| | |
|
| | | public static final String SYSTEM_INFO_DISK_PREFIX = "VMP_SYSTEM_INFO_DISK_";
|
| | |
|
| | | public static final String REGISTER_EXPIRE_TASK_KEY_PREFIX = "VMP_device_register_expire_";
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
| | | @Schema(description = "心跳时间") |
| | | private String keepaliveTime; |
| | | |
| | | |
| | | /** |
| | | * 心跳间隔 |
| | | */ |
| | | @Schema(description = "心跳间隔") |
| | | private int keepaliveIntervalTime; |
| | | |
| | | /** |
| | | * 通道个数 |
| | | */ |
| | |
| | | public void setLocalIp(String localIp) { |
| | | this.localIp = localIp; |
| | | } |
| | | |
| | | public int getKeepaliveIntervalTime() { |
| | | return keepaliveIntervalTime; |
| | | } |
| | | |
| | | public void setKeepaliveIntervalTime(int keepaliveIntervalTime) { |
| | | this.keepaliveIntervalTime = keepaliveIntervalTime; |
| | | } |
| | | } |
| | |
| | | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; |
| | | |
| | | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| | | import com.genersoft.iot.vmp.conf.DynamicTask; |
| | | import com.genersoft.iot.vmp.conf.UserSetting; |
| | | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| | | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| | |
| | | @Autowired |
| | | private UserSetting userSetting; |
| | | |
| | | @Autowired |
| | | private DynamicTask dynamicTask; |
| | | |
| | | @Override |
| | | public void afterPropertiesSet() throws Exception { |
| | | notifyMessageHandler.addHandler(cmdType, this); |
| | |
| | | device.setHostAddress(remoteAddressInfo.getIp().concat(":").concat(String.valueOf(remoteAddressInfo.getPort()))); |
| | | device.setIp(remoteAddressInfo.getIp()); |
| | | } |
| | | if (device.getKeepaliveTime() == null) { |
| | | device.setKeepaliveIntervalTime(60); |
| | | }else { |
| | | long lastTime = DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(device.getKeepaliveTime()); |
| | | device.setKeepaliveIntervalTime(new Long(System.currentTimeMillis()/1000-lastTime).intValue()); |
| | | } |
| | | |
| | | device.setKeepaliveTime(DateUtil.getNow()); |
| | | |
| | | if (device.getOnline() == 1) { |
| | |
| | | }else { |
| | | // 对于已经离线的设备判断他的注册是否已经过期 |
| | | if (!deviceService.expire(device)){ |
| | | device.setOnline(0); |
| | | deviceService.online(device); |
| | | } |
| | | } |
| | | // 刷新过期任务 |
| | | String registerExpireTaskKey = VideoManagerConstants.REGISTER_EXPIRE_TASK_KEY_PREFIX + device.getDeviceId(); |
| | | // 如果三次心跳失败,则设置设备离线 |
| | | dynamicTask.startDelay(registerExpireTaskKey, ()-> deviceService.offline(device.getDeviceId()), device.getKeepaliveIntervalTime()*1000*3); |
| | | |
| | | } |
| | | |
| | | @Override |
| | |
| | | HashMap<String, DeviceChannel> channelsInStore = new HashMap<>(); |
| | | Device device = deviceMapper.getDeviceByDeviceId(deviceId); |
| | | if (channels != null && channels.size() > 0) { |
| | | List<DeviceChannel> channelList = channelMapper.queryChannels(deviceId, null, null, null, null); |
| | | List<DeviceChannel> channelList = channelMapper.queryChannels(deviceId, null, null, null, null,null); |
| | | if (channelList.size() == 0) { |
| | | for (DeviceChannel channel : channels) { |
| | | channel.setDeviceId(deviceId); |
| | |
| | | package com.genersoft.iot.vmp.service.impl; |
| | | |
| | | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| | | import com.genersoft.iot.vmp.conf.DynamicTask; |
| | | import com.genersoft.iot.vmp.conf.UserSetting; |
| | | import com.genersoft.iot.vmp.gb28181.bean.*; |
| | |
| | | public class DeviceServiceImpl implements IDeviceService { |
| | | |
| | | private final static Logger logger = LoggerFactory.getLogger(DeviceServiceImpl.class); |
| | | |
| | | private final String registerExpireTaskKeyPrefix = "device-register-expire-"; |
| | | |
| | | @Autowired |
| | | private DynamicTask dynamicTask; |
| | |
| | | redisCatchStorage.clearCatchByDeviceId(device.getDeviceId()); |
| | | } |
| | | device.setUpdateTime(now); |
| | | |
| | | if (device.getKeepaliveIntervalTime() == 0) { |
| | | // 默认心跳间隔60 |
| | | device.setKeepaliveIntervalTime(60); |
| | | } |
| | | // 第一次上线 或则设备之前是离线状态--进行通道同步和设备信息查询 |
| | | if (device.getCreateTime() == null) { |
| | | device.setOnline(1); |
| | |
| | | } |
| | | sync(device); |
| | | }else { |
| | | |
| | | if(device.getOnline() == 0){ |
| | | device.setOnline(1); |
| | | device.setCreateTime(now); |
| | |
| | | addMobilePositionSubscribe(device); |
| | | } |
| | | // 刷新过期任务 |
| | | String registerExpireTaskKey = registerExpireTaskKeyPrefix + device.getDeviceId(); |
| | | // 增加一个10秒给设备重发消息的机会 |
| | | dynamicTask.startDelay(registerExpireTaskKey, ()-> offline(device.getDeviceId()), (device.getExpires() + 10) * 1000); |
| | | String registerExpireTaskKey = VideoManagerConstants.REGISTER_EXPIRE_TASK_KEY_PREFIX + device.getDeviceId(); |
| | | // 如果第一次注册那么必须在60 * 3时间内收到一个心跳,否则设备离线 |
| | | dynamicTask.startDelay(registerExpireTaskKey, ()-> offline(device.getDeviceId()), device.getKeepaliveIntervalTime() * 1000 * 3); |
| | | } |
| | | |
| | | @Override |
| | | public void offline(String deviceId) { |
| | | logger.info("[设备离线], device:{}", deviceId); |
| | | logger.error("[设备离线], device:{}", deviceId); |
| | | Device device = deviceMapper.getDeviceByDeviceId(deviceId); |
| | | if (device == null) { |
| | | return; |
| | | } |
| | | String registerExpireTaskKey = registerExpireTaskKeyPrefix + deviceId; |
| | | String registerExpireTaskKey = VideoManagerConstants.REGISTER_EXPIRE_TASK_KEY_PREFIX + deviceId; |
| | | dynamicTask.stop(registerExpireTaskKey); |
| | | device.setOnline(0); |
| | | redisCatchStorage.updateDevice(device); |
| | |
| | | if (parentId.length() < 14 ) { |
| | | return null; |
| | | } |
| | | List<DeviceChannel> deviceChannels = deviceChannelMapper.queryChannels(deviceId, parentId, null, null, null); |
| | | List<DeviceChannel> deviceChannels = deviceChannelMapper.queryChannels(deviceId, parentId, null, null, null,null); |
| | | List<BaseTree<DeviceChannel>> trees = transportChannelsToTree(deviceChannels, parentId); |
| | | return trees; |
| | | } |
| | |
| | | if (parentId.length() < 14 ) { |
| | | return null; |
| | | } |
| | | List<DeviceChannel> deviceChannels = deviceChannelMapper.queryChannels(deviceId, parentId, null, null, null); |
| | | List<DeviceChannel> deviceChannels = deviceChannelMapper.queryChannels(deviceId, parentId, null, null, null,null); |
| | | return deviceChannels; |
| | | } |
| | | |
| | |
| | | } |
| | | }else { |
| | | if (haveChannel) { |
| | | List<DeviceChannel> deviceChannels = deviceChannelMapper.queryChannels(deviceId, null, null, null, null); |
| | | List<DeviceChannel> deviceChannels = deviceChannelMapper.queryChannels(deviceId, null, null, null, null,null); |
| | | if (deviceChannels != null && deviceChannels.size() > 0) { |
| | | result.addAll(deviceChannels); |
| | | } |
| | |
| | | */ |
| | | public PageInfo queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, Boolean online, Boolean catalogUnderDevice, int page, int count); |
| | | |
| | | public List<DeviceChannel> queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit); |
| | | public List<DeviceChannel> queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit,List<String> channelIds); |
| | | |
| | | |
| | | /** |
| | |
| | | * @param deviceId 设备ID |
| | | * @return |
| | | */ |
| | | public List<DeviceChannel> queryChannelsByDeviceId(String deviceId); |
| | | public List<DeviceChannel> queryChannelsByDeviceId(String deviceId,Boolean online,List<String> channelIds); |
| | | public List<DeviceChannel> queryOnlineChannelsByDeviceId(String deviceId); |
| | | |
| | | /** |
| | |
| | | * @param count 每页数量 |
| | | * @return List<Device> 设备对象数组 |
| | | */ |
| | | public PageInfo<Device> queryVideoDeviceList(int page, int count); |
| | | public PageInfo<Device> queryVideoDeviceList(int page, int count,Boolean online); |
| | | |
| | | /** |
| | | * 获取多个设备 |
| | | * |
| | | * @return List<Device> 设备对象数组 |
| | | */ |
| | | public List<Device> queryVideoDeviceList(); |
| | | public List<Device> queryVideoDeviceList(Boolean online); |
| | | |
| | | |
| | | |
| | |
| | | " <if test='online == false' > AND dc.status=0</if>" + |
| | | " <if test='hasSubChannel == true' > AND dc.subCount > 0 </if>" + |
| | | " <if test='hasSubChannel == false' > AND dc.subCount = 0 </if>" + |
| | | "<if test='channelIds != null'> AND dc.channelId in <foreach item='item' index='index' collection='channelIds' open='(' separator=',' close=')'>" + |
| | | "#{item} " + |
| | | "</foreach> </if>" + |
| | | "ORDER BY dc.channelId " + |
| | | " </script>"}) |
| | | List<DeviceChannel> queryChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, Boolean online); |
| | | List<DeviceChannel> queryChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, Boolean online,List<String> channelIds); |
| | | |
| | | @Select("SELECT * FROM device_channel WHERE deviceId=#{deviceId} AND channelId=#{channelId}") |
| | | DeviceChannel queryChannel(String deviceId, String channelId); |
| | |
| | | " <if test='online == false' > AND dc1.status=0</if>" + |
| | | " <if test='hasSubChannel == true' > AND dc1.subCount >0</if>" + |
| | | " <if test='hasSubChannel == false' > AND dc1.subCount=0</if>" + |
| | | "<if test='channelIds != null'> AND dc1.channelId in <foreach item='item' index='index' collection='channelIds' open='(' separator=',' close=')'>" + |
| | | "#{item} " + |
| | | "</foreach> </if>" + |
| | | "ORDER BY dc1.channelId ASC " + |
| | | "Limit #{limit} OFFSET #{start}" + |
| | | " </script>"}) |
| | | List<DeviceChannel> queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String parentChannelId, String query, |
| | | Boolean hasSubChannel, Boolean online, int start, int limit); |
| | | Boolean hasSubChannel, Boolean online, int start, int limit,List<String> channelIds); |
| | | |
| | | @Select("SELECT * FROM device_channel WHERE deviceId=#{deviceId} AND status=1") |
| | | List<DeviceChannel> queryOnlineChannelsByDeviceId(String deviceId); |
| | |
| | | "expires," + |
| | | "registerTime," + |
| | | "keepaliveTime," + |
| | | "keepaliveIntervalTime," + |
| | | "createTime," + |
| | | "updateTime," + |
| | | "charset," + |
| | |
| | | "#{expires}," + |
| | | "#{registerTime}," + |
| | | "#{keepaliveTime}," + |
| | | "#{keepaliveIntervalTime}," + |
| | | "#{createTime}," + |
| | | "#{updateTime}," + |
| | | "#{charset}," + |
| | |
| | | "<if test=\"online != null\">, online=#{online}</if>" + |
| | | "<if test=\"registerTime != null\">, registerTime=#{registerTime}</if>" + |
| | | "<if test=\"keepaliveTime != null\">, keepaliveTime=#{keepaliveTime}</if>" + |
| | | "<if test=\"keepaliveIntervalTime != null\">, keepaliveIntervalTime=#{keepaliveIntervalTime}</if>" + |
| | | "<if test=\"expires != null\">, expires=#{expires}</if>" + |
| | | "WHERE deviceId=#{deviceId}"+ |
| | | " </script>"}) |
| | | int update(Device device); |
| | | |
| | | @Select("SELECT " + |
| | | @Select( |
| | | " <script>" + |
| | | "SELECT " + |
| | | "deviceId, " + |
| | | "coalesce(custom_name, name) as name, " + |
| | | "password, " + |
| | |
| | | "geoCoordSys," + |
| | | "treeType," + |
| | | "online," + |
| | | "(SELECT count(0) FROM device_channel WHERE deviceId=de.deviceId) as channelCount FROM device de") |
| | | List<Device> getDevices(); |
| | | "(SELECT count(0) FROM device_channel WHERE deviceId=de.deviceId) as channelCount FROM device de" + |
| | | "<if test=\"online != null\"> where online=${online}</if>"+ |
| | | " </script>" |
| | | ) |
| | | List<Device> getDevices(Boolean online); |
| | | |
| | | @Delete("DELETE FROM device WHERE deviceId=#{deviceId}") |
| | | int del(String deviceId); |
| | |
| | | PageHelper.startPage(page, count); |
| | | List<DeviceChannel> all; |
| | | if (catalogUnderDevice != null && catalogUnderDevice) { |
| | | all = deviceChannelMapper.queryChannels(deviceId, deviceId, query, hasSubChannel, online); |
| | | all = deviceChannelMapper.queryChannels(deviceId, deviceId, query, hasSubChannel, online,null); |
| | | // 海康设备的parentId是SIP id |
| | | List<DeviceChannel> deviceChannels = deviceChannelMapper.queryChannels(deviceId, sipConfig.getId(), query, hasSubChannel, online); |
| | | List<DeviceChannel> deviceChannels = deviceChannelMapper.queryChannels(deviceId, sipConfig.getId(), query, hasSubChannel, online,null); |
| | | all.addAll(deviceChannels); |
| | | }else { |
| | | all = deviceChannelMapper.queryChannels(deviceId, null, query, hasSubChannel, online); |
| | | all = deviceChannelMapper.queryChannels(deviceId, null, query, hasSubChannel, online,null); |
| | | } |
| | | return new PageInfo<>(all); |
| | | } |
| | | |
| | | @Override |
| | | public List<DeviceChannel> queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit) { |
| | | return deviceChannelMapper.queryChannelsByDeviceIdWithStartAndLimit(deviceId, null, query, hasSubChannel, online, start, limit); |
| | | public List<DeviceChannel> queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit,List<String> channelIds) { |
| | | return deviceChannelMapper.queryChannelsByDeviceIdWithStartAndLimit(deviceId, null, query, hasSubChannel, online, start, limit,channelIds); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) { |
| | | return deviceChannelMapper.queryChannels(deviceId, null,null, null, null); |
| | | public List<DeviceChannel> queryChannelsByDeviceId(String deviceId,Boolean online,List<String> channelIds) { |
| | | return deviceChannelMapper.queryChannels(deviceId, null,null, null, online,channelIds); |
| | | } |
| | | |
| | | @Override |
| | | public PageInfo<DeviceChannel> querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, Boolean online, int page, int count) { |
| | | PageHelper.startPage(page, count); |
| | | List<DeviceChannel> all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, query, hasSubChannel, online); |
| | | List<DeviceChannel> all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, query, hasSubChannel, online,null); |
| | | return new PageInfo<>(all); |
| | | } |
| | | |
| | |
| | | * @return PageInfo<Device> 分页设备对象数组 |
| | | */ |
| | | @Override |
| | | public PageInfo<Device> queryVideoDeviceList(int page, int count) { |
| | | public PageInfo<Device> queryVideoDeviceList(int page, int count,Boolean online) { |
| | | PageHelper.startPage(page, count); |
| | | List<Device> all = deviceMapper.getDevices(); |
| | | List<Device> all = deviceMapper.getDevices(online); |
| | | return new PageInfo<>(all); |
| | | } |
| | | |
| | |
| | | * @return List<Device> 设备对象数组 |
| | | */ |
| | | @Override |
| | | public List<Device> queryVideoDeviceList() { |
| | | public List<Device> queryVideoDeviceList(Boolean online) { |
| | | |
| | | List<Device> deviceList = deviceMapper.getDevices(); |
| | | List<Device> deviceList = deviceMapper.getDevices(online); |
| | | return deviceList; |
| | | } |
| | | |
| | |
| | | @GetMapping("/devices") |
| | | public PageInfo<Device> devices(int page, int count){ |
| | | |
| | | return storager.queryVideoDeviceList(page, count); |
| | | return storager.queryVideoDeviceList(page, count,null); |
| | | } |
| | | |
| | | /** |
| | |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.util.StringUtils; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | JSONObject result = new JSONObject(); |
| | | List<Device> devices; |
| | | if (start == null || limit ==null) { |
| | | devices = storager.queryVideoDeviceList(); |
| | | devices = storager.queryVideoDeviceList(online); |
| | | result.put("DeviceCount", devices.size()); |
| | | }else { |
| | | PageInfo<Device> deviceList = storager.queryVideoDeviceList(start/limit, limit); |
| | | PageInfo<Device> deviceList = storager.queryVideoDeviceList(start/limit, limit,online); |
| | | result.put("DeviceCount", deviceList.getTotal()); |
| | | devices = deviceList.getList(); |
| | | } |
| | |
| | | return result; |
| | | } |
| | | List<DeviceChannel> deviceChannels; |
| | | List<DeviceChannel> allDeviceChannelList = storager.queryChannelsByDeviceId(serial); |
| | | List<String> channelIds = null; |
| | | if (!StringUtils.isEmpty(code)) { |
| | | String[] split = code.trim().split(","); |
| | | channelIds = Arrays.asList(split); |
| | | } |
| | | List<DeviceChannel> allDeviceChannelList = storager.queryChannelsByDeviceId(serial,online,channelIds); |
| | | if (start == null || limit ==null) { |
| | | deviceChannels = allDeviceChannelList; |
| | | result.put("ChannelCount", deviceChannels.size()); |
| | | }else { |
| | | deviceChannels = storager.queryChannelsByDeviceIdWithStartAndLimit(serial, null, null, null,start, limit); |
| | | deviceChannels = storager.queryChannelsByDeviceIdWithStartAndLimit(serial, null, null, online,start, limit,channelIds); |
| | | int total = allDeviceChannelList.size(); |
| | | result.put("ChannelCount", total); |
| | | } |