Commit 6afcd5176b89e213fed5d5904279c4095bfada9a
1 parent
2d2832db
请求历史媒体下载增加回复事件处理ssrc与下级不一致情况
Showing
3 changed files
with
152 additions
and
92 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
| @@ -15,26 +15,26 @@ import javax.sip.InvalidArgumentException; | @@ -15,26 +15,26 @@ import javax.sip.InvalidArgumentException; | ||
| 15 | import javax.sip.SipException; | 15 | import javax.sip.SipException; |
| 16 | import java.text.ParseException; | 16 | import java.text.ParseException; |
| 17 | 17 | ||
| 18 | -/** | ||
| 19 | - * @description:设备能力接口,用于定义设备的控制、查询能力 | 18 | +/** |
| 19 | + * @description:设备能力接口,用于定义设备的控制、查询能力 | ||
| 20 | * @author: swwheihei | 20 | * @author: swwheihei |
| 21 | - * @date: 2020年5月3日 下午9:16:34 | 21 | + * @date: 2020年5月3日 下午9:16:34 |
| 22 | */ | 22 | */ |
| 23 | public interface ISIPCommander { | 23 | public interface ISIPCommander { |
| 24 | 24 | ||
| 25 | /** | 25 | /** |
| 26 | * 云台方向放控制,使用配置文件中的默认镜头移动速度 | 26 | * 云台方向放控制,使用配置文件中的默认镜头移动速度 |
| 27 | - * | 27 | + * |
| 28 | * @param device 控制设备 | 28 | * @param device 控制设备 |
| 29 | * @param channelId 预览通道 | 29 | * @param channelId 预览通道 |
| 30 | * @param leftRight 镜头左移右移 0:停止 1:左移 2:右移 | 30 | * @param leftRight 镜头左移右移 0:停止 1:左移 2:右移 |
| 31 | * @param upDown 镜头上移下移 0:停止 1:上移 2:下移 | 31 | * @param upDown 镜头上移下移 0:停止 1:上移 2:下移 |
| 32 | */ | 32 | */ |
| 33 | void ptzdirectCmd(Device device,String channelId,int leftRight, int upDown) throws InvalidArgumentException, ParseException, SipException; | 33 | void ptzdirectCmd(Device device,String channelId,int leftRight, int upDown) throws InvalidArgumentException, ParseException, SipException; |
| 34 | - | 34 | + |
| 35 | /** | 35 | /** |
| 36 | * 云台方向放控制 | 36 | * 云台方向放控制 |
| 37 | - * | 37 | + * |
| 38 | * @param device 控制设备 | 38 | * @param device 控制设备 |
| 39 | * @param channelId 预览通道 | 39 | * @param channelId 预览通道 |
| 40 | * @param leftRight 镜头左移右移 0:停止 1:左移 2:右移 | 40 | * @param leftRight 镜头左移右移 0:停止 1:左移 2:右移 |
| @@ -42,28 +42,28 @@ public interface ISIPCommander { | @@ -42,28 +42,28 @@ public interface ISIPCommander { | ||
| 42 | * @param moveSpeed 镜头移动速度 | 42 | * @param moveSpeed 镜头移动速度 |
| 43 | */ | 43 | */ |
| 44 | void ptzdirectCmd(Device device,String channelId,int leftRight, int upDown, int moveSpeed) throws InvalidArgumentException, ParseException, SipException; | 44 | void ptzdirectCmd(Device device,String channelId,int leftRight, int upDown, int moveSpeed) throws InvalidArgumentException, ParseException, SipException; |
| 45 | - | 45 | + |
| 46 | /** | 46 | /** |
| 47 | * 云台缩放控制,使用配置文件中的默认镜头缩放速度 | 47 | * 云台缩放控制,使用配置文件中的默认镜头缩放速度 |
| 48 | - * | 48 | + * |
| 49 | * @param device 控制设备 | 49 | * @param device 控制设备 |
| 50 | * @param channelId 预览通道 | 50 | * @param channelId 预览通道 |
| 51 | * @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大 | 51 | * @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大 |
| 52 | */ | 52 | */ |
| 53 | void ptzZoomCmd(Device device,String channelId,int inOut) throws InvalidArgumentException, ParseException, SipException; | 53 | void ptzZoomCmd(Device device,String channelId,int inOut) throws InvalidArgumentException, ParseException, SipException; |
| 54 | - | 54 | + |
| 55 | /** | 55 | /** |
| 56 | * 云台缩放控制 | 56 | * 云台缩放控制 |
| 57 | - * | 57 | + * |
| 58 | * @param device 控制设备 | 58 | * @param device 控制设备 |
| 59 | * @param channelId 预览通道 | 59 | * @param channelId 预览通道 |
| 60 | * @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大 | 60 | * @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大 |
| 61 | */ | 61 | */ |
| 62 | void ptzZoomCmd(Device device,String channelId,int inOut, int moveSpeed) throws InvalidArgumentException, ParseException, SipException; | 62 | void ptzZoomCmd(Device device,String channelId,int inOut, int moveSpeed) throws InvalidArgumentException, ParseException, SipException; |
| 63 | - | 63 | + |
| 64 | /** | 64 | /** |
| 65 | * 云台控制,支持方向与缩放控制 | 65 | * 云台控制,支持方向与缩放控制 |
| 66 | - * | 66 | + * |
| 67 | * @param device 控制设备 | 67 | * @param device 控制设备 |
| 68 | * @param channelId 预览通道 | 68 | * @param channelId 预览通道 |
| 69 | * @param leftRight 镜头左移右移 0:停止 1:左移 2:右移 | 69 | * @param leftRight 镜头左移右移 0:停止 1:左移 2:右移 |
| @@ -73,10 +73,10 @@ public interface ISIPCommander { | @@ -73,10 +73,10 @@ public interface ISIPCommander { | ||
| 73 | * @param zoomSpeed 镜头缩放速度 | 73 | * @param zoomSpeed 镜头缩放速度 |
| 74 | */ | 74 | */ |
| 75 | void ptzCmd(Device device,String channelId,int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed) throws InvalidArgumentException, SipException, ParseException; | 75 | void ptzCmd(Device device,String channelId,int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed) throws InvalidArgumentException, SipException, ParseException; |
| 76 | - | 76 | + |
| 77 | /** | 77 | /** |
| 78 | * 前端控制,包括PTZ指令、FI指令、预置位指令、巡航指令、扫描指令和辅助开关指令 | 78 | * 前端控制,包括PTZ指令、FI指令、预置位指令、巡航指令、扫描指令和辅助开关指令 |
| 79 | - * | 79 | + * |
| 80 | * @param device 控制设备 | 80 | * @param device 控制设备 |
| 81 | * @param channelId 预览通道 | 81 | * @param channelId 预览通道 |
| 82 | * @param cmdCode 指令码 | 82 | * @param cmdCode 指令码 |
| @@ -85,7 +85,7 @@ public interface ISIPCommander { | @@ -85,7 +85,7 @@ public interface ISIPCommander { | ||
| 85 | * @param combineCode2 组合码2 | 85 | * @param combineCode2 组合码2 |
| 86 | */ | 86 | */ |
| 87 | void frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2) throws SipException, InvalidArgumentException, ParseException; | 87 | void frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2) throws SipException, InvalidArgumentException, ParseException; |
| 88 | - | 88 | + |
| 89 | /** | 89 | /** |
| 90 | * 前端控制指令(用于转发上级指令) | 90 | * 前端控制指令(用于转发上级指令) |
| 91 | * @param device 控制设备 | 91 | * @param device 控制设备 |
| @@ -103,7 +103,7 @@ public interface ISIPCommander { | @@ -103,7 +103,7 @@ public interface ISIPCommander { | ||
| 103 | 103 | ||
| 104 | /** | 104 | /** |
| 105 | * 请求回放视频流 | 105 | * 请求回放视频流 |
| 106 | - * | 106 | + * |
| 107 | * @param device 视频设备 | 107 | * @param device 视频设备 |
| 108 | * @param channelId 预览通道 | 108 | * @param channelId 预览通道 |
| 109 | * @param startTime 开始时间,格式要求:yyyy-MM-dd HH:mm:ss | 109 | * @param startTime 开始时间,格式要求:yyyy-MM-dd HH:mm:ss |
| @@ -113,16 +113,16 @@ public interface ISIPCommander { | @@ -113,16 +113,16 @@ public interface ISIPCommander { | ||
| 113 | 113 | ||
| 114 | /** | 114 | /** |
| 115 | * 请求历史媒体下载 | 115 | * 请求历史媒体下载 |
| 116 | - * | 116 | + * |
| 117 | * @param device 视频设备 | 117 | * @param device 视频设备 |
| 118 | * @param channelId 预览通道 | 118 | * @param channelId 预览通道 |
| 119 | * @param startTime 开始时间,格式要求:yyyy-MM-dd HH:mm:ss | 119 | * @param startTime 开始时间,格式要求:yyyy-MM-dd HH:mm:ss |
| 120 | * @param endTime 结束时间,格式要求:yyyy-MM-dd HH:mm:ss | 120 | * @param endTime 结束时间,格式要求:yyyy-MM-dd HH:mm:ss |
| 121 | * @param downloadSpeed 下载倍速参数 | 121 | * @param downloadSpeed 下载倍速参数 |
| 122 | - */ | 122 | + */ |
| 123 | void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, | 123 | void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, |
| 124 | String startTime, String endTime, int downloadSpeed, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, | 124 | String startTime, String endTime, int downloadSpeed, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, |
| 125 | - SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; | 125 | + SipSubscribe.Event errorEvent,SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException; |
| 126 | 126 | ||
| 127 | /** | 127 | /** |
| 128 | * 视频流停止 | 128 | * 视频流停止 |
| @@ -150,7 +150,7 @@ public interface ISIPCommander { | @@ -150,7 +150,7 @@ public interface ISIPCommander { | ||
| 150 | * 回放倍速播放 | 150 | * 回放倍速播放 |
| 151 | */ | 151 | */ |
| 152 | void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed) throws InvalidArgumentException, ParseException, SipException; | 152 | void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed) throws InvalidArgumentException, ParseException, SipException; |
| 153 | - | 153 | + |
| 154 | /** | 154 | /** |
| 155 | * 回放控制 | 155 | * 回放控制 |
| 156 | * @param device | 156 | * @param device |
| @@ -162,55 +162,55 @@ public interface ISIPCommander { | @@ -162,55 +162,55 @@ public interface ISIPCommander { | ||
| 162 | 162 | ||
| 163 | /** | 163 | /** |
| 164 | * 语音广播 | 164 | * 语音广播 |
| 165 | - * | 165 | + * |
| 166 | * @param device 视频设备 | 166 | * @param device 视频设备 |
| 167 | * @param channelId 预览通道 | 167 | * @param channelId 预览通道 |
| 168 | */ | 168 | */ |
| 169 | void audioBroadcastCmd(Device device,String channelId); | 169 | void audioBroadcastCmd(Device device,String channelId); |
| 170 | - | 170 | + |
| 171 | /** | 171 | /** |
| 172 | * 语音广播 | 172 | * 语音广播 |
| 173 | - * | 173 | + * |
| 174 | * @param device 视频设备 | 174 | * @param device 视频设备 |
| 175 | */ | 175 | */ |
| 176 | void audioBroadcastCmd(Device device, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException; | 176 | void audioBroadcastCmd(Device device, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException; |
| 177 | void audioBroadcastCmd(Device device) throws InvalidArgumentException, SipException, ParseException; | 177 | void audioBroadcastCmd(Device device) throws InvalidArgumentException, SipException, ParseException; |
| 178 | - | 178 | + |
| 179 | /** | 179 | /** |
| 180 | * 音视频录像控制 | 180 | * 音视频录像控制 |
| 181 | - * | 181 | + * |
| 182 | * @param device 视频设备 | 182 | * @param device 视频设备 |
| 183 | * @param channelId 预览通道 | 183 | * @param channelId 预览通道 |
| 184 | * @param recordCmdStr 录像命令:Record / StopRecord | 184 | * @param recordCmdStr 录像命令:Record / StopRecord |
| 185 | */ | 185 | */ |
| 186 | void recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException; | 186 | void recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException; |
| 187 | - | 187 | + |
| 188 | /** | 188 | /** |
| 189 | * 远程启动控制命令 | 189 | * 远程启动控制命令 |
| 190 | - * | 190 | + * |
| 191 | * @param device 视频设备 | 191 | * @param device 视频设备 |
| 192 | */ | 192 | */ |
| 193 | void teleBootCmd(Device device) throws InvalidArgumentException, SipException, ParseException; | 193 | void teleBootCmd(Device device) throws InvalidArgumentException, SipException, ParseException; |
| 194 | 194 | ||
| 195 | /** | 195 | /** |
| 196 | * 报警布防/撤防命令 | 196 | * 报警布防/撤防命令 |
| 197 | - * | 197 | + * |
| 198 | * @param device 视频设备 | 198 | * @param device 视频设备 |
| 199 | */ | 199 | */ |
| 200 | void guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException; | 200 | void guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException; |
| 201 | - | 201 | + |
| 202 | /** | 202 | /** |
| 203 | * 报警复位命令 | 203 | * 报警复位命令 |
| 204 | - * | 204 | + * |
| 205 | * @param device 视频设备 | 205 | * @param device 视频设备 |
| 206 | * @param alarmMethod 报警方式(可选) | 206 | * @param alarmMethod 报警方式(可选) |
| 207 | * @param alarmType 报警类型(可选) | 207 | * @param alarmType 报警类型(可选) |
| 208 | */ | 208 | */ |
| 209 | void alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException; | 209 | void alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException; |
| 210 | - | 210 | + |
| 211 | /** | 211 | /** |
| 212 | * 强制关键帧命令,设备收到此命令应立刻发送一个IDR帧 | 212 | * 强制关键帧命令,设备收到此命令应立刻发送一个IDR帧 |
| 213 | - * | 213 | + * |
| 214 | * @param device 视频设备 | 214 | * @param device 视频设备 |
| 215 | * @param channelId 预览通道 | 215 | * @param channelId 预览通道 |
| 216 | */ | 216 | */ |
| @@ -230,58 +230,58 @@ public interface ISIPCommander { | @@ -230,58 +230,58 @@ public interface ISIPCommander { | ||
| 230 | 230 | ||
| 231 | /** | 231 | /** |
| 232 | * 设备配置命令 | 232 | * 设备配置命令 |
| 233 | - * | 233 | + * |
| 234 | * @param device 视频设备 | 234 | * @param device 视频设备 |
| 235 | */ | 235 | */ |
| 236 | void deviceConfigCmd(Device device); | 236 | void deviceConfigCmd(Device device); |
| 237 | - | 237 | + |
| 238 | /** | 238 | /** |
| 239 | * 设备配置命令:basicParam | 239 | * 设备配置命令:basicParam |
| 240 | - * | 240 | + * |
| 241 | * @param device 视频设备 | 241 | * @param device 视频设备 |
| 242 | * @param channelId 通道编码(可选) | 242 | * @param channelId 通道编码(可选) |
| 243 | * @param name 设备/通道名称(可选) | 243 | * @param name 设备/通道名称(可选) |
| 244 | * @param expiration 注册过期时间(可选) | 244 | * @param expiration 注册过期时间(可选) |
| 245 | * @param heartBeatInterval 心跳间隔时间(可选) | 245 | * @param heartBeatInterval 心跳间隔时间(可选) |
| 246 | * @param heartBeatCount 心跳超时次数(可选) | 246 | * @param heartBeatCount 心跳超时次数(可选) |
| 247 | - */ | 247 | + */ |
| 248 | void deviceBasicConfigCmd(Device device, String channelId, String name, String expiration, String heartBeatInterval, String heartBeatCount, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; | 248 | void deviceBasicConfigCmd(Device device, String channelId, String name, String expiration, String heartBeatInterval, String heartBeatCount, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; |
| 249 | 249 | ||
| 250 | /** | 250 | /** |
| 251 | * 查询设备状态 | 251 | * 查询设备状态 |
| 252 | - * | 252 | + * |
| 253 | * @param device 视频设备 | 253 | * @param device 视频设备 |
| 254 | */ | 254 | */ |
| 255 | void deviceStatusQuery(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; | 255 | void deviceStatusQuery(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; |
| 256 | - | 256 | + |
| 257 | /** | 257 | /** |
| 258 | * 查询设备信息 | 258 | * 查询设备信息 |
| 259 | - * | 259 | + * |
| 260 | * @param device 视频设备 | 260 | * @param device 视频设备 |
| 261 | - * @return | 261 | + * @return |
| 262 | */ | 262 | */ |
| 263 | void deviceInfoQuery(Device device) throws InvalidArgumentException, SipException, ParseException; | 263 | void deviceInfoQuery(Device device) throws InvalidArgumentException, SipException, ParseException; |
| 264 | - | 264 | + |
| 265 | /** | 265 | /** |
| 266 | * 查询目录列表 | 266 | * 查询目录列表 |
| 267 | - * | 267 | + * |
| 268 | * @param device 视频设备 | 268 | * @param device 视频设备 |
| 269 | */ | 269 | */ |
| 270 | void catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent) throws SipException, InvalidArgumentException, ParseException; | 270 | void catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent) throws SipException, InvalidArgumentException, ParseException; |
| 271 | - | 271 | + |
| 272 | /** | 272 | /** |
| 273 | * 查询录像信息 | 273 | * 查询录像信息 |
| 274 | - * | 274 | + * |
| 275 | * @param device 视频设备 | 275 | * @param device 视频设备 |
| 276 | * @param startTime 开始时间,格式要求:yyyy-MM-dd HH:mm:ss | 276 | * @param startTime 开始时间,格式要求:yyyy-MM-dd HH:mm:ss |
| 277 | * @param endTime 结束时间,格式要求:yyyy-MM-dd HH:mm:ss | 277 | * @param endTime 结束时间,格式要求:yyyy-MM-dd HH:mm:ss |
| 278 | * @param sn | 278 | * @param sn |
| 279 | */ | 279 | */ |
| 280 | void recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, Integer Secrecy, String type, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; | 280 | void recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, Integer Secrecy, String type, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; |
| 281 | - | 281 | + |
| 282 | /** | 282 | /** |
| 283 | * 查询报警信息 | 283 | * 查询报警信息 |
| 284 | - * | 284 | + * |
| 285 | * @param device 视频设备 | 285 | * @param device 视频设备 |
| 286 | * @param startPriority 报警起始级别(可选) | 286 | * @param startPriority 报警起始级别(可选) |
| 287 | * @param endPriority 报警终止级别(可选) | 287 | * @param endPriority 报警终止级别(可选) |
| @@ -293,33 +293,33 @@ public interface ISIPCommander { | @@ -293,33 +293,33 @@ public interface ISIPCommander { | ||
| 293 | */ | 293 | */ |
| 294 | void alarmInfoQuery(Device device, String startPriority, String endPriority, String alarmMethod, | 294 | void alarmInfoQuery(Device device, String startPriority, String endPriority, String alarmMethod, |
| 295 | String alarmType, String startTime, String endTime, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; | 295 | String alarmType, String startTime, String endTime, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; |
| 296 | - | 296 | + |
| 297 | /** | 297 | /** |
| 298 | * 查询设备配置 | 298 | * 查询设备配置 |
| 299 | - * | 299 | + * |
| 300 | * @param device 视频设备 | 300 | * @param device 视频设备 |
| 301 | * @param channelId 通道编码(可选) | 301 | * @param channelId 通道编码(可选) |
| 302 | * @param configType 配置类型: | 302 | * @param configType 配置类型: |
| 303 | */ | 303 | */ |
| 304 | void deviceConfigQuery(Device device, String channelId, String configType, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; | 304 | void deviceConfigQuery(Device device, String channelId, String configType, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; |
| 305 | - | 305 | + |
| 306 | /** | 306 | /** |
| 307 | * 查询设备预置位置 | 307 | * 查询设备预置位置 |
| 308 | - * | 308 | + * |
| 309 | * @param device 视频设备 | 309 | * @param device 视频设备 |
| 310 | */ | 310 | */ |
| 311 | void presetQuery(Device device, String channelId, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; | 311 | void presetQuery(Device device, String channelId, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; |
| 312 | - | 312 | + |
| 313 | /** | 313 | /** |
| 314 | * 查询移动设备位置数据 | 314 | * 查询移动设备位置数据 |
| 315 | - * | 315 | + * |
| 316 | * @param device 视频设备 | 316 | * @param device 视频设备 |
| 317 | */ | 317 | */ |
| 318 | void mobilePostitionQuery(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; | 318 | void mobilePostitionQuery(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; |
| 319 | 319 | ||
| 320 | /** | 320 | /** |
| 321 | * 订阅、取消订阅移动位置 | 321 | * 订阅、取消订阅移动位置 |
| 322 | - * | 322 | + * |
| 323 | * @param device 视频设备 | 323 | * @param device 视频设备 |
| 324 | * @return true = 命令发送成功 | 324 | * @return true = 命令发送成功 |
| 325 | */ | 325 | */ |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| @@ -29,7 +29,6 @@ import org.springframework.beans.factory.annotation.Autowired; | @@ -29,7 +29,6 @@ import org.springframework.beans.factory.annotation.Autowired; | ||
| 29 | import org.springframework.context.annotation.DependsOn; | 29 | import org.springframework.context.annotation.DependsOn; |
| 30 | import org.springframework.stereotype.Component; | 30 | import org.springframework.stereotype.Component; |
| 31 | import org.springframework.util.ObjectUtils; | 31 | import org.springframework.util.ObjectUtils; |
| 32 | -import org.springframework.util.StringUtils; | ||
| 33 | 32 | ||
| 34 | import javax.sip.InvalidArgumentException; | 33 | import javax.sip.InvalidArgumentException; |
| 35 | import javax.sip.ResponseEvent; | 34 | import javax.sip.ResponseEvent; |
| @@ -57,7 +56,7 @@ public class SIPCommander implements ISIPCommander { | @@ -57,7 +56,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 57 | 56 | ||
| 58 | @Autowired | 57 | @Autowired |
| 59 | private SIPSender sipSender; | 58 | private SIPSender sipSender; |
| 60 | - | 59 | + |
| 61 | @Autowired | 60 | @Autowired |
| 62 | private SIPRequestHeaderProvider headerProvider; | 61 | private SIPRequestHeaderProvider headerProvider; |
| 63 | 62 | ||
| @@ -181,7 +180,7 @@ public class SIPCommander implements ISIPCommander { | @@ -181,7 +180,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 181 | ptzXml.append("<ControlPriority>5</ControlPriority>\r\n"); | 180 | ptzXml.append("<ControlPriority>5</ControlPriority>\r\n"); |
| 182 | ptzXml.append("</Info>\r\n"); | 181 | ptzXml.append("</Info>\r\n"); |
| 183 | ptzXml.append("</Control>\r\n"); | 182 | ptzXml.append("</Control>\r\n"); |
| 184 | - | 183 | + |
| 185 | Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 184 | Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 186 | 185 | ||
| 187 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request); | 186 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request); |
| @@ -244,8 +243,8 @@ public class SIPCommander implements ISIPCommander { | @@ -244,8 +243,8 @@ public class SIPCommander implements ISIPCommander { | ||
| 244 | ptzXml.append("<ControlPriority>5</ControlPriority>\r\n"); | 243 | ptzXml.append("<ControlPriority>5</ControlPriority>\r\n"); |
| 245 | ptzXml.append("</Info>\r\n"); | 244 | ptzXml.append("</Info>\r\n"); |
| 246 | ptzXml.append("</Control>\r\n"); | 245 | ptzXml.append("</Control>\r\n"); |
| 247 | - | ||
| 248 | - | 246 | + |
| 247 | + | ||
| 249 | Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 248 | Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 250 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request, errorEvent, okEvent); | 249 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request, errorEvent, okEvent); |
| 251 | 250 | ||
| @@ -365,7 +364,8 @@ public class SIPCommander implements ISIPCommander { | @@ -365,7 +364,8 @@ public class SIPCommander implements ISIPCommander { | ||
| 365 | */ | 364 | */ |
| 366 | @Override | 365 | @Override |
| 367 | public void playbackStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, | 366 | public void playbackStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, |
| 368 | - String startTime, String endTime, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, | 367 | + String startTime, String endTime, |
| 368 | + InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, | ||
| 369 | SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { | 369 | SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { |
| 370 | 370 | ||
| 371 | 371 | ||
| @@ -411,7 +411,8 @@ public class SIPCommander implements ISIPCommander { | @@ -411,7 +411,8 @@ public class SIPCommander implements ISIPCommander { | ||
| 411 | content.append("a=setup:active\r\n"); | 411 | content.append("a=setup:active\r\n"); |
| 412 | content.append("a=connection:new\r\n"); | 412 | content.append("a=connection:new\r\n"); |
| 413 | } | 413 | } |
| 414 | - } else { | 414 | + } else |
| 415 | + { | ||
| 415 | if ("TCP-PASSIVE".equalsIgnoreCase(streamMode)) { | 416 | if ("TCP-PASSIVE".equalsIgnoreCase(streamMode)) { |
| 416 | content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 97 98 99\r\n"); | 417 | content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 97 98 99\r\n"); |
| 417 | } else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { | 418 | } else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { |
| @@ -471,8 +472,9 @@ public class SIPCommander implements ISIPCommander { | @@ -471,8 +472,9 @@ public class SIPCommander implements ISIPCommander { | ||
| 471 | */ | 472 | */ |
| 472 | @Override | 473 | @Override |
| 473 | public void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, | 474 | public void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, |
| 474 | - String startTime, String endTime, int downloadSpeed, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, | ||
| 475 | - SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { | 475 | + String startTime, String endTime, int downloadSpeed, |
| 476 | + InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, | ||
| 477 | + SipSubscribe.Event errorEvent,SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException { | ||
| 476 | 478 | ||
| 477 | logger.info("{} 分配的ZLM为: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); | 479 | logger.info("{} 分配的ZLM为: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); |
| 478 | String sdpIp; | 480 | String sdpIp; |
| @@ -541,10 +543,11 @@ public class SIPCommander implements ISIPCommander { | @@ -541,10 +543,11 @@ public class SIPCommander implements ISIPCommander { | ||
| 541 | content.append("a=downloadspeed:" + downloadSpeed + "\r\n"); | 543 | content.append("a=downloadspeed:" + downloadSpeed + "\r\n"); |
| 542 | 544 | ||
| 543 | content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc | 545 | content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc |
| 544 | - | 546 | + |
| 545 | HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId()); | 547 | HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId()); |
| 546 | // 添加订阅 | 548 | // 添加订阅 |
| 547 | - subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> { | 549 | + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> |
| 550 | + { | ||
| 548 | hookEvent.call(new InviteStreamInfo(mediaServerItem, json,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream())); | 551 | hookEvent.call(new InviteStreamInfo(mediaServerItem, json,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream())); |
| 549 | subscribe.removeSubscribe(hookSubscribe); | 552 | subscribe.removeSubscribe(hookSubscribe); |
| 550 | hookSubscribe.getContent().put("regist", false); | 553 | hookSubscribe.getContent().put("regist", false); |
| @@ -567,10 +570,11 @@ public class SIPCommander implements ISIPCommander { | @@ -567,10 +570,11 @@ public class SIPCommander implements ISIPCommander { | ||
| 567 | inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream())); | 570 | inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream())); |
| 568 | } | 571 | } |
| 569 | 572 | ||
| 570 | - sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent -> { | ||
| 571 | - ResponseEvent responseEvent = (ResponseEvent) okEvent.event; | 573 | + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, event -> { |
| 574 | + ResponseEvent responseEvent = (ResponseEvent) event.event; | ||
| 572 | SIPResponse response = (SIPResponse) responseEvent.getResponse(); | 575 | SIPResponse response = (SIPResponse) responseEvent.getResponse(); |
| 573 | streamSession.put(device.getDeviceId(), channelId, response.getCallIdHeader().getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download); | 576 | streamSession.put(device.getDeviceId(), channelId, response.getCallIdHeader().getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download); |
| 577 | + okEvent.response(event); | ||
| 574 | }); | 578 | }); |
| 575 | } | 579 | } |
| 576 | 580 | ||
| @@ -628,7 +632,7 @@ public class SIPCommander implements ISIPCommander { | @@ -628,7 +632,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 628 | broadcastXml.append("<TargetID>" + device.getDeviceId() + "</TargetID>\r\n"); | 632 | broadcastXml.append("<TargetID>" + device.getDeviceId() + "</TargetID>\r\n"); |
| 629 | broadcastXml.append("</Notify>\r\n"); | 633 | broadcastXml.append("</Notify>\r\n"); |
| 630 | 634 | ||
| 631 | - | 635 | + |
| 632 | 636 | ||
| 633 | Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 637 | Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 634 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request); | 638 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request); |
| @@ -648,7 +652,7 @@ public class SIPCommander implements ISIPCommander { | @@ -648,7 +652,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 648 | broadcastXml.append("<TargetID>" + device.getDeviceId() + "</TargetID>\r\n"); | 652 | broadcastXml.append("<TargetID>" + device.getDeviceId() + "</TargetID>\r\n"); |
| 649 | broadcastXml.append("</Notify>\r\n"); | 653 | broadcastXml.append("</Notify>\r\n"); |
| 650 | 654 | ||
| 651 | - | 655 | + |
| 652 | 656 | ||
| 653 | Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 657 | Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 654 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent); | 658 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent); |
| @@ -679,7 +683,7 @@ public class SIPCommander implements ISIPCommander { | @@ -679,7 +683,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 679 | cmdXml.append("<RecordCmd>" + recordCmdStr + "</RecordCmd>\r\n"); | 683 | cmdXml.append("<RecordCmd>" + recordCmdStr + "</RecordCmd>\r\n"); |
| 680 | cmdXml.append("</Control>\r\n"); | 684 | cmdXml.append("</Control>\r\n"); |
| 681 | 685 | ||
| 682 | - | 686 | + |
| 683 | 687 | ||
| 684 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 688 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 685 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent,okEvent); | 689 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent,okEvent); |
| @@ -703,7 +707,7 @@ public class SIPCommander implements ISIPCommander { | @@ -703,7 +707,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 703 | cmdXml.append("<TeleBoot>Boot</TeleBoot>\r\n"); | 707 | cmdXml.append("<TeleBoot>Boot</TeleBoot>\r\n"); |
| 704 | cmdXml.append("</Control>\r\n"); | 708 | cmdXml.append("</Control>\r\n"); |
| 705 | 709 | ||
| 706 | - | 710 | + |
| 707 | 711 | ||
| 708 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 712 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 709 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request); | 713 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request); |
| @@ -762,7 +766,7 @@ public class SIPCommander implements ISIPCommander { | @@ -762,7 +766,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 762 | } | 766 | } |
| 763 | cmdXml.append("</Control>\r\n"); | 767 | cmdXml.append("</Control>\r\n"); |
| 764 | 768 | ||
| 765 | - | 769 | + |
| 766 | 770 | ||
| 767 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 771 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 768 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent,okEvent); | 772 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent,okEvent); |
| @@ -791,7 +795,7 @@ public class SIPCommander implements ISIPCommander { | @@ -791,7 +795,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 791 | cmdXml.append("<IFameCmd>Send</IFameCmd>\r\n"); | 795 | cmdXml.append("<IFameCmd>Send</IFameCmd>\r\n"); |
| 792 | cmdXml.append("</Control>\r\n"); | 796 | cmdXml.append("</Control>\r\n"); |
| 793 | 797 | ||
| 794 | - | 798 | + |
| 795 | 799 | ||
| 796 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 800 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 797 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request); | 801 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request); |
| @@ -802,7 +806,6 @@ public class SIPCommander implements ISIPCommander { | @@ -802,7 +806,6 @@ public class SIPCommander implements ISIPCommander { | ||
| 802 | * | 806 | * |
| 803 | * @param device 视频设备 | 807 | * @param device 视频设备 |
| 804 | * @param channelId 通道id,非通道则是设备本身 | 808 | * @param channelId 通道id,非通道则是设备本身 |
| 805 | - * @param frontCmd 上级平台的指令,如果存在则直接下发 | ||
| 806 | * @param enabled 看守位使能:1 = 开启,0 = 关闭 | 809 | * @param enabled 看守位使能:1 = 开启,0 = 关闭 |
| 807 | * @param resetTime 自动归位时间间隔,开启看守位时使用,单位:秒(s) | 810 | * @param resetTime 自动归位时间间隔,开启看守位时使用,单位:秒(s) |
| 808 | * @param presetIndex 调用预置位编号,开启看守位时使用,取值范围0~255 | 811 | * @param presetIndex 调用预置位编号,开启看守位时使用,取值范围0~255 |
| @@ -840,7 +843,7 @@ public class SIPCommander implements ISIPCommander { | @@ -840,7 +843,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 840 | cmdXml.append("</HomePosition>\r\n"); | 843 | cmdXml.append("</HomePosition>\r\n"); |
| 841 | cmdXml.append("</Control>\r\n"); | 844 | cmdXml.append("</Control>\r\n"); |
| 842 | 845 | ||
| 843 | - | 846 | + |
| 844 | 847 | ||
| 845 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 848 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 846 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent,okEvent); | 849 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent,okEvent); |
| @@ -903,7 +906,7 @@ public class SIPCommander implements ISIPCommander { | @@ -903,7 +906,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 903 | cmdXml.append("</BasicParam>\r\n"); | 906 | cmdXml.append("</BasicParam>\r\n"); |
| 904 | cmdXml.append("</Control>\r\n"); | 907 | cmdXml.append("</Control>\r\n"); |
| 905 | 908 | ||
| 906 | - | 909 | + |
| 907 | 910 | ||
| 908 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 911 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 909 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent); | 912 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent); |
| @@ -926,7 +929,7 @@ public class SIPCommander implements ISIPCommander { | @@ -926,7 +929,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 926 | catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); | 929 | catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); |
| 927 | catalogXml.append("</Query>\r\n"); | 930 | catalogXml.append("</Query>\r\n"); |
| 928 | 931 | ||
| 929 | - | 932 | + |
| 930 | 933 | ||
| 931 | Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 934 | Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 932 | 935 | ||
| @@ -950,7 +953,7 @@ public class SIPCommander implements ISIPCommander { | @@ -950,7 +953,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 950 | catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); | 953 | catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); |
| 951 | catalogXml.append("</Query>\r\n"); | 954 | catalogXml.append("</Query>\r\n"); |
| 952 | 955 | ||
| 953 | - | 956 | + |
| 954 | 957 | ||
| 955 | Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 958 | Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 956 | 959 | ||
| @@ -975,7 +978,7 @@ public class SIPCommander implements ISIPCommander { | @@ -975,7 +978,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 975 | catalogXml.append(" <DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); | 978 | catalogXml.append(" <DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); |
| 976 | catalogXml.append("</Query>\r\n"); | 979 | catalogXml.append("</Query>\r\n"); |
| 977 | 980 | ||
| 978 | - | 981 | + |
| 979 | 982 | ||
| 980 | Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 983 | Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 981 | 984 | ||
| @@ -1020,7 +1023,7 @@ public class SIPCommander implements ISIPCommander { | @@ -1020,7 +1023,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 1020 | } | 1023 | } |
| 1021 | recordInfoXml.append("</Query>\r\n"); | 1024 | recordInfoXml.append("</Query>\r\n"); |
| 1022 | 1025 | ||
| 1023 | - | 1026 | + |
| 1024 | 1027 | ||
| 1025 | Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), | 1028 | Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), |
| 1026 | SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 1029 | SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| @@ -1071,7 +1074,7 @@ public class SIPCommander implements ISIPCommander { | @@ -1071,7 +1074,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 1071 | } | 1074 | } |
| 1072 | cmdXml.append("</Query>\r\n"); | 1075 | cmdXml.append("</Query>\r\n"); |
| 1073 | 1076 | ||
| 1074 | - | 1077 | + |
| 1075 | 1078 | ||
| 1076 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 1079 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 1077 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent); | 1080 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent); |
| @@ -1101,7 +1104,7 @@ public class SIPCommander implements ISIPCommander { | @@ -1101,7 +1104,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 1101 | cmdXml.append("<ConfigType>" + configType + "</ConfigType>\r\n"); | 1104 | cmdXml.append("<ConfigType>" + configType + "</ConfigType>\r\n"); |
| 1102 | cmdXml.append("</Query>\r\n"); | 1105 | cmdXml.append("</Query>\r\n"); |
| 1103 | 1106 | ||
| 1104 | - | 1107 | + |
| 1105 | 1108 | ||
| 1106 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 1109 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 1107 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent); | 1110 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent); |
| @@ -1128,7 +1131,7 @@ public class SIPCommander implements ISIPCommander { | @@ -1128,7 +1131,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 1128 | } | 1131 | } |
| 1129 | cmdXml.append("</Query>\r\n"); | 1132 | cmdXml.append("</Query>\r\n"); |
| 1130 | 1133 | ||
| 1131 | - | 1134 | + |
| 1132 | 1135 | ||
| 1133 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 1136 | Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 1134 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent); | 1137 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent); |
| @@ -1152,7 +1155,7 @@ public class SIPCommander implements ISIPCommander { | @@ -1152,7 +1155,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 1152 | mobilePostitionXml.append("<Interval>60</Interval>\r\n"); | 1155 | mobilePostitionXml.append("<Interval>60</Interval>\r\n"); |
| 1153 | mobilePostitionXml.append("</Query>\r\n"); | 1156 | mobilePostitionXml.append("</Query>\r\n"); |
| 1154 | 1157 | ||
| 1155 | - | 1158 | + |
| 1156 | 1159 | ||
| 1157 | Request request = headerProvider.createMessageRequest(device, mobilePostitionXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 1160 | Request request = headerProvider.createMessageRequest(device, mobilePostitionXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 1158 | 1161 | ||
| @@ -1237,7 +1240,7 @@ public class SIPCommander implements ISIPCommander { | @@ -1237,7 +1240,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 1237 | } | 1240 | } |
| 1238 | cmdXml.append("</Query>\r\n"); | 1241 | cmdXml.append("</Query>\r\n"); |
| 1239 | 1242 | ||
| 1240 | - | 1243 | + |
| 1241 | 1244 | ||
| 1242 | Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), null, expires, "presence",sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 1245 | Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), null, expires, "presence",sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 1243 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request); | 1246 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request); |
| @@ -1287,14 +1290,14 @@ public class SIPCommander implements ISIPCommander { | @@ -1287,14 +1290,14 @@ public class SIPCommander implements ISIPCommander { | ||
| 1287 | } | 1290 | } |
| 1288 | dragXml.append(cmdString); | 1291 | dragXml.append(cmdString); |
| 1289 | dragXml.append("</Control>\r\n"); | 1292 | dragXml.append("</Control>\r\n"); |
| 1290 | - | 1293 | + |
| 1291 | Request request = headerProvider.createMessageRequest(device, dragXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 1294 | Request request = headerProvider.createMessageRequest(device, dragXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 1292 | logger.debug("拉框信令: " + request.toString()); | 1295 | logger.debug("拉框信令: " + request.toString()); |
| 1293 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request); | 1296 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request); |
| 1294 | } | 1297 | } |
| 1295 | 1298 | ||
| 1296 | 1299 | ||
| 1297 | - | 1300 | + |
| 1298 | 1301 | ||
| 1299 | 1302 | ||
| 1300 | /** | 1303 | /** |
| @@ -1398,7 +1401,7 @@ public class SIPCommander implements ISIPCommander { | @@ -1398,7 +1401,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 1398 | deviceStatusXml.append("</info>\r\n"); | 1401 | deviceStatusXml.append("</info>\r\n"); |
| 1399 | deviceStatusXml.append("</Notify>\r\n"); | 1402 | deviceStatusXml.append("</Notify>\r\n"); |
| 1400 | 1403 | ||
| 1401 | - | 1404 | + |
| 1402 | Request request = headerProvider.createMessageRequest(device, deviceStatusXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | 1405 | Request request = headerProvider.createMessageRequest(device, deviceStatusXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); |
| 1403 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request); | 1406 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request); |
| 1404 | 1407 |
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
| @@ -258,7 +258,8 @@ public class PlayServiceImpl implements IPlayService { | @@ -258,7 +258,8 @@ public class PlayServiceImpl implements IPlayService { | ||
| 258 | return; | 258 | return; |
| 259 | } | 259 | } |
| 260 | try { | 260 | try { |
| 261 | - cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> { | 261 | + cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> |
| 262 | + { | ||
| 262 | logger.info("收到订阅消息: " + response.toJSONString()); | 263 | logger.info("收到订阅消息: " + response.toJSONString()); |
| 263 | dynamicTask.stop(timeOutTaskKey); | 264 | dynamicTask.stop(timeOutTaskKey); |
| 264 | 265 | ||
| @@ -273,7 +274,8 @@ public class PlayServiceImpl implements IPlayService { | @@ -273,7 +274,8 @@ public class PlayServiceImpl implements IPlayService { | ||
| 273 | logger.info("[请求截图]: " + fileName); | 274 | logger.info("[请求截图]: " + fileName); |
| 274 | zlmresTfulUtils.getSnap(mediaServerItemInuse, streamUrl, 15, 1, path, fileName); | 275 | zlmresTfulUtils.getSnap(mediaServerItemInuse, streamUrl, 15, 1, path, fileName); |
| 275 | 276 | ||
| 276 | - }, (event) -> { | 277 | + }, (event) -> |
| 278 | + { | ||
| 277 | ResponseEvent responseEvent = (ResponseEvent) event.event; | 279 | ResponseEvent responseEvent = (ResponseEvent) event.event; |
| 278 | String contentString = new String(responseEvent.getResponse().getRawContent()); | 280 | String contentString = new String(responseEvent.getResponse().getRawContent()); |
| 279 | // 获取ssrc | 281 | // 获取ssrc |
| @@ -322,7 +324,8 @@ public class PlayServiceImpl implements IPlayService { | @@ -322,7 +324,8 @@ public class PlayServiceImpl implements IPlayService { | ||
| 322 | 324 | ||
| 323 | } | 325 | } |
| 324 | } | 326 | } |
| 325 | - }, (event) -> { | 327 | + }, (event) -> |
| 328 | + { | ||
| 326 | dynamicTask.stop(timeOutTaskKey); | 329 | dynamicTask.stop(timeOutTaskKey); |
| 327 | mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); | 330 | mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| 328 | // 释放ssrc | 331 | // 释放ssrc |
| @@ -513,7 +516,8 @@ public class PlayServiceImpl implements IPlayService { | @@ -513,7 +516,8 @@ public class PlayServiceImpl implements IPlayService { | ||
| 513 | 516 | ||
| 514 | try { | 517 | try { |
| 515 | cmder.playbackStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, infoCallBack, | 518 | cmder.playbackStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, infoCallBack, |
| 516 | - hookEvent, eventResult -> { | 519 | + hookEvent, eventResult -> |
| 520 | + { | ||
| 517 | if (eventResult.type == SipSubscribe.EventResultType.response) { | 521 | if (eventResult.type == SipSubscribe.EventResultType.response) { |
| 518 | ResponseEvent responseEvent = (ResponseEvent) eventResult.event; | 522 | ResponseEvent responseEvent = (ResponseEvent) eventResult.event; |
| 519 | String contentString = new String(responseEvent.getResponse().getRawContent()); | 523 | String contentString = new String(responseEvent.getResponse().getRawContent()); |
| @@ -582,6 +586,7 @@ public class PlayServiceImpl implements IPlayService { | @@ -582,6 +586,7 @@ public class PlayServiceImpl implements IPlayService { | ||
| 582 | if (device == null) { | 586 | if (device == null) { |
| 583 | return; | 587 | return; |
| 584 | } | 588 | } |
| 589 | + //获取录像下载的服务,配置文件中的record-assist-port不为0 | ||
| 585 | MediaServerItem newMediaServerItem = getNewMediaServerItemHasAssist(device); | 590 | MediaServerItem newMediaServerItem = getNewMediaServerItemHasAssist(device); |
| 586 | if (newMediaServerItem == null) { | 591 | if (newMediaServerItem == null) { |
| 587 | PlayBackResult<StreamInfo> downloadResult = new PlayBackResult<>(); | 592 | PlayBackResult<StreamInfo> downloadResult = new PlayBackResult<>(); |
| @@ -651,7 +656,59 @@ public class PlayServiceImpl implements IPlayService { | @@ -651,7 +656,59 @@ public class PlayServiceImpl implements IPlayService { | ||
| 651 | downloadResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem()); | 656 | downloadResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem()); |
| 652 | downloadResult.setResponse(inviteStreamInfo.getResponse()); | 657 | downloadResult.setResponse(inviteStreamInfo.getResponse()); |
| 653 | hookCallBack.call(downloadResult); | 658 | hookCallBack.call(downloadResult); |
| 654 | - }, errorEvent); | 659 | + }, errorEvent, eventResult -> |
| 660 | + { | ||
| 661 | + if (eventResult.type == SipSubscribe.EventResultType.response) { | ||
| 662 | + ResponseEvent responseEvent = (ResponseEvent) eventResult.event; | ||
| 663 | + String contentString = new String(responseEvent.getResponse().getRawContent()); | ||
| 664 | + // 获取ssrc | ||
| 665 | + int ssrcIndex = contentString.indexOf("y="); | ||
| 666 | + // 检查是否有y字段 | ||
| 667 | + if (ssrcIndex >= 0) { | ||
| 668 | + //ssrc规定长度为10字节,不取余下长度以避免后续还有“f=”字段 TODO 后续对不规范的非10位ssrc兼容 | ||
| 669 | + String ssrcInResponse = contentString.substring(ssrcIndex + 2, ssrcIndex + 12); | ||
| 670 | + // 查询到ssrc不一致且开启了ssrc校验则需要针对处理 | ||
| 671 | + if (ssrcInfo.getSsrc().equals(ssrcInResponse)) { | ||
| 672 | + return; | ||
| 673 | + } | ||
| 674 | + logger.info("[回放消息] 收到invite 200, 发现下级自定义了ssrc: {}", ssrcInResponse); | ||
| 675 | + if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) { | ||
| 676 | + logger.info("[回放消息] SSRC修正 {}->{}", ssrcInfo.getSsrc(), ssrcInResponse); | ||
| 677 | + | ||
| 678 | + if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) { | ||
| 679 | + // ssrc 不可用 | ||
| 680 | + // 释放ssrc | ||
| 681 | + mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); | ||
| 682 | + streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); | ||
| 683 | + eventResult.msg = "下级自定义了ssrc,但是此ssrc不可用"; | ||
| 684 | + eventResult.statusCode = 400; | ||
| 685 | + errorEvent.response(eventResult); | ||
| 686 | + return; | ||
| 687 | + } | ||
| 688 | + | ||
| 689 | + // 单端口模式streamId也有变化,需要重新设置监听 | ||
| 690 | + if (!mediaServerItem.isRtpEnable()) { | ||
| 691 | + // 添加订阅 | ||
| 692 | + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId()); | ||
| 693 | + subscribe.removeSubscribe(hookSubscribe); | ||
| 694 | + hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase()); | ||
| 695 | + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response) -> { | ||
| 696 | + logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + response.toJSONString()); | ||
| 697 | + dynamicTask.stop(downLoadTimeOutTaskKey); | ||
| 698 | + // hook响应,TODO 此处待处理 | ||
| 699 | +// onPublishHandlerForPlayback(mediaServerItemInUse, response, device.getDeviceId(), channelId, playBackCallback); | ||
| 700 | +// hookCallBack.call(new InviteStreamInfo(mediaServerItem, null, eventResult.callId, "rtp", ssrcInfo.getStream())); | ||
| 701 | + }); | ||
| 702 | + } | ||
| 703 | + // 关闭rtp server | ||
| 704 | + mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); | ||
| 705 | + // 重新开启ssrc server | ||
| 706 | + mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort()); | ||
| 707 | + } | ||
| 708 | + } | ||
| 709 | + } | ||
| 710 | + | ||
| 711 | + }); | ||
| 655 | } catch (InvalidArgumentException | SipException | ParseException e) { | 712 | } catch (InvalidArgumentException | SipException | ParseException e) { |
| 656 | logger.error("[命令发送失败] 录像下载: {}", e.getMessage()); | 713 | logger.error("[命令发送失败] 录像下载: {}", e.getMessage()); |
| 657 | 714 |