Commit 002782569d323c8a9def230cd561ffb15b1f3f3a
1 parent
b55374c7
修改bug
Showing
5 changed files
with
59 additions
and
46 deletions
README.md
| @@ -36,4 +36,5 @@ web界面系统设置 | @@ -36,4 +36,5 @@ web界面系统设置 | ||
| 36 | QQ群: 901799015 | 36 | QQ群: 901799015 |
| 37 | 37 | ||
| 38 | # 致谢 | 38 | # 致谢 |
| 39 | -感谢作者[夏楚](https://github.com/xiongziliang) 提供这么棒的开源流媒体服务框架 | ||
| 40 | \ No newline at end of file | 39 | \ No newline at end of file |
| 40 | +感谢作者[夏楚](https://github.com/xiongziliang) 提供这么棒的开源流媒体服务框架 | ||
| 41 | + |
src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java
| @@ -38,21 +38,23 @@ public class OfflineEventListener implements ApplicationListener<OfflineEvent> { | @@ -38,21 +38,23 @@ public class OfflineEventListener implements ApplicationListener<OfflineEvent> { | ||
| 38 | String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + event.getDeviceId(); | 38 | String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + event.getDeviceId(); |
| 39 | 39 | ||
| 40 | switch (event.getFrom()) { | 40 | switch (event.getFrom()) { |
| 41 | - // 心跳超时触发的离线事件,说明redis中已删除,无需处理 | ||
| 42 | - case VideoManagerConstants.EVENT_OUTLINE_TIMEOUT: | ||
| 43 | - break; | ||
| 44 | - // 设备主动注销触发的离线事件,需要删除redis中的超时监听 | ||
| 45 | - case VideoManagerConstants.EVENT_OUTLINE_UNREGISTER: | ||
| 46 | - redis.del(key); | ||
| 47 | - break; | ||
| 48 | - default: | ||
| 49 | - boolean exist = redis.hasKey(key); | ||
| 50 | - if (exist) { | 41 | + // 心跳超时触发的离线事件,说明redis中已删除,无需处理 |
| 42 | + case VideoManagerConstants.EVENT_OUTLINE_TIMEOUT: | ||
| 43 | + break; | ||
| 44 | + // 设备主动注销触发的离线事件,需要删除redis中的超时监听 | ||
| 45 | + case VideoManagerConstants.EVENT_OUTLINE_UNREGISTER: | ||
| 51 | redis.del(key); | 46 | redis.del(key); |
| 52 | - } | 47 | + break; |
| 48 | + default: | ||
| 49 | + boolean exist = redis.hasKey(key); | ||
| 50 | + if (exist) { | ||
| 51 | + redis.del(key); | ||
| 52 | + } | ||
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | // 处理离线监听 | 55 | // 处理离线监听 |
| 56 | storager.outline(event.getDeviceId()); | 56 | storager.outline(event.getDeviceId()); |
| 57 | + | ||
| 58 | + // | ||
| 57 | } | 59 | } |
| 58 | } | 60 | } |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| @@ -181,15 +181,15 @@ public class SIPCommander implements ISIPCommander { | @@ -181,15 +181,15 @@ public class SIPCommander implements ISIPCommander { | ||
| 181 | try { | 181 | try { |
| 182 | String cmdStr= cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed); | 182 | String cmdStr= cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed); |
| 183 | StringBuffer ptzXml = new StringBuffer(200); | 183 | StringBuffer ptzXml = new StringBuffer(200); |
| 184 | - ptzXml.append("<?xml version=\"1.0\" ?>"); | ||
| 185 | - ptzXml.append("<Control>"); | ||
| 186 | - ptzXml.append("<CmdType>DeviceControl</CmdType>"); | ||
| 187 | - ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>"); | ||
| 188 | - ptzXml.append("<DeviceID>" + channelId + "</DeviceID>"); | ||
| 189 | - ptzXml.append("<PTZCmd>" + cmdStr + "</PTZCmd>"); | ||
| 190 | - ptzXml.append("<Info>"); | ||
| 191 | - ptzXml.append("</Info>"); | ||
| 192 | - ptzXml.append("</Control>"); | 184 | + ptzXml.append("<?xml version=\"1.0\" ?>\r\n"); |
| 185 | + ptzXml.append("<Control>\r\n"); | ||
| 186 | + ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n"); | ||
| 187 | + ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); | ||
| 188 | + ptzXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); | ||
| 189 | + ptzXml.append("<PTZCmd>" + cmdStr + "</PTZCmd>\r\n"); | ||
| 190 | + ptzXml.append("<Info>\r\n"); | ||
| 191 | + ptzXml.append("</Info>\r\n"); | ||
| 192 | + ptzXml.append("</Control>\r\n"); | ||
| 193 | 193 | ||
| 194 | Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag"); | 194 | Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag"); |
| 195 | 195 | ||
| @@ -458,12 +458,12 @@ public class SIPCommander implements ISIPCommander { | @@ -458,12 +458,12 @@ public class SIPCommander implements ISIPCommander { | ||
| 458 | public boolean deviceInfoQuery(Device device) { | 458 | public boolean deviceInfoQuery(Device device) { |
| 459 | try { | 459 | try { |
| 460 | StringBuffer catalogXml = new StringBuffer(200); | 460 | StringBuffer catalogXml = new StringBuffer(200); |
| 461 | - catalogXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>"); | ||
| 462 | - catalogXml.append("<Query>"); | ||
| 463 | - catalogXml.append("<CmdType>DeviceInfo</CmdType>"); | ||
| 464 | - catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>"); | ||
| 465 | - catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>"); | ||
| 466 | - catalogXml.append("</Query>"); | 461 | + catalogXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n"); |
| 462 | + catalogXml.append("<Query>\r\n"); | ||
| 463 | + catalogXml.append("<CmdType>DeviceInfo</CmdType>\r\n"); | ||
| 464 | + catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); | ||
| 465 | + catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); | ||
| 466 | + catalogXml.append("</Query>\r\n"); | ||
| 467 | 467 | ||
| 468 | Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), "ViaDeviceInfoBranch", "FromDeviceInfoTag", "ToDeviceInfoTag"); | 468 | Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), "ViaDeviceInfoBranch", "FromDeviceInfoTag", "ToDeviceInfoTag"); |
| 469 | transmitRequest(device, request); | 469 | transmitRequest(device, request); |
| @@ -486,12 +486,12 @@ public class SIPCommander implements ISIPCommander { | @@ -486,12 +486,12 @@ public class SIPCommander implements ISIPCommander { | ||
| 486 | storager.cleanChannelsForDevice(device.getDeviceId()); | 486 | storager.cleanChannelsForDevice(device.getDeviceId()); |
| 487 | try { | 487 | try { |
| 488 | StringBuffer catalogXml = new StringBuffer(200); | 488 | StringBuffer catalogXml = new StringBuffer(200); |
| 489 | - catalogXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>"); | ||
| 490 | - catalogXml.append("<Query>"); | ||
| 491 | - catalogXml.append("<CmdType>Catalog</CmdType>"); | ||
| 492 | - catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>"); | ||
| 493 | - catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>"); | ||
| 494 | - catalogXml.append("</Query>"); | 489 | + catalogXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n"); |
| 490 | + catalogXml.append("<Query>\r\n"); | ||
| 491 | + catalogXml.append("<CmdType>Catalog</CmdType>\r\n"); | ||
| 492 | + catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); | ||
| 493 | + catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); | ||
| 494 | + catalogXml.append("</Query>\r\n"); | ||
| 495 | 495 | ||
| 496 | Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), "ViaCatalogBranch", "FromCatalogTag", "ToCatalogTag"); | 496 | Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), "ViaCatalogBranch", "FromCatalogTag", "ToCatalogTag"); |
| 497 | transmitRequest(device, request); | 497 | transmitRequest(device, request); |
| @@ -514,17 +514,17 @@ public class SIPCommander implements ISIPCommander { | @@ -514,17 +514,17 @@ public class SIPCommander implements ISIPCommander { | ||
| 514 | 514 | ||
| 515 | try { | 515 | try { |
| 516 | StringBuffer recordInfoXml = new StringBuffer(200); | 516 | StringBuffer recordInfoXml = new StringBuffer(200); |
| 517 | - recordInfoXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>"); | ||
| 518 | - recordInfoXml.append("<Query>"); | ||
| 519 | - recordInfoXml.append("<CmdType>RecordInfo</CmdType>"); | ||
| 520 | - recordInfoXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>"); | ||
| 521 | - recordInfoXml.append("<DeviceID>" + channelId + "</DeviceID>"); | ||
| 522 | - recordInfoXml.append("<StartTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(startTime) + "</StartTime>"); | ||
| 523 | - recordInfoXml.append("<EndTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(endTime) + "</EndTime>"); | ||
| 524 | - recordInfoXml.append("<Secrecy>0</Secrecy>"); | 517 | + recordInfoXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n"); |
| 518 | + recordInfoXml.append("<Query>\r\n"); | ||
| 519 | + recordInfoXml.append("<CmdType>RecordInfo</CmdType>\r\n"); | ||
| 520 | + recordInfoXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); | ||
| 521 | + recordInfoXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); | ||
| 522 | + recordInfoXml.append("<StartTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(startTime) + "</StartTime>\r\n"); | ||
| 523 | + recordInfoXml.append("<EndTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(endTime) + "</EndTime>\r\n"); | ||
| 524 | + recordInfoXml.append("<Secrecy>0</Secrecy>\\r\n"); | ||
| 525 | // 大华NVR要求必须增加一个值为all的文本元素节点Type | 525 | // 大华NVR要求必须增加一个值为all的文本元素节点Type |
| 526 | - recordInfoXml.append("<Type>all</Type>"); | ||
| 527 | - recordInfoXml.append("</Query>"); | 526 | + recordInfoXml.append("<Type>all</Type>\r\n"); |
| 527 | + recordInfoXml.append("</Query>\r\n"); | ||
| 528 | 528 | ||
| 529 | Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), "ViaRecordInfoBranch", "FromRecordInfoTag", "ToRecordInfoTag"); | 529 | Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), "ViaRecordInfoBranch", "FromRecordInfoTag", "ToRecordInfoTag"); |
| 530 | transmitRequest(device, request); | 530 | transmitRequest(device, request); |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
| @@ -99,6 +99,7 @@ public class ZLMRunner implements CommandLineRunner { | @@ -99,6 +99,7 @@ public class ZLMRunner implements CommandLineRunner { | ||
| 99 | param.put("secret",mediaSecret); | 99 | param.put("secret",mediaSecret); |
| 100 | param.put("hook.enable","1"); | 100 | param.put("hook.enable","1"); |
| 101 | param.put("hook.on_flow_report",""); | 101 | param.put("hook.on_flow_report",""); |
| 102 | + param.put("hook.on_play",""); | ||
| 102 | param.put("hook.on_http_access",""); | 103 | param.put("hook.on_http_access",""); |
| 103 | param.put("hook.on_publish",String.format("%s/on_publish", hookPrex)); | 104 | param.put("hook.on_publish",String.format("%s/on_publish", hookPrex)); |
| 104 | param.put("hook.on_record_mp4",""); | 105 | param.put("hook.on_record_mp4",""); |
| @@ -107,6 +108,7 @@ public class ZLMRunner implements CommandLineRunner { | @@ -107,6 +108,7 @@ public class ZLMRunner implements CommandLineRunner { | ||
| 107 | param.put("hook.on_rtsp_realm",""); | 108 | param.put("hook.on_rtsp_realm",""); |
| 108 | param.put("hook.on_server_started",String.format("%s/on_server_started", hookPrex)); | 109 | param.put("hook.on_server_started",String.format("%s/on_server_started", hookPrex)); |
| 109 | param.put("hook.on_shell_login",String.format("%s/on_shell_login", hookPrex)); | 110 | param.put("hook.on_shell_login",String.format("%s/on_shell_login", hookPrex)); |
| 111 | + param.put("hook.on_stream_changed",String.format("%s/on_stream_changed", hookPrex)); | ||
| 110 | param.put("hook.on_stream_none_reader",String.format("%s/on_stream_none_reader", hookPrex)); | 112 | param.put("hook.on_stream_none_reader",String.format("%s/on_stream_none_reader", hookPrex)); |
| 111 | param.put("hook.on_stream_not_found",String.format("%s/on_stream_not_found", hookPrex)); | 113 | param.put("hook.on_stream_not_found",String.format("%s/on_stream_not_found", hookPrex)); |
| 112 | param.put("hook.timeoutSec","20"); | 114 | param.put("hook.timeoutSec","20"); |
src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java
| @@ -93,7 +93,7 @@ public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager { | @@ -93,7 +93,7 @@ public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager { | ||
| 93 | ":" + channel.getName() + | 93 | ":" + channel.getName() + |
| 94 | "_" + (channel.getStatus() == 1 ? "on":"off") + | 94 | "_" + (channel.getStatus() == 1 ? "on":"off") + |
| 95 | "_" + (channelMap.get(channelId).size() > 0)+ | 95 | "_" + (channelMap.get(channelId).size() > 0)+ |
| 96 | - "_" + channel.getParentId(), | 96 | + "_" + (StringUtils.isEmpty(channel.getParentId())?null:channel.getParentId()), |
| 97 | channel); | 97 | channel); |
| 98 | // 更新device中的通道数量 | 98 | // 更新device中的通道数量 |
| 99 | Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId); | 99 | Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId); |
| @@ -113,7 +113,14 @@ public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager { | @@ -113,7 +113,14 @@ public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager { | ||
| 113 | DeviceChannel deviceChannel = queryChannel(deviceId, parentId); | 113 | DeviceChannel deviceChannel = queryChannel(deviceId, parentId); |
| 114 | if (deviceChannel != null) { | 114 | if (deviceChannel != null) { |
| 115 | deviceChannel.setSubCount(channelMap.get(parentId).size()); | 115 | deviceChannel.setSubCount(channelMap.get(parentId).size()); |
| 116 | - redis.set(VideoManagerConstants.CACHEKEY_PREFIX+deviceId + "_" + deviceChannel.getChannelId(), | 116 | +// redis.set(VideoManagerConstants.CACHEKEY_PREFIX+deviceId + "_" + deviceChannel.getChannelId(), |
| 117 | +// deviceChannel); | ||
| 118 | + redis.set(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + | ||
| 119 | + "_" + deviceChannel.getChannelId() + | ||
| 120 | + ":" + deviceChannel.getName() + | ||
| 121 | + "_" + (deviceChannel.getStatus() == 1 ? "on":"off") + | ||
| 122 | + "_" + (channelMap.get(deviceChannel.getChannelId()).size() > 0)+ | ||
| 123 | + "_" + (StringUtils.isEmpty(deviceChannel.getParentId())?null:deviceChannel.getParentId()), | ||
| 117 | deviceChannel); | 124 | deviceChannel); |
| 118 | 125 | ||
| 119 | } | 126 | } |
| @@ -438,7 +445,8 @@ public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager { | @@ -438,7 +445,8 @@ public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager { | ||
| 438 | if (subChannel == null) { | 445 | if (subChannel == null) { |
| 439 | subChannel = new HashSet<>(); | 446 | subChannel = new HashSet<>(); |
| 440 | } | 447 | } |
| 441 | - if (!"null".equals(s[6])) { | 448 | + System.out.println(key); |
| 449 | + if (s.length == 7 && !"null".equals(s[6])) { | ||
| 442 | subChannel.add(s[6]); | 450 | subChannel.add(s[6]); |
| 443 | } | 451 | } |
| 444 | channelMap.put(channelId, subChannel); | 452 | channelMap.put(channelId, subChannel); |