Commit 31219f0c0edfc214ca75731a892013a92a4ce0fb
1 parent
97a90ac6
根据车辆编号查询设备通道信息
Showing
12 changed files
with
1119 additions
and
997 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
| ... | ... | @@ -5,453 +5,457 @@ import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | 5 | |
| 6 | 6 | /** |
| 7 | 7 | * 国标设备/平台 |
| 8 | + * | |
| 8 | 9 | * @author lin |
| 9 | 10 | */ |
| 10 | 11 | @Schema(description = "国标设备/平台") |
| 11 | 12 | public class Device { |
| 12 | 13 | |
| 13 | - /** | |
| 14 | - * 设备国标编号 | |
| 15 | - */ | |
| 16 | - @Schema(description = "设备国标编号") | |
| 17 | - private String deviceId; | |
| 18 | - | |
| 19 | - /** | |
| 20 | - * 设备名 | |
| 21 | - */ | |
| 22 | - @Schema(description = "名称") | |
| 23 | - private String name; | |
| 24 | - | |
| 25 | - /** | |
| 26 | - * 生产厂商 | |
| 27 | - */ | |
| 28 | - @Schema(description = "生产厂商") | |
| 29 | - private String manufacturer; | |
| 30 | - | |
| 31 | - /** | |
| 32 | - * 型号 | |
| 33 | - */ | |
| 34 | - @Schema(description = "型号") | |
| 35 | - private String model; | |
| 36 | - | |
| 37 | - /** | |
| 38 | - * 固件版本 | |
| 39 | - */ | |
| 40 | - @Schema(description = "固件版本") | |
| 41 | - private String firmware; | |
| 42 | - | |
| 43 | - /** | |
| 44 | - * 传输协议 | |
| 45 | - * UDP/TCP | |
| 46 | - */ | |
| 47 | - @Schema(description = "传输协议(UDP/TCP)") | |
| 48 | - private String transport; | |
| 49 | - | |
| 50 | - /** | |
| 51 | - * 数据流传输模式 | |
| 52 | - * UDP:udp传输 | |
| 53 | - * TCP-ACTIVE:tcp主动模式 | |
| 54 | - * TCP-PASSIVE:tcp被动模式 | |
| 55 | - */ | |
| 56 | - @Schema(description = "数据流传输模式") | |
| 57 | - private String streamMode; | |
| 58 | - | |
| 59 | - /** | |
| 60 | - * wan地址_ip | |
| 61 | - */ | |
| 62 | - @Schema(description = "IP") | |
| 63 | - private String ip; | |
| 64 | - | |
| 65 | - /** | |
| 66 | - * wan地址_port | |
| 67 | - */ | |
| 68 | - @Schema(description = "端口") | |
| 69 | - private int port; | |
| 70 | - | |
| 71 | - /** | |
| 72 | - * wan地址 | |
| 73 | - */ | |
| 74 | - @Schema(description = "wan地址") | |
| 75 | - private String hostAddress; | |
| 76 | - | |
| 77 | - /** | |
| 78 | - * 在线 | |
| 79 | - */ | |
| 80 | - @Schema(description = "是否在线,true为在线,false为离线") | |
| 81 | - private boolean onLine; | |
| 82 | - | |
| 83 | - | |
| 84 | - /** | |
| 85 | - * 注册时间 | |
| 86 | - */ | |
| 87 | - @Schema(description = "注册时间") | |
| 88 | - private String registerTime; | |
| 89 | - | |
| 90 | - | |
| 91 | - /** | |
| 92 | - * 心跳时间 | |
| 93 | - */ | |
| 94 | - @Schema(description = "心跳时间") | |
| 95 | - private String keepaliveTime; | |
| 96 | - | |
| 97 | - | |
| 98 | - /** | |
| 99 | - * 心跳间隔 | |
| 100 | - */ | |
| 101 | - @Schema(description = "心跳间隔") | |
| 102 | - private int keepaliveIntervalTime; | |
| 103 | - | |
| 104 | - /** | |
| 105 | - * 通道个数 | |
| 106 | - */ | |
| 107 | - @Schema(description = "通道个数") | |
| 108 | - private int channelCount; | |
| 109 | - | |
| 110 | - /** | |
| 111 | - * 注册有效期 | |
| 112 | - */ | |
| 113 | - @Schema(description = "注册有效期") | |
| 114 | - private int expires; | |
| 115 | - | |
| 116 | - /** | |
| 117 | - * 创建时间 | |
| 118 | - */ | |
| 119 | - @Schema(description = "创建时间") | |
| 120 | - private String createTime; | |
| 121 | - | |
| 122 | - /** | |
| 123 | - * 更新时间 | |
| 124 | - */ | |
| 125 | - @Schema(description = "更新时间") | |
| 126 | - private String updateTime; | |
| 127 | - | |
| 128 | - /** | |
| 129 | - * 设备使用的媒体id, 默认为null | |
| 130 | - */ | |
| 131 | - @Schema(description = "设备使用的媒体id, 默认为null") | |
| 132 | - private String mediaServerId; | |
| 133 | - | |
| 134 | - /** | |
| 135 | - * 字符集, 支持 UTF-8 与 GB2312 | |
| 136 | - */ | |
| 137 | - @Schema(description = "符集, 支持 UTF-8 与 GB2312") | |
| 138 | - private String charset ; | |
| 139 | - | |
| 140 | - /** | |
| 141 | - * 目录订阅周期,0为不订阅 | |
| 142 | - */ | |
| 143 | - @Schema(description = "目录订阅周期,o为不订阅") | |
| 144 | - private int subscribeCycleForCatalog; | |
| 145 | - | |
| 146 | - /** | |
| 147 | - * 移动设备位置订阅周期,0为不订阅 | |
| 148 | - */ | |
| 149 | - @Schema(description = "移动设备位置订阅周期,0为不订阅") | |
| 150 | - private int subscribeCycleForMobilePosition; | |
| 151 | - | |
| 152 | - /** | |
| 153 | - * 移动设备位置信息上报时间间隔,单位:秒,默认值5 | |
| 154 | - */ | |
| 155 | - @Schema(description = "移动设备位置信息上报时间间隔,单位:秒,默认值5") | |
| 156 | - private int mobilePositionSubmissionInterval = 5; | |
| 157 | - | |
| 158 | - /** | |
| 159 | - * 报警订阅周期,0为不订阅 | |
| 160 | - */ | |
| 161 | - @Schema(description = "报警心跳时间订阅周期,0为不订阅") | |
| 162 | - private int subscribeCycleForAlarm; | |
| 163 | - | |
| 164 | - /** | |
| 165 | - * 是否开启ssrc校验,默认关闭,开启可以防止串流 | |
| 166 | - */ | |
| 167 | - @Schema(description = "是否开启ssrc校验,默认关闭,开启可以防止串流") | |
| 168 | - private boolean ssrcCheck = false; | |
| 169 | - | |
| 170 | - /** | |
| 171 | - * 地理坐标系, 目前支持 WGS84,GCJ02 | |
| 172 | - */ | |
| 173 | - @Schema(description = "地理坐标系, 目前支持 WGS84,GCJ02") | |
| 174 | - private String geoCoordSys; | |
| 175 | - | |
| 176 | - @Schema(description = "密码") | |
| 177 | - private String password; | |
| 178 | - | |
| 179 | - @Schema(description = "收流IP") | |
| 180 | - private String sdpIp; | |
| 181 | - | |
| 182 | - @Schema(description = "SIP交互IP(设备访问平台的IP)") | |
| 183 | - private String localIp; | |
| 184 | - | |
| 185 | - @Schema(description = "是否作为消息通道") | |
| 186 | - private boolean asMessageChannel; | |
| 187 | - | |
| 188 | - @Schema(description = "设备注册的事务信息") | |
| 189 | - private SipTransactionInfo sipTransactionInfo; | |
| 190 | - | |
| 191 | - @Schema(description = "控制语音对讲流程,释放收到ACK后发流") | |
| 192 | - private boolean broadcastPushAfterAck; | |
| 193 | - | |
| 194 | - public String getDeviceId() { | |
| 195 | - return deviceId; | |
| 196 | - } | |
| 197 | - | |
| 198 | - public void setDeviceId(String deviceId) { | |
| 199 | - this.deviceId = deviceId; | |
| 200 | - } | |
| 201 | - | |
| 202 | - public String getName() { | |
| 203 | - return name; | |
| 204 | - } | |
| 205 | - | |
| 206 | - public void setName(String name) { | |
| 207 | - this.name = name; | |
| 208 | - } | |
| 209 | - | |
| 210 | - public String getManufacturer() { | |
| 211 | - return manufacturer; | |
| 212 | - } | |
| 213 | - | |
| 214 | - public void setManufacturer(String manufacturer) { | |
| 215 | - this.manufacturer = manufacturer; | |
| 216 | - } | |
| 217 | - | |
| 218 | - public String getModel() { | |
| 219 | - return model; | |
| 220 | - } | |
| 221 | - | |
| 222 | - public void setModel(String model) { | |
| 223 | - this.model = model; | |
| 224 | - } | |
| 225 | - | |
| 226 | - public String getFirmware() { | |
| 227 | - return firmware; | |
| 228 | - } | |
| 229 | - | |
| 230 | - public void setFirmware(String firmware) { | |
| 231 | - this.firmware = firmware; | |
| 232 | - } | |
| 233 | - | |
| 234 | - public String getTransport() { | |
| 235 | - return transport; | |
| 236 | - } | |
| 237 | - | |
| 238 | - public void setTransport(String transport) { | |
| 239 | - this.transport = transport; | |
| 240 | - } | |
| 241 | - | |
| 242 | - public String getStreamMode() { | |
| 243 | - return streamMode; | |
| 244 | - } | |
| 245 | - | |
| 246 | - public Integer getStreamModeForParam() { | |
| 247 | - if (streamMode == null) { | |
| 248 | - return 0; | |
| 249 | - } | |
| 250 | - if (streamMode.equalsIgnoreCase("UDP")) { | |
| 251 | - return 0; | |
| 252 | - }else if (streamMode.equalsIgnoreCase("TCP-PASSIVE")) { | |
| 253 | - return 1; | |
| 254 | - }else if (streamMode.equalsIgnoreCase("TCP-ACTIVE")) { | |
| 255 | - return 2; | |
| 256 | - } | |
| 257 | - return 0; | |
| 258 | - } | |
| 259 | - | |
| 260 | - public void setStreamMode(String streamMode) { | |
| 261 | - this.streamMode = streamMode; | |
| 262 | - } | |
| 263 | - | |
| 264 | - public String getIp() { | |
| 265 | - return ip; | |
| 266 | - } | |
| 267 | - | |
| 268 | - public void setIp(String ip) { | |
| 269 | - this.ip = ip; | |
| 270 | - } | |
| 271 | - | |
| 272 | - public int getPort() { | |
| 273 | - return port; | |
| 274 | - } | |
| 14 | + /** | |
| 15 | + * 设备国标编号 | |
| 16 | + */ | |
| 17 | + @Schema(description = "设备国标编号") | |
| 18 | + private String deviceId; | |
| 19 | + | |
| 20 | + /** | |
| 21 | + * 设备名 | |
| 22 | + */ | |
| 23 | + @Schema(description = "名称") | |
| 24 | + private String name; | |
| 25 | + | |
| 26 | + /** | |
| 27 | + * 生产厂商 | |
| 28 | + */ | |
| 29 | + @Schema(description = "生产厂商") | |
| 30 | + private String manufacturer; | |
| 31 | + | |
| 32 | + /** | |
| 33 | + * 型号 | |
| 34 | + */ | |
| 35 | + @Schema(description = "型号") | |
| 36 | + private String model; | |
| 37 | + | |
| 38 | + /** | |
| 39 | + * 固件版本 | |
| 40 | + */ | |
| 41 | + @Schema(description = "固件版本") | |
| 42 | + private String firmware; | |
| 43 | + | |
| 44 | + /** | |
| 45 | + * 传输协议 | |
| 46 | + * UDP/TCP | |
| 47 | + */ | |
| 48 | + @Schema(description = "传输协议(UDP/TCP)") | |
| 49 | + private String transport; | |
| 50 | + | |
| 51 | + /** | |
| 52 | + * 数据流传输模式 | |
| 53 | + * UDP:udp传输 | |
| 54 | + * TCP-ACTIVE:tcp主动模式 | |
| 55 | + * TCP-PASSIVE:tcp被动模式 | |
| 56 | + */ | |
| 57 | + @Schema(description = "数据流传输模式") | |
| 58 | + private String streamMode; | |
| 59 | + | |
| 60 | + /** | |
| 61 | + * wan地址_ip | |
| 62 | + */ | |
| 63 | + @Schema(description = "IP") | |
| 64 | + private String ip; | |
| 65 | + | |
| 66 | + /** | |
| 67 | + * wan地址_port | |
| 68 | + */ | |
| 69 | + @Schema(description = "端口") | |
| 70 | + private int port; | |
| 71 | + | |
| 72 | + /** | |
| 73 | + * wan地址 | |
| 74 | + */ | |
| 75 | + @Schema(description = "wan地址") | |
| 76 | + private String hostAddress; | |
| 77 | + | |
| 78 | + /** | |
| 79 | + * 在线 | |
| 80 | + */ | |
| 81 | + @Schema(description = "是否在线,true为在线,false为离线") | |
| 82 | + private boolean onLine; | |
| 83 | + | |
| 84 | + | |
| 85 | + /** | |
| 86 | + * 注册时间 | |
| 87 | + */ | |
| 88 | + @Schema(description = "注册时间") | |
| 89 | + private String registerTime; | |
| 90 | + | |
| 91 | + | |
| 92 | + /** | |
| 93 | + * 心跳时间 | |
| 94 | + */ | |
| 95 | + @Schema(description = "心跳时间") | |
| 96 | + private String keepaliveTime; | |
| 97 | + | |
| 98 | + | |
| 99 | + /** | |
| 100 | + * 心跳间隔 | |
| 101 | + */ | |
| 102 | + @Schema(description = "心跳间隔") | |
| 103 | + private int keepaliveIntervalTime; | |
| 104 | + | |
| 105 | + /** | |
| 106 | + * 通道个数 | |
| 107 | + */ | |
| 108 | + @Schema(description = "通道个数") | |
| 109 | + private int channelCount; | |
| 110 | + | |
| 111 | + /** | |
| 112 | + * 注册有效期 | |
| 113 | + */ | |
| 114 | + @Schema(description = "注册有效期") | |
| 115 | + private int expires; | |
| 116 | + | |
| 117 | + /** | |
| 118 | + * 创建时间 | |
| 119 | + */ | |
| 120 | + @Schema(description = "创建时间") | |
| 121 | + private String createTime; | |
| 122 | + | |
| 123 | + /** | |
| 124 | + * 更新时间 | |
| 125 | + */ | |
| 126 | + @Schema(description = "更新时间") | |
| 127 | + private String updateTime; | |
| 128 | + | |
| 129 | + /** | |
| 130 | + * 设备使用的媒体id, 默认为null | |
| 131 | + */ | |
| 132 | + @Schema(description = "设备使用的媒体id, 默认为null") | |
| 133 | + private String mediaServerId; | |
| 134 | + | |
| 135 | + /** | |
| 136 | + * 字符集, 支持 UTF-8 与 GB2312 | |
| 137 | + */ | |
| 138 | + @Schema(description = "符集, 支持 UTF-8 与 GB2312") | |
| 139 | + private String charset; | |
| 140 | + | |
| 141 | + /** | |
| 142 | + * 目录订阅周期,0为不订阅 | |
| 143 | + */ | |
| 144 | + @Schema(description = "目录订阅周期,o为不订阅") | |
| 145 | + private int subscribeCycleForCatalog; | |
| 146 | + | |
| 147 | + /** | |
| 148 | + * 移动设备位置订阅周期,0为不订阅 | |
| 149 | + */ | |
| 150 | + @Schema(description = "移动设备位置订阅周期,0为不订阅") | |
| 151 | + private int subscribeCycleForMobilePosition; | |
| 152 | + | |
| 153 | + /** | |
| 154 | + * 移动设备位置信息上报时间间隔,单位:秒,默认值5 | |
| 155 | + */ | |
| 156 | + @Schema(description = "移动设备位置信息上报时间间隔,单位:秒,默认值5") | |
| 157 | + private int mobilePositionSubmissionInterval = 5; | |
| 158 | + | |
| 159 | + /** | |
| 160 | + * 报警订阅周期,0为不订阅 | |
| 161 | + */ | |
| 162 | + @Schema(description = "报警心跳时间订阅周期,0为不订阅") | |
| 163 | + private int subscribeCycleForAlarm; | |
| 164 | + | |
| 165 | + /** | |
| 166 | + * 是否开启ssrc校验,默认关闭,开启可以防止串流 | |
| 167 | + */ | |
| 168 | + @Schema(description = "是否开启ssrc校验,默认关闭,开启可以防止串流") | |
| 169 | + private boolean ssrcCheck = false; | |
| 170 | + | |
| 171 | + /** | |
| 172 | + * 地理坐标系, 目前支持 WGS84,GCJ02 | |
| 173 | + */ | |
| 174 | + @Schema(description = "地理坐标系, 目前支持 WGS84,GCJ02") | |
| 175 | + private String geoCoordSys; | |
| 176 | + | |
| 177 | + @Schema(description = "密码") | |
| 178 | + private String password; | |
| 179 | + | |
| 180 | + @Schema(description = "收流IP") | |
| 181 | + private String sdpIp; | |
| 182 | + | |
| 183 | + @Schema(description = "SIP交互IP(设备访问平台的IP)") | |
| 184 | + private String localIp; | |
| 185 | + | |
| 186 | + @Schema(description = "是否作为消息通道") | |
| 187 | + private boolean asMessageChannel; | |
| 188 | + | |
| 189 | + @Schema(description = "设备注册的事务信息") | |
| 190 | + private SipTransactionInfo sipTransactionInfo; | |
| 191 | + | |
| 192 | + @Schema(description = "控制语音对讲流程,释放收到ACK后发流") | |
| 193 | + private boolean broadcastPushAfterAck; | |
| 194 | + @Schema(description = "车辆编号") | |
| 195 | + private String carNo; | |
| 196 | + | |
| 197 | + public String getDeviceId() { | |
| 198 | + return deviceId; | |
| 199 | + } | |
| 275 | 200 | |
| 276 | - public void setPort(int port) { | |
| 277 | - this.port = port; | |
| 278 | - } | |
| 279 | - | |
| 280 | - public String getHostAddress() { | |
| 281 | - return hostAddress; | |
| 282 | - } | |
| 283 | - | |
| 284 | - public void setHostAddress(String hostAddress) { | |
| 285 | - this.hostAddress = hostAddress; | |
| 286 | - } | |
| 287 | - | |
| 288 | - public boolean isOnLine() { | |
| 289 | - return onLine; | |
| 290 | - } | |
| 291 | - | |
| 292 | - public void setOnLine(boolean onLine) { | |
| 293 | - this.onLine = onLine; | |
| 294 | - } | |
| 295 | - | |
| 296 | - public int getChannelCount() { | |
| 297 | - return channelCount; | |
| 298 | - } | |
| 299 | - | |
| 300 | - public void setChannelCount(int channelCount) { | |
| 301 | - this.channelCount = channelCount; | |
| 302 | - } | |
| 303 | - | |
| 304 | - public String getRegisterTime() { | |
| 305 | - return registerTime; | |
| 306 | - } | |
| 307 | - | |
| 308 | - public void setRegisterTime(String registerTime) { | |
| 309 | - this.registerTime = registerTime; | |
| 310 | - } | |
| 311 | - | |
| 312 | - public String getKeepaliveTime() { | |
| 313 | - return keepaliveTime; | |
| 314 | - } | |
| 315 | - | |
| 316 | - public void setKeepaliveTime(String keepaliveTime) { | |
| 317 | - this.keepaliveTime = keepaliveTime; | |
| 318 | - } | |
| 319 | - | |
| 320 | - public int getExpires() { | |
| 321 | - return expires; | |
| 322 | - } | |
| 323 | - | |
| 324 | - public void setExpires(int expires) { | |
| 325 | - this.expires = expires; | |
| 326 | - } | |
| 327 | - | |
| 328 | - public String getCreateTime() { | |
| 329 | - return createTime; | |
| 330 | - } | |
| 331 | - | |
| 332 | - public void setCreateTime(String createTime) { | |
| 333 | - this.createTime = createTime; | |
| 334 | - } | |
| 335 | - | |
| 336 | - public String getUpdateTime() { | |
| 337 | - return updateTime; | |
| 338 | - } | |
| 339 | - | |
| 340 | - public void setUpdateTime(String updateTime) { | |
| 341 | - this.updateTime = updateTime; | |
| 342 | - } | |
| 343 | - | |
| 344 | - public String getMediaServerId() { | |
| 345 | - return mediaServerId; | |
| 346 | - } | |
| 347 | - | |
| 348 | - public void setMediaServerId(String mediaServerId) { | |
| 349 | - this.mediaServerId = mediaServerId; | |
| 350 | - } | |
| 351 | - | |
| 352 | - public String getCharset() { | |
| 353 | - return charset; | |
| 354 | - } | |
| 355 | - | |
| 356 | - public void setCharset(String charset) { | |
| 357 | - this.charset = charset; | |
| 358 | - } | |
| 201 | + public void setDeviceId(String deviceId) { | |
| 202 | + this.deviceId = deviceId; | |
| 203 | + } | |
| 359 | 204 | |
| 360 | - public int getSubscribeCycleForCatalog() { | |
| 361 | - return subscribeCycleForCatalog; | |
| 362 | - } | |
| 205 | + public String getName() { | |
| 206 | + return name; | |
| 207 | + } | |
| 363 | 208 | |
| 364 | - public void setSubscribeCycleForCatalog(int subscribeCycleForCatalog) { | |
| 365 | - this.subscribeCycleForCatalog = subscribeCycleForCatalog; | |
| 366 | - } | |
| 209 | + public void setName(String name) { | |
| 210 | + this.name = name; | |
| 211 | + } | |
| 367 | 212 | |
| 368 | - public int getSubscribeCycleForMobilePosition() { | |
| 369 | - return subscribeCycleForMobilePosition; | |
| 370 | - } | |
| 213 | + public String getManufacturer() { | |
| 214 | + return manufacturer; | |
| 215 | + } | |
| 371 | 216 | |
| 372 | - public void setSubscribeCycleForMobilePosition(int subscribeCycleForMobilePosition) { | |
| 373 | - this.subscribeCycleForMobilePosition = subscribeCycleForMobilePosition; | |
| 374 | - } | |
| 217 | + public void setManufacturer(String manufacturer) { | |
| 218 | + this.manufacturer = manufacturer; | |
| 219 | + } | |
| 375 | 220 | |
| 376 | - public int getMobilePositionSubmissionInterval() { | |
| 377 | - return mobilePositionSubmissionInterval; | |
| 378 | - } | |
| 221 | + public String getModel() { | |
| 222 | + return model; | |
| 223 | + } | |
| 379 | 224 | |
| 380 | - public void setMobilePositionSubmissionInterval(int mobilePositionSubmissionInterval) { | |
| 381 | - this.mobilePositionSubmissionInterval = mobilePositionSubmissionInterval; | |
| 382 | - } | |
| 225 | + public void setModel(String model) { | |
| 226 | + this.model = model; | |
| 227 | + } | |
| 383 | 228 | |
| 384 | - public int getSubscribeCycleForAlarm() { | |
| 385 | - return subscribeCycleForAlarm; | |
| 386 | - } | |
| 229 | + public String getFirmware() { | |
| 230 | + return firmware; | |
| 231 | + } | |
| 387 | 232 | |
| 388 | - public void setSubscribeCycleForAlarm(int subscribeCycleForAlarm) { | |
| 389 | - this.subscribeCycleForAlarm = subscribeCycleForAlarm; | |
| 390 | - } | |
| 233 | + public void setFirmware(String firmware) { | |
| 234 | + this.firmware = firmware; | |
| 235 | + } | |
| 391 | 236 | |
| 392 | - public boolean isSsrcCheck() { | |
| 393 | - return ssrcCheck; | |
| 394 | - } | |
| 237 | + public String getTransport() { | |
| 238 | + return transport; | |
| 239 | + } | |
| 395 | 240 | |
| 396 | - public void setSsrcCheck(boolean ssrcCheck) { | |
| 397 | - this.ssrcCheck = ssrcCheck; | |
| 398 | - } | |
| 241 | + public void setTransport(String transport) { | |
| 242 | + this.transport = transport; | |
| 243 | + } | |
| 399 | 244 | |
| 400 | - public String getGeoCoordSys() { | |
| 401 | - return geoCoordSys; | |
| 402 | - } | |
| 245 | + public String getStreamMode() { | |
| 246 | + return streamMode; | |
| 247 | + } | |
| 403 | 248 | |
| 404 | - public void setGeoCoordSys(String geoCoordSys) { | |
| 405 | - this.geoCoordSys = geoCoordSys; | |
| 406 | - } | |
| 249 | + public Integer getStreamModeForParam() { | |
| 250 | + if (streamMode == null) { | |
| 251 | + return 0; | |
| 252 | + } | |
| 253 | + if (streamMode.equalsIgnoreCase("UDP")) { | |
| 254 | + return 0; | |
| 255 | + } else if (streamMode.equalsIgnoreCase("TCP-PASSIVE")) { | |
| 256 | + return 1; | |
| 257 | + } else if (streamMode.equalsIgnoreCase("TCP-ACTIVE")) { | |
| 258 | + return 2; | |
| 259 | + } | |
| 260 | + return 0; | |
| 261 | + } | |
| 407 | 262 | |
| 408 | - public String getPassword() { | |
| 409 | - return password; | |
| 410 | - } | |
| 263 | + public void setStreamMode(String streamMode) { | |
| 264 | + this.streamMode = streamMode; | |
| 265 | + } | |
| 411 | 266 | |
| 412 | - public void setPassword(String password) { | |
| 413 | - this.password = password; | |
| 414 | - } | |
| 267 | + public String getIp() { | |
| 268 | + return ip; | |
| 269 | + } | |
| 415 | 270 | |
| 416 | - public String getSdpIp() { | |
| 417 | - return sdpIp; | |
| 418 | - } | |
| 271 | + public void setIp(String ip) { | |
| 272 | + this.ip = ip; | |
| 273 | + } | |
| 419 | 274 | |
| 420 | - public void setSdpIp(String sdpIp) { | |
| 421 | - this.sdpIp = sdpIp; | |
| 422 | - } | |
| 275 | + public int getPort() { | |
| 276 | + return port; | |
| 277 | + } | |
| 423 | 278 | |
| 424 | - public String getLocalIp() { | |
| 425 | - return localIp; | |
| 426 | - } | |
| 279 | + public void setPort(int port) { | |
| 280 | + this.port = port; | |
| 281 | + } | |
| 427 | 282 | |
| 428 | - public void setLocalIp(String localIp) { | |
| 429 | - this.localIp = localIp; | |
| 430 | - } | |
| 283 | + public String getHostAddress() { | |
| 284 | + return hostAddress; | |
| 285 | + } | |
| 431 | 286 | |
| 432 | - public int getKeepaliveIntervalTime() { | |
| 433 | - return keepaliveIntervalTime; | |
| 434 | - } | |
| 287 | + public void setHostAddress(String hostAddress) { | |
| 288 | + this.hostAddress = hostAddress; | |
| 289 | + } | |
| 435 | 290 | |
| 436 | - public void setKeepaliveIntervalTime(int keepaliveIntervalTime) { | |
| 437 | - this.keepaliveIntervalTime = keepaliveIntervalTime; | |
| 438 | - } | |
| 291 | + public boolean isOnLine() { | |
| 292 | + return onLine; | |
| 293 | + } | |
| 294 | + | |
| 295 | + public void setOnLine(boolean onLine) { | |
| 296 | + this.onLine = onLine; | |
| 297 | + } | |
| 439 | 298 | |
| 440 | - public boolean isAsMessageChannel() { | |
| 441 | - return asMessageChannel; | |
| 442 | - } | |
| 299 | + public int getChannelCount() { | |
| 300 | + return channelCount; | |
| 301 | + } | |
| 443 | 302 | |
| 444 | - public void setAsMessageChannel(boolean asMessageChannel) { | |
| 445 | - this.asMessageChannel = asMessageChannel; | |
| 446 | - } | |
| 303 | + public void setChannelCount(int channelCount) { | |
| 304 | + this.channelCount = channelCount; | |
| 305 | + } | |
| 447 | 306 | |
| 448 | - public SipTransactionInfo getSipTransactionInfo() { | |
| 449 | - return sipTransactionInfo; | |
| 450 | - } | |
| 307 | + public String getRegisterTime() { | |
| 308 | + return registerTime; | |
| 309 | + } | |
| 310 | + | |
| 311 | + public void setRegisterTime(String registerTime) { | |
| 312 | + this.registerTime = registerTime; | |
| 313 | + } | |
| 314 | + | |
| 315 | + public String getKeepaliveTime() { | |
| 316 | + return keepaliveTime; | |
| 317 | + } | |
| 318 | + | |
| 319 | + public void setKeepaliveTime(String keepaliveTime) { | |
| 320 | + this.keepaliveTime = keepaliveTime; | |
| 321 | + } | |
| 322 | + | |
| 323 | + public int getExpires() { | |
| 324 | + return expires; | |
| 325 | + } | |
| 326 | + | |
| 327 | + public void setExpires(int expires) { | |
| 328 | + this.expires = expires; | |
| 329 | + } | |
| 330 | + | |
| 331 | + public String getCreateTime() { | |
| 332 | + return createTime; | |
| 333 | + } | |
| 334 | + | |
| 335 | + public void setCreateTime(String createTime) { | |
| 336 | + this.createTime = createTime; | |
| 337 | + } | |
| 338 | + | |
| 339 | + public String getUpdateTime() { | |
| 340 | + return updateTime; | |
| 341 | + } | |
| 342 | + | |
| 343 | + public void setUpdateTime(String updateTime) { | |
| 344 | + this.updateTime = updateTime; | |
| 345 | + } | |
| 346 | + | |
| 347 | + public String getMediaServerId() { | |
| 348 | + return mediaServerId; | |
| 349 | + } | |
| 350 | + | |
| 351 | + public void setMediaServerId(String mediaServerId) { | |
| 352 | + this.mediaServerId = mediaServerId; | |
| 353 | + } | |
| 354 | + | |
| 355 | + public String getCharset() { | |
| 356 | + return charset; | |
| 357 | + } | |
| 358 | + | |
| 359 | + public void setCharset(String charset) { | |
| 360 | + this.charset = charset; | |
| 361 | + } | |
| 362 | + | |
| 363 | + public int getSubscribeCycleForCatalog() { | |
| 364 | + return subscribeCycleForCatalog; | |
| 365 | + } | |
| 366 | + | |
| 367 | + public void setSubscribeCycleForCatalog(int subscribeCycleForCatalog) { | |
| 368 | + this.subscribeCycleForCatalog = subscribeCycleForCatalog; | |
| 369 | + } | |
| 370 | + | |
| 371 | + public int getSubscribeCycleForMobilePosition() { | |
| 372 | + return subscribeCycleForMobilePosition; | |
| 373 | + } | |
| 374 | + | |
| 375 | + public void setSubscribeCycleForMobilePosition(int subscribeCycleForMobilePosition) { | |
| 376 | + this.subscribeCycleForMobilePosition = subscribeCycleForMobilePosition; | |
| 377 | + } | |
| 378 | + | |
| 379 | + public int getMobilePositionSubmissionInterval() { | |
| 380 | + return mobilePositionSubmissionInterval; | |
| 381 | + } | |
| 382 | + | |
| 383 | + public void setMobilePositionSubmissionInterval(int mobilePositionSubmissionInterval) { | |
| 384 | + this.mobilePositionSubmissionInterval = mobilePositionSubmissionInterval; | |
| 385 | + } | |
| 386 | + | |
| 387 | + public int getSubscribeCycleForAlarm() { | |
| 388 | + return subscribeCycleForAlarm; | |
| 389 | + } | |
| 390 | + | |
| 391 | + public void setSubscribeCycleForAlarm(int subscribeCycleForAlarm) { | |
| 392 | + this.subscribeCycleForAlarm = subscribeCycleForAlarm; | |
| 393 | + } | |
| 394 | + | |
| 395 | + public boolean isSsrcCheck() { | |
| 396 | + return ssrcCheck; | |
| 397 | + } | |
| 398 | + | |
| 399 | + public void setSsrcCheck(boolean ssrcCheck) { | |
| 400 | + this.ssrcCheck = ssrcCheck; | |
| 401 | + } | |
| 402 | + | |
| 403 | + public String getGeoCoordSys() { | |
| 404 | + return geoCoordSys; | |
| 405 | + } | |
| 406 | + | |
| 407 | + public void setGeoCoordSys(String geoCoordSys) { | |
| 408 | + this.geoCoordSys = geoCoordSys; | |
| 409 | + } | |
| 410 | + | |
| 411 | + public String getPassword() { | |
| 412 | + return password; | |
| 413 | + } | |
| 414 | + | |
| 415 | + public void setPassword(String password) { | |
| 416 | + this.password = password; | |
| 417 | + } | |
| 418 | + | |
| 419 | + public String getSdpIp() { | |
| 420 | + return sdpIp; | |
| 421 | + } | |
| 422 | + | |
| 423 | + public void setSdpIp(String sdpIp) { | |
| 424 | + this.sdpIp = sdpIp; | |
| 425 | + } | |
| 426 | + | |
| 427 | + public String getLocalIp() { | |
| 428 | + return localIp; | |
| 429 | + } | |
| 430 | + | |
| 431 | + public void setLocalIp(String localIp) { | |
| 432 | + this.localIp = localIp; | |
| 433 | + } | |
| 434 | + | |
| 435 | + public int getKeepaliveIntervalTime() { | |
| 436 | + return keepaliveIntervalTime; | |
| 437 | + } | |
| 438 | + | |
| 439 | + public void setKeepaliveIntervalTime(int keepaliveIntervalTime) { | |
| 440 | + this.keepaliveIntervalTime = keepaliveIntervalTime; | |
| 441 | + } | |
| 442 | + | |
| 443 | + public boolean isAsMessageChannel() { | |
| 444 | + return asMessageChannel; | |
| 445 | + } | |
| 446 | + | |
| 447 | + public void setAsMessageChannel(boolean asMessageChannel) { | |
| 448 | + this.asMessageChannel = asMessageChannel; | |
| 449 | + } | |
| 450 | + | |
| 451 | + public SipTransactionInfo getSipTransactionInfo() { | |
| 452 | + return sipTransactionInfo; | |
| 453 | + } | |
| 454 | + | |
| 455 | + public void setSipTransactionInfo(SipTransactionInfo sipTransactionInfo) { | |
| 456 | + this.sipTransactionInfo = sipTransactionInfo; | |
| 457 | + } | |
| 451 | 458 | |
| 452 | - public void setSipTransactionInfo(SipTransactionInfo sipTransactionInfo) { | |
| 453 | - this.sipTransactionInfo = sipTransactionInfo; | |
| 454 | - } | |
| 455 | 459 | public boolean isBroadcastPushAfterAck() { |
| 456 | 460 | return broadcastPushAfterAck; |
| 457 | 461 | } |
| ... | ... | @@ -459,4 +463,12 @@ public class Device { |
| 459 | 463 | public void setBroadcastPushAfterAck(boolean broadcastPushAfterAck) { |
| 460 | 464 | this.broadcastPushAfterAck = broadcastPushAfterAck; |
| 461 | 465 | } |
| 466 | + | |
| 467 | + public String getCarNo() { | |
| 468 | + return carNo; | |
| 469 | + } | |
| 470 | + | |
| 471 | + public void setCarNo(String carNo) { | |
| 472 | + this.carNo = carNo; | |
| 473 | + } | |
| 462 | 474 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
| ... | ... | @@ -28,6 +28,7 @@ import com.genersoft.iot.vmp.storager.dao.PlatformChannelMapper; |
| 28 | 28 | import com.genersoft.iot.vmp.utils.DateUtil; |
| 29 | 29 | import com.genersoft.iot.vmp.vmanager.bean.BaseTree; |
| 30 | 30 | import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo; |
| 31 | +import org.apache.commons.lang3.StringUtils; | |
| 31 | 32 | import org.slf4j.Logger; |
| 32 | 33 | import org.slf4j.LoggerFactory; |
| 33 | 34 | import org.springframework.beans.factory.annotation.Autowired; |
| ... | ... | @@ -35,6 +36,7 @@ import org.springframework.jdbc.datasource.DataSourceTransactionManager; |
| 35 | 36 | import org.springframework.stereotype.Service; |
| 36 | 37 | import org.springframework.transaction.TransactionDefinition; |
| 37 | 38 | import org.springframework.transaction.TransactionStatus; |
| 39 | +import org.springframework.util.CollectionUtils; | |
| 38 | 40 | import org.springframework.util.ObjectUtils; |
| 39 | 41 | |
| 40 | 42 | import javax.sip.InvalidArgumentException; |
| ... | ... | @@ -43,6 +45,7 @@ import java.text.ParseException; |
| 43 | 45 | import java.time.Instant; |
| 44 | 46 | import java.util.*; |
| 45 | 47 | import java.util.concurrent.TimeUnit; |
| 48 | +import java.util.stream.Collectors; | |
| 46 | 49 | |
| 47 | 50 | /** |
| 48 | 51 | * 设备业务(目录订阅) |
| ... | ... | @@ -125,7 +128,7 @@ public class DeviceServiceImpl implements IDeviceService { |
| 125 | 128 | } |
| 126 | 129 | if (sipTransactionInfo != null) { |
| 127 | 130 | device.setSipTransactionInfo(sipTransactionInfo); |
| 128 | - }else { | |
| 131 | + } else { | |
| 129 | 132 | if (deviceInRedis != null) { |
| 130 | 133 | device.setSipTransactionInfo(deviceInRedis.getSipTransactionInfo()); |
| 131 | 134 | } |
| ... | ... | @@ -145,8 +148,8 @@ public class DeviceServiceImpl implements IDeviceService { |
| 145 | 148 | logger.error("[命令发送失败] 查询设备信息: {}", e.getMessage()); |
| 146 | 149 | } |
| 147 | 150 | sync(device); |
| 148 | - }else { | |
| 149 | - if(!device.isOnLine()){ | |
| 151 | + } else { | |
| 152 | + if (!device.isOnLine()) { | |
| 150 | 153 | device.setOnLine(true); |
| 151 | 154 | device.setCreateTime(now); |
| 152 | 155 | deviceMapper.update(device); |
| ... | ... | @@ -174,7 +177,7 @@ public class DeviceServiceImpl implements IDeviceService { |
| 174 | 177 | redisCatchStorage.sendDeviceOrChannelStatus(device.getDeviceId(), null, true); |
| 175 | 178 | } |
| 176 | 179 | |
| 177 | - }else { | |
| 180 | + } else { | |
| 178 | 181 | if (deviceChannelMapper.queryAllChannels(device.getDeviceId()).size() == 0) { |
| 179 | 182 | logger.info("[设备上线]: {},通道数为0,查询通道信息", device.getDeviceId()); |
| 180 | 183 | sync(device); |
| ... | ... | @@ -189,7 +192,7 @@ public class DeviceServiceImpl implements IDeviceService { |
| 189 | 192 | // 刷新过期任务 |
| 190 | 193 | String registerExpireTaskKey = VideoManagerConstants.REGISTER_EXPIRE_TASK_KEY_PREFIX + device.getDeviceId(); |
| 191 | 194 | // 如果第一次注册那么必须在60 * 3时间内收到一个心跳,否则设备离线 |
| 192 | - dynamicTask.startDelay(registerExpireTaskKey, ()-> offline(device.getDeviceId(), "首次注册后未能收到心跳"), device.getKeepaliveIntervalTime() * 1000 * 3); | |
| 195 | + dynamicTask.startDelay(registerExpireTaskKey, () -> offline(device.getDeviceId(), "首次注册后未能收到心跳"), device.getKeepaliveIntervalTime() * 1000 * 3); | |
| 193 | 196 | |
| 194 | 197 | // |
| 195 | 198 | // try { |
| ... | ... | @@ -267,9 +270,9 @@ public class DeviceServiceImpl implements IDeviceService { |
| 267 | 270 | // 添加目录订阅 |
| 268 | 271 | CatalogSubscribeTask catalogSubscribeTask = new CatalogSubscribeTask(device, sipCommander, dynamicTask); |
| 269 | 272 | // 刷新订阅 |
| 270 | - int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForCatalog(),30); | |
| 273 | + int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForCatalog(), 30); | |
| 271 | 274 | // 设置最小值为30 |
| 272 | - dynamicTask.startCron(device.getDeviceId() + "catalog", catalogSubscribeTask, (subscribeCycleForCatalog -1) * 1000); | |
| 275 | + dynamicTask.startCron(device.getDeviceId() + "catalog", catalogSubscribeTask, (subscribeCycleForCatalog - 1) * 1000); | |
| 273 | 276 | |
| 274 | 277 | catalogSubscribeTask.run(); |
| 275 | 278 | return true; |
| ... | ... | @@ -302,9 +305,9 @@ public class DeviceServiceImpl implements IDeviceService { |
| 302 | 305 | // 添加目录订阅 |
| 303 | 306 | MobilePositionSubscribeTask mobilePositionSubscribeTask = new MobilePositionSubscribeTask(device, sipCommander, dynamicTask); |
| 304 | 307 | // 设置最小值为30 |
| 305 | - int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForMobilePosition(),30); | |
| 308 | + int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForMobilePosition(), 30); | |
| 306 | 309 | // 刷新订阅 |
| 307 | - dynamicTask.startCron(device.getDeviceId() + "mobile_position" , mobilePositionSubscribeTask, subscribeCycleForCatalog * 1000); | |
| 310 | + dynamicTask.startCron(device.getDeviceId() + "mobile_position", mobilePositionSubscribeTask, subscribeCycleForCatalog * 1000); | |
| 308 | 311 | mobilePositionSubscribeTask.run(); |
| 309 | 312 | return true; |
| 310 | 313 | } |
| ... | ... | @@ -343,7 +346,7 @@ public class DeviceServiceImpl implements IDeviceService { |
| 343 | 346 | logger.info("开启同步时发现同步已经存在"); |
| 344 | 347 | return; |
| 345 | 348 | } |
| 346 | - int sn = (int)((Math.random()*9+1)*100000); | |
| 349 | + int sn = (int) ((Math.random() * 9 + 1) * 100000); | |
| 347 | 350 | catalogResponseMessageHandler.setChannelSyncReady(device, sn); |
| 348 | 351 | try { |
| 349 | 352 | sipCommander.catalogQuery(device, sn, event -> { |
| ... | ... | @@ -351,7 +354,7 @@ public class DeviceServiceImpl implements IDeviceService { |
| 351 | 354 | catalogResponseMessageHandler.setChannelSyncEnd(device.getDeviceId(), errorMsg); |
| 352 | 355 | }); |
| 353 | 356 | } catch (SipException | InvalidArgumentException | ParseException e) { |
| 354 | - logger.error("[同步通道], 信令发送失败:{}", e.getMessage() ); | |
| 357 | + logger.error("[同步通道], 信令发送失败:{}", e.getMessage()); | |
| 355 | 358 | String errorMsg = String.format("同步通道失败,信令发送失败: %s", e.getMessage()); |
| 356 | 359 | catalogResponseMessageHandler.setChannelSyncEnd(device.getDeviceId(), errorMsg); |
| 357 | 360 | } |
| ... | ... | @@ -415,14 +418,14 @@ public class DeviceServiceImpl implements IDeviceService { |
| 415 | 418 | * 更新通道坐标系 |
| 416 | 419 | */ |
| 417 | 420 | private void updateDeviceChannelGeoCoordSys(Device device) { |
| 418 | - List<DeviceChannel> deviceChannels = deviceChannelMapper.getAllChannelWithCoordinate(device.getDeviceId()); | |
| 419 | - if (deviceChannels.size() > 0) { | |
| 420 | - List<DeviceChannel> deviceChannelsForStore = new ArrayList<>(); | |
| 421 | - for (DeviceChannel deviceChannel : deviceChannels) { | |
| 422 | - deviceChannelsForStore.add(deviceChannelService.updateGps(deviceChannel, device)); | |
| 423 | - } | |
| 424 | - deviceChannelService.updateChannels(device.getDeviceId(), deviceChannelsForStore); | |
| 425 | - } | |
| 421 | + List<DeviceChannel> deviceChannels = deviceChannelMapper.getAllChannelWithCoordinate(device.getDeviceId()); | |
| 422 | + if (deviceChannels.size() > 0) { | |
| 423 | + List<DeviceChannel> deviceChannelsForStore = new ArrayList<>(); | |
| 424 | + for (DeviceChannel deviceChannel : deviceChannels) { | |
| 425 | + deviceChannelsForStore.add(deviceChannelService.updateGps(deviceChannel, device)); | |
| 426 | + } | |
| 427 | + deviceChannelService.updateChannels(device.getDeviceId(), deviceChannelsForStore); | |
| 428 | + } | |
| 426 | 429 | } |
| 427 | 430 | |
| 428 | 431 | |
| ... | ... | @@ -432,7 +435,7 @@ public class DeviceServiceImpl implements IDeviceService { |
| 432 | 435 | if (device == null) { |
| 433 | 436 | return null; |
| 434 | 437 | } |
| 435 | - if (ObjectUtils.isEmpty(parentId) ) { | |
| 438 | + if (ObjectUtils.isEmpty(parentId)) { | |
| 436 | 439 | parentId = deviceId; |
| 437 | 440 | } |
| 438 | 441 | List<DeviceChannel> rootNodes = deviceChannelMapper.getSubChannelsByDeviceId(deviceId, parentId, onlyCatalog); |
| ... | ... | @@ -447,7 +450,7 @@ public class DeviceServiceImpl implements IDeviceService { |
| 447 | 450 | } |
| 448 | 451 | if (ObjectUtils.isEmpty(parentId) || parentId.equals(deviceId)) { |
| 449 | 452 | return deviceChannelMapper.getSubChannelsByDeviceId(deviceId, null, false); |
| 450 | - }else { | |
| 453 | + } else { | |
| 451 | 454 | return deviceChannelMapper.getSubChannelsByDeviceId(deviceId, parentId, false); |
| 452 | 455 | } |
| 453 | 456 | } |
| ... | ... | @@ -471,16 +474,16 @@ public class DeviceServiceImpl implements IDeviceService { |
| 471 | 474 | node.setParent(false); |
| 472 | 475 | if (channel.getChannelId().length() <= 8) { |
| 473 | 476 | node.setParent(true); |
| 474 | - }else { | |
| 477 | + } else { | |
| 475 | 478 | if (channel.getChannelId().length() != 20) { |
| 476 | 479 | node.setParent(channel.getParental() == 1); |
| 477 | - }else { | |
| 480 | + } else { | |
| 478 | 481 | try { |
| 479 | 482 | int type = Integer.parseInt(channel.getChannelId().substring(10, 13)); |
| 480 | 483 | if (type == 215 || type == 216 || type == 200) { |
| 481 | 484 | node.setParent(true); |
| 482 | 485 | } |
| 483 | - }catch (NumberFormatException e) { | |
| 486 | + } catch (NumberFormatException e) { | |
| 484 | 487 | node.setParent(false); |
| 485 | 488 | } |
| 486 | 489 | } |
| ... | ... | @@ -533,6 +536,10 @@ public class DeviceServiceImpl implements IDeviceService { |
| 533 | 536 | if (!ObjectUtils.isEmpty(device.getStreamMode())) { |
| 534 | 537 | deviceInStore.setStreamMode(device.getStreamMode()); |
| 535 | 538 | } |
| 539 | + | |
| 540 | + if (!ObjectUtils.isEmpty(device.getCarNo())) { | |
| 541 | + deviceInStore.setCarNo(device.getCarNo()); | |
| 542 | + } | |
| 536 | 543 | // 事件订阅相关的信息 |
| 537 | 544 | if (deviceInStore.getSubscribeCycleForAlarm() != device.getSubscribeCycleForAlarm()) { |
| 538 | 545 | if (device.getSubscribeCycleForAlarm() > 0) { |
| ... | ... | @@ -555,7 +562,7 @@ public class DeviceServiceImpl implements IDeviceService { |
| 555 | 562 | if (device.getSubscribeCycleForCatalog() > 0) { |
| 556 | 563 | // 若已开启订阅,但订阅周期不同,则先取消 |
| 557 | 564 | if (deviceInStore.getSubscribeCycleForCatalog() != 0) { |
| 558 | - removeCatalogSubscribe(deviceInStore, result->{ | |
| 565 | + removeCatalogSubscribe(deviceInStore, result -> { | |
| 559 | 566 | // 开启订阅 |
| 560 | 567 | deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); |
| 561 | 568 | addCatalogSubscribe(deviceInStore); |
| ... | ... | @@ -563,13 +570,13 @@ public class DeviceServiceImpl implements IDeviceService { |
| 563 | 570 | deviceMapper.updateCustom(deviceInStore); |
| 564 | 571 | redisCatchStorage.updateDevice(deviceInStore); |
| 565 | 572 | }); |
| 566 | - }else { | |
| 573 | + } else { | |
| 567 | 574 | // 开启订阅 |
| 568 | 575 | deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); |
| 569 | 576 | addCatalogSubscribe(deviceInStore); |
| 570 | 577 | } |
| 571 | 578 | |
| 572 | - }else if (device.getSubscribeCycleForCatalog() == 0) { | |
| 579 | + } else if (device.getSubscribeCycleForCatalog() == 0) { | |
| 573 | 580 | // 取消订阅 |
| 574 | 581 | deviceInStore.setSubscribeCycleForCatalog(0); |
| 575 | 582 | removeCatalogSubscribe(deviceInStore, null); |
| ... | ... | @@ -580,7 +587,7 @@ public class DeviceServiceImpl implements IDeviceService { |
| 580 | 587 | if (device.getSubscribeCycleForMobilePosition() > 0) { |
| 581 | 588 | // 若已开启订阅,但订阅周期不同,则先取消 |
| 582 | 589 | if (deviceInStore.getSubscribeCycleForMobilePosition() != 0) { |
| 583 | - removeMobilePositionSubscribe(deviceInStore, result->{ | |
| 590 | + removeMobilePositionSubscribe(deviceInStore, result -> { | |
| 584 | 591 | // 开启订阅 |
| 585 | 592 | deviceInStore.setSubscribeCycleForMobilePosition(device.getSubscribeCycleForMobilePosition()); |
| 586 | 593 | addMobilePositionSubscribe(deviceInStore); |
| ... | ... | @@ -588,13 +595,13 @@ public class DeviceServiceImpl implements IDeviceService { |
| 588 | 595 | deviceMapper.updateCustom(deviceInStore); |
| 589 | 596 | redisCatchStorage.updateDevice(deviceInStore); |
| 590 | 597 | }); |
| 591 | - }else { | |
| 598 | + } else { | |
| 592 | 599 | // 开启订阅 |
| 593 | 600 | deviceInStore.setSubscribeCycleForMobilePosition(device.getSubscribeCycleForMobilePosition()); |
| 594 | 601 | addMobilePositionSubscribe(deviceInStore); |
| 595 | 602 | } |
| 596 | 603 | |
| 597 | - }else if (device.getSubscribeCycleForMobilePosition() == 0) { | |
| 604 | + } else if (device.getSubscribeCycleForMobilePosition() == 0) { | |
| 598 | 605 | // 取消订阅 |
| 599 | 606 | deviceInStore.setSubscribeCycleForMobilePosition(0); |
| 600 | 607 | removeMobilePositionSubscribe(deviceInStore, null); |
| ... | ... | @@ -606,7 +613,7 @@ public class DeviceServiceImpl implements IDeviceService { |
| 606 | 613 | deviceInStore.setGeoCoordSys(device.getGeoCoordSys()); |
| 607 | 614 | updateDeviceChannelGeoCoordSys(deviceInStore); |
| 608 | 615 | } |
| 609 | - }else { | |
| 616 | + } else { | |
| 610 | 617 | deviceInStore.setGeoCoordSys("WGS84"); |
| 611 | 618 | } |
| 612 | 619 | if (device.getCharset() == null) { |
| ... | ... | @@ -628,13 +635,13 @@ public class DeviceServiceImpl implements IDeviceService { |
| 628 | 635 | try { |
| 629 | 636 | platformChannelMapper.delChannelForDeviceId(deviceId); |
| 630 | 637 | deviceChannelMapper.cleanChannelsByDeviceId(deviceId); |
| 631 | - if ( deviceMapper.del(deviceId) < 0 ) { | |
| 638 | + if (deviceMapper.del(deviceId) < 0) { | |
| 632 | 639 | //事务回滚 |
| 633 | 640 | dataSourceTransactionManager.rollback(transactionStatus); |
| 634 | 641 | } |
| 635 | 642 | result = true; |
| 636 | 643 | dataSourceTransactionManager.commit(transactionStatus); //手动提交 |
| 637 | - }catch (Exception e) { | |
| 644 | + } catch (Exception e) { | |
| 638 | 645 | dataSourceTransactionManager.rollback(transactionStatus); |
| 639 | 646 | } |
| 640 | 647 | if (result) { |
| ... | ... | @@ -689,5 +696,19 @@ public class DeviceServiceImpl implements IDeviceService { |
| 689 | 696 | return true; |
| 690 | 697 | } |
| 691 | 698 | |
| 699 | + @Override | |
| 700 | + public List<DeviceChannel> queryDeviceChannelByCarNo(String carNO) { | |
| 701 | + if (StringUtils.isEmpty(carNO)) { | |
| 702 | + return Collections.emptyList(); | |
| 703 | + } | |
| 704 | + List<Device> devices = deviceMapper.queryDeviceByCarNo(carNO); | |
| 705 | + if (CollectionUtils.isEmpty(devices)) { | |
| 706 | + return Collections.emptyList(); | |
| 707 | + } | |
| 708 | + | |
| 709 | + Set<String> deviceIds = devices.stream().map(Device::getDeviceId).collect(Collectors.toSet()); | |
| 710 | + return deviceChannelMapper.querySubChannelsByDeviceIds(deviceIds); | |
| 711 | + } | |
| 712 | + | |
| 692 | 713 | |
| 693 | 714 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/UserServiceImpl.java
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
| ... | ... | @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.web.gb28181.dto.DeviceChannelExtend; |
| 8 | 8 | import org.apache.ibatis.annotations.*; |
| 9 | 9 | import org.springframework.stereotype.Repository; |
| 10 | 10 | |
| 11 | +import java.util.Collection; | |
| 11 | 12 | import java.util.List; |
| 12 | 13 | |
| 13 | 14 | /** |
| ... | ... | @@ -550,4 +551,50 @@ public interface DeviceChannelMapper { |
| 550 | 551 | " <if test='channelId != null'> and channel_id = #{channelId} </if>" + |
| 551 | 552 | "</script>") |
| 552 | 553 | void updateChannelStreamIdentification(DeviceChannel channel); |
| 554 | + | |
| 555 | + | |
| 556 | + @Select(value = {" <script>" + | |
| 557 | + "SELECT id,\n" + | |
| 558 | + " channel_id as channelId,\n" + | |
| 559 | + " COALESCE(custom_name, name) AS name,\n" + | |
| 560 | + " custom_name,\n" + | |
| 561 | + " manufacture,\n" + | |
| 562 | + " model,\n" + | |
| 563 | + " owner,\n" + | |
| 564 | + " civil_code,\n" + | |
| 565 | + " block,\n" + | |
| 566 | + " address,\n" + | |
| 567 | + " parent_id,\n" + | |
| 568 | + " safety_way,\n" + | |
| 569 | + " register_way,\n" + | |
| 570 | + " cert_num,\n" + | |
| 571 | + " certifiable,\n" + | |
| 572 | + " err_code,\n" + | |
| 573 | + " end_time,\n" + | |
| 574 | + " secrecy,\n" + | |
| 575 | + " ip_address,\n" + | |
| 576 | + " port,\n" + | |
| 577 | + " password,\n" + | |
| 578 | + " COALESCE(custom_ptz_type, ptz_type) AS ptz_type,\n" + | |
| 579 | + " status,\n" + | |
| 580 | + " COALESCE(custom_longitude, longitude) AS longitude,\n" + | |
| 581 | + " COALESCE(custom_latitude, latitude) AS latitude,\n" + | |
| 582 | + " stream_id,\n" + | |
| 583 | + " device_id,\n" + | |
| 584 | + " parental,\n" + | |
| 585 | + " has_audio,\n" + | |
| 586 | + " create_time,\n" + | |
| 587 | + " update_time,\n" + | |
| 588 | + " sub_count,\n" + | |
| 589 | + " longitude_gcj02,\n" + | |
| 590 | + " latitude_gcj02,\n" + | |
| 591 | + " longitude_wgs84,\n" + | |
| 592 | + " latitude_wgs84,\n" + | |
| 593 | + " business_group_id,\n" + | |
| 594 | + " gps_time\n" + | |
| 595 | + "from wvp_device_channel " + | |
| 596 | + "where device_id in " + | |
| 597 | + "<foreach collection='deviceIds' item='item' open='(' separator=',' close=')' > #{item}</foreach>" + | |
| 598 | + " </script>"}) | |
| 599 | + List<DeviceChannel> querySubChannelsByDeviceIds(@Param("deviceIds") Collection<String> deviceIds); | |
| 553 | 600 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
| ... | ... | @@ -255,6 +255,7 @@ public interface DeviceMapper { |
| 255 | 255 | "<if test=\"broadcastPushAfterAck != null\">, broadcast_push_after_ack=#{broadcastPushAfterAck}</if>" + |
| 256 | 256 | "<if test=\"geoCoordSys != null\">, geo_coord_sys=#{geoCoordSys}</if>" + |
| 257 | 257 | "<if test=\"mediaServerId != null\">, media_server_id=#{mediaServerId}</if>" + |
| 258 | + "<if test=\"carNo != null\">, car_No=#{carNo}</if>" + | |
| 258 | 259 | "WHERE device_id=#{deviceId}"+ |
| 259 | 260 | " </script>"}) |
| 260 | 261 | void updateCustom(Device device); |
| ... | ... | @@ -272,7 +273,8 @@ public interface DeviceMapper { |
| 272 | 273 | "broadcast_push_after_ack,"+ |
| 273 | 274 | "geo_coord_sys,"+ |
| 274 | 275 | "on_line,"+ |
| 275 | - "media_server_id"+ | |
| 276 | + "media_server_id,"+ | |
| 277 | + "car_No"+ | |
| 276 | 278 | ") VALUES (" + |
| 277 | 279 | "#{deviceId}," + |
| 278 | 280 | "#{name}," + |
| ... | ... | @@ -286,7 +288,8 @@ public interface DeviceMapper { |
| 286 | 288 | "#{broadcastPushAfterAck}," + |
| 287 | 289 | "#{geoCoordSys}," + |
| 288 | 290 | "#{onLine}," + |
| 289 | - "#{mediaServerId}" + | |
| 291 | + "#{mediaServerId}," + | |
| 292 | + "#{carNo}" + | |
| 290 | 293 | ")") |
| 291 | 294 | void addCustomDevice(Device device); |
| 292 | 295 | |
| ... | ... | @@ -295,4 +298,7 @@ public interface DeviceMapper { |
| 295 | 298 | |
| 296 | 299 | @Select("select * FROM wvp_device where as_message_channel = true") |
| 297 | 300 | List<Device> queryDeviceWithAsMessageChannel(); |
| 301 | + | |
| 302 | + @Select("select * FROM wvp_device where car_No = #{carNo}") | |
| 303 | + List<Device> queryDeviceByCarNo(@Param("carNo") String carNo); | |
| 298 | 304 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
| ... | ... | @@ -49,538 +49,562 @@ import java.nio.file.Files; |
| 49 | 49 | import java.text.ParseException; |
| 50 | 50 | import java.util.*; |
| 51 | 51 | |
| 52 | -@Tag(name = "国标设备查询", description = "国标设备查询") | |
| 52 | +@Tag(name = "国标设备查询", description = "国标设备查询") | |
| 53 | 53 | @SuppressWarnings("rawtypes") |
| 54 | 54 | |
| 55 | 55 | @RestController |
| 56 | 56 | @RequestMapping("/api/device/query") |
| 57 | 57 | public class DeviceQuery { |
| 58 | - | |
| 59 | - private final static Logger logger = LoggerFactory.getLogger(DeviceQuery.class); | |
| 60 | - | |
| 61 | - @Autowired | |
| 62 | - private IVideoManagerStorage storager; | |
| 63 | - | |
| 64 | - @Autowired | |
| 65 | - private IDeviceChannelService deviceChannelService; | |
| 66 | - | |
| 67 | - @Autowired | |
| 68 | - private IRedisCatchStorage redisCatchStorage; | |
| 69 | - | |
| 70 | - @Autowired | |
| 71 | - private IInviteStreamService inviteStreamService; | |
| 72 | - | |
| 73 | - @Autowired | |
| 74 | - private SIPCommander cmder; | |
| 75 | - | |
| 76 | - @Autowired | |
| 77 | - private DeferredResultHolder resultHolder; | |
| 78 | - | |
| 79 | - @Autowired | |
| 80 | - private IDeviceService deviceService; | |
| 81 | - | |
| 82 | - @Autowired | |
| 83 | - private DynamicTask dynamicTask; | |
| 84 | - | |
| 85 | - /** | |
| 86 | - * 使用ID查询国标设备 | |
| 87 | - * @param deviceId 国标ID | |
| 88 | - * @return 国标设备 | |
| 89 | - */ | |
| 90 | - @Operation(summary = "查询国标设备", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 91 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 92 | - @GetMapping("/devices/{deviceId}") | |
| 93 | - public Device devices(@PathVariable String deviceId){ | |
| 94 | - | |
| 95 | - return storager.queryVideoDevice(deviceId); | |
| 96 | - } | |
| 97 | - | |
| 98 | - /** | |
| 99 | - * 分页查询国标设备 | |
| 100 | - * @param page 当前页 | |
| 101 | - * @param count 每页查询数量 | |
| 102 | - * @return 分页国标列表 | |
| 103 | - */ | |
| 104 | - @Operation(summary = "分页查询国标设备", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 105 | - @Parameter(name = "page", description = "当前页", required = true) | |
| 106 | - @Parameter(name = "count", description = "每页查询数量", required = true) | |
| 107 | - @GetMapping("/devices") | |
| 108 | - @Options() | |
| 109 | - public PageInfo<Device> devices(int page, int count){ | |
| 58 | + | |
| 59 | + private final static Logger logger = LoggerFactory.getLogger(DeviceQuery.class); | |
| 60 | + | |
| 61 | + @Autowired | |
| 62 | + private IVideoManagerStorage storager; | |
| 63 | + | |
| 64 | + @Autowired | |
| 65 | + private IDeviceChannelService deviceChannelService; | |
| 66 | + | |
| 67 | + @Autowired | |
| 68 | + private IRedisCatchStorage redisCatchStorage; | |
| 69 | + | |
| 70 | + @Autowired | |
| 71 | + private IInviteStreamService inviteStreamService; | |
| 72 | + | |
| 73 | + @Autowired | |
| 74 | + private SIPCommander cmder; | |
| 75 | + | |
| 76 | + @Autowired | |
| 77 | + private DeferredResultHolder resultHolder; | |
| 78 | + | |
| 79 | + @Autowired | |
| 80 | + private IDeviceService deviceService; | |
| 81 | + | |
| 82 | + @Autowired | |
| 83 | + private DynamicTask dynamicTask; | |
| 84 | + | |
| 85 | + /** | |
| 86 | + * 使用ID查询国标设备 | |
| 87 | + * | |
| 88 | + * @param deviceId 国标ID | |
| 89 | + * @return 国标设备 | |
| 90 | + */ | |
| 91 | + @Operation(summary = "查询国标设备", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 92 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 93 | + @GetMapping("/devices/{deviceId}") | |
| 94 | + public Device devices(@PathVariable String deviceId) { | |
| 95 | + | |
| 96 | + return storager.queryVideoDevice(deviceId); | |
| 97 | + } | |
| 98 | + | |
| 99 | + /** | |
| 100 | + * 分页查询国标设备 | |
| 101 | + * | |
| 102 | + * @param page 当前页 | |
| 103 | + * @param count 每页查询数量 | |
| 104 | + * @return 分页国标列表 | |
| 105 | + */ | |
| 106 | + @Operation(summary = "分页查询国标设备", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 107 | + @Parameter(name = "page", description = "当前页", required = true) | |
| 108 | + @Parameter(name = "count", description = "每页查询数量", required = true) | |
| 109 | + @GetMapping("/devices") | |
| 110 | + @Options() | |
| 111 | + public PageInfo<Device> devices(int page, int count) { | |
| 110 | 112 | // if (page == null) page = 0; |
| 111 | 113 | // if (count == null) count = 20; |
| 112 | - return storager.queryVideoDeviceList(page, count,null); | |
| 113 | - } | |
| 114 | - | |
| 115 | - /** | |
| 116 | - * 分页查询通道数 | |
| 117 | - * | |
| 118 | - * @param deviceId 设备id | |
| 119 | - * @param page 当前页 | |
| 120 | - * @param count 每页条数 | |
| 121 | - * @param query 查询内容 | |
| 122 | - * @param online 是否在线 在线 true / 离线 false | |
| 123 | - * @param channelType 设备 false/子目录 true | |
| 124 | - * @param catalogUnderDevice 是否直属与设备的目录 | |
| 125 | - * @return 通道列表 | |
| 126 | - */ | |
| 127 | - @GetMapping("/devices/{deviceId}/channels") | |
| 128 | - @Operation(summary = "分页查询通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 129 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 130 | - @Parameter(name = "page", description = "当前页", required = true) | |
| 131 | - @Parameter(name = "count", description = "每页查询数量", required = true) | |
| 132 | - @Parameter(name = "query", description = "查询内容") | |
| 133 | - @Parameter(name = "online", description = "是否在线") | |
| 134 | - @Parameter(name = "channelType", description = "设备/子目录-> false/true") | |
| 135 | - @Parameter(name = "catalogUnderDevice", description = "是否直属与设备的目录") | |
| 136 | - public PageInfo<DeviceChannel> channels(@PathVariable String deviceId, | |
| 137 | - int page, int count, | |
| 138 | - @RequestParam(required = false) String query, | |
| 139 | - @RequestParam(required = false) Boolean online, | |
| 140 | - @RequestParam(required = false) Boolean channelType, | |
| 141 | - @RequestParam(required = false) Boolean catalogUnderDevice) { | |
| 142 | - if (ObjectUtils.isEmpty(query)) { | |
| 143 | - query = null; | |
| 144 | - } | |
| 145 | - | |
| 146 | - return storager.queryChannelsByDeviceId(deviceId, query, channelType, online, catalogUnderDevice, page, count); | |
| 147 | - } | |
| 148 | - | |
| 149 | - /** | |
| 150 | - * 同步设备通道 | |
| 151 | - * @param deviceId 设备id | |
| 152 | - * @return | |
| 153 | - */ | |
| 154 | - @Operation(summary = "同步设备通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 155 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 156 | - @GetMapping("/devices/{deviceId}/sync") | |
| 157 | - public WVPResult<SyncStatus> devicesSync(@PathVariable String deviceId){ | |
| 158 | - | |
| 159 | - if (logger.isDebugEnabled()) { | |
| 160 | - logger.debug("设备通道信息同步API调用,deviceId:" + deviceId); | |
| 161 | - } | |
| 162 | - Device device = storager.queryVideoDevice(deviceId); | |
| 163 | - boolean status = deviceService.isSyncRunning(deviceId); | |
| 164 | - // 已存在则返回进度 | |
| 165 | - if (status) { | |
| 166 | - SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId); | |
| 167 | - return WVPResult.success(channelSyncStatus); | |
| 168 | - } | |
| 169 | - deviceService.sync(device); | |
| 170 | - | |
| 171 | - WVPResult<SyncStatus> wvpResult = new WVPResult<>(); | |
| 172 | - wvpResult.setCode(0); | |
| 173 | - wvpResult.setMsg("开始同步"); | |
| 174 | - return wvpResult; | |
| 175 | - } | |
| 176 | - | |
| 177 | - /** | |
| 178 | - * 移除设备 | |
| 179 | - * @param deviceId 设备id | |
| 180 | - * @return | |
| 181 | - */ | |
| 182 | - @Operation(summary = "移除设备", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 183 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 184 | - @DeleteMapping("/devices/{deviceId}/delete") | |
| 185 | - public String delete(@PathVariable String deviceId){ | |
| 186 | - | |
| 187 | - if (logger.isDebugEnabled()) { | |
| 188 | - logger.debug("设备信息删除API调用,deviceId:" + deviceId); | |
| 189 | - } | |
| 190 | - | |
| 191 | - // 清除redis记录 | |
| 192 | - boolean isSuccess = deviceService.delete(deviceId); | |
| 193 | - if (isSuccess) { | |
| 194 | - inviteStreamService.clearInviteInfo(deviceId); | |
| 195 | - // 停止此设备的订阅更新 | |
| 196 | - Set<String> allKeys = dynamicTask.getAllKeys(); | |
| 197 | - for (String key : allKeys) { | |
| 198 | - if (key.startsWith(deviceId)) { | |
| 199 | - Runnable runnable = dynamicTask.get(key); | |
| 200 | - if (runnable instanceof ISubscribeTask) { | |
| 201 | - ISubscribeTask subscribeTask = (ISubscribeTask) runnable; | |
| 202 | - subscribeTask.stop(null); | |
| 203 | - } | |
| 204 | - dynamicTask.stop(key); | |
| 205 | - } | |
| 206 | - } | |
| 207 | - JSONObject json = new JSONObject(); | |
| 208 | - json.put("deviceId", deviceId); | |
| 209 | - return json.toString(); | |
| 210 | - } else { | |
| 211 | - logger.warn("设备信息删除API调用失败!"); | |
| 212 | - throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备信息删除API调用失败!"); | |
| 213 | - } | |
| 214 | - } | |
| 215 | - | |
| 216 | - /** | |
| 217 | - * 分页查询子目录通道 | |
| 218 | - * @param deviceId 通道id | |
| 219 | - * @param channelId 通道id | |
| 220 | - * @param page 当前页 | |
| 221 | - * @param count 每页条数 | |
| 222 | - * @param query 查询内容 | |
| 223 | - * @param online 是否在线 | |
| 224 | - * @param channelType 通道类型 | |
| 225 | - * @return 子通道列表 | |
| 226 | - */ | |
| 227 | - @Operation(summary = "分页查询子目录通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 228 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 229 | - @Parameter(name = "channelId", description = "通道国标编号", required = true) | |
| 230 | - @Parameter(name = "page", description = "当前页", required = true) | |
| 231 | - @Parameter(name = "count", description = "每页查询数量", required = true) | |
| 232 | - @Parameter(name = "query", description = "查询内容") | |
| 233 | - @Parameter(name = "online", description = "是否在线") | |
| 234 | - @Parameter(name = "channelType", description = "设备/子目录-> false/true") | |
| 235 | - @GetMapping("/sub_channels/{deviceId}/{channelId}/channels") | |
| 236 | - public PageInfo<DeviceChannel> subChannels(@PathVariable String deviceId, | |
| 237 | - @PathVariable String channelId, | |
| 238 | - int page, | |
| 239 | - int count, | |
| 240 | - @RequestParam(required = false) String query, | |
| 241 | - @RequestParam(required = false) Boolean online, | |
| 242 | - @RequestParam(required = false) Boolean channelType){ | |
| 243 | - | |
| 244 | - DeviceChannel deviceChannel = storager.queryChannel(deviceId,channelId); | |
| 245 | - if (deviceChannel == null) { | |
| 246 | - PageInfo<DeviceChannel> deviceChannelPageResult = new PageInfo<>(); | |
| 247 | - return deviceChannelPageResult; | |
| 248 | - } | |
| 249 | - | |
| 250 | - return storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count); | |
| 251 | - } | |
| 252 | - | |
| 253 | - /** | |
| 254 | - * 更新通道信息 | |
| 255 | - * @param deviceId 设备id | |
| 256 | - * @param channel 通道 | |
| 257 | - * @return | |
| 258 | - */ | |
| 259 | - @Operation(summary = "更新通道信息", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 260 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 261 | - @Parameter(name = "channel", description = "通道信息", required = true) | |
| 262 | - @PostMapping("/channel/update/{deviceId}") | |
| 263 | - public void updateChannel(@PathVariable String deviceId,DeviceChannel channel){ | |
| 264 | - deviceChannelService.updateChannel(deviceId, channel); | |
| 265 | - } | |
| 266 | - | |
| 267 | - @Operation(summary = "修改通道的码流类型", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 268 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 269 | - @Parameter(name = "channel", description = "通道信息", required = true) | |
| 270 | - @PostMapping("/channel/stream/identification/update/") | |
| 271 | - public void updateChannelStreamIdentification(DeviceChannel channel){ | |
| 272 | - deviceChannelService.updateChannelStreamIdentification(channel); | |
| 273 | - } | |
| 274 | - | |
| 275 | - /** | |
| 276 | - * 修改数据流传输模式 | |
| 277 | - * @param deviceId 设备id | |
| 278 | - * @param streamMode 数据流传输模式 | |
| 279 | - * @return | |
| 280 | - */ | |
| 281 | - @Operation(summary = "修改数据流传输模式", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 282 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 283 | - @Parameter(name = "streamMode", description = "数据流传输模式, 取值:" + | |
| 284 | - "UDP(udp传输),TCP-ACTIVE(tcp主动模式,暂不支持),TCP-PASSIVE(tcp被动模式)", required = true) | |
| 285 | - @PostMapping("/transport/{deviceId}/{streamMode}") | |
| 286 | - public void updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){ | |
| 287 | - Device device = deviceService.getDevice(deviceId); | |
| 288 | - device.setStreamMode(streamMode); | |
| 289 | - deviceService.updateCustomDevice(device); | |
| 290 | - } | |
| 291 | - | |
| 292 | - /** | |
| 293 | - * 添加设备信息 | |
| 294 | - * @param device 设备信息 | |
| 295 | - * @return | |
| 296 | - */ | |
| 297 | - @Operation(summary = "添加设备信息", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 298 | - @Parameter(name = "device", description = "设备", required = true) | |
| 299 | - @PostMapping("/device/add/") | |
| 300 | - public void addDevice(Device device){ | |
| 301 | - | |
| 302 | - if (device == null || device.getDeviceId() == null) { | |
| 303 | - throw new ControllerException(ErrorCode.ERROR400); | |
| 304 | - } | |
| 305 | - | |
| 306 | - // 查看deviceId是否存在 | |
| 307 | - boolean exist = deviceService.isExist(device.getDeviceId()); | |
| 308 | - if (exist) { | |
| 309 | - throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备编号已存在"); | |
| 310 | - } | |
| 311 | - deviceService.addDevice(device); | |
| 312 | - } | |
| 313 | - | |
| 314 | - /** | |
| 315 | - * 更新设备信息 | |
| 316 | - * @param device 设备信息 | |
| 317 | - * @return | |
| 318 | - */ | |
| 319 | - @Operation(summary = "更新设备信息", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 320 | - @Parameter(name = "device", description = "设备", required = true) | |
| 321 | - @PostMapping("/device/update/") | |
| 322 | - public void updateDevice(Device device){ | |
| 323 | - | |
| 324 | - if (device != null && device.getDeviceId() != null) { | |
| 325 | - deviceService.updateCustomDevice(device); | |
| 326 | - } | |
| 327 | - } | |
| 328 | - | |
| 329 | - /** | |
| 330 | - * 设备状态查询请求API接口 | |
| 331 | - * | |
| 332 | - * @param deviceId 设备id | |
| 333 | - */ | |
| 334 | - @Operation(summary = "设备状态查询", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 335 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 336 | - @GetMapping("/devices/{deviceId}/status") | |
| 337 | - public DeferredResult<ResponseEntity<String>> deviceStatusApi(@PathVariable String deviceId) { | |
| 338 | - if (logger.isDebugEnabled()) { | |
| 339 | - logger.debug("设备状态查询API调用"); | |
| 340 | - } | |
| 341 | - Device device = storager.queryVideoDevice(deviceId); | |
| 342 | - String uuid = UUID.randomUUID().toString(); | |
| 343 | - String key = DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId; | |
| 344 | - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(2*1000L); | |
| 345 | - if(device == null) { | |
| 346 | - result.setResult(new ResponseEntity(String.format("设备%s不存在", deviceId),HttpStatus.OK)); | |
| 347 | - return result; | |
| 348 | - } | |
| 349 | - try { | |
| 350 | - cmder.deviceStatusQuery(device, event -> { | |
| 351 | - RequestMessage msg = new RequestMessage(); | |
| 352 | - msg.setId(uuid); | |
| 353 | - msg.setKey(key); | |
| 354 | - msg.setData(String.format("获取设备状态失败,错误码: %s, %s", event.statusCode, event.msg)); | |
| 355 | - resultHolder.invokeResult(msg); | |
| 356 | - }); | |
| 357 | - } catch (InvalidArgumentException | SipException | ParseException e) { | |
| 358 | - logger.error("[命令发送失败] 获取设备状态: {}", e.getMessage()); | |
| 359 | - throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage()); | |
| 360 | - } | |
| 361 | - result.onTimeout(()->{ | |
| 362 | - logger.warn(String.format("获取设备状态超时")); | |
| 363 | - // 释放rtpserver | |
| 364 | - RequestMessage msg = new RequestMessage(); | |
| 365 | - msg.setId(uuid); | |
| 366 | - msg.setKey(key); | |
| 367 | - msg.setData("Timeout. Device did not response to this command."); | |
| 368 | - resultHolder.invokeResult(msg); | |
| 369 | - }); | |
| 370 | - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId, uuid, result); | |
| 371 | - return result; | |
| 372 | - } | |
| 373 | - | |
| 374 | - /** | |
| 375 | - * 设备报警查询请求API接口 | |
| 376 | - * @param deviceId 设备id | |
| 377 | - * @param startPriority 报警起始级别(可选) | |
| 378 | - * @param endPriority 报警终止级别(可选) | |
| 379 | - * @param alarmMethod 报警方式条件(可选) | |
| 380 | - * @param alarmType 报警类型 | |
| 381 | - * @param startTime 报警发生起始时间(可选) | |
| 382 | - * @param endTime 报警发生终止时间(可选) | |
| 383 | - * @return true = 命令发送成功 | |
| 384 | - */ | |
| 385 | - @Operation(summary = "设备报警查询", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 386 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 387 | - @Parameter(name = "startPriority", description = "报警起始级别") | |
| 388 | - @Parameter(name = "endPriority", description = "报警终止级别") | |
| 389 | - @Parameter(name = "alarmMethod", description = "报警方式条件") | |
| 390 | - @Parameter(name = "alarmType", description = "报警类型") | |
| 391 | - @Parameter(name = "startTime", description = "报警发生起始时间") | |
| 392 | - @Parameter(name = "endTime", description = "报警发生终止时间") | |
| 393 | - @GetMapping("/alarm/{deviceId}") | |
| 394 | - public DeferredResult<ResponseEntity<String>> alarmApi(@PathVariable String deviceId, | |
| 395 | - @RequestParam(required = false) String startPriority, | |
| 396 | - @RequestParam(required = false) String endPriority, | |
| 397 | - @RequestParam(required = false) String alarmMethod, | |
| 398 | - @RequestParam(required = false) String alarmType, | |
| 399 | - @RequestParam(required = false) String startTime, | |
| 400 | - @RequestParam(required = false) String endTime) { | |
| 401 | - if (logger.isDebugEnabled()) { | |
| 402 | - logger.debug("设备报警查询API调用"); | |
| 403 | - } | |
| 404 | - Device device = storager.queryVideoDevice(deviceId); | |
| 405 | - String key = DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId; | |
| 406 | - String uuid = UUID.randomUUID().toString(); | |
| 407 | - try { | |
| 408 | - cmder.alarmInfoQuery(device, startPriority, endPriority, alarmMethod, alarmType, startTime, endTime, event -> { | |
| 409 | - RequestMessage msg = new RequestMessage(); | |
| 410 | - msg.setId(uuid); | |
| 411 | - msg.setKey(key); | |
| 412 | - msg.setData(String.format("设备报警查询失败,错误码: %s, %s",event.statusCode, event.msg)); | |
| 413 | - resultHolder.invokeResult(msg); | |
| 414 | - }); | |
| 415 | - } catch (InvalidArgumentException | SipException | ParseException e) { | |
| 416 | - logger.error("[命令发送失败] 设备报警查询: {}", e.getMessage()); | |
| 417 | - throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage()); | |
| 418 | - } | |
| 419 | - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String >> (3 * 1000L); | |
| 420 | - result.onTimeout(()->{ | |
| 421 | - logger.warn(String.format("设备报警查询超时")); | |
| 422 | - // 释放rtpserver | |
| 423 | - RequestMessage msg = new RequestMessage(); | |
| 424 | - msg.setId(uuid); | |
| 425 | - msg.setKey(key); | |
| 426 | - msg.setData("设备报警查询超时"); | |
| 427 | - resultHolder.invokeResult(msg); | |
| 428 | - }); | |
| 429 | - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId, uuid, result); | |
| 430 | - return result; | |
| 431 | - } | |
| 432 | - | |
| 433 | - | |
| 434 | - @GetMapping("/{deviceId}/sync_status") | |
| 435 | - @Operation(summary = "获取通道同步进度", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 436 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 437 | - public WVPResult<SyncStatus> getSyncStatus(@PathVariable String deviceId) { | |
| 438 | - SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId); | |
| 439 | - WVPResult<SyncStatus> wvpResult = new WVPResult<>(); | |
| 440 | - if (channelSyncStatus == null) { | |
| 441 | - wvpResult.setCode(-1); | |
| 442 | - wvpResult.setMsg("同步尚未开始"); | |
| 443 | - }else { | |
| 444 | - wvpResult.setCode(ErrorCode.SUCCESS.getCode()); | |
| 445 | - wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); | |
| 446 | - wvpResult.setData(channelSyncStatus); | |
| 447 | - if (channelSyncStatus.getErrorMsg() != null) { | |
| 448 | - wvpResult.setMsg(channelSyncStatus.getErrorMsg()); | |
| 449 | - } | |
| 450 | - } | |
| 451 | - return wvpResult; | |
| 452 | - } | |
| 453 | - | |
| 454 | - @GetMapping("/{deviceId}/subscribe_info") | |
| 455 | - @Operation(summary = "获取设备的订阅状态", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 456 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 457 | - public WVPResult<Map<String, Integer>> getSubscribeInfo(@PathVariable String deviceId) { | |
| 458 | - Set<String> allKeys = dynamicTask.getAllKeys(); | |
| 459 | - Map<String, Integer> dialogStateMap = new HashMap<>(); | |
| 460 | - for (String key : allKeys) { | |
| 461 | - if (key.startsWith(deviceId)) { | |
| 462 | - ISubscribeTask subscribeTask = (ISubscribeTask)dynamicTask.get(key); | |
| 463 | - if (subscribeTask instanceof CatalogSubscribeTask) { | |
| 464 | - dialogStateMap.put("catalog", 1); | |
| 465 | - }else if (subscribeTask instanceof MobilePositionSubscribeTask) { | |
| 466 | - dialogStateMap.put("mobilePosition", 1); | |
| 467 | - } | |
| 468 | - } | |
| 469 | - } | |
| 470 | - WVPResult<Map<String, Integer>> wvpResult = new WVPResult<>(); | |
| 471 | - wvpResult.setCode(0); | |
| 472 | - wvpResult.setData(dialogStateMap); | |
| 473 | - return wvpResult; | |
| 474 | - } | |
| 475 | - | |
| 476 | - @GetMapping("/snap/{deviceId}/{channelId}") | |
| 477 | - @Operation(summary = "请求截图") | |
| 478 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 479 | - @Parameter(name = "channelId", description = "通道国标编号", required = true) | |
| 480 | - @Parameter(name = "mark", description = "标识", required = false) | |
| 481 | - public void getSnap(HttpServletResponse resp, @PathVariable String deviceId, @PathVariable String channelId, @RequestParam(required = false) String mark) { | |
| 482 | - | |
| 483 | - try { | |
| 484 | - final InputStream in = Files.newInputStream(new File("snap" + File.separator + deviceId + "_" + channelId + (mark == null? ".jpg": ("_" + mark + ".jpg"))).toPath()); | |
| 485 | - resp.setContentType(MediaType.IMAGE_PNG_VALUE); | |
| 486 | - ServletOutputStream outputStream = resp.getOutputStream(); | |
| 487 | - IOUtils.copy(in, resp.getOutputStream()); | |
| 488 | - in.close(); | |
| 489 | - outputStream.close(); | |
| 490 | - } catch (IOException e) { | |
| 491 | - resp.setStatus(HttpServletResponse.SC_NOT_FOUND); | |
| 492 | - } | |
| 493 | - } | |
| 494 | - | |
| 495 | - /** | |
| 496 | - * 查询国标树 | |
| 497 | - * @param deviceId 设备ID | |
| 498 | - * @param parentId 父ID | |
| 499 | - * @param page 当前页 | |
| 500 | - * @param count 每页条数 | |
| 501 | - * @return 国标设备 | |
| 502 | - */ | |
| 503 | - @Operation(summary = "查询国标树") | |
| 504 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 505 | - @Parameter(name = "parentId", description = "父级国标编号") | |
| 506 | - @Parameter(name = "onlyCatalog", description = "只获取目录") | |
| 507 | - @Parameter(name = "page", description = "当前页", required = true) | |
| 508 | - @Parameter(name = "count", description = "每页条数", required = true) | |
| 509 | - @GetMapping("/tree/{deviceId}") | |
| 510 | - public ResponseEntity<PageInfo> getTree(@PathVariable String deviceId, | |
| 511 | - @RequestParam(required = false) String parentId, | |
| 512 | - @RequestParam(required = false) Boolean onlyCatalog, | |
| 513 | - int page, int count){ | |
| 514 | - | |
| 515 | - | |
| 516 | - if (page <= 0) { | |
| 517 | - page = 1; | |
| 518 | - } | |
| 519 | - if (onlyCatalog == null) { | |
| 520 | - onlyCatalog = false; | |
| 521 | - } | |
| 522 | - | |
| 523 | - List<BaseTree<DeviceChannel>> treeData = deviceService.queryVideoDeviceTree(deviceId, parentId, onlyCatalog); | |
| 524 | - if (treeData == null || (page - 1) * count > treeData.size()) { | |
| 525 | - PageInfo<BaseTree<DeviceChannel>> pageInfo = new PageInfo<>(); | |
| 526 | - pageInfo.setPageNum(page); | |
| 527 | - pageInfo.setTotal(treeData == null? 0 : treeData.size()); | |
| 528 | - pageInfo.setSize(0); | |
| 529 | - pageInfo.setList(new ArrayList<>()); | |
| 530 | - return new ResponseEntity<>(pageInfo,HttpStatus.OK); | |
| 531 | - } | |
| 532 | - | |
| 533 | - int toIndex = Math.min(page * count, treeData.size()); | |
| 534 | - // 处理分页 | |
| 535 | - List<BaseTree<DeviceChannel>> trees = treeData.subList((page - 1) * count, toIndex); | |
| 536 | - PageInfo<BaseTree<DeviceChannel>> pageInfo = new PageInfo<>(); | |
| 537 | - pageInfo.setPageNum(page); | |
| 538 | - pageInfo.setTotal(treeData.size()); | |
| 539 | - pageInfo.setSize(trees.size()); | |
| 540 | - pageInfo.setList(trees); | |
| 541 | - | |
| 542 | - return new ResponseEntity<>(pageInfo,HttpStatus.OK); | |
| 543 | - } | |
| 544 | - | |
| 545 | - /** | |
| 546 | - * 查询国标树下的通道 | |
| 547 | - * @param deviceId 设备ID | |
| 548 | - * @param parentId 父ID | |
| 549 | - * @param page 当前页 | |
| 550 | - * @param count 每页条数 | |
| 551 | - * @return 国标设备 | |
| 552 | - */ | |
| 553 | - @Operation(summary = "查询国标树下的通道") | |
| 554 | - @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 555 | - @Parameter(name = "parentId", description = "父级国标编号") | |
| 556 | - @Parameter(name = "page", description = "当前页", required = true) | |
| 557 | - @Parameter(name = "count", description = "每页条数", required = true) | |
| 558 | - @GetMapping("/tree/channel/{deviceId}") | |
| 559 | - public ResponseEntity<PageInfo> getChannelInTreeNode(@PathVariable String deviceId, @RequestParam(required = false) String parentId, int page, int count){ | |
| 560 | - | |
| 561 | - if (page <= 0) { | |
| 562 | - page = 1; | |
| 563 | - } | |
| 564 | - | |
| 565 | - List<DeviceChannel> treeData = deviceService.queryVideoDeviceInTreeNode(deviceId, parentId); | |
| 566 | - if (treeData == null || (page - 1) * count > treeData.size()) { | |
| 567 | - PageInfo<BaseTree<DeviceChannel>> pageInfo = new PageInfo<>(); | |
| 568 | - pageInfo.setPageNum(page); | |
| 569 | - pageInfo.setTotal(treeData == null? 0 : treeData.size()); | |
| 570 | - pageInfo.setSize(0); | |
| 571 | - pageInfo.setList(new ArrayList<>()); | |
| 572 | - return new ResponseEntity<>(pageInfo,HttpStatus.OK); | |
| 573 | - } | |
| 574 | - | |
| 575 | - int toIndex = Math.min(page * count, treeData.size()); | |
| 576 | - // 处理分页 | |
| 577 | - List<DeviceChannel> trees = treeData.subList((page - 1) * count, toIndex); | |
| 578 | - PageInfo<DeviceChannel> pageInfo = new PageInfo<>(); | |
| 579 | - pageInfo.setPageNum(page); | |
| 580 | - pageInfo.setTotal(treeData.size()); | |
| 581 | - pageInfo.setSize(trees.size()); | |
| 582 | - pageInfo.setList(trees); | |
| 583 | - | |
| 584 | - return new ResponseEntity<>(pageInfo,HttpStatus.OK); | |
| 585 | - } | |
| 114 | + return storager.queryVideoDeviceList(page, count, null); | |
| 115 | + } | |
| 116 | + | |
| 117 | + /** | |
| 118 | + * 分页查询通道数 | |
| 119 | + * | |
| 120 | + * @param deviceId 设备id | |
| 121 | + * @param page 当前页 | |
| 122 | + * @param count 每页条数 | |
| 123 | + * @param query 查询内容 | |
| 124 | + * @param online 是否在线 在线 true / 离线 false | |
| 125 | + * @param channelType 设备 false/子目录 true | |
| 126 | + * @param catalogUnderDevice 是否直属与设备的目录 | |
| 127 | + * @return 通道列表 | |
| 128 | + */ | |
| 129 | + @GetMapping("/devices/{deviceId}/channels") | |
| 130 | + @Operation(summary = "分页查询通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 131 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 132 | + @Parameter(name = "page", description = "当前页", required = true) | |
| 133 | + @Parameter(name = "count", description = "每页查询数量", required = true) | |
| 134 | + @Parameter(name = "query", description = "查询内容") | |
| 135 | + @Parameter(name = "online", description = "是否在线") | |
| 136 | + @Parameter(name = "channelType", description = "设备/子目录-> false/true") | |
| 137 | + @Parameter(name = "catalogUnderDevice", description = "是否直属与设备的目录") | |
| 138 | + public PageInfo<DeviceChannel> channels(@PathVariable String deviceId, | |
| 139 | + int page, int count, | |
| 140 | + @RequestParam(required = false) String query, | |
| 141 | + @RequestParam(required = false) Boolean online, | |
| 142 | + @RequestParam(required = false) Boolean channelType, | |
| 143 | + @RequestParam(required = false) Boolean catalogUnderDevice) { | |
| 144 | + if (ObjectUtils.isEmpty(query)) { | |
| 145 | + query = null; | |
| 146 | + } | |
| 147 | + | |
| 148 | + return storager.queryChannelsByDeviceId(deviceId, query, channelType, online, catalogUnderDevice, page, count); | |
| 149 | + } | |
| 150 | + | |
| 151 | + /** | |
| 152 | + * 同步设备通道 | |
| 153 | + * | |
| 154 | + * @param deviceId 设备id | |
| 155 | + * @return | |
| 156 | + */ | |
| 157 | + @Operation(summary = "同步设备通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 158 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 159 | + @GetMapping("/devices/{deviceId}/sync") | |
| 160 | + public WVPResult<SyncStatus> devicesSync(@PathVariable String deviceId) { | |
| 161 | + | |
| 162 | + if (logger.isDebugEnabled()) { | |
| 163 | + logger.debug("设备通道信息同步API调用,deviceId:" + deviceId); | |
| 164 | + } | |
| 165 | + Device device = storager.queryVideoDevice(deviceId); | |
| 166 | + boolean status = deviceService.isSyncRunning(deviceId); | |
| 167 | + // 已存在则返回进度 | |
| 168 | + if (status) { | |
| 169 | + SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId); | |
| 170 | + return WVPResult.success(channelSyncStatus); | |
| 171 | + } | |
| 172 | + deviceService.sync(device); | |
| 173 | + | |
| 174 | + WVPResult<SyncStatus> wvpResult = new WVPResult<>(); | |
| 175 | + wvpResult.setCode(0); | |
| 176 | + wvpResult.setMsg("开始同步"); | |
| 177 | + return wvpResult; | |
| 178 | + } | |
| 179 | + | |
| 180 | + /** | |
| 181 | + * 移除设备 | |
| 182 | + * | |
| 183 | + * @param deviceId 设备id | |
| 184 | + * @return | |
| 185 | + */ | |
| 186 | + @Operation(summary = "移除设备", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 187 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 188 | + @DeleteMapping("/devices/{deviceId}/delete") | |
| 189 | + public String delete(@PathVariable String deviceId) { | |
| 190 | + | |
| 191 | + if (logger.isDebugEnabled()) { | |
| 192 | + logger.debug("设备信息删除API调用,deviceId:" + deviceId); | |
| 193 | + } | |
| 194 | + | |
| 195 | + // 清除redis记录 | |
| 196 | + boolean isSuccess = deviceService.delete(deviceId); | |
| 197 | + if (isSuccess) { | |
| 198 | + inviteStreamService.clearInviteInfo(deviceId); | |
| 199 | + // 停止此设备的订阅更新 | |
| 200 | + Set<String> allKeys = dynamicTask.getAllKeys(); | |
| 201 | + for (String key : allKeys) { | |
| 202 | + if (key.startsWith(deviceId)) { | |
| 203 | + Runnable runnable = dynamicTask.get(key); | |
| 204 | + if (runnable instanceof ISubscribeTask) { | |
| 205 | + ISubscribeTask subscribeTask = (ISubscribeTask) runnable; | |
| 206 | + subscribeTask.stop(null); | |
| 207 | + } | |
| 208 | + dynamicTask.stop(key); | |
| 209 | + } | |
| 210 | + } | |
| 211 | + JSONObject json = new JSONObject(); | |
| 212 | + json.put("deviceId", deviceId); | |
| 213 | + return json.toString(); | |
| 214 | + } else { | |
| 215 | + logger.warn("设备信息删除API调用失败!"); | |
| 216 | + throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备信息删除API调用失败!"); | |
| 217 | + } | |
| 218 | + } | |
| 219 | + | |
| 220 | + /** | |
| 221 | + * 分页查询子目录通道 | |
| 222 | + * | |
| 223 | + * @param deviceId 通道id | |
| 224 | + * @param channelId 通道id | |
| 225 | + * @param page 当前页 | |
| 226 | + * @param count 每页条数 | |
| 227 | + * @param query 查询内容 | |
| 228 | + * @param online 是否在线 | |
| 229 | + * @param channelType 通道类型 | |
| 230 | + * @return 子通道列表 | |
| 231 | + */ | |
| 232 | + @Operation(summary = "分页查询子目录通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 233 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 234 | + @Parameter(name = "channelId", description = "通道国标编号", required = true) | |
| 235 | + @Parameter(name = "page", description = "当前页", required = true) | |
| 236 | + @Parameter(name = "count", description = "每页查询数量", required = true) | |
| 237 | + @Parameter(name = "query", description = "查询内容") | |
| 238 | + @Parameter(name = "online", description = "是否在线") | |
| 239 | + @Parameter(name = "channelType", description = "设备/子目录-> false/true") | |
| 240 | + @GetMapping("/sub_channels/{deviceId}/{channelId}/channels") | |
| 241 | + public PageInfo<DeviceChannel> subChannels(@PathVariable String deviceId, | |
| 242 | + @PathVariable String channelId, | |
| 243 | + int page, | |
| 244 | + int count, | |
| 245 | + @RequestParam(required = false) String query, | |
| 246 | + @RequestParam(required = false) Boolean online, | |
| 247 | + @RequestParam(required = false) Boolean channelType) { | |
| 248 | + | |
| 249 | + DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId); | |
| 250 | + if (deviceChannel == null) { | |
| 251 | + PageInfo<DeviceChannel> deviceChannelPageResult = new PageInfo<>(); | |
| 252 | + return deviceChannelPageResult; | |
| 253 | + } | |
| 254 | + | |
| 255 | + return storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count); | |
| 256 | + } | |
| 257 | + | |
| 258 | + /** | |
| 259 | + * 更新通道信息 | |
| 260 | + * | |
| 261 | + * @param deviceId 设备id | |
| 262 | + * @param channel 通道 | |
| 263 | + * @return | |
| 264 | + */ | |
| 265 | + @Operation(summary = "更新通道信息", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 266 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 267 | + @Parameter(name = "channel", description = "通道信息", required = true) | |
| 268 | + @PostMapping("/channel/update/{deviceId}") | |
| 269 | + public void updateChannel(@PathVariable String deviceId, DeviceChannel channel) { | |
| 270 | + deviceChannelService.updateChannel(deviceId, channel); | |
| 271 | + } | |
| 272 | + | |
| 273 | + @Operation(summary = "修改通道的码流类型", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 274 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 275 | + @Parameter(name = "channel", description = "通道信息", required = true) | |
| 276 | + @PostMapping("/channel/stream/identification/update/") | |
| 277 | + public void updateChannelStreamIdentification(DeviceChannel channel) { | |
| 278 | + deviceChannelService.updateChannelStreamIdentification(channel); | |
| 279 | + } | |
| 280 | + | |
| 281 | + /** | |
| 282 | + * 修改数据流传输模式 | |
| 283 | + * | |
| 284 | + * @param deviceId 设备id | |
| 285 | + * @param streamMode 数据流传输模式 | |
| 286 | + * @return | |
| 287 | + */ | |
| 288 | + @Operation(summary = "修改数据流传输模式", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 289 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 290 | + @Parameter(name = "streamMode", description = "数据流传输模式, 取值:" + | |
| 291 | + "UDP(udp传输),TCP-ACTIVE(tcp主动模式,暂不支持),TCP-PASSIVE(tcp被动模式)", required = true) | |
| 292 | + @PostMapping("/transport/{deviceId}/{streamMode}") | |
| 293 | + public void updateTransport(@PathVariable String deviceId, @PathVariable String streamMode) { | |
| 294 | + Device device = deviceService.getDevice(deviceId); | |
| 295 | + device.setStreamMode(streamMode); | |
| 296 | + deviceService.updateCustomDevice(device); | |
| 297 | + } | |
| 298 | + | |
| 299 | + /** | |
| 300 | + * 添加设备信息 | |
| 301 | + * | |
| 302 | + * @param device 设备信息 | |
| 303 | + * @return | |
| 304 | + */ | |
| 305 | + @Operation(summary = "添加设备信息", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 306 | + @Parameter(name = "device", description = "设备", required = true) | |
| 307 | + @PostMapping("/device/add/") | |
| 308 | + public void addDevice(Device device) { | |
| 309 | + | |
| 310 | + if (device == null || device.getDeviceId() == null) { | |
| 311 | + throw new ControllerException(ErrorCode.ERROR400); | |
| 312 | + } | |
| 313 | + | |
| 314 | + // 查看deviceId是否存在 | |
| 315 | + boolean exist = deviceService.isExist(device.getDeviceId()); | |
| 316 | + if (exist) { | |
| 317 | + throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备编号已存在"); | |
| 318 | + } | |
| 319 | + deviceService.addDevice(device); | |
| 320 | + } | |
| 321 | + | |
| 322 | + /** | |
| 323 | + * 更新设备信息 | |
| 324 | + * | |
| 325 | + * @param device 设备信息 | |
| 326 | + * @return | |
| 327 | + */ | |
| 328 | + @Operation(summary = "更新设备信息", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 329 | + @Parameter(name = "device", description = "设备", required = true) | |
| 330 | + @PostMapping("/device/update/") | |
| 331 | + public void updateDevice(Device device) { | |
| 332 | + | |
| 333 | + if (device != null && device.getDeviceId() != null) { | |
| 334 | + deviceService.updateCustomDevice(device); | |
| 335 | + } | |
| 336 | + } | |
| 337 | + | |
| 338 | + /** | |
| 339 | + * 设备状态查询请求API接口 | |
| 340 | + * | |
| 341 | + * @param deviceId 设备id | |
| 342 | + */ | |
| 343 | + @Operation(summary = "设备状态查询", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 344 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 345 | + @GetMapping("/devices/{deviceId}/status") | |
| 346 | + public DeferredResult<ResponseEntity<String>> deviceStatusApi(@PathVariable String deviceId) { | |
| 347 | + if (logger.isDebugEnabled()) { | |
| 348 | + logger.debug("设备状态查询API调用"); | |
| 349 | + } | |
| 350 | + Device device = storager.queryVideoDevice(deviceId); | |
| 351 | + String uuid = UUID.randomUUID().toString(); | |
| 352 | + String key = DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId; | |
| 353 | + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(2 * 1000L); | |
| 354 | + if (device == null) { | |
| 355 | + result.setResult(new ResponseEntity(String.format("设备%s不存在", deviceId), HttpStatus.OK)); | |
| 356 | + return result; | |
| 357 | + } | |
| 358 | + try { | |
| 359 | + cmder.deviceStatusQuery(device, event -> { | |
| 360 | + RequestMessage msg = new RequestMessage(); | |
| 361 | + msg.setId(uuid); | |
| 362 | + msg.setKey(key); | |
| 363 | + msg.setData(String.format("获取设备状态失败,错误码: %s, %s", event.statusCode, event.msg)); | |
| 364 | + resultHolder.invokeResult(msg); | |
| 365 | + }); | |
| 366 | + } catch (InvalidArgumentException | SipException | ParseException e) { | |
| 367 | + logger.error("[命令发送失败] 获取设备状态: {}", e.getMessage()); | |
| 368 | + throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage()); | |
| 369 | + } | |
| 370 | + result.onTimeout(() -> { | |
| 371 | + logger.warn(String.format("获取设备状态超时")); | |
| 372 | + // 释放rtpserver | |
| 373 | + RequestMessage msg = new RequestMessage(); | |
| 374 | + msg.setId(uuid); | |
| 375 | + msg.setKey(key); | |
| 376 | + msg.setData("Timeout. Device did not response to this command."); | |
| 377 | + resultHolder.invokeResult(msg); | |
| 378 | + }); | |
| 379 | + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId, uuid, result); | |
| 380 | + return result; | |
| 381 | + } | |
| 382 | + | |
| 383 | + /** | |
| 384 | + * 设备报警查询请求API接口 | |
| 385 | + * | |
| 386 | + * @param deviceId 设备id | |
| 387 | + * @param startPriority 报警起始级别(可选) | |
| 388 | + * @param endPriority 报警终止级别(可选) | |
| 389 | + * @param alarmMethod 报警方式条件(可选) | |
| 390 | + * @param alarmType 报警类型 | |
| 391 | + * @param startTime 报警发生起始时间(可选) | |
| 392 | + * @param endTime 报警发生终止时间(可选) | |
| 393 | + * @return true = 命令发送成功 | |
| 394 | + */ | |
| 395 | + @Operation(summary = "设备报警查询", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 396 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 397 | + @Parameter(name = "startPriority", description = "报警起始级别") | |
| 398 | + @Parameter(name = "endPriority", description = "报警终止级别") | |
| 399 | + @Parameter(name = "alarmMethod", description = "报警方式条件") | |
| 400 | + @Parameter(name = "alarmType", description = "报警类型") | |
| 401 | + @Parameter(name = "startTime", description = "报警发生起始时间") | |
| 402 | + @Parameter(name = "endTime", description = "报警发生终止时间") | |
| 403 | + @GetMapping("/alarm/{deviceId}") | |
| 404 | + public DeferredResult<ResponseEntity<String>> alarmApi(@PathVariable String deviceId, | |
| 405 | + @RequestParam(required = false) String startPriority, | |
| 406 | + @RequestParam(required = false) String endPriority, | |
| 407 | + @RequestParam(required = false) String alarmMethod, | |
| 408 | + @RequestParam(required = false) String alarmType, | |
| 409 | + @RequestParam(required = false) String startTime, | |
| 410 | + @RequestParam(required = false) String endTime) { | |
| 411 | + if (logger.isDebugEnabled()) { | |
| 412 | + logger.debug("设备报警查询API调用"); | |
| 413 | + } | |
| 414 | + Device device = storager.queryVideoDevice(deviceId); | |
| 415 | + String key = DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId; | |
| 416 | + String uuid = UUID.randomUUID().toString(); | |
| 417 | + try { | |
| 418 | + cmder.alarmInfoQuery(device, startPriority, endPriority, alarmMethod, alarmType, startTime, endTime, event -> { | |
| 419 | + RequestMessage msg = new RequestMessage(); | |
| 420 | + msg.setId(uuid); | |
| 421 | + msg.setKey(key); | |
| 422 | + msg.setData(String.format("设备报警查询失败,错误码: %s, %s", event.statusCode, event.msg)); | |
| 423 | + resultHolder.invokeResult(msg); | |
| 424 | + }); | |
| 425 | + } catch (InvalidArgumentException | SipException | ParseException e) { | |
| 426 | + logger.error("[命令发送失败] 设备报警查询: {}", e.getMessage()); | |
| 427 | + throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage()); | |
| 428 | + } | |
| 429 | + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L); | |
| 430 | + result.onTimeout(() -> { | |
| 431 | + logger.warn(String.format("设备报警查询超时")); | |
| 432 | + // 释放rtpserver | |
| 433 | + RequestMessage msg = new RequestMessage(); | |
| 434 | + msg.setId(uuid); | |
| 435 | + msg.setKey(key); | |
| 436 | + msg.setData("设备报警查询超时"); | |
| 437 | + resultHolder.invokeResult(msg); | |
| 438 | + }); | |
| 439 | + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId, uuid, result); | |
| 440 | + return result; | |
| 441 | + } | |
| 442 | + | |
| 443 | + | |
| 444 | + @GetMapping("/{deviceId}/sync_status") | |
| 445 | + @Operation(summary = "获取通道同步进度", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 446 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 447 | + public WVPResult<SyncStatus> getSyncStatus(@PathVariable String deviceId) { | |
| 448 | + SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId); | |
| 449 | + WVPResult<SyncStatus> wvpResult = new WVPResult<>(); | |
| 450 | + if (channelSyncStatus == null) { | |
| 451 | + wvpResult.setCode(-1); | |
| 452 | + wvpResult.setMsg("同步尚未开始"); | |
| 453 | + } else { | |
| 454 | + wvpResult.setCode(ErrorCode.SUCCESS.getCode()); | |
| 455 | + wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); | |
| 456 | + wvpResult.setData(channelSyncStatus); | |
| 457 | + if (channelSyncStatus.getErrorMsg() != null) { | |
| 458 | + wvpResult.setMsg(channelSyncStatus.getErrorMsg()); | |
| 459 | + } | |
| 460 | + } | |
| 461 | + return wvpResult; | |
| 462 | + } | |
| 463 | + | |
| 464 | + @GetMapping("/{deviceId}/subscribe_info") | |
| 465 | + @Operation(summary = "获取设备的订阅状态", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 466 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 467 | + public WVPResult<Map<String, Integer>> getSubscribeInfo(@PathVariable String deviceId) { | |
| 468 | + Set<String> allKeys = dynamicTask.getAllKeys(); | |
| 469 | + Map<String, Integer> dialogStateMap = new HashMap<>(); | |
| 470 | + for (String key : allKeys) { | |
| 471 | + if (key.startsWith(deviceId)) { | |
| 472 | + ISubscribeTask subscribeTask = (ISubscribeTask) dynamicTask.get(key); | |
| 473 | + if (subscribeTask instanceof CatalogSubscribeTask) { | |
| 474 | + dialogStateMap.put("catalog", 1); | |
| 475 | + } else if (subscribeTask instanceof MobilePositionSubscribeTask) { | |
| 476 | + dialogStateMap.put("mobilePosition", 1); | |
| 477 | + } | |
| 478 | + } | |
| 479 | + } | |
| 480 | + WVPResult<Map<String, Integer>> wvpResult = new WVPResult<>(); | |
| 481 | + wvpResult.setCode(0); | |
| 482 | + wvpResult.setData(dialogStateMap); | |
| 483 | + return wvpResult; | |
| 484 | + } | |
| 485 | + | |
| 486 | + @GetMapping("/snap/{deviceId}/{channelId}") | |
| 487 | + @Operation(summary = "请求截图") | |
| 488 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 489 | + @Parameter(name = "channelId", description = "通道国标编号", required = true) | |
| 490 | + @Parameter(name = "mark", description = "标识", required = false) | |
| 491 | + public void getSnap(HttpServletResponse resp, @PathVariable String deviceId, @PathVariable String channelId, @RequestParam(required = false) String mark) { | |
| 492 | + | |
| 493 | + try { | |
| 494 | + final InputStream in = Files.newInputStream(new File("snap" + File.separator + deviceId + "_" + channelId + (mark == null ? ".jpg" : ("_" + mark + ".jpg"))).toPath()); | |
| 495 | + resp.setContentType(MediaType.IMAGE_PNG_VALUE); | |
| 496 | + ServletOutputStream outputStream = resp.getOutputStream(); | |
| 497 | + IOUtils.copy(in, resp.getOutputStream()); | |
| 498 | + in.close(); | |
| 499 | + outputStream.close(); | |
| 500 | + } catch (IOException e) { | |
| 501 | + resp.setStatus(HttpServletResponse.SC_NOT_FOUND); | |
| 502 | + } | |
| 503 | + } | |
| 504 | + | |
| 505 | + /** | |
| 506 | + * 查询国标树 | |
| 507 | + * | |
| 508 | + * @param deviceId 设备ID | |
| 509 | + * @param parentId 父ID | |
| 510 | + * @param page 当前页 | |
| 511 | + * @param count 每页条数 | |
| 512 | + * @return 国标设备 | |
| 513 | + */ | |
| 514 | + @Operation(summary = "查询国标树") | |
| 515 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 516 | + @Parameter(name = "parentId", description = "父级国标编号") | |
| 517 | + @Parameter(name = "onlyCatalog", description = "只获取目录") | |
| 518 | + @Parameter(name = "page", description = "当前页", required = true) | |
| 519 | + @Parameter(name = "count", description = "每页条数", required = true) | |
| 520 | + @GetMapping("/tree/{deviceId}") | |
| 521 | + public ResponseEntity<PageInfo> getTree(@PathVariable String deviceId, | |
| 522 | + @RequestParam(required = false) String parentId, | |
| 523 | + @RequestParam(required = false) Boolean onlyCatalog, | |
| 524 | + int page, int count) { | |
| 525 | + | |
| 526 | + | |
| 527 | + if (page <= 0) { | |
| 528 | + page = 1; | |
| 529 | + } | |
| 530 | + if (onlyCatalog == null) { | |
| 531 | + onlyCatalog = false; | |
| 532 | + } | |
| 533 | + | |
| 534 | + List<BaseTree<DeviceChannel>> treeData = deviceService.queryVideoDeviceTree(deviceId, parentId, onlyCatalog); | |
| 535 | + if (treeData == null || (page - 1) * count > treeData.size()) { | |
| 536 | + PageInfo<BaseTree<DeviceChannel>> pageInfo = new PageInfo<>(); | |
| 537 | + pageInfo.setPageNum(page); | |
| 538 | + pageInfo.setTotal(treeData == null ? 0 : treeData.size()); | |
| 539 | + pageInfo.setSize(0); | |
| 540 | + pageInfo.setList(new ArrayList<>()); | |
| 541 | + return new ResponseEntity<>(pageInfo, HttpStatus.OK); | |
| 542 | + } | |
| 543 | + | |
| 544 | + int toIndex = Math.min(page * count, treeData.size()); | |
| 545 | + // 处理分页 | |
| 546 | + List<BaseTree<DeviceChannel>> trees = treeData.subList((page - 1) * count, toIndex); | |
| 547 | + PageInfo<BaseTree<DeviceChannel>> pageInfo = new PageInfo<>(); | |
| 548 | + pageInfo.setPageNum(page); | |
| 549 | + pageInfo.setTotal(treeData.size()); | |
| 550 | + pageInfo.setSize(trees.size()); | |
| 551 | + pageInfo.setList(trees); | |
| 552 | + | |
| 553 | + return new ResponseEntity<>(pageInfo, HttpStatus.OK); | |
| 554 | + } | |
| 555 | + | |
| 556 | + /** | |
| 557 | + * 查询国标树下的通道 | |
| 558 | + * | |
| 559 | + * @param deviceId 设备ID | |
| 560 | + * @param parentId 父ID | |
| 561 | + * @param page 当前页 | |
| 562 | + * @param count 每页条数 | |
| 563 | + * @return 国标设备 | |
| 564 | + */ | |
| 565 | + @Operation(summary = "查询国标树下的通道") | |
| 566 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 567 | + @Parameter(name = "parentId", description = "父级国标编号") | |
| 568 | + @Parameter(name = "page", description = "当前页", required = true) | |
| 569 | + @Parameter(name = "count", description = "每页条数", required = true) | |
| 570 | + @GetMapping("/tree/channel/{deviceId}") | |
| 571 | + public ResponseEntity<PageInfo> getChannelInTreeNode(@PathVariable String deviceId, @RequestParam(required = false) String parentId, int page, int count) { | |
| 572 | + | |
| 573 | + if (page <= 0) { | |
| 574 | + page = 1; | |
| 575 | + } | |
| 576 | + | |
| 577 | + List<DeviceChannel> treeData = deviceService.queryVideoDeviceInTreeNode(deviceId, parentId); | |
| 578 | + if (treeData == null || (page - 1) * count > treeData.size()) { | |
| 579 | + PageInfo<BaseTree<DeviceChannel>> pageInfo = new PageInfo<>(); | |
| 580 | + pageInfo.setPageNum(page); | |
| 581 | + pageInfo.setTotal(treeData == null ? 0 : treeData.size()); | |
| 582 | + pageInfo.setSize(0); | |
| 583 | + pageInfo.setList(new ArrayList<>()); | |
| 584 | + return new ResponseEntity<>(pageInfo, HttpStatus.OK); | |
| 585 | + } | |
| 586 | + | |
| 587 | + int toIndex = Math.min(page * count, treeData.size()); | |
| 588 | + // 处理分页 | |
| 589 | + List<DeviceChannel> trees = treeData.subList((page - 1) * count, toIndex); | |
| 590 | + PageInfo<DeviceChannel> pageInfo = new PageInfo<>(); | |
| 591 | + pageInfo.setPageNum(page); | |
| 592 | + pageInfo.setTotal(treeData.size()); | |
| 593 | + pageInfo.setSize(trees.size()); | |
| 594 | + pageInfo.setList(trees); | |
| 595 | + | |
| 596 | + return new ResponseEntity<>(pageInfo, HttpStatus.OK); | |
| 597 | + } | |
| 598 | + | |
| 599 | + @Operation(summary = "根据车辆编号查询通道信息") | |
| 600 | + @Parameter(name = "carNo", description = "车辆编号", required = true) | |
| 601 | + @GetMapping("/query/channel/carNo/{carNo}") | |
| 602 | + public WVPResult<List<DeviceChannel>> queryDeviceChannelByCarNo(@PathVariable("carNo") String carNo) { | |
| 603 | + List<DeviceChannel> deviceChannels = deviceService.queryDeviceChannelByCarNo(carNo); | |
| 604 | + WVPResult<List<DeviceChannel>> wvpResult = new WVPResult<>(); | |
| 605 | + wvpResult.setCode(0); | |
| 606 | + wvpResult.setData(deviceChannels); | |
| 607 | + | |
| 608 | + return wvpResult; | |
| 609 | + } | |
| 586 | 610 | } | ... | ... |
src/main/resources/application-local.yml
| ... | ... | @@ -19,7 +19,7 @@ spring: |
| 19 | 19 | # [可选] 数据库 DB |
| 20 | 20 | database: 7 |
| 21 | 21 | # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接 |
| 22 | -# password: guzijian | |
| 22 | + # password: guzijian | |
| 23 | 23 | # [可选] 超时时间 |
| 24 | 24 | timeout: 10000 |
| 25 | 25 | # mysql数据源 |
| ... | ... | @@ -30,7 +30,7 @@ spring: |
| 30 | 30 | master: |
| 31 | 31 | type: com.zaxxer.hikari.HikariDataSource |
| 32 | 32 | driver-class-name: com.mysql.cj.jdbc.Driver |
| 33 | - url: jdbc:mysql://127.0.0.1:3306/latest_wvp2?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true | |
| 33 | + url: jdbc:mysql://192.168.169.100:3306/wvp2?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true | |
| 34 | 34 | username: root |
| 35 | 35 | password: guzijian |
| 36 | 36 | hikari: |
| ... | ... | @@ -60,9 +60,10 @@ sip: |
| 60 | 60 | # 如果要监听多张网卡,可以使用逗号分隔多个IP, 例如: 192.168.1.4,10.0.0.4 |
| 61 | 61 | # 如果不明白,就使用0.0.0.0,大部分情况都是可以的 |
| 62 | 62 | # 请不要使用127.0.0.1,任何包括localhost在内的域名都是不可以的。 |
| 63 | - ip: 192.169.1.31 | |
| 63 | + ip: 192.169.1.89 | |
| 64 | 64 | # [可选] 28181服务监听的端口 |
| 65 | 65 | port: 5060 |
| 66 | + | |
| 66 | 67 | # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007) |
| 67 | 68 | # 后两位为行业编码,定义参照附录D.3 |
| 68 | 69 | # 3701020049标识山东济南历下区 信息行业接入 |
| ... | ... | @@ -77,29 +78,29 @@ sip: |
| 77 | 78 | |
| 78 | 79 | #zlm 默认服务器配置 |
| 79 | 80 | media: |
| 80 | - id: cQ5byeSBKP2INt6l | |
| 81 | + id: guzijian1 | |
| 81 | 82 | # [必须修改] zlm服务器的内网IP |
| 82 | - ip: 192.169.1.31 | |
| 83 | + ip: 192.168.169.100 | |
| 83 | 84 | # [必须修改] zlm服务器的http.port |
| 84 | - http-port: 80 | |
| 85 | + http-port: 1091 | |
| 85 | 86 | # [可选] 返回流地址时的ip,置空使用 media.ip |
| 86 | - stream-ip: 192.169.1.31 | |
| 87 | + stream-ip: 192.168.169.100 | |
| 87 | 88 | # [可选] wvp在国标信令中使用的ip,此ip为摄像机可以访问到的ip, 置空使用 media.ip |
| 88 | - sdp-ip: 192.169.1.31 | |
| 89 | + sdp-ip: 192.168.169.100 | |
| 89 | 90 | # [可选] zlm服务器的hook所使用的IP, 默认使用sip.ip |
| 90 | - hook-ip: 192.169.1.31 | |
| 91 | + hook-ip: 192.169.1.89 | |
| 91 | 92 | # [可选] zlm服务器的http.sslport, 置空使用zlm配置文件配置 |
| 92 | 93 | http-ssl-port: 443 |
| 93 | 94 | # [可选] zlm服务器的hook.admin_params=secret |
| 94 | - secret: ZLh24VioqaKqxiihBJ80ny60NuWpVe62 | |
| 95 | + secret: RPorcBlIw26uHGnEHYGesIYyFDXpgjkP | |
| 95 | 96 | # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试 |
| 96 | 97 | rtp: |
| 97 | 98 | # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输 |
| 98 | 99 | enable: true |
| 99 | 100 | # [可选] 在此范围内选择端口用于媒体流传输, 必须提前在zlm上配置该属性,不然自动配置此属性可能不成功 |
| 100 | - port-range: 50000,50300 # 端口范围 | |
| 101 | + port-range: 60000,60300 # 端口范围 | |
| 101 | 102 | # [可选] 国标级联在此范围内选择端口发送媒体流, |
| 102 | - send-port-range: 50000,50300 # 端口范围 | |
| 103 | + send-port-range: 60000,60300 # 端口范围 | |
| 103 | 104 | # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用 |
| 104 | 105 | record-assist-port: 18081 |
| 105 | 106 | # [根据业务需求配置] |
| ... | ... | @@ -111,11 +112,11 @@ user-settings: |
| 111 | 112 | # 设备/通道状态变化时发送消息 |
| 112 | 113 | device-status-notify: true |
| 113 | 114 | # 推流直播是否录制 |
| 114 | -# record-push-live: true | |
| 115 | + # record-push-live: true | |
| 115 | 116 | # 是否开启接口鉴权 |
| 116 | -# interface-authentication: false | |
| 117 | + # interface-authentication: false | |
| 117 | 118 | # 国标是否录制 |
| 118 | -# record-sip: true | |
| 119 | + # record-sip: true | |
| 119 | 120 | # 等待音视频编码信息再返回, true: 可以根据编码选择合适的播放器,false: 可以更快点播 |
| 120 | 121 | # wait-track: true |
| 121 | 122 | # [可选] 日志配置, 一般不需要改 | ... | ... |
web_src/config/index.js
| ... | ... | @@ -11,14 +11,14 @@ module.exports = { |
| 11 | 11 | assetsPublicPath: "/", |
| 12 | 12 | proxyTable: { |
| 13 | 13 | "/debug": { |
| 14 | - target: "http://61.169.120.202:18089", | |
| 14 | + target: "http://192.169.1.89:18080", | |
| 15 | 15 | changeOrigin: true, |
| 16 | 16 | pathRewrite: { |
| 17 | 17 | "^/debug": "/", |
| 18 | 18 | }, |
| 19 | 19 | }, |
| 20 | 20 | "/static/snap": { |
| 21 | - target: "http://61.169.120.202:18089", | |
| 21 | + target: "http://192.169.1.89:18080", | |
| 22 | 22 | changeOrigin: true, |
| 23 | 23 | // pathRewrite: { |
| 24 | 24 | // '^/static/snap': '/static/snap' | ... | ... |
web_src/src/components/dialog/deviceEdit.vue
| ... | ... | @@ -59,6 +59,12 @@ |
| 59 | 59 | <el-checkbox label="作为消息通道" v-model="form.asMessageChannel" style="float: left"></el-checkbox> |
| 60 | 60 | <el-checkbox label="收到ACK后发流" v-model="form.broadcastPushAfterAck" style="float: left"></el-checkbox> |
| 61 | 61 | </el-form-item> |
| 62 | + | |
| 63 | + <el-form-item label="车辆编号" prop="carNo"> | |
| 64 | + <el-input v-model="form.carNo" clearable></el-input> | |
| 65 | + </el-form-item> | |
| 66 | + | |
| 67 | + | |
| 62 | 68 | <el-form-item> |
| 63 | 69 | <div style="float: right;"> |
| 64 | 70 | <el-button type="primary" @click="onSubmit">确认</el-button> | ... | ... |
web_src/static/js/config.js
数据库/ddl/DDL.sql
0 → 100644