device 平台

yangliu 040f3bd702 添加生产配置 2 mesiacov pred
device-service-application d5d748e8ea device redis缓存 改写 2 mesiacov pred
device-service-client-starter dfe51e191f feat: 合并ServiceActivator相关的业务处理 4 mesiacov pred
device-service-common 60361c5b98 线程池 改写 2 mesiacov pred
device-service-domain d5d748e8ea device redis缓存 改写 2 mesiacov pred
device-service-infrastructure 0a3a37d169 线程池 改写 2 mesiacov pred
device-service-server 040f3bd702 添加生产配置 2 mesiacov pred
.gitignore 93131749fd feat: 更换git仓库 4 mesiacov pred
Dockerfile 93131749fd feat: 更换git仓库 4 mesiacov pred
Java类与Python文件映射关系.md 0d138826e5 feat: 回滚springboot版本 3 mesiacov pred
Jenkinsfile 040f3bd702 添加生产配置 2 mesiacov pred
OPC单元测试验证结果.md c5df9e9460 feat: 新增设备订阅相关 4 mesiacov pred
OPC消息处理功能实现说明.md c5df9e9460 feat: 新增设备订阅相关 4 mesiacov pred
README.md 1cdae60414 feat: 更新jenkinsfile 完善点云算法 3 mesiacov pred
RadarTimeSeriesService.java 4e662ebd32 feat: 升级springboot版本 3 mesiacov pred
pom.xml 265586a3b0 device redis缓存 改写 3 mesiacov pred
消息发送逻辑修正总结.md c5ff2b296d feat: 修改设备订阅相关 4 mesiacov pred

README.md

# YceQ gR (Device Access Service) ## yv{N YceQ gR(DAS) /fN*NWN Java Spring Boot b/ghg^vYceQs^S Ǒ(uWqR(DDD) e(W:N N T{|WvYcO~Nv0SibU\vceQeHh0 gRǏ MQTT OSNYۏLO [sYOo Nb0rvc0̍PhKm0pNpencYtI{R0 ## yvgg ,gyvuWqR(DDD)vRB\gg wQSORR:N - **^(uB** (device-service-application): #OSW gR Yt^(u~+RvNR; YY}TNYt0NNOSTpenclbc0 - **WB** (device-service-domain): yvv8h S+TN@b gNR8h; YY[SO0pNYt0YƋ+R0W gRTNPcS0 - **W@xeB\** (device-service-infrastructure): cOb/g[s Ypenc^0MQTTmoYt0,{ Ne gRcSv[s0 - **(uB** (device-service-common): S+T!jWWv(u{| Y8^ϑ[IN0DTO[a0]wQ{|TMn0 - **[7bz/TRhV** (device-service-client-starter): :NvQN gRcON,g gRNNvFeign[7bz0 - ** gR/TR** (device-service-server): Spring Boot^(uveQS #~ňT/TRte*N gR0 - **PythonS gR** (das): (uN[kTvPythonHr,g[s cONJava gRI{NvR;0 ### ggOVV `mermaid graph TD; subgraph "^(uB\ Application" A["device-service-application"] A1["controller<br/>Web/WAPc6RhV"] A2["service<br/>^(u gRB\"] A21["DeviceCommandService"] A22["DeviceEventService"] A3["convert<br/>penclbchV"] A4["dto<br/>penc O[a"] A5["task<br/>[eNR"] A -- S+T --> A1 & A2 & A3 & A4 & A5 A2 -- S+T --> A21 & A22 end subgraph "WB\ Domain" B["device-service-domain"] B1["entity<br/>W[SO"] B11["Device<br/>Y[SO"] B12["AlarmPlan<br/>JTfR"] B13["BehaviorPattern<br/>L:N!j"] B2["service<br/>W gR"] B21["PointCloudProcessService<br/>pNYt gR"] B22["AlarmService<br/>JTf gR"] B23["DeviceService<br/>Y gR"] B3["port/gateway<br/>zScS"] B31["DeviceEventPort<br/>YNNzS"] B32["DeviceGateway<br/>YQsQ"] B33["MqttGateway<br/>MQTTQsQ"] B4["event<br/>WNN"] B41["DeviceEvent<br/>YNN"] B42["FallEvent<br/>̍PNN"] B5["vo<br/>YRg~g"] B52["TargetPoint<br/>vhp"] B -- S+T --> B1 & B2 & B3 & B4 & B5 B1 -- S+T --> B11 & B12 & B13 B2 -- S+T --> B21 & B22 & B23 B3 -- S+T --> B31 & B32 & B33 B4 -- S+T --> B41 & B42 B5 -- S+T --> B51 & B52 end subgraph "W@xeB\ Infrastructure" C["device-service-infrastructure"] C1["gateway/impl<br/>QsQ[s"] C11["DeviceGatewayImpl"] C12["MqttGatewayImpl"] C2["mqtt<br/>MQTTmoYt"] C21["DeviceMessageHandler<br/>YmoYthV"] C22["AppMessageHandler<br/>^(umoYthV"] C23["MpsMessageHandler<br/>\ z^moYthV"] C24["OpcMessageHandler<br/>Џ~moYthV"] C25["MqttHandlerImpl<br/>~Nmo1u"] C3["config<br/>Mn{t"] C31["MqttConfig<br/>MQTTMn"] C32["RedisConfig<br/>RedisMn"] C4["mapper<br/>penc f\"] C5["service<br/>W@x gR"] C -- S+T --> C1 & C2 & C3 & C4 & C5 C1 -- S+T --> C11 & C12 C2 -- S+T --> C21 & C22 & C23 & C24 & C25 C3 -- S+T --> C31 & C32 end subgraph "(uB\ Common" D["device-service-common"] D1["constant<br/>8^ϑ[IN"] D11["MqttTopics<br/>MQTT;N"] D12["DeviceErrorCode<br/>Yx"] D2["dto<br/>penc O[a"] D21["DeviceDTO<br/>YDTO"] D22["EventDTO<br/>NNDTO"] D3["util<br/>]wQ{|"] D31["PointCloudUtil<br/>pN]wQ"] D32["JsonUtil<br/>JSON]wQ"] D4["enums<br/>g>N"] D41["ModelType<br/>!jW{|W"] D42["PoseType<br/>Y{|W"] D5["annotation<br/>l"] D51["MqttSubscriber<br/>MQTTl"] D -- S+T --> D1 & D2 & D3 & D4 & D5 D1 -- S+T --> D11 & D12 D2 -- S+T --> D21 & D22 D3 -- S+T --> D31 & D32 D4 -- S+T --> D41 & D42 D5 -- S+T --> D51 end subgraph "[7bz/TRhV Client" E["device-service-client-starter"] E1["feign<br/>Feign[7bz"] E11["TokenFacadeFeign<br/>NLr gR[7bz"] E12["LogLoginFacadeFeign<br/>{vU_e_[7bz"] end subgraph "PythonS gR" P["das"] P1["mqtt_recv.py<br/>moc6eYt"] P2["mqtt_send.py<br/>moSYt"] P3["dev_mng.py<br/>Y{t"] P4["mydef.py<br/>8h_[INT]wQ"] P -- S+T --> P1 & P2 & P3 & P4 end %% !jWWOVsQ| A --> B & D C --> B & D B --> D E --> D %% cSN[ssQ| C11 --. [s .-> B32 C12 --. [s .-> B33 A21 --. [s .-> B31 %% NR(uAm C2 --. (u .-> A2 A2 --. (u .-> B2 A2 --. (u .-> B3 %% PythonNJavaR f\ P1 --. R f\ .-> C2 P2 --. R f\ .-> C12 P3 --. R f\ .-> C11 P4 --. R f\ .-> D3 ### 8h_~N #### 1. WB\8h_~N - **Y[SO (Device)**: WB\v8h_[SO \ňNYv@b g^\'TL:N SbYr0MOnOo0SpeMnI{0 - **pNYt gR (PointCloudProcessService)**: #YtY NbvpNpenc [svhhKm0YƋ+RI{8h_{l0 - **W gR/zS**: DeviceEventPort [INNYNNYtv8h_NR;cS nxONR;v~|'0 - **QsQcS**: DeviceGateway N MqttGateway [INNNY|~Ypenc^0MQTT Broker NNvbacS0 #### 2. MQTTmoYtgg - **mo1u (MqttHandlerImpl)**: ~NvMQTTmoeQS 9hnc;N\moRS~[^vYthV0 - **N(umoYthV**: - DeviceMessageHandler: YtY NLmoYOo Nb0_0rI{ - AppMessageHandler: Yt^(u NLmoY~[0SpenI{ - MpsMessageHandler: Yt\ z^ gRmo - OpcMessageHandler: YtЏ~[7bzmo - **Spring IntegrationƖb**: ǏMqttConfigMn[sNMQTT BrokervޏcTmo0 #### 3. pNpencYtAm z 1. **pencc6e**: YǏMQTT NbpNpenc0R/dev/{deviceId}/cloudpoint;N 2. **penc㉐g**: DeviceMessageHandler㉐gmov^cSpNPWhOo 3. **vhhKm**: PointCloudProcessService.getTrackerTargets(){vhMOn 4. **YƋ+R**: WNpNؚ^R^Tzzyr_Ƌ+RNXTY 5. **NNYt**: hKm̍PI{_8^NNv^SJTf ### !jWWOVsQ| u_DDDvOVSR !jWWvOVsQ|npffnx - **^(uB**OVWB\T(uB\ #OSNRAm z - **W@xeB**OVWB\T(uB\ cOb/g[s - **WB**NOV(uB\ OcNR;v~|' - **[7bz/TRhV**OV(uB\ cO[Y gRcS ُyUSTOVsQ|ONW!jWvrz' OvQ NSb/g[s~valg0 ### MQTTmoYtAm z 1. **moc6e**: W@xeB\v MqttConfig MnNSpring Integrationv MqttPahoMessageDrivenChannelAdapter #MQTT;Nv^\moc0Rc[v MessageChannel0 2. **mo1u**: MqttHandlerImpl \O:N~NveQS 9hncmo;N!j_9SM\vQRS~[^v MessageHandler0 3. **NRYt**: T*N MessageHandler (u^(uB\v gRY DeviceEventService eggbLwQSOvNR;0 4. **WgbL**: ^(uB\ gRYXbW[aTW gR[b8h_NR v^ǏQsQcSNY|~NN0 ُ*NAm z[sNb/gsQlpMQTTO NNRsQlpYNNYt v[hQRy0 ## yv~gf hfln-device-service/ %%% device-service-application/ # ^(uB\ % %%% controller/ # Webc6RhV % % %%% web/ # Webzc6RhV % % %%% wap/ # yRzc6RhV % %%% service/ # ^(u gR % % %%% impl/ # gR[s % %%% convert/ # penclbchV % %%% dto/ # penc O[a % %%% task/ # [eNR %%% device-service-domain/ # WB\ % %%% entity/ # W[SO % %%% service/ # W gR % % %%% impl/ # gR[s % %%% port/ # zScS % %%% gateway/ # QsQcS % %%% event/ # WNN % %%% vo/ # N{|W % %%% annotation/ # ꁚ[INl % %%% request/ # Bl[a % %%% vo/ # <P[a %%% device-service-client-starter/ # [7bz/TRhV % %%% api/feign/ # Feign[7bz %%% device-service-server/ # gR/TR!jWW % %%% config/ # /TRMn % %%% controller/ # vcc6RhV % %%% DeviceApplication.java # ;N/TR{| %%% das/ # PythonS gR % %%% mqtt_recv.py # moc6eYt % %%% mqtt_send.py # moSYt % %%% dev_mng.py # Y{t % %%% mydef.py # 8h_[IN %%% .gitignore # GiteuMn %%% Dockerfile # Dockerg^eN %%% Jenkinsfile # Jenkins CI/CD Am4l~ %%% pom.xml # Mavenyv9hMn %%% README.md # yvfech ## 8h_Ryr' ### 1. YceQ{t - /ecYy{|WYv~NceQ - YlQ0Tr{t - YSpeMnT܏ zc6R ### 2. pNpencYt - [epNpencc6eT㉐g - vhhKmTߍ*{l - WNnumpy{lI{NvJava[s ### 3. YƋ+R - WNpNpencvNXTYƋ+R - /eczz0PW N0 N0̍PI{YyY - [eYrvcTSSU ### 4. ̍PhKmJTf - [e̍PNNhKm - JTfRMnT{t - Y nSJTfwMQTT0wOI{ ### 5. YzcS/ec - Webz{tLubcS - yRzWAPcS - \ z^ gRcS - Џ~[7bzcS ## MQTTOOS ### MQTTMn MQTT gRvޏcMnOoMON device-service-server !jWWv application.yml eN-N yaml mqtt: server: uri: tcp://8.130.28.21:1883 client: id: device-service- username: admin password: public connect: timeout: 30 keep: alive: interval: 60 clean: session: true ### MQTT;Nĉ yvǑ(uB\!kSvMQTT;N #### Y NL;N (Device ! Server) - **YOo Nb**: /dev/{deviceId}/report_device_info - **Y_**: /dev/{deviceId}/keepalive - **Yr Nb**: /dev/{deviceId}/report_status - **YSpe Nb**: /dev/{deviceId}/report_param - **pNpenc Nb**: /dev/{deviceId}/cloudpoint - **̍PNN Nb**: /dev/{deviceId}/report_fall - **[epenc Nb**: /dev/{deviceId}/dsp_data #### ^(u NL;N (Server ! Device) - **DAS gRmo**: /das/{messageType} - **\ z^ gRmo**: /mps/{messageType} - **Џ~[7bzmo**: /opc/{messageType} #### wQSOmo;N - **YrSf**: /das/dev_status - **[eMOnY**: /das/realtime_pos - **̍PNNw**: /das/event - **JTfNN**: /das/alarm_event - **Y~[**: /mps/bind_device - **Y~**: /mps/unbind_device - **Spen**: /mps/set_device_param ### mo<h_ĉ #### pNpencmo<h_ json { "device_id": "YID", "timestamp": 1234567890000, "cloud_points": [ [x1, y1, z1], [x2, y2, z2], ... ], "trackertargets": [ [x, y, z] ] } #### ̍PNNmo<h json { "device_id": "YID", "timestamp": 1234567890000, "event_type": "fall_detected", "target_position": [x, y, z], "confidence": 0.95 } ## _STKmՋ ### _SsXBl - Java 8+ - Maven 3.6+ - Spring Boot 2.x - Redis ((uNX[) - MySQL ((uNpenccENS) - MQTT Broker (Eclipse Mosquitto cP) ### ЏLKmՋ bash # ЏL@b gKmՋ mvn test # ЏLc[vKmՋ{| mvn test -Dtest="com.hfln.device.infrastructure.config.MqttConfigTest" # ЏLMQTTƖbKmՋ mvn test -Dtest="com.hfln.device.infrastructure.mqtt.*Test" ### Nx(ϑhg bash # ыhg mvn clean compile # OVRg mvn dependency:analyze # Nxvs mvn jacoco:report ## rcWS ### ,g0W_Sr bash # ыSbS mvn clean package # ЏL gR java -jar device-service-server/target/device-service-server-1.0.0-SNAPSHOT.jar ### Dockerr bash # g^\P docker build -t device-service:latest . # ЏL[hV docker run -d -p 8080:8080 --name device-service device-service:latest ### uNsXr 1. **sXMn**: O9e application-prod.yml MneN 2. **penc^RYS**: gbL src/main/resources/db/migration/ NvSQL,g 3. ** gR/TR**: O(u systemd b supervisor {t gRۏ z 4. **vcMn**: Mn Prometheus + Grafana vcJTf ## 'OS ### pNpencYtOS - Ǒ(uAm_YtQ\QX[S(u - O(u[alb/g Y(u4Ne[a - _ekYt^sQ._; ### MQTTmoYtOS - moYthVv^LSYt - WN;Nvmo1uOS - ޏclTO݋{t ### penc^OS - O(uMyBatis PluscGS_SHes - TtO(uX[V{eu - penc^ޏclO ## vcTЏ~ ### ^(uvc - Spring Boot ActuatoreP^hg - ꁚ[INNRch6eƖ - JVM'vc ### e_{t - ~gSe_Q - R~+Re_Mn - e_nlTR_chV{eu ### JTfMn - gRS(u'JTf - NR8^JTf - 'chJTf --- ## !.scWS ### Nxĉ - u_?̑]]Java_SKbQ - O(u~NvNx<h_SMn - Q[tevUSCQKmՋ ### cNĉ - O(uINScNOo - R/e}T Tĉfeature/R Ty0bugfix/c - Pull Request{ǏNx[g ### ech~b - SefeAPIech - ~bggech - U͑Sfe Y gb^ cNIssuebT|_SV0