Bladeren bron

视频中心

lipenghui 1 maand geleden
bovenliggende
commit
85a6068ea1
51 gewijzigde bestanden met toevoegingen van 990 en 100 verwijderingen
  1. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/device/vo/YfIotDevicePageReqVO.java
  2. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/device/vo/YfIotDeviceRespVO.java
  3. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/device/vo/YfIotDeviceSaveReqVO.java
  4. 10 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/media/YfMediaServerController.java
  5. 4 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/server/VideoSessionManager.java
  6. 126 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/ZmlHookController.java
  7. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/IReqHandler.java
  8. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/IResHandler.java
  9. 0 15
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/msg/IMessageHandler.java
  10. 36 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/AckReqHandler.java
  11. 36 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/ByeReqHandler.java
  12. 36 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/CancelReqHandler.java
  13. 36 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/InviteReqHandler.java
  14. 2 6
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/RegisterReqHandler.java
  15. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/ReqAbstractHandler.java
  16. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/IMessageHandler.java
  17. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/MessageHandlerAbstract.java
  18. 3 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/MessageRequestProcessor.java
  19. 18 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/UnknowReqHandler.java
  20. 3 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/notify/NotifyMessageHandler.java
  21. 46 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/notify/cmdType/AlarmHandler.java
  22. 4 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/notify/cmdType/KeepaliveHandler.java
  23. 27 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/notify/cmdType/MediaStatusHandler.java
  24. 27 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/notify/cmdType/MobilePositionHandler.java
  25. 3 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/ResponseMessageHandler.java
  26. 28 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/AlarmRHandler.java
  27. 4 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/CatalogHandler.java
  28. 29 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/ConfigDownloadHandler.java
  29. 28 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/DeviceConfigHandler.java
  30. 28 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/DeviceControlHandler.java
  31. 4 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/DeviceInfoHandler.java
  32. 28 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/DeviceStatusHandler.java
  33. 28 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/MobilePositionRHandler.java
  34. 93 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/RecordInfoHandler.java
  35. 29 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/res/ByeResHandler.java
  36. 28 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/res/CancelResHandler.java
  37. 52 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/res/InviteResHandler.java
  38. 17 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/res/UnknowResHandler.java
  39. 74 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/thingsmodel/vo/ThingsModelSimpleItem.java
  40. 13 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/utils/ZlmApiUtils.java
  41. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/vo/DevicePageReqVO.java
  42. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/vo/DeviceRespVO.java
  43. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/vo/DeviceSaveReqVO.java
  44. 2 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/media/YfMediaServerService.java
  45. 11 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/media/YfMediaServerServiceImpl.java
  46. 2 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/sip/GBListenerImpl.java
  47. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/sip/IGBListener.java
  48. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/sip/IMqttService.java
  49. 57 56
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/sip/VideoMqttService.java
  50. 1 1
      yudao-server/src/main/resources/application-dev.yaml
  51. 2 0
      yudao-server/src/main/resources/application.yaml

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/device/vo/YfIotDevicePageReqVO.java

@@ -41,7 +41,7 @@ public class YfIotDevicePageReqVO extends PageParam {
     private Long deptId;
 
     @Schema(description = "设备状态(1-未激活,2-禁用,3-在线,4-离线)", example = "2")
-    private Boolean status;
+    private Integer status;
 
     @Schema(description = "信号强度(	信号极好4格[-55— 0],	信号好3格[-70— -55],	信号一般2格[-85— -70],	信号差1格[-100— -85])")
     private Integer rssi;

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/device/vo/YfIotDeviceRespVO.java

@@ -50,7 +50,7 @@ public class YfIotDeviceRespVO {
 
     @Schema(description = "设备状态(1-未激活,2-禁用,3-在线,4-离线)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @ExcelProperty("设备状态(1-未激活,2-禁用,3-在线,4-离线)")
-    private Boolean status;
+    private Integer status;
 
     @Schema(description = "信号强度(	信号极好4格[-55— 0],	信号好3格[-70— -55],	信号一般2格[-85— -70],	信号差1格[-100— -85])")
     @ExcelProperty("信号强度(	信号极好4格[-55— 0],	信号好3格[-70— -55],	信号一般2格[-85— -70],	信号差1格[-100— -85])")

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/device/vo/YfIotDeviceSaveReqVO.java

@@ -46,7 +46,7 @@ public class YfIotDeviceSaveReqVO {
 
     @Schema(description = "设备状态(1-未激活,2-禁用,3-在线,4-离线)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @NotNull(message = "设备状态(1-未激活,2-禁用,3-在线,4-离线)不能为空")
-    private Boolean status;
+    private Integer status;
 
     @Schema(description = "信号强度(	信号极好4格[-55— 0],	信号好3格[-70— -55],	信号一般2格[-85— -70],	信号差1格[-100— -85])")
     private Integer rssi;

+ 10 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/media/YfMediaServerController.java

@@ -5,6 +5,8 @@ import cn.iocoder.yudao.module.pms.controller.admin.yanfan.media.vo.YfMediaServe
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.media.vo.YfMediaServerSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.media.YfMediaServerDO;
 import cn.iocoder.yudao.module.pms.service.yanfan.media.YfMediaServerService;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.teautil.Common;
 import lombok.extern.java.Log;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
@@ -48,6 +50,14 @@ public class YfMediaServerController {
         return success(yfMediaServerService.createYfMediaServer(createReqVO));
     }
 
+    @Operation(summary = "获取rtp推流端口列表")
+    //@PreAuthorize("@ss.hasPermi('iot:video:list')")
+    @GetMapping("/listRtpServer")
+    public CommonResult<JSONObject> listRtpServer() {
+        return success(yfMediaServerService.listRtpServer());
+    }
+
+
     @PutMapping("/update")
     @Operation(summary = "更新yf流媒体服务器配置")
     @PreAuthorize("@ss.hasPermission('rq:yf-media-server:update')")

+ 4 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/server/VideoSessionManager.java

@@ -87,7 +87,8 @@ public class VideoSessionManager {
         String key = RedisKeyBuilder.buildStreamCacheKey("*", "*", "*", callId);
         List<Object> scanResult = redisCache.scan(key);
         if (!scanResult.isEmpty()) {
-            return (VideoSessionInfo) redisCache.getCacheObject((String) scanResult.get(0));
+//            return (VideoSessionInfo) redisCache.getCacheObject((String) scanResult.get(0));
+            return JSON.parseObject(JSON.toJSONString(scanResult.get(0)), VideoSessionInfo.class);
         } else {
             return null;
         }
@@ -100,7 +101,8 @@ public class VideoSessionManager {
         String key = RedisKeyBuilder.buildStreamCacheKey("*", "*", SSRC, "*");
         List<Object> scanResult = redisCache.scan(key);
         if (!scanResult.isEmpty()) {
-            return (VideoSessionInfo) redisCache.getCacheObject((String) scanResult.get(0));
+//            return (VideoSessionInfo) redisCache.getCacheObject((String) scanResult.get(0));
+            return JSON.parseObject(JSON.toJSONString(scanResult.get(0)), VideoSessionInfo.class);
         } else {
             return null;
         }

+ 126 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/ZmlHookController.java

@@ -0,0 +1,126 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip;
+
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.IZmlHookService;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.security.PermitAll;
+
+@Slf4j
+@RestController
+@RequestMapping("/zlmhook")
+public class ZmlHookController {
+
+    @Autowired
+    private IZmlHookService zmlHookService;
+
+    //@ApiOperation("访问流媒体服务器上的文件时触发回调")
+    @ResponseBody
+    @PostMapping(value = "/on_http_access", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onHttpAccess(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onHttpAccess(json).toString(), HttpStatus.OK);
+    }
+
+    //@ApiOperation("播放器鉴权事件回调")
+    @ResponseBody
+    @PostMapping(value = "/on_play", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onPlay(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onPlay(json).toString(), HttpStatus.OK);
+    }
+
+    //@ApiOperation("rtsp/rtmp/rtp推流鉴权事件回调")
+    @ResponseBody
+    @PostMapping(value = "/on_publish", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onPublish(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onPublish(json).toString(), HttpStatus.OK);
+    }
+
+    //@ApiOperation("流无人观看时事件回调")
+    @ResponseBody
+    @PostMapping(value = "/on_stream_none_reader", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onStreamNoneReader(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onStreamNoneReader(json).toString(), HttpStatus.OK);
+    }
+
+    //@ApiOperation("流未找到事件回调")
+    @ResponseBody
+    @PostMapping(value = "/on_stream_not_found", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onStreamNotFound(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onStreamNotFound(json).toString(), HttpStatus.OK);
+    }
+
+    //@ApiOperation("流注册或注销时触发此事件回调")
+    @ResponseBody
+    @PostMapping(value = "/on_stream_changed", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onStreamChanged(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onStreamChanged(json).toString(), HttpStatus.OK);
+    }
+
+    //@ApiOperation("流量统计事件回调")
+    @ResponseBody
+    @PostMapping(value = "/on_flow_report", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onFlowReport(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onFlowReport(json).toString(), HttpStatus.OK);
+    }
+
+    //@ApiOperation("rtp服务器长时间未收到数据超时回调")
+    @ResponseBody
+    @PostMapping(value = "/on_rtp_server_timeout", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onRtpServerTimeout(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onRtpServerTimeout(json).toString(), HttpStatus.OK);
+    }
+
+    //@ApiOperation("rtp发送停止回调")
+    @ResponseBody
+    @PostMapping(value = "/on_send_rtp_stopped", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onSendRtpStopped(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onSendRtpStopped(json).toString(), HttpStatus.OK);
+    }
+
+    //@ApiOperation("录制mp4完成后通知事件回调")
+    @ResponseBody
+    @PostMapping(value = "/on_record_mp4", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onRecordMp4(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onRecordMp4(json).toString(), HttpStatus.OK);
+    }
+
+    //@ApiOperation("流媒体服务器启动回调")
+    @ResponseBody
+    @PostMapping(value = "/on_server_started", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onServerStarted(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onServerStarted(json).toString(), HttpStatus.OK);
+    }
+
+    //@ApiOperation("流媒体服务器心跳回调")
+    @ResponseBody
+    @PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onServerKeepalive(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onServerKeepalive(json).toString(), HttpStatus.OK);
+    }
+
+    //@ApiOperation("流媒体服务器存活回调")
+    @ResponseBody
+    @PostMapping(value = "/on_server_exited", produces = "application/json;charset=UTF-8")
+    @PermitAll
+    public ResponseEntity<String> onServerExited(@RequestBody JSONObject json) {
+        return new ResponseEntity<String>(zmlHookService.onServerExited(json).toString(), HttpStatus.OK);
+    }
+
+
+}

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/sip/IReqHandler.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/IReqHandler.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.pms.service.yanfan.sip;
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler;
 
 import javax.sip.RequestEvent;
 

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/sip/IResHandler.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/IResHandler.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.pms.service.yanfan.sip;
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler;
 
 import javax.sip.ResponseEvent;
 import java.text.ParseException;

+ 0 - 15
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/msg/IMessageHandler.java

@@ -1,15 +0,0 @@
-package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.msg;
-
-import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
-import org.dom4j.Element;
-
-import javax.sip.RequestEvent;
-
-public interface IMessageHandler {
-    /**
-     * 处理来自设备的信息
-     * @param evt
-     * @param device
-     */
-    void handlerCmdType(RequestEvent evt, YfSipDeviceDO device, Element element);
-}

+ 36 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/AckReqHandler.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req;
+
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.IGBListener;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IReqHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.InvalidArgumentException;
+import javax.sip.RequestEvent;
+import javax.sip.SipException;
+import java.text.ParseException;
+
+@Slf4j
+@Component
+public class AckReqHandler extends ReqAbstractHandler implements InitializingBean, IReqHandler {
+    @Autowired
+    private IGBListener sipListener;
+
+    @Override
+    public void processMsg(RequestEvent evt) {
+        log.info("接收到ACK信息");
+        try {
+            responseAck(evt);
+        } catch (SipException | InvalidArgumentException | ParseException e) {
+            log.error("[回复ACK信息失败],{}", e.getMessage());
+        }
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String method = "ACK";
+        sipListener.addRequestProcessor(method, this);
+    }
+}

+ 36 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/ByeReqHandler.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req;
+
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.IGBListener;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IReqHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.InvalidArgumentException;
+import javax.sip.RequestEvent;
+import javax.sip.SipException;
+import java.text.ParseException;
+
+@Slf4j
+@Component
+public class ByeReqHandler extends ReqAbstractHandler implements InitializingBean, IReqHandler {
+    @Autowired
+    private IGBListener sipListener;
+
+    @Override
+    public void processMsg(RequestEvent evt) {
+        log.info("接收到BYE信息");
+        try {
+            responseAck(evt);
+        } catch (SipException | InvalidArgumentException | ParseException e) {
+            log.error("[回复BYE信息失败],{}", e.getMessage());
+        }
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String method = "BYE";
+        sipListener.addRequestProcessor(method, this);
+    }
+}

+ 36 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/CancelReqHandler.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req;
+
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.IGBListener;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IReqHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.InvalidArgumentException;
+import javax.sip.RequestEvent;
+import javax.sip.SipException;
+import java.text.ParseException;
+
+@Slf4j
+@Component
+public class CancelReqHandler extends ReqAbstractHandler implements InitializingBean, IReqHandler {
+    @Autowired
+    private IGBListener sipListener;
+
+    @Override
+    public void processMsg(RequestEvent evt) {
+        log.info("接收到CANCEL信息");
+        try {
+            responseAck(evt);
+        } catch (SipException | InvalidArgumentException | ParseException e) {
+            log.error("[回复CANCEL信息失败],{}", e.getMessage());
+        }
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String method = "CANCEL";
+        sipListener.addRequestProcessor(method, this);
+    }
+}

+ 36 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/InviteReqHandler.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req;
+
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.IGBListener;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IReqHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.InvalidArgumentException;
+import javax.sip.RequestEvent;
+import javax.sip.SipException;
+import java.text.ParseException;
+
+@Slf4j
+@Component
+public class InviteReqHandler extends ReqAbstractHandler implements InitializingBean, IReqHandler {
+    @Autowired
+    private IGBListener sipListener;
+
+    @Override
+    public void processMsg(RequestEvent evt) {
+        log.info("接收到INVITE信息");
+        try {
+            responseAck(evt);
+        } catch (SipException | InvalidArgumentException | ParseException e) {
+            log.error("[回复INVITE信息失败],{}", e.getMessage());
+        }
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String method = "INVITE";
+        sipListener.addRequestProcessor(method, this);
+    }
+}

+ 2 - 6
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/RegisterReqHandler.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/RegisterReqHandler.java

@@ -1,6 +1,5 @@
-package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler;
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req;
 
-import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.SipDate;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.utils.DigestAuthUtil;
@@ -10,13 +9,11 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceD
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.channel.YfSipDeviceChannelDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.yanfan.sip.device.YfSipDeviceMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.yanfan.sip.device.channel.YfSipDeviceChannelMapper;
-import cn.iocoder.yudao.module.pms.service.IDeviceService;
-import cn.iocoder.yudao.module.pms.service.yanfan.YfDeviceService;
 import cn.iocoder.yudao.module.pms.service.yanfan.config.SysSipConfig;
 import cn.iocoder.yudao.module.pms.service.yanfan.device.YfIotDeviceService;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.IGBListener;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.IMqttService;
-import cn.iocoder.yudao.module.pms.service.yanfan.sip.IReqHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IReqHandler;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.MessageInvoker;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.config.IotSipConfigService;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.device.YfSipDeviceService;
@@ -25,7 +22,6 @@ import gov.nist.javax.sip.address.AddressImpl;
 import gov.nist.javax.sip.address.SipUri;
 import gov.nist.javax.sip.header.Expires;
 import gov.nist.javax.sip.header.SIPDateHeader;
-import liquibase.pro.packaged.Y;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/ReqAbstractHandler.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/ReqAbstractHandler.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler;
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req;
 
 import gov.nist.javax.sip.SipStackImpl;
 import gov.nist.javax.sip.message.SIPRequest;

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/IMessageHandler.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/IMessageHandler.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler;
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message;
 
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
 import org.dom4j.Element;

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/MessageHandlerAbstract.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/MessageHandlerAbstract.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler;
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message;
 
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.utils.XmlUtil;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;

+ 3 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/MessageRequestProcessor.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/MessageRequestProcessor.java

@@ -1,10 +1,11 @@
-package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler;
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message;
 
 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.ReqAbstractHandler;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.utils.SipUtil;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.IGBListener;
-import cn.iocoder.yudao.module.pms.service.yanfan.sip.IReqHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IReqHandler;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.device.YfSipDeviceService;
 import gov.nist.javax.sip.message.SIPRequest;
 import lombok.extern.slf4j.Slf4j;

+ 18 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/UnknowReqHandler.java

@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message;
+
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IReqHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.ReqAbstractHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.sip.RequestEvent;
+
+@Slf4j
+@Component
+public class UnknowReqHandler extends ReqAbstractHandler implements IReqHandler {
+
+    @Override
+    public void processMsg(RequestEvent evt) {
+        log.warn("Unknow the method! Method:" + evt.getRequest().getMethod());
+    }
+}

+ 3 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/NotifyMessageHandler.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/notify/NotifyMessageHandler.java

@@ -1,5 +1,7 @@
-package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler;
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.notify;
 
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.MessageHandlerAbstract;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.MessageRequestProcessor;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;

+ 46 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/notify/cmdType/AlarmHandler.java

@@ -0,0 +1,46 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.notify.cmdType;
+
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.IMessageHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.notify.NotifyMessageHandler;
+import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.IMqttService;
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.MessageInvoker;
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.msg.Alarm;
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.msg.SipMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.dom4j.Element;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.RequestEvent;
+
+@Slf4j
+@Component
+public class AlarmHandler implements InitializingBean, IMessageHandler {
+
+    @Autowired
+    private NotifyMessageHandler notifyMessageHandler;
+
+    @Autowired
+    private MessageInvoker messageInvoker;
+
+    @Autowired
+    private IMqttService mqttService;
+
+    @Override
+    public void handlerCmdType(RequestEvent evt, YfSipDeviceDO device, Element element) {
+        log.info("设备报警:{}", device.getDeviceId());
+        SipMessage message = messageInvoker.messageToObj(evt);
+        if (message instanceof Alarm) {
+            log.info("报警内容:{}", message);
+            mqttService.publishEvent((Alarm) message);
+        }
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String cmdType = "Alarm";
+        notifyMessageHandler.addHandler(cmdType, this);
+    }
+}

+ 4 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/KeepaliveHandler.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/notify/cmdType/KeepaliveHandler.java

@@ -1,6 +1,9 @@
-package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler;
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.notify.cmdType;
 
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.enums.DeviceStatus;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.IMessageHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.notify.NotifyMessageHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.ReqAbstractHandler;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.utils.XmlUtil;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.device.YfIotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;

+ 27 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/notify/cmdType/MediaStatusHandler.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.notify.cmdType;
+
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.IMessageHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.notify.NotifyMessageHandler;
+import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
+import org.dom4j.Element;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.sip.RequestEvent;
+
+public class MediaStatusHandler implements InitializingBean, IMessageHandler {
+
+    @Autowired
+    private NotifyMessageHandler notifyMessageHandler;
+
+    @Override
+    public void handlerCmdType(RequestEvent evt, YfSipDeviceDO device, Element element) {
+
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String cmdType = "MediaStatus";
+        notifyMessageHandler.addHandler(cmdType, this);
+    }
+}

+ 27 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/notify/cmdType/MobilePositionHandler.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.notify.cmdType;
+
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.IMessageHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.notify.NotifyMessageHandler;
+import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
+import org.dom4j.Element;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.sip.RequestEvent;
+
+public class MobilePositionHandler implements InitializingBean, IMessageHandler {
+
+    @Autowired
+    private NotifyMessageHandler notifyMessageHandler;
+
+    @Override
+    public void handlerCmdType(RequestEvent evt, YfSipDeviceDO device, Element element) {
+
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String cmdType = "MobilePosition";
+        notifyMessageHandler.addHandler(cmdType, this);
+    }
+}

+ 3 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/ResponseMessageHandler.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/ResponseMessageHandler.java

@@ -1,5 +1,7 @@
-package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler;
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response;
 
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.MessageHandlerAbstract;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.MessageRequestProcessor;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;

+ 28 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/AlarmRHandler.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.cmdType;
+
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.IMessageHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.ResponseMessageHandler;
+import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
+import org.dom4j.Element;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.RequestEvent;
+
+@Component
+public class AlarmRHandler implements InitializingBean, IMessageHandler {
+
+    @Autowired
+    private ResponseMessageHandler responseMessageHandler;
+    @Override
+    public void handlerCmdType(RequestEvent evt, YfSipDeviceDO device, Element element) {
+
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String cmdType = "Alarm";
+        responseMessageHandler.addHandler(cmdType, this);
+    }
+}

+ 4 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/CatalogHandler.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/CatalogHandler.java

@@ -1,7 +1,10 @@
-package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler;
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.cmdType;
 
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.enums.ChannelType;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.enums.DeviceChannelStatus;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.IMessageHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.ReqAbstractHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.ResponseMessageHandler;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.utils.XmlUtil;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.channel.YfSipDeviceChannelDO;

+ 29 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/ConfigDownloadHandler.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.cmdType;
+
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.IMessageHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.ResponseMessageHandler;
+import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.channel.YfSipDeviceChannelDO;
+import org.dom4j.Element;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.RequestEvent;
+
+@Component
+public class ConfigDownloadHandler implements InitializingBean, IMessageHandler {
+
+    @Autowired
+    private ResponseMessageHandler responseMessageHandler;
+    @Override
+    public void handlerCmdType(RequestEvent evt, YfSipDeviceDO device, Element element) {
+
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String cmdType = "ConfigDownload";
+        responseMessageHandler.addHandler(cmdType, this);
+    }
+}

+ 28 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/DeviceConfigHandler.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.cmdType;
+
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.IMessageHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.ResponseMessageHandler;
+import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
+import org.dom4j.Element;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.RequestEvent;
+
+@Component
+public class DeviceConfigHandler implements InitializingBean, IMessageHandler {
+
+    @Autowired
+    private ResponseMessageHandler responseMessageHandler;
+    @Override
+    public void handlerCmdType(RequestEvent evt, YfSipDeviceDO device, Element element) {
+
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String cmdType = "DeviceConfig";
+        responseMessageHandler.addHandler(cmdType, this);
+    }
+}

+ 28 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/DeviceControlHandler.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.cmdType;
+
+import com.yanfan.sip.domain.SipDevice;
+import com.yanfan.sip.handler.req.message.IMessageHandler;
+import com.yanfan.sip.handler.req.message.response.ResponseMessageHandler;
+import org.dom4j.Element;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.RequestEvent;
+
+@Component
+public class DeviceControlHandler implements InitializingBean, IMessageHandler {
+
+    @Autowired
+    private ResponseMessageHandler responseMessageHandler;
+    @Override
+    public void handlerCmdType(RequestEvent evt, SipDevice device, Element element) {
+
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String cmdType = "DeviceConfig";
+        responseMessageHandler.addHandler(cmdType, this);
+    }
+}

+ 4 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/DeviceInfoHandler.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/DeviceInfoHandler.java

@@ -1,5 +1,8 @@
-package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler;
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.cmdType;
 
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.IMessageHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.ReqAbstractHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.ResponseMessageHandler;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.utils.XmlUtil;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.IMqttService;

+ 28 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/DeviceStatusHandler.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.cmdType;
+
+import com.yanfan.sip.domain.SipDevice;
+import com.yanfan.sip.handler.req.message.IMessageHandler;
+import com.yanfan.sip.handler.req.message.response.ResponseMessageHandler;
+import org.dom4j.Element;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.RequestEvent;
+
+@Component
+public class DeviceStatusHandler implements InitializingBean, IMessageHandler {
+
+    @Autowired
+    private ResponseMessageHandler responseMessageHandler;
+    @Override
+    public void handlerCmdType(RequestEvent evt, SipDevice device, Element element) {
+
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String cmdType = "DeviceStatus";
+        responseMessageHandler.addHandler(cmdType, this);
+    }
+}

+ 28 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/MobilePositionRHandler.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.cmdType;
+
+import com.yanfan.sip.domain.SipDevice;
+import com.yanfan.sip.handler.req.message.IMessageHandler;
+import com.yanfan.sip.handler.req.message.response.ResponseMessageHandler;
+import org.dom4j.Element;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.RequestEvent;
+
+@Component
+public class MobilePositionRHandler implements InitializingBean, IMessageHandler {
+
+    @Autowired
+    private ResponseMessageHandler responseMessageHandler;
+    @Override
+    public void handlerCmdType(RequestEvent evt, SipDevice device, Element element) {
+
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String cmdType = "MobilePosition";
+        responseMessageHandler.addHandler(cmdType, this);
+    }
+}

+ 93 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/message/response/cmdType/RecordInfoHandler.java

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req.message.response.cmdType;
+
+import com.yanfan.sip.domain.SipDevice;
+import com.yanfan.sip.handler.req.ReqAbstractHandler;
+import com.yanfan.sip.handler.req.message.IMessageHandler;
+import com.yanfan.sip.handler.req.message.response.ResponseMessageHandler;
+import com.yanfan.sip.model.RecordItem;
+import com.yanfan.sip.model.RecordList;
+import com.yanfan.sip.server.RecordCacheManager;
+import com.yanfan.sip.service.ISipCacheService;
+import com.yanfan.sip.util.SipUtil;
+import com.yanfan.sip.util.XmlUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.InvalidArgumentException;
+import javax.sip.RequestEvent;
+import javax.sip.SipException;
+import java.text.ParseException;
+import java.util.Iterator;
+
+@Slf4j
+@Component
+public class RecordInfoHandler extends ReqAbstractHandler implements InitializingBean, IMessageHandler {
+
+    @Autowired
+    private ResponseMessageHandler responseMessageHandler;
+
+    @Autowired
+    private ISipCacheService sipCacheService;
+
+    @Autowired
+    private RecordCacheManager recordCacheManager;
+    @Override
+    public void handlerCmdType(RequestEvent evt, SipDevice device, Element element) {
+        try {
+            // 回复200 OK
+            responseAck(evt);
+            Element rootElement = getRootElement(evt);
+            String deviceId = rootElement.element("DeviceID").getText();
+            String sn = XmlUtil.getText(rootElement, "SN");
+            String sumNum = XmlUtil.getText(rootElement, "SumNum");
+            String recordkey = deviceId + ":" + sn;
+            int recordnum = 0;
+            RecordList recordList = recordCacheManager.get(recordkey);
+            recordList.setDeviceID(deviceId);
+            Element recordListElement = rootElement.element("RecordList");
+            if (recordListElement == null || sumNum == null || sumNum.equals("")) {
+                log.info("无录像数据");
+            } else {
+                Iterator<Element> recordListIterator = recordListElement.elementIterator();
+                if (recordListIterator != null) {
+                    while (recordListIterator.hasNext()) {
+                        Element itemRecord = recordListIterator.next();
+                        Element recordElement = itemRecord.element("DeviceID");
+                        if (recordElement == null) {
+                            continue;
+                        }
+                        RecordItem item = new RecordItem();
+                        item.setStart(SipUtil.ISO8601Totimestamp(XmlUtil.getText(itemRecord, "StartTime")));
+                        item.setEnd(SipUtil.ISO8601Totimestamp(XmlUtil.getText(itemRecord, "EndTime")));
+                        recordList.addItem(item);
+                        recordnum++;
+                    }
+                }
+            }
+            log.info("getSumNum:{}", recordList.getSumNum());
+            recordList.setSumNum(recordList.getSumNum() + recordnum);
+            if (recordList.getSumNum() == Integer.parseInt(sumNum)) {
+                //时间合并 保存到redia
+                recordList.mergeItems();
+                log.info("mergeItems recordList:{}", recordList);
+                recordCacheManager.remove(recordkey);
+                sipCacheService.setRecordList(recordkey, recordList);
+                //发布设备property到emqx
+            } else {
+                recordCacheManager.put(recordkey, recordList);
+            }
+        } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String cmdType = "RecordInfo";
+        responseMessageHandler.addHandler(cmdType, this);
+    }
+}

+ 29 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/res/ByeResHandler.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.res;
+
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.IGBListener;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IResHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.ResponseEvent;
+import java.text.ParseException;
+
+@Slf4j
+@Component
+public class ByeResHandler implements InitializingBean, IResHandler {
+    @Autowired
+    private IGBListener sipListener;
+
+    @Override
+    public void processMsg(ResponseEvent evt) throws ParseException {
+
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String method = "BYE";
+        sipListener.addResponseProcessor(method,this);
+    }
+}

+ 28 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/res/CancelResHandler.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.res;
+
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.IGBListener;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IResHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.ResponseEvent;
+import java.text.ParseException;
+@Slf4j
+@Component
+public class CancelResHandler implements InitializingBean, IResHandler {
+    @Autowired
+    private IGBListener sipListener;
+
+    @Override
+    public void processMsg(ResponseEvent evt) throws ParseException {
+
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String method = "CANCEL";
+        sipListener.addResponseProcessor(method,this);
+    }
+}

+ 52 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/res/InviteResHandler.java

@@ -0,0 +1,52 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.res;
+
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.IGBListener;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IResHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sip.Dialog;
+import javax.sip.InvalidArgumentException;
+import javax.sip.ResponseEvent;
+import javax.sip.SipException;
+import javax.sip.address.SipURI;
+import javax.sip.header.CSeqHeader;
+import javax.sip.header.ViaHeader;
+import javax.sip.message.Request;
+import javax.sip.message.Response;
+import java.text.ParseException;
+
+@Slf4j
+@Component
+public class InviteResHandler implements InitializingBean, IResHandler {
+
+    @Autowired
+    private IGBListener sipListener;
+
+    @Override
+    public void processMsg(ResponseEvent evt) throws ParseException {
+        Response response = evt.getResponse();
+        Dialog dialog = evt.getDialog();
+        CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
+        Request reqAck = null;
+        try {
+            reqAck = dialog.createAck(cseq.getSeqNumber());
+            SipURI requestURI = (SipURI) reqAck.getRequestURI();
+            ViaHeader viaHeader = (ViaHeader) response.getHeader(ViaHeader.NAME);
+            requestURI.setHost(viaHeader.getHost());
+            requestURI.setPort(viaHeader.getPort());
+            reqAck.setRequestURI(requestURI);
+            dialog.sendAck(reqAck);
+        } catch (InvalidArgumentException | SipException | ParseException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        String method = "INVITE";
+        sipListener.addResponseProcessor(method,this);
+    }
+}

+ 17 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/res/UnknowResHandler.java

@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.res;
+
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IResHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.sip.ResponseEvent;
+import java.text.ParseException;
+
+@Slf4j
+@Component
+public class UnknowResHandler implements IResHandler {
+    @Override
+    public void processMsg(ResponseEvent evt) throws ParseException {
+        log.warn("Unknow Response! ReasonPhrase:" + evt.getResponse().getReasonPhrase());
+    }
+}

+ 74 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/thingsmodel/vo/ThingsModelSimpleItem.java

@@ -0,0 +1,74 @@
+package cn.iocoder.yudao.module.pms.controller.admin.yanfan.thingsmodel.vo;
+
+import cn.hutool.core.date.DateUtil;
+import cn.iocoder.yudao.framework.common.util.date.DateUtils;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 物模型值的项
+ *
+ * @author kerwincui
+ * @date 2021-12-16
+ */
+@AllArgsConstructor
+@Getter
+@Setter
+@Builder
+public class ThingsModelSimpleItem {
+    /**
+     * 物模型唯一标识符
+     */
+    private String id;
+
+    /**
+     * 物模型值
+     */
+    private String value;
+
+    private String name;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date ts;
+
+    private Integer slaveId;
+
+    /**
+     * 备注
+     **/
+    private String remark;
+
+    private String timestamp;
+
+    private boolean isBit = false;
+
+    public ThingsModelSimpleItem(String id, String value, String remark) {
+        this.id = id;
+        this.value = value;
+        this.remark = remark;
+    }
+
+    public ThingsModelSimpleItem(String id, String value, Integer slaveId, String remark) {
+        this.id = id;
+        this.value = value;
+        this.slaveId = slaveId;
+        this.remark = remark;
+    }
+
+    public ThingsModelSimpleItem() {
+    }
+
+
+    public void setTs(Date ts) {
+        this.ts = ts != null ? ts : new Date();
+    }
+
+}

+ 13 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/utils/ZlmApiUtils.java

@@ -380,4 +380,17 @@ public class ZlmApiUtils {
             log.error(String.format("[ %s ]请求失败: %s", url, e.getMessage()));
         }
     }
+
+    public JSONObject addStreamProxy(YfMediaServerDO media, String app, String stream, String url, Integer count) {
+        Map<String, Object> param = new HashMap<>();
+        param.put("app", app);
+        param.put("vhost", "__defaultVhost__");
+        param.put("stream", stream);
+        param.put("url", url);
+        if (Objects.isNull(count)) {
+            count = 10;
+        }
+        param.put("retry_count", count);
+        return sendPost(media, "addStreamProxy", param);
+    }
 }

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/vo/DevicePageReqVO.java

@@ -37,7 +37,7 @@ public class DevicePageReqVO extends PageParam {
     private Double firmwareVersion;
 
     @Schema(description = "设备状态(1-未激活,2-禁用,3-在线,4-离线)", example = "2")
-    private Boolean status;
+    private Integer status;
 
     @Schema(description = "信号强度(	信号极好4格[-55— 0],	信号好3格[-70— -55],	信号一般2格[-85— -70],	信号差1格[-100— -85])")
     private Integer rssi;

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/vo/DeviceRespVO.java

@@ -46,7 +46,7 @@ public class DeviceRespVO {
 
     @Schema(description = "设备状态(1-未激活,2-禁用,3-在线,4-离线)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @ExcelProperty("设备状态(1-未激活,2-禁用,3-在线,4-离线)")
-    private Boolean status;
+    private Integer status;
 
     @Schema(description = "信号强度(	信号极好4格[-55— 0],	信号好3格[-70— -55],	信号一般2格[-85— -70],	信号差1格[-100— -85])")
     @ExcelProperty("信号强度(	信号极好4格[-55— 0],	信号好3格[-70— -55],	信号一般2格[-85— -70],	信号差1格[-100— -85])")

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/vo/DeviceSaveReqVO.java

@@ -43,7 +43,7 @@ public class DeviceSaveReqVO {
 
     @Schema(description = "设备状态(1-未激活,2-禁用,3-在线,4-离线)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @NotNull(message = "设备状态(1-未激活,2-禁用,3-在线,4-离线)不能为空")
-    private Boolean status;
+    private Integer status;
 
     @Schema(description = "信号强度(	信号极好4格[-55— 0],	信号好3格[-70— -55],	信号一般2格[-85— -70],	信号差1格[-100— -85])")
     private Integer rssi;

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/media/YfMediaServerService.java

@@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.vo.VideoSessionIn
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.media.YfMediaServerDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.config.IotSipConfigDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
+import com.alibaba.fastjson.JSONObject;
 import liquibase.pro.packaged.Y;
 
 import javax.validation.Valid;
@@ -20,6 +21,7 @@ import javax.validation.Valid;
  * @author 超级管理员
  */
 public interface YfMediaServerService {
+    JSONObject listRtpServer();
     int deleteMediaServerByIds(Long[] ids);
     List<YfMediaServerDO> selectMediaServer();
     int updateMediaServer(YfMediaServerSaveReqVO mediaServer);

+ 11 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/media/YfMediaServerServiceImpl.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.pms.service.yanfan.media;
 import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.media.vo.YfMediaServerPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.media.vo.YfMediaServerSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.server.VideoSessionManager;
@@ -102,7 +103,7 @@ public class YfMediaServerServiceImpl implements YfMediaServerService {
 
     @Override
     public boolean syncMediaServer(YfMediaServerDO mediaServer, String secret) {
-        String hookPrex = String.format("http://%s/zlmhook", mediaServer.getHookurl());
+        String hookPrex = String.format("http://%s/admin-api/zlmhook", mediaServer.getHookurl());
         Map<String, Object> param = new HashMap<>();
         param.put("api.secret", secret);
 
@@ -212,6 +213,15 @@ public class YfMediaServerServiceImpl implements YfMediaServerService {
     }
 
 
+    @Override
+    public JSONObject listRtpServer() {
+        YfMediaServerDO media = selectMediaServerBytenantId(SecurityFrameworkUtils.getLoginUserId());
+        if (media != null) {
+            return zlmApiUtils.listRtpServer(media).getJSONObject("data");
+        }
+        return null;
+    }
+
     @Override
     public YfMediaServerDO selectMediaServerBydeviceSipId(String deviceSipId) {
         YfIotDeviceDO device = yfIotDeviceService.selectDeviceBySerialNumber(deviceSipId);

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/sip/GBListenerImpl.java

@@ -1,5 +1,7 @@
 package cn.iocoder.yudao.module.pms.service.yanfan.sip;
 
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IReqHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IResHandler;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/sip/IGBListener.java

@@ -1,6 +1,9 @@
 package cn.iocoder.yudao.module.pms.service.yanfan.sip;
 
 
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IReqHandler;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IResHandler;
+
 import javax.sip.SipListener;
 
 public interface IGBListener extends SipListener {

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/sip/IMqttService.java

@@ -11,7 +11,7 @@ import java.util.List;
 public interface IMqttService {
     void publishInfo(YfSipDeviceDO device);
     void publishStatus(YfSipDeviceDO device, int deviceStatus);
-//    void publishEvent(Alarm alarm);
+    void publishEvent(Alarm alarm);
 //    void publishProperty(Long productId, String deviceNum, List<ThingsModelSimpleItem> thingsList, int delay);
 //    void publishChannelsProperty(String DeviceSipId, List<YfSipDeviceChannelDO> channels);
 //    void publishRecordsProperty(String DeviceSipId, RecordList recordList);

+ 57 - 56
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/yanfan/sip/VideoMqttService.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.pms.service.yanfan.sip;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.enums.TopicType;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.mqtt.PubMqttClient;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.vo.SipDeviceSummary;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.thingsmodel.vo.ThingsModelSimpleItem;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.utils.TopicsUtils;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.device.YfIotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.config.IotSipConfigDO;
@@ -80,62 +81,62 @@ public class VideoMqttService implements IMqttService {
         }
     }
 
-//    @Override
-//    public void publishEvent(Alarm alarm) {
-//        Alarm.Info info;
-//        ThingsModelSimpleItem item;
-//        SipConfig sipConfig = sipConfigService.selectSipConfigBydeviceSipId(alarm.getDeviceId());
-//        if (null != sipConfig) {
-//            List<ThingsModelSimpleItem> events = new ArrayList<>();
-//            switch (alarm.getAlarmMethod()){
-//                case telAlarm:
-//                    item = new ThingsModelSimpleItem("telAlarm","1","");
-//                    events.add(item);
-//                    break;
-//                case devAlarm:
-//                    item = new ThingsModelSimpleItem("devAlarm","1","");
-//                    info = alarm.getInfo();
-//                    if(info != null && info.getAlarmType() != null){
-//                        item.setValue(info.getAlarmType());
-//                    }
-//                    events.add(item);
-//                    break;
-//                case smsAlarm:
-//                    item = new ThingsModelSimpleItem("smsAlarm","1","");
-//                    events.add(item);
-//                    break;
-//                case gpsAlarm:
-//                    item = new ThingsModelSimpleItem("gpsAlarm","1","");
-//                    events.add(item);
-//                    break;
-//                case videoAlarm:
-//                    item = new ThingsModelSimpleItem("videoAlarm","1","");
-//                    info = alarm.getInfo();
-//                    if(info != null && info.getAlarmType() != null){
-//                        item.setValue(info.getAlarmType());
-//                    }
-//                    events.add(item);
-//                    break;
-//                case devErrorAlarm:
-//                    item = new ThingsModelSimpleItem("devErrorAlarm","1","");
-//                    info = alarm.getInfo();
-//                    if(info != null && info.getAlarmType() != null){
-//                        item.setValue(info.getAlarmType());
-//                    }
-//                    events.add(item);
-//                    break;
-//                case other:
-//                    item = new ThingsModelSimpleItem("otherAlarm","1","");
-//                    events.add(item);
-//                    break;
-//            }
-//            Long productId = sipConfig.getProductId();
-//            if (null != productId && productId != -1L && productId != 0L) {
-//                String topic = topicsUtils.buildTopic(sipConfig.getProductId(), alarm.getDeviceId(), TopicType.DEV_EVENT_POST);
-//                mqttClient.publish(1, false, topic, JSON.toJSONString(events));
-//            }
-//        }
-//    }
+    @Override
+    public void publishEvent(Alarm alarm) {
+        Alarm.Info info;
+        ThingsModelSimpleItem item;
+        IotSipConfigDO sipConfig = sipConfigService.selectSipConfigBydeviceSipId(alarm.getDeviceId());
+        if (null != sipConfig) {
+            List<ThingsModelSimpleItem> events = new ArrayList<>();
+            switch (alarm.getAlarmMethod()){
+                case telAlarm:
+                    item = new ThingsModelSimpleItem("telAlarm","1","");
+                    events.add(item);
+                    break;
+                case devAlarm:
+                    item = new ThingsModelSimpleItem("devAlarm","1","");
+                    info = alarm.getInfo();
+                    if(info != null && info.getAlarmType() != null){
+                        item.setValue(info.getAlarmType());
+                    }
+                    events.add(item);
+                    break;
+                case smsAlarm:
+                    item = new ThingsModelSimpleItem("smsAlarm","1","");
+                    events.add(item);
+                    break;
+                case gpsAlarm:
+                    item = new ThingsModelSimpleItem("gpsAlarm","1","");
+                    events.add(item);
+                    break;
+                case videoAlarm:
+                    item = new ThingsModelSimpleItem("videoAlarm","1","");
+                    info = alarm.getInfo();
+                    if(info != null && info.getAlarmType() != null){
+                        item.setValue(info.getAlarmType());
+                    }
+                    events.add(item);
+                    break;
+                case devErrorAlarm:
+                    item = new ThingsModelSimpleItem("devErrorAlarm","1","");
+                    info = alarm.getInfo();
+                    if(info != null && info.getAlarmType() != null){
+                        item.setValue(info.getAlarmType());
+                    }
+                    events.add(item);
+                    break;
+                case other:
+                    item = new ThingsModelSimpleItem("otherAlarm","1","");
+                    events.add(item);
+                    break;
+            }
+            Long productId = sipConfig.getProductId();
+            if (null != productId && productId != -1L && productId != 0L) {
+                String topic = topicsUtils.buildTopic(sipConfig.getProductId(), alarm.getDeviceId(), TopicType.DEV_EVENT_POST);
+                mqttClient.publish(1, false, topic, JSON.toJSONString(events));
+            }
+        }
+    }
 //
 //    public void publishChannelsProperty(String DeviceSipId, List<SipDeviceChannel> channels) {
 //        SipConfig sipConfig = sipConfigService.selectSipConfigBydeviceSipId(DeviceSipId);

+ 1 - 1
yudao-server/src/main/resources/application-dev.yaml

@@ -1,5 +1,5 @@
 server:
-  port: 48080
+  port: 8080
 
 --- #################### 数据库相关配置 ####################
 

+ 2 - 0
yudao-server/src/main/resources/application.yaml

@@ -253,6 +253,7 @@ yudao:
     permit-all_urls:
       - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,不需要登录
       - /admin-api/rq/iot-app/**
+      - /admin-api/zlmhook/**
   websocket:
     enable: true # websocket的开关
     path: /infra/ws # 路径
@@ -295,6 +296,7 @@ yudao:
       - /jmreport/* # 积木报表,无法携带租户编号
       - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,无法携带租户编号
       - /admin-api/system/auth/social-login
+      - /admin-api/zlmhook/*
       - /admin-api/system/dict-data/page
       - /admin-api/rq/iot-tree/simple-list
       - /system/auth/social-login