Forráskód Böngészése

优化目录结构

wuweihao 5 éve
szülő
commit
9e1f9305c8

+ 206 - 208
.idea/workspace.xml

@@ -2,75 +2,24 @@
 <project version="4">
   <component name="ChangeListManager">
     <list default="true" id="fb6ddcd0-df98-4d65-a159-b2472538162d" name="Default" comment="">
-      <change afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/TaskSchedule.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/wsm-application/src/main/resources/application-dev.properties" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/wsm-application/src/main/resources/application-pro.properties" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/constant/MsgCode.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/mqtt/ClientMQTT.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/mqtt/PushCallback.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/mqtt/TopicCode.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/ConvertData.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/CoverTcpServer.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/NettyServerHandler.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/Rule.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/dao/IDeviceEventDao.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/dao/IDeviceEventDao.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/dao/IResourceDao.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/dao/IResourceDao.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/dao/IRoleDao.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/dao/IRoleDao.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/dao/IUserDao.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/dao/IUserDao.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/mapper/ResourceMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/mapper/ResourceMapper.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/mapper/RoleMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/mapper/RoleMapper.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/mapper/UserMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/mapper/UserMapper.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/model/Device.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/model/Device.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/model/DeviceEvent.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/model/DeviceEvent.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/model/Resource.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/model/Resource.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/model/Role.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/model/Role.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/model/User.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-dao/src/main/java/com/wsm/admin/model/User.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-service/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-service/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/dto/ResourceTree.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/dto/ResourceTree.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/IDeviceEventService.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/IDeviceEventService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/IResourceService.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/IResourceService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/IRoleService.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/IRoleService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/IUserService.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/IUserService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/DeviceEventServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/DeviceEventServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/DeviceServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/DeviceServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/ResourceServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/ResourceServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/RoleServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/RoleServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/UserServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/UserServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/util/ResourceTreeUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/util/ResourceTreeUtil.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/ApiDeviceController.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/ApiDeviceController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/DataDictionaryController.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/DataDictionaryController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/DeviceController.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/DeviceController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/DeviceEventController.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/DeviceEventController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/IndexController.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/IndexController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/KaptchaController.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/KaptchaController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/ResourceController.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/ResourceController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/RoleController.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/RoleController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/UserController.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/UserController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/handle/UdpServerHandler.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/handle/UdpServerHandler.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/StartupUdpEvent.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/StartupUdpEvent.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/TcpServer.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/TcpServer.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/shiro/MyShiroRealm.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/shiro/MyShiroRealm.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/shiro/ShiroConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/shiro/ShiroConfig.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/thread/TaskExecutePool.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/thread/TaskExecutePool.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-application/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-application/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-application/src/main/java/com/wsm/Application.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-application/src/main/java/com/wsm/Application.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/handle/UdpServerHandler.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/StartupUdpEvent.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/init/StartupUdpEvent.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/TaskSchedule.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/init/TaskSchedule.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/TcpServer.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/UdpServer.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/wsm-application/src/main/resources/application-dev.properties" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-application/src/main/resources/application-dev.properties" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/wsm-application/src/main/resources/application-pro.properties" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-application/src/main/resources/application-pro.properties" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/wsm-application/src/main/resources/application.properties" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-application/src/main/resources/application.properties" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-application/src/main/resources/logback.xml" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-application/src/main/resources/logback.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/aop/SystemControllerLog.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/aop/SystemControllerLog.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/aop/SystemServiceLog.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/aop/SystemServiceLog.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/api/BaseController.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/api/BaseController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/config/KaptchaConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/config/KaptchaConfig.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/config/WebMvcConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/config/WebMvcConfig.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/config/WebSocketConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/config/WebSocketConfig.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/dao/IBaseDao.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/dao/IBaseDao.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/interceptor/CommonInterceptor.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/interceptor/CommonInterceptor.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/model/BaseModel.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/model/BaseModel.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/redis/RedisConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/redis/RedisConfig.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/service/IBaseService.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/service/IBaseService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/service/impl/BaseServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/service/impl/BaseServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/shiro/ShiroManager.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/shiro/ShiroManager.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/util/AjaxJson.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/util/AjaxJson.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/util/DateEditor.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/util/DateEditor.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/util/DateTimeUtils.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/util/DateTimeUtils.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/util/PasswordUtils.java" beforeDir="false" afterPath="$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/util/PasswordUtils.java" afterDir="false" />
     </list>
     <ignored path="$PROJECT_DIR$/wsm-admin-web/target/" />
     <ignored path="$PROJECT_DIR$/wsm-common/target/" />
@@ -89,84 +38,83 @@
   </component>
   <component name="FileEditorManager">
     <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file leaf-file-name="LiveController.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/LiveController.java">
+      <file leaf-file-name="ConvertData.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/ConvertData.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="1292">
-              <caret line="97" column="43" selection-start-line="97" selection-start-column="38" selection-end-line="97" selection-end-column="43" />
+            <state relative-caret-position="67">
+              <caret line="10" column="9" selection-start-line="10" selection-start-column="9" selection-end-line="10" selection-end-column="9" />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="RoleController.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/RoleController.java">
+      <file leaf-file-name="TaskExecutePool.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/thread/TaskExecutePool.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="102">
-              <caret line="28" column="13" selection-start-line="28" selection-start-column="13" selection-end-line="28" selection-end-column="13" />
+            <state relative-caret-position="17">
+              <caret line="17" lean-forward="true" selection-start-line="17" selection-end-line="17" />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="StartupUdpEvent.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/StartupUdpEvent.java">
+      <file leaf-file-name="MsgCode.java" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/constant/MsgCode.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="527">
-              <caret line="37" column="53" selection-start-line="37" selection-start-column="53" selection-end-line="37" selection-end-column="53" />
+            <state relative-caret-position="136">
+              <caret line="8" column="20" selection-start-line="8" selection-start-column="20" selection-end-line="8" selection-end-column="20" />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="application.properties" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/wsm-application/src/main/resources/application.properties">
+      <file leaf-file-name="TopicCode.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/mqtt/TopicCode.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="289">
-              <caret line="20" column="13" selection-start-line="20" selection-start-column="13" selection-end-line="20" selection-end-column="13" />
+            <state relative-caret-position="350">
+              <caret line="34" column="31" selection-start-line="34" selection-start-column="31" selection-end-line="34" selection-end-column="31" />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="application-pro.properties" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/wsm-application/src/main/resources/application-pro.properties">
-          <provider selected="true" editor-type-id="text-editor" />
-        </entry>
-      </file>
-      <file leaf-file-name="application-dev.properties" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/wsm-application/src/main/resources/application-dev.properties">
-          <provider selected="true" editor-type-id="text-editor" />
+      <file leaf-file-name="StartupUdpEvent.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/init/StartupUdpEvent.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="306">
+              <caret line="30" column="26" selection-start-line="30" selection-start-column="12" selection-end-line="30" selection-end-column="26" />
+            </state>
+          </provider>
         </entry>
       </file>
-      <file leaf-file-name="UdpServerHandler.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/handle/UdpServerHandler.java">
+      <file leaf-file-name="CoverTcpServer.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/CoverTcpServer.java">
           <provider selected="true" editor-type-id="text-editor">
             <state relative-caret-position="119">
-              <caret line="35" column="3" selection-start-line="35" selection-start-column="3" selection-end-line="35" selection-end-column="3" />
+              <caret line="18" column="10" lean-forward="true" selection-start-line="18" selection-start-column="10" selection-end-line="18" selection-end-column="10" />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="UdpServer.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/UdpServer.java">
+      <file leaf-file-name="NettyServerHandler.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/NettyServerHandler.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="272">
-              <caret line="25" column="18" selection-start-line="25" selection-start-column="18" selection-end-line="25" selection-end-column="18" />
+            <state relative-caret-position="68">
+              <caret line="29" column="9" selection-start-line="29" selection-start-column="9" selection-end-line="29" selection-end-column="9" />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="TcpServer.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/TcpServer.java">
+      <file leaf-file-name="Rule.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/Rule.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="68">
-              <caret line="31" column="10" selection-start-line="31" selection-start-column="10" selection-end-line="31" selection-end-column="10" />
+            <state relative-caret-position="102">
+              <caret line="6" column="13" selection-start-line="6" selection-start-column="13" selection-end-line="6" selection-end-column="13" />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="ResourceController.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/ResourceController.java">
+      <file leaf-file-name="TaskSchedule.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/init/TaskSchedule.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="102">
-              <caret line="35" column="13" selection-start-line="35" selection-start-column="13" selection-end-line="35" selection-end-column="13" />
+            <state relative-caret-position="162">
+              <caret line="24" column="13" selection-start-line="24" selection-start-column="13" selection-end-line="24" selection-end-column="13" />
             </state>
           </provider>
         </entry>
@@ -211,6 +159,16 @@
         <option value="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/LiveController.java" />
         <option value="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/KaptchaController.java" />
         <option value="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/StartupUdpEvent.java" />
+        <option value="$PROJECT_DIR$/README.md" />
+        <option value="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/TaskSchedule.java" />
+        <option value="$PROJECT_DIR$/wsm-application/src/main/resources/application-pro.properties" />
+        <option value="$PROJECT_DIR$/wsm-application/src/main/resources/application-dev.properties" />
+        <option value="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/mqtt/PushCallback.java" />
+        <option value="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/Rule.java" />
+        <option value="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/init/TaskSchedule.java" />
+        <option value="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/ConvertData.java" />
+        <option value="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/NettyServerHandler.java" />
+        <option value="$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/constant/MsgCode.java" />
       </list>
     </option>
   </component>
@@ -339,7 +297,7 @@
               <item name="main" type="462c0819:PsiDirectoryNode" />
               <item name="java" type="462c0819:PsiDirectoryNode" />
               <item name="admin" type="462c0819:PsiDirectoryNode" />
-              <item name="handle" type="462c0819:PsiDirectoryNode" />
+              <item name="constant" type="462c0819:PsiDirectoryNode" />
             </path>
             <path>
               <item name="jm-smart-city" type="b2602c69:ProjectViewProjectNode" />
@@ -349,7 +307,7 @@
               <item name="main" type="462c0819:PsiDirectoryNode" />
               <item name="java" type="462c0819:PsiDirectoryNode" />
               <item name="admin" type="462c0819:PsiDirectoryNode" />
-              <item name="init" type="462c0819:PsiDirectoryNode" />
+              <item name="device" type="462c0819:PsiDirectoryNode" />
             </path>
             <path>
               <item name="jm-smart-city" type="b2602c69:ProjectViewProjectNode" />
@@ -359,7 +317,8 @@
               <item name="main" type="462c0819:PsiDirectoryNode" />
               <item name="java" type="462c0819:PsiDirectoryNode" />
               <item name="admin" type="462c0819:PsiDirectoryNode" />
-              <item name="shiro" type="462c0819:PsiDirectoryNode" />
+              <item name="device" type="462c0819:PsiDirectoryNode" />
+              <item name="init" type="462c0819:PsiDirectoryNode" />
             </path>
             <path>
               <item name="jm-smart-city" type="b2602c69:ProjectViewProjectNode" />
@@ -369,7 +328,8 @@
               <item name="main" type="462c0819:PsiDirectoryNode" />
               <item name="java" type="462c0819:PsiDirectoryNode" />
               <item name="admin" type="462c0819:PsiDirectoryNode" />
-              <item name="thread" type="462c0819:PsiDirectoryNode" />
+              <item name="device" type="462c0819:PsiDirectoryNode" />
+              <item name="tcp" type="462c0819:PsiDirectoryNode" />
             </path>
             <path>
               <item name="jm-smart-city" type="b2602c69:ProjectViewProjectNode" />
@@ -627,19 +587,27 @@
       <option name="presentableId" value="Default" />
       <updated>1573182301041</updated>
       <workItem from="1573182306625" duration="7204000" />
-      <workItem from="1576231069731" duration="247000" />
+      <workItem from="1576231069731" duration="5156000" />
+    </task>
+    <task id="LOCAL-00001" summary="添加了传感器">
+      <created>1576231455524</created>
+      <option name="number" value="00001" />
+      <option name="presentableId" value="LOCAL-00001" />
+      <option name="project" value="LOCAL" />
+      <updated>1576231455524</updated>
     </task>
+    <option name="localTasksCounter" value="2" />
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="7451000" />
+    <option name="totallyTimeSpent" value="12360000" />
   </component>
   <component name="ToolWindowManager">
     <frame x="-8" y="5" width="1936" height="1049" extended-state="0" />
     <layout>
       <window_info anchor="right" id="Palette" order="3" />
       <window_info anchor="bottom" id="Event Log" order="7" side_tool="true" />
-      <window_info anchor="right" id="Maven Projects" order="3" visible="true" weight="0.32995737" />
+      <window_info anchor="right" id="Maven Projects" order="3" weight="0.32995737" />
       <window_info anchor="bottom" id="Database Changes" order="7" show_stripe_button="false" />
       <window_info id="Capture Tool" order="2" />
       <window_info id="Designer" order="2" />
@@ -657,11 +625,11 @@
       <window_info id="Image Layers" order="2" />
       <window_info anchor="bottom" id="Java Enterprise" order="7" />
       <window_info anchor="right" id="Capture Analysis" order="3" />
-      <window_info anchor="bottom" id="Version Control" order="7" weight="0.3293348" />
-      <window_info active="true" anchor="bottom" id="Run" order="2" visible="true" weight="0.26593408" />
+      <window_info anchor="bottom" id="Version Control" order="7" weight="0.32857144" />
+      <window_info anchor="bottom" id="Run" order="2" visible="true" weight="0.41098902" />
       <window_info anchor="bottom" id="Spring" order="7" />
       <window_info anchor="bottom" id="Terminal" order="7" />
-      <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.25" />
+      <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.25" />
       <window_info anchor="right" id="Bean Validation" order="3" />
       <window_info id="Web" order="2" side_tool="true" />
       <window_info anchor="right" id="Theme Preview" order="3" />
@@ -680,84 +648,16 @@
   <component name="VcsContentAnnotationSettings">
     <option name="myLimit" value="2678400000" />
   </component>
+  <component name="VcsManagerConfiguration">
+    <MESSAGE value="添加了传感器" />
+    <option name="LAST_COMMIT_MESSAGE" value="添加了传感器" />
+  </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
       <option name="time" value="1" />
     </breakpoint-manager>
   </component>
   <component name="editorHistoryManager">
-    <entry file="jar://D:/Program Files/Java/jdk1.8.0_161/src.zip!/java/util/function/Consumer.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="425">
-          <caret line="48" column="9" selection-start-line="48" selection-start-column="9" selection-end-line="48" selection-end-column="9" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/util/AjaxJson.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="561">
-          <caret line="48" column="73" selection-start-line="48" selection-start-column="69" selection-end-line="48" selection-end-column="73" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/api/hhh.java" />
-    <entry file="file://$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/RoleServiceImpl.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="102">
-          <caret line="16" column="13" selection-start-line="16" selection-start-column="13" selection-end-line="16" selection-end-column="13" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/UserServiceImpl.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="102">
-          <caret line="16" column="13" selection-start-line="16" selection-start-column="13" selection-end-line="16" selection-end-column="13" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/dto/ResourceTree.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-442">
-          <caret line="4" column="13" selection-start-line="4" selection-start-column="13" selection-end-line="4" selection-end-column="13" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/DeviceEventServiceImpl.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="85">
-          <caret line="11" column="13" selection-start-line="11" selection-start-column="13" selection-end-line="11" selection-end-column="13" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/IDeviceService.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="68">
-          <caret line="5" column="17" selection-start-line="5" selection-start-column="17" selection-end-line="5" selection-end-column="17" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-admin-service/src/main/java/com/wsm/admin/service/impl/DataDictionaryServiceImpl.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="197">
-          <caret line="22" column="13" selection-start-line="22" selection-start-column="13" selection-end-line="22" selection-end-column="13" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/README.md">
-      <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
-        <state split_layout="SPLIT">
-          <first_editor />
-          <second_editor />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-admin-web/pom.xml">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="391">
-          <caret line="35" column="26" selection-start-line="35" selection-start-column="26" selection-end-line="35" selection-end-column="26" />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/config/Swagger2.java" />
     <entry file="file://$PROJECT_DIR$/wsm-common/src/main/java/com/wsm/common/config/WebMvcConfig.java">
       <provider selected="true" editor-type-id="text-editor">
@@ -785,6 +685,10 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="153">
           <caret line="20" selection-start-line="20" selection-end-line="20" selection-end-column="15" />
+          <folding>
+            <element signature="e#1305#1306#0" expanded="true" />
+            <element signature="e#1367#1368#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
@@ -813,6 +717,9 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="493">
           <caret line="35" column="37" lean-forward="true" selection-start-line="35" selection-start-column="37" selection-end-line="35" selection-end-column="37" />
+          <folding>
+            <element signature="e#959#989#1" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
@@ -865,6 +772,9 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="459">
           <caret line="29" lean-forward="true" selection-start-line="29" selection-end-line="29" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
@@ -952,51 +862,139 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/thread/TaskExecutePool.java">
+    <entry file="file://$PROJECT_DIR$/README.md">
+      <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
+        <state split_layout="SPLIT">
+          <first_editor relative-caret-position="85">
+            <caret line="5" column="7" selection-start-line="5" selection-start-column="7" selection-end-line="5" selection-end-column="7" />
+          </first_editor>
+          <second_editor />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wsm-application/src/main/resources/application.properties">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-31">
-          <caret line="17" column="13" selection-start-line="17" selection-start-column="13" selection-end-line="17" selection-end-column="13" />
+        <state relative-caret-position="-286">
+          <caret line="20" column="13" selection-start-line="20" selection-start-column="13" selection-end-line="20" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/TcpServer.java">
+    <entry file="file://$PROJECT_DIR$/wsm-application/src/main/resources/application-pro.properties">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="68">
-          <caret line="31" column="10" selection-start-line="31" selection-start-column="10" selection-end-line="31" selection-end-column="10" />
+        <state relative-caret-position="119">
+          <caret line="7" column="168" selection-start-line="7" selection-start-column="168" selection-end-line="7" selection-end-column="168" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wsm-application/src/main/resources/application-dev.properties">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="170">
+          <caret line="10" lean-forward="true" selection-start-line="10" selection-end-line="10" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/mqtt/ClientMQTT.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="213">
+          <caret line="60" selection-start-line="60" selection-end-line="60" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/mqtt/PushCallback.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1080">
+          <caret line="106" selection-start-line="106" selection-end-line="106" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/init/TaskSchedule.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="162">
+          <caret line="24" column="13" selection-start-line="24" selection-start-column="13" selection-end-line="24" selection-end-column="13" />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/UdpServer.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="272">
-          <caret line="25" column="18" selection-start-line="25" selection-start-column="18" selection-end-line="25" selection-end-column="18" />
+        <state relative-caret-position="170">
+          <caret line="19" column="70" selection-start-line="19" selection-start-column="61" selection-end-line="19" selection-end-column="70" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/tcp/NettyServer.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="68">
+          <caret line="12" column="13" selection-start-line="12" selection-start-column="13" selection-end-line="12" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/TcpServer.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-544">
+          <caret line="31" column="10" selection-start-line="31" selection-start-column="10" selection-end-line="31" selection-end-column="10" />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/handle/UdpServerHandler.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="119">
-          <caret line="35" column="3" selection-start-line="35" selection-start-column="3" selection-end-line="35" selection-end-column="3" />
+        <state relative-caret-position="2686">
+          <caret line="186" column="9" selection-start-line="186" selection-start-column="9" selection-end-line="186" selection-end-column="9" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/init/StartupUdpEvent.java">
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/thread/TaskExecutePool.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="527">
-          <caret line="37" column="53" selection-start-line="37" selection-start-column="53" selection-end-line="37" selection-end-column="53" />
+        <state relative-caret-position="17">
+          <caret line="17" lean-forward="true" selection-start-line="17" selection-end-line="17" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-application/src/main/resources/application-pro.properties">
-      <provider selected="true" editor-type-id="text-editor" />
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/mqtt/TopicCode.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="350">
+          <caret line="34" column="31" selection-start-line="34" selection-start-column="31" selection-end-line="34" selection-end-column="31" />
+        </state>
+      </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-application/src/main/resources/application-dev.properties">
-      <provider selected="true" editor-type-id="text-editor" />
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/Rule.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="102">
+          <caret line="6" column="13" selection-start-line="6" selection-start-column="13" selection-end-line="6" selection-end-column="13" />
+        </state>
+      </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/wsm-application/src/main/resources/application.properties">
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/NettyServerHandler.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="289">
-          <caret line="20" column="13" selection-start-line="20" selection-start-column="13" selection-end-line="20" selection-end-column="13" />
+        <state relative-caret-position="68">
+          <caret line="29" column="9" selection-start-line="29" selection-start-column="9" selection-end-line="29" selection-end-column="9" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/ConvertData.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="67">
+          <caret line="10" column="9" selection-start-line="10" selection-start-column="9" selection-end-line="10" selection-end-column="9" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/init/StartupUdpEvent.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="306">
+          <caret line="30" column="26" selection-start-line="30" selection-start-column="12" selection-end-line="30" selection-end-column="26" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/CoverTcpServer.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="119">
+          <caret line="18" column="10" lean-forward="true" selection-start-line="18" selection-start-column="10" selection-end-line="18" selection-end-column="10" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wsm-admin-web/src/main/java/com/wsm/admin/constant/MsgCode.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="136">
+          <caret line="8" column="20" selection-start-line="8" selection-start-column="20" selection-end-line="8" selection-end-column="20" />
         </state>
       </provider>
     </entry>

+ 3 - 1
README.md

@@ -1,4 +1,6 @@
 江门市智慧城市管理系统
 
 问题
-1. 当警情超过24小时没有处理,传感器又没有心跳,心跳检测会把当前传感器设置为离线状态。
+1. 当警情超过24小时没有处理,传感器又没有心跳,心跳检测会把当前传感器设置为离线状态。
+
+2. 统一个设备,报火警,报低电压、报离线,算多少个事件。目前是算3个事件

+ 12 - 0
wsm-admin-web/src/main/java/com/wsm/admin/constant/MsgCode.java

@@ -0,0 +1,12 @@
+package com.wsm.admin.constant;
+
+/**
+ * Created by Owen on 2019/12/13 0013 15:33
+ */
+public class MsgCode {
+
+    /**
+     * redis传感器心跳key
+     */
+    public static String REDIS_CYCLE_DEVICE_LIST = "cycleDeviceList";
+}

+ 3 - 3
wsm-admin-web/src/main/java/com/wsm/admin/init/StartupUdpEvent.java

@@ -1,7 +1,7 @@
-package com.wsm.admin.init;
+package com.wsm.admin.device.init;
 
-import com.wsm.admin.mqtt.ClientMQTT;
-import com.wsm.admin.tcp.init.CoverTcpServer;
+import com.wsm.admin.device.mqtt.ClientMQTT;
+import com.wsm.admin.device.tcp.CoverTcpServer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationContext;

+ 3 - 3
wsm-admin-web/src/main/java/com/wsm/admin/init/TaskSchedule.java

@@ -1,4 +1,4 @@
-package com.wsm.admin.init;
+package com.wsm.admin.device.init;
 
 import java.util.Date;
 import java.util.List;
@@ -38,12 +38,12 @@ public class TaskSchedule {
 
 
     /**
-     * 每天24点检查未开始的活动
+     * 每天1:10检查未开始的活动
      * 每天24点执行一次  @Scheduled(cron=" 0 0 0 * * ? ") @Scheduled(cron=" * 1  * * ? ")
      *
      * Scheduled(cron=" 10 0/5 * * * ? ")   //每五分钟执行一次
      */
-    @Scheduled(cron=" 10 0 0 * * ? ")
+    @Scheduled(cron=" 10 0 10 * * ? ")
 //    @Scheduled(cron=" 10 0/5 * * * ? ")
     public void checkDeviceId(){
         logger.info("run checkDeviceId");

+ 84 - 0
wsm-admin-web/src/main/java/com/wsm/admin/device/mqtt/ClientMQTT.java

@@ -0,0 +1,84 @@
+package com.wsm.admin.device.mqtt;
+
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.eclipse.paho.client.mqttv3.MqttTopic;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+
+public class ClientMQTT {
+
+//topic, demo只订阅了火警的topic,其他的添加topic到数组中即可
+//      火警      - /chiefdata/push/fire_alarm/department/34/area/1/dev/3jyun-866971030771930
+//      设备故障      - /chiefdata/push/fault_alarm/department/34/area/1/dev/3jyun-866971030771930
+//      上下线     - /chiefdata/push/device_online_status/department/34/area/1/dev/3jyun-866971030771930
+//      设备属性上报      - /chiefdata/push/dev_msg/department/34/area/1/dev/3jyun-866971030771930
+//      服务器账号密码等私密信息请勿外泄    
+
+
+
+
+
+
+
+    /**
+     * 服务器地址
+     */
+    public static final String HOST = "tcp://swan.3jyun.com:8008";
+
+    /**
+     * 客户端id
+     */
+    private static final String clientId = "MQTT_FX_Client";
+
+    private String userName = "httpAgent";
+    private String passWord = "c3772e1bee68544284e47e8806a2a8ca";
+
+    private MqttClient client;
+    private MqttConnectOptions options;
+
+
+    public void start() {
+        try {
+            // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
+            client = new MqttClient(HOST, clientId, new MemoryPersistence());
+            // MQTT的连接设置
+            options = new MqttConnectOptions();
+            // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,设置为true表示每次连接到服务器都以新的身份连接
+            options.setCleanSession(false);
+            // 设置连接的用户名
+            options.setUserName(userName);
+            // 设置连接的密码
+            options.setPassword(passWord.toCharArray());
+            // 设置超时时间 单位为秒
+            options.setConnectionTimeout(5);
+            // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
+            options.setKeepAliveInterval(20);
+            // 设置回调
+            client.setCallback(new PushCallback());
+            MqttTopic topic = client.getTopic(TopicCode.TOPIC_FIRE_ALARM);
+            //setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
+//遗嘱        options.setWill(topic, "close".getBytes(), 2, true);
+            client.connect(options);
+            /**
+             * 订阅消息
+             * 0代表“至多一次”
+             * 1代表“至少一次”
+             * 2代表“只有一次”
+             */
+            int[] qos  = {1,1,1,1};
+            // 订阅topic ,最少一个,允许多个,加入数组中就可以了
+            String[] subscribeTopic = {TopicCode.TOPIC_FIRE_ALARM, TopicCode.TOPIC_FAULT_ALARM, TopicCode.TOPIC_DEVICE_ONLINE_STATUS, TopicCode.TOPIC_DEV_MSG};
+//            String[] topic1 = {TOPIC1};
+            client.subscribe(subscribeTopic, qos);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+//    public static void main(String[] args) throws MqttException {
+//        ClientMQTT client = new ClientMQTT();
+//        client.start();
+//    }
+
+}

+ 155 - 0
wsm-admin-web/src/main/java/com/wsm/admin/device/mqtt/PushCallback.java

@@ -0,0 +1,155 @@
+package com.wsm.admin.device.mqtt;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.wsm.admin.constant.MsgCode;
+import com.wsm.admin.model.Device;
+import com.wsm.admin.model.DeviceEvent;
+import com.wsm.admin.service.IDeviceEventService;
+import com.wsm.admin.service.IDeviceService;
+import com.wsm.admin.service.impl.DeviceEventServiceImpl;
+import com.wsm.admin.service.impl.DeviceServiceImpl;
+import com.wsm.common.util.DateTimeUtils;
+import com.wsm.common.util.RedisUtil;
+import com.wsm.common.util.SpringContext;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.MqttCallback;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.messaging.simp.SimpMessagingTemplate;
+
+import java.util.Date;
+
+
+public class PushCallback implements MqttCallback {
+
+    private static final Logger log = LoggerFactory.getLogger(PushCallback.class);
+
+    private IDeviceService deviceService;
+
+    private IDeviceEventService deviceEventService;
+
+    private SimpMessagingTemplate messagingTemplate;
+
+    private RedisUtil redisUtil;
+
+
+    /**
+     * 火灾报警
+     * alarm_type : 1
+     */
+    private static String TYPE_FIRE = "1";
+
+
+    /**
+     * 故障
+     * alarm_type : 2
+     */
+    private static String TYPE_FAULT = "2";
+
+    public PushCallback(){
+        if (deviceService == null){
+            deviceService = SpringContext.getBean(DeviceServiceImpl.class);
+        }
+        if (deviceEventService == null){
+            deviceEventService = SpringContext.getBean(DeviceEventServiceImpl.class);
+        }
+        if (messagingTemplate == null){
+            messagingTemplate = SpringContext.getBean(SimpMessagingTemplate.class);
+        }
+
+        if (redisUtil == null){
+            redisUtil = SpringContext.getBean(RedisUtil.class);
+        }
+    }
+
+    @Override
+    public void connectionLost(Throwable cause) {
+        // 连接丢失后,一般在这里面进行重连
+        log.info("连接断开,需要从连重连");
+        ClientMQTT clientMqtt = new ClientMQTT();
+        clientMqtt.start();
+        log.info("重新启动MQTT成功");
+    }
+    @Override
+    public void deliveryComplete(IMqttDeliveryToken token) {
+        log.warn("deliveryComplete: {}", token.isComplete());
+    }
+    @Override
+    public void messageArrived(String topic, MqttMessage message) throws Exception {
+        // subscribe后得到的消息会执行到这里面
+        log.warn("接收消息主题 : {}", topic);
+        log.warn("接收消息Qos : {}", message.getQos());
+
+        corventJson(new String(message.getPayload()), topic);
+    }
+
+
+    /**
+     * 解析接收到的内容
+     */
+    private void corventJson(String str, String topic){
+//        String str = "{\"devid\":\"3jyun-866971030771930\",\"pid\":\"H388N\",\"pname\":\"广东潮庭集团-珠海移动白蕉项目1\",\"cid\":34,\"aid\":1,\"a_name\":\"\",\"bid\":2,\"b_name\":\"\",\"lid\":5,\"l_name\":\"北京天安门\",\"time\":\"2019-12-05 14:19:54\",\"alarm_type\":1,\"alarm_type_name\":\"烟感传感器火警\",\"event_id\":32,\"event_count\":1,\"device_type\":1,\"comm_type\":2,\"first_alarm_time\":\"2019-12-05 14:19:54\",\"last_alarm_time\":\"2019-12-05 14:19:54\"}";
+        JSONObject orgin = JSON.parseObject(str);
+        log.info("orgin data: {}", orgin);
+
+        // 火灾报警、设备故障
+        String devid = orgin.getString("devid");
+        String time = orgin.getString("time");
+        Date postTime = DateTimeUtils.parse(time);
+        log.warn("上报时间: {}", time);
+
+        // 用来心跳检测
+        if (TopicCode.TOPIC_DEV_MSG.equals(topic)) {
+            redisUtil.set(devid,"heartbeat", Long.parseLong("25"));
+            return;
+        }
+
+
+        // 火警报警
+        String alarmTypeName = orgin.getString("alarm_type_name");
+        String alarmType = orgin.getString("alarm_type");
+        log.info("devid : {}", devid);
+        log.info("time : {}", time);
+        log.info("alarmType : {}", alarmType);
+        log.info("alarmTypeName : {}", alarmTypeName);
+
+        Device device = deviceService.findByDeviceId(devid);
+        if (device != null && alarmType.equals(TYPE_FIRE)) {
+            // 报警
+            device.setStatus((byte)1);
+            device.setUpdateTime(new Date());
+            deviceService.update(device);
+
+            // 删除缓存
+            redisUtil.delete(MsgCode.REDIS_CYCLE_DEVICE_LIST);
+
+            // 记录报警详情
+            DeviceEvent event = new DeviceEvent();
+//            DeviceEvent event = deviceEventService.findByDeviceIdTop(device.getId());
+//            if (event == null) {
+                event = new DeviceEvent();
+                event.setDevice(device);
+                event.setCreateTime(new Date());
+//            }
+            event.setHandleStatus((byte)0);
+            event.setContent(alarmTypeName);
+            event.setUpdateTime(new Date());
+            event.setPostTime(postTime);
+            deviceEventService.save(event);
+            log.warn(device + ": " + alarmTypeName);
+
+
+            JSONObject result = new JSONObject();
+            result.put("id", device.getDeviceId());
+            result.put("deviceType", device.getDeviceType());
+            result.put("status", alarmTypeName);
+
+            //推送信息到前端
+            messagingTemplate.convertAndSend("/topic/device", result.toJSONString());
+
+        }
+    }
+
+}

+ 36 - 0
wsm-admin-web/src/main/java/com/wsm/admin/device/mqtt/TopicCode.java

@@ -0,0 +1,36 @@
+package com.wsm.admin.device.mqtt;
+
+/**
+ * Created by Owen on 2019/12/12 0012 15:14
+ *
+ * 话题类型
+ //      火警      - /chiefdata/push/fire_alarm/department/34/area/1/dev/3jyun-866971030771930
+ //      设备故障      - /chiefdata/push/fault_alarm/department/34/area/1/dev/3jyun-866971030771930
+ //      上下线     - /chiefdata/push/device_online_status/department/34/area/1/dev/3jyun-866971030771930
+ //      设备属性上报      - /chiefdata/push/dev_msg/department/34/area/1/dev/3jyun-866971030771930
+ */
+public class TopicCode {
+
+
+
+
+    /**
+     * 火灾事件消息
+     */
+    public static final String TOPIC_FIRE_ALARM = "/chiefdata/push/fire_alarm/department/34/area/1/dev/3jyun-866971030771930";
+
+    /**
+     * 设备故障
+     */
+    public static final String TOPIC_FAULT_ALARM = "/chiefdata/push/fault_alarm/department/34/area/1/dev/3jyun-866971030771930";
+
+    /**
+     * 上下线
+     */
+    public static final String TOPIC_DEVICE_ONLINE_STATUS = "/chiefdata/push/device_online_status/department/34/area/1/dev/3jyun-866971030771930";
+
+    /**
+     * 设备属性上报
+     */
+    public static final String TOPIC_DEV_MSG = "/chiefdata/push/dev_msg/department/34/area/1/dev/3jyun-866971030771930";
+}

+ 86 - 0
wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/ConvertData.java

@@ -0,0 +1,86 @@
+package com.wsm.admin.device.tcp;
+
+import com.alibaba.fastjson.JSON;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * 井盖报文解析
+ */
+public class ConvertData {
+
+	private List<Rule> ruleList = new ArrayList<>();
+
+	public ConvertData() {
+		ruleList.add(new Rule("sn1", "string", 22, 26));
+		ruleList.add(new Rule("sn2", null, 26, 46));
+		ruleList.add(new Rule("yyyy", "int", 46, 48));
+		ruleList.add(new Rule("MM", "int", 48, 50));
+		ruleList.add(new Rule("dd", "int", 50, 52));
+		ruleList.add(new Rule("HH", "int", 52, 54));
+		ruleList.add(new Rule("mm", "int", 54, 56));
+		ruleList.add(new Rule("ss", "int", 56, 58));
+		ruleList.add(new Rule("x", "int", 58, 62));
+		ruleList.add(new Rule("y", "int", 62, 66));
+		ruleList.add(new Rule("z", "int", 66, 70));
+		ruleList.add(new Rule("CSQ", "int", 74, 78));
+		ruleList.add(new Rule("RSRQ", "int", 78, 82));
+		ruleList.add(new Rule("SNR", "int", 82, 86));
+		ruleList.add(new Rule("RSRP", "int", 86, 90));
+		ruleList.add(new Rule("经度方向", "string", 90, 92));
+		ruleList.add(new Rule("经度", "string", 92, 112));
+		ruleList.add(new Rule("纬度方向", "string", 112, 114));
+		ruleList.add(new Rule("纬度", "string", 114, 134));
+		ruleList.add(new Rule("status", null, 134, 142));
+	}
+
+	public Map<String, Object> convert(String date) {
+		//此例子没做对数据的校验
+		Map<String, Object> reHm = new TreeMap<>();
+		for (Rule rule : ruleList) {
+			if (rule.getStart() < date.length() && rule.getEnd() < date.length()) {
+				String inString = date.substring(rule.getStart(), rule.getEnd());
+				if ("int".equals(rule.getType())) {
+					reHm.put(rule.getName(), hexStr2Int(inString));
+				} else if ("string".equals(rule.getType())) {
+					reHm.put(rule.getName(), hexStr2String(inString));
+				} else {
+					reHm.put(rule.getName(), inString);
+				}
+			}
+		}
+		return reHm;
+	}
+
+	private int hexStr2Int(String hexString) {
+		int ret = Integer.parseInt(hexString, 16);
+		ret = ((ret & 0x8000) > 0) ? (ret - 0x10000) : (ret);
+		return ret;
+	}
+
+	private String hexStr2String(String hexStr) {
+		String str = "0123456789ABCDEF";
+		char[] hexs = hexStr.toCharArray();
+		byte[] bytes = new byte[hexStr.length() / 2];
+		int n;
+		for (int i = 0; i < bytes.length; i++) {
+			n = str.indexOf(hexs[2 * i]) * 16;
+			n += str.indexOf(hexs[2 * i + 1]);
+			bytes[i] = (byte) (n & 0xff);
+		}
+		return new String(bytes);
+	}
+
+	public static void main(String[] args) {
+		String d = "010001004A0000A3010044514300010003020100000001130C020B0B1EFFF3000000F100000000000000000000453131332E3536393639354E3032322E3337363735390000000000000000000000004140";
+		System.out.println(d.length());
+		ConvertData cd = new ConvertData();
+		Map<String, Object> hm = cd.convert(d);
+		System.out.println(JSON.toJSONString(hm));
+	}
+
+}
+

+ 62 - 0
wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/CoverTcpServer.java

@@ -0,0 +1,62 @@
+package com.wsm.admin.device.tcp;
+
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created by Owen on 2019/12/3 0003 14:46
+ *
+ * 井盖tcp服务
+ */
+
+@Component
+public class CoverTcpServer {
+
+    private static final Logger log = LoggerFactory.getLogger(CoverTcpServer.class);
+
+    @Async("updAsyncPool")
+    public void run(int port) throws Exception {
+        log.info("run startTcpServer");
+        // NioEventLoopGroup是用来处理IO操作的多线程事件循环器
+        // 用来接收进来的连接
+        EventLoopGroup bossGroup = new NioEventLoopGroup();
+        // 用来处理已经被接收的连接
+        EventLoopGroup workerGroup = new NioEventLoopGroup();
+        try {
+            // 是一个启动NIO服务的辅助启动类
+            ServerBootstrap server = new ServerBootstrap();
+            // 这里告诉Channel如何接收新的连接
+            server.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
+                    .childHandler(new ChannelInitializer<SocketChannel>() {
+                        @Override
+                        protected void initChannel(SocketChannel ch) throws Exception {
+                            // 自定义处理类
+                            ch.pipeline().addLast(new NettyServerHandler());
+                        }
+                    });
+            // 初始化服务端可连接队列,指定了队列的大小128
+            server.option(ChannelOption.SO_BACKLOG, 128);
+            // 用来接收进来的连接
+            server.childOption(ChannelOption.SO_KEEPALIVE, true);
+            // 绑定端口,开始接收进来的连接
+            ChannelFuture f = server.bind(port).sync();
+            log.info("tcp:2000 端口,服务端启动成功...");
+            // 监听服务器关闭监听
+            f.channel().closeFuture().sync();
+        } finally {
+            // 关闭EventLoopGroup,释放掉所有资源包括创建的线程
+            bossGroup.shutdownGracefully();
+            workerGroup.shutdownGracefully();
+        }
+    }
+}

+ 288 - 0
wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/NettyServerHandler.java

@@ -0,0 +1,288 @@
+package com.wsm.admin.device.tcp;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.wsm.admin.constant.MsgCode;
+import com.wsm.admin.model.Device;
+import com.wsm.admin.model.DeviceEvent;
+import com.wsm.admin.service.IDeviceEventService;
+import com.wsm.admin.service.IDeviceService;
+import com.wsm.admin.service.impl.DeviceEventServiceImpl;
+import com.wsm.admin.service.impl.DeviceServiceImpl;
+import com.wsm.common.util.DateTimeUtils;
+import com.wsm.common.util.RedisUtil;
+import com.wsm.common.util.SpringContext;
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+import io.netty.util.ReferenceCountUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.messaging.simp.SimpMessagingTemplate;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 井盖事件处理
+ */
+public class NettyServerHandler extends ChannelInboundHandlerAdapter {
+	private static final Logger log= LoggerFactory.getLogger(NettyServerHandler.class);
+
+
+	private IDeviceService deviceService;
+
+	private IDeviceEventService deviceEventService;
+
+	private SimpMessagingTemplate messagingTemplate;
+
+	private RedisUtil redisUtil;
+
+
+//	@Autowired
+//	private RedisTemplate<String, Object> redisTemplate;
+
+
+
+	private static final Map<String, String> deviceStatusMap = new HashMap<>();
+
+
+	private static final String JG_NORMAL = "00000000";
+
+	private static final String JG_LOW_PRESSURE_CODE = "0xFF002F00";
+
+	private static final String JG_LOW_PRESSURE_OFF = "0xFF002F01";
+
+	/**
+	 * 心跳响应
+	 */
+	private static final String JG_HEARTBEAT = "GET / HTTP/1.0";
+
+	/**
+	 * 井盖正常数据长度
+	 */
+	private static final Integer CHECK_DATA_LENGTH = 162;
+
+	private static final double JG_ERC40 = 10;
+
+	private static final double JG_ERC90 = 70;
+
+
+
+
+	static {
+		deviceStatusMap.put(JG_NORMAL, "井盖正常");
+		deviceStatusMap.put(JG_LOW_PRESSURE_CODE, "井盖低电告警 ");
+		deviceStatusMap.put(JG_LOW_PRESSURE_OFF, "井盖低电关机");
+		deviceStatusMap.put("ERC40", "井盖倾斜/抬起");
+		deviceStatusMap.put("ERC90", "井盖掀翻");
+	}
+
+
+	public NettyServerHandler(){
+		if (deviceService == null){
+			deviceService = SpringContext.getBean(DeviceServiceImpl.class);
+		}
+		if (deviceEventService == null){
+			deviceEventService = SpringContext.getBean(DeviceEventServiceImpl.class);
+		}
+		if (messagingTemplate == null){
+			messagingTemplate = SpringContext.getBean(SimpMessagingTemplate.class);
+		}
+		if (redisUtil == null){
+			redisUtil = SpringContext.getBean(RedisUtil.class);
+		}
+	}
+
+
+	/**
+     * 收到数据时调用
+	 * @param ctx
+     * @param msg
+     * @throws Exception
+	 */
+	@Override
+	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+
+		log.info("Time: {}", new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS").format(new Date()));
+		log.info("客户端地址: {}", ctx.channel().remoteAddress());
+		log.info("ID: {}", ctx.channel().id());
+		try {
+			ByteBuf in = (ByteBuf) msg;
+			int readableBytes = in.readableBytes();
+			byte[] bytes = new byte[readableBytes];
+			in.readBytes(bytes);
+			String inString = new String(bytes);
+			log.info("接收data: {}", inString);
+
+
+
+			if (StringUtils.isNotEmpty(inString) && inString.length() == CHECK_DATA_LENGTH){
+
+				// 这应该是心跳,直接结束
+//				if (inString.contains(JG_HEARTBEAT)) {
+//					return;
+//				}
+
+				ConvertData cd = new ConvertData();
+				Map<String, Object> hm = cd.convert(inString);
+
+
+				log.info("解析json: {}", JSON.toJSONString(hm));
+				String status = hm.get("status").toString();
+
+				// 计算井盖角度
+				String ox = hm.get("x").toString();
+				String oy = hm.get("y").toString();
+				double angle = angle(Double.parseDouble(ox), Double.parseDouble(oy));
+				log.info("井盖开启角度: {} 度", Math.round(angle));
+
+				// 设备id
+				String sn2 = hm.get("sn2").toString();
+				Device device = deviceService.findByDeviceId(sn2);
+				log.warn("JG设备号: {}", sn2);
+
+				// 用来心跳检测
+				redisUtil.set(sn2,"heartbeat",Long.parseLong("25"));
+
+				// 上报时间
+				String year = hm.get("yyyy").toString();
+				String month = hm.get("MM").toString();
+				String day = hm.get("dd").toString();
+				String hh = hm.get("HH").toString();
+				String mm = hm.get("mm").toString();
+				String ss = hm.get("ss").toString();
+				String time = "20"+year+"-"+month+"-"+day+" "+hh+":"+mm+":"+ss;
+				Date postTime = DateTimeUtils.parse(time);
+				log.warn("上报时间: {}", time);
+
+
+				//报警开关
+				boolean needEvent = false;
+				String content = "";
+
+				if (device != null) {
+					// 低电压
+					if (JG_LOW_PRESSURE_CODE.equals(status)) {
+						device.setStatus((byte)2);
+
+						// 故障
+					} else if (JG_LOW_PRESSURE_OFF.equals(status)) {
+						device.setStatus((byte)3);
+
+						// 报警
+					} else if (JG_NORMAL.equals(status)) {
+						device.setStatus((byte)1);
+						needEvent = true;
+
+						//处理报警类型
+						// 大于40度
+
+						if (angle > JG_ERC40) {
+							// 报警
+							content = deviceStatusMap.get("ERC40");
+
+						}
+						if (angle > JG_ERC90) {
+							content = deviceStatusMap.get("ERC90");
+						}
+					}
+					device.setUpdateTime(new Date());
+					deviceService.update(device);
+
+					redisUtil.delete(MsgCode.REDIS_CYCLE_DEVICE_LIST);
+
+
+
+
+					// 记录报警详情
+					if (needEvent) {
+						DeviceEvent event  = new DeviceEvent();
+//						DeviceEvent event = deviceEventService.findByDeviceIdTop(device.getId());
+//						if (event == null) {
+							event = new DeviceEvent();
+							event.setDevice(device);
+							event.setCreateTime(new Date());
+//						}
+						event.setHandleStatus((byte)0);
+						event.setContent(content);
+						event.setUpdateTime(new Date());
+						event.setPostTime(postTime);
+						deviceEventService.save(event);
+						log.warn(device.getDeviceId() + ": " + content);
+
+
+						JSONObject result = new JSONObject();
+						result.put("id", device.getDeviceId());
+						result.put("deviceType", device.getDeviceType());
+						result.put("status", status);
+
+						//推送信息到前端
+						messagingTemplate.convertAndSend("/topic/device", result.toJSONString());
+
+					}
+				}
+			}
+
+
+		} finally {
+			// 抛弃收到的数据
+			ReferenceCountUtil.release(msg);
+			log.warn("<<<<<<<<<end");
+		}
+	}
+
+	@Override
+	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
+		// 当出现异常就关闭连接
+		cause.printStackTrace();
+		ctx.close();
+	}
+
+
+	/**
+	 * 获取角度
+	 * @return
+	 */
+	private static double angle(double x, double y) {
+
+		// 三轴计算
+		// 计算因子
+		double factor = 3.90625;
+
+		double gx = x * factor;
+		double gy = y * factor;
+
+		double Axy =  Math.sqrt(gx * gx + gy * gy);
+
+		if (Axy > 980) {
+			Axy = 980;
+		}
+
+		Axy = Math.acos(Axy/980) * 180 / 3.1415;
+
+		double angleXY = Axy;
+
+		if ((Axy - angleXY) >= 0.5){
+			angleXY += 1;
+		}
+		angleXY = 90 - angleXY;
+
+//		System.out.println("angleXY: " + angleXY); // 23.574218229866414
+
+
+		return angleXY;
+	}
+
+	public static void main(String[] args) {
+		double x = -125;
+		double y = -193;
+		angle(x, y);
+	}
+
+
+
+}

+ 39 - 0
wsm-admin-web/src/main/java/com/wsm/admin/device/tcp/Rule.java

@@ -0,0 +1,39 @@
+package com.wsm.admin.device.tcp;
+
+/**
+ * Created by Owen on 2019/12/3 0003 15:39
+ */
+
+public class Rule {
+
+    private String name;
+
+    private String type;
+
+    private int start;
+
+    private int end;
+
+    public Rule(String name, String type, int start, int end) {
+        this.name = name;
+        this.type = type;
+        this.start = start;
+        this.end = end;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public int getStart() {
+        return start;
+    }
+
+    public int getEnd() {
+        return end;
+    }
+}

+ 0 - 262
wsm-admin-web/src/main/java/com/wsm/admin/handle/UdpServerHandler.java

@@ -1,262 +0,0 @@
-package com.wsm.admin.handle;
-
-import com.alibaba.fastjson.JSONObject;
-import com.wsm.admin.model.Device;
-import com.wsm.admin.model.DeviceEvent;
-import com.wsm.admin.service.IDeviceService;
-import com.wsm.admin.service.IDeviceEventService;
-import com.wsm.admin.service.impl.DeviceServiceImpl;
-import com.wsm.admin.service.impl.DeviceEventServiceImpl;
-import com.wsm.common.util.DeviceUtil;
-import com.wsm.common.util.ByteUtil;
-import com.wsm.common.util.SpringContext;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import io.netty.channel.socket.DatagramPacket;
-import org.apache.commons.lang3.StringUtils;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.messaging.simp.SimpMessagingTemplate;
-
-import java.sql.Timestamp;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static java.lang.Long.parseLong;
-
-/**
- * 接受UDP消息并且处理
- *
- */
-public class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {
-
-    private static final Logger log= LoggerFactory.getLogger(UdpServerHandler.class);
-
-    private IDeviceEventService deviceEventService;
-    private IDeviceService deviceService;
-    private SimpMessagingTemplate messagingTemplate;
-
-    public UdpServerHandler(){
-        if (deviceService == null){
-            deviceService = SpringContext.getBean(DeviceServiceImpl.class);
-        }
-        if (deviceEventService == null){
-            deviceEventService = SpringContext.getBean(DeviceEventServiceImpl.class);
-        }
-        if (messagingTemplate == null){
-            messagingTemplate = SpringContext.getBean(SimpMessagingTemplate.class);
-        }
-    }
-
-    private static final Map<String, String> jgDeviceStatusMap = new HashMap<>();
-
-    private static final String LOW_PRESSURE_CODE = "ERC40";
-
-    static {
-        jgDeviceStatusMap.put(LOW_PRESSURE_CODE, "电池电压");
-        jgDeviceStatusMap.put("ERC52", "水浸事件");
-        jgDeviceStatusMap.put("ERC51", "井盖掀翻");
-        jgDeviceStatusMap.put("ERC50", "井盖倾斜/抬起");
-    }
-
-    @Override
-    public void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
-        ByteBuf buf = packet.copy().content();
-        //通过ByteBuf的readableBytes方法可以获取缓冲区可读的字节数,
-        //根据可读的字节数创建byte数组
-        byte[] req = new byte[buf.readableBytes()];
-        buf.readBytes(req);
-        String receiveMsg = ByteUtil.bytesToHexString(req).toUpperCase();
-        log.warn("\nReceived UDP Msg :" + receiveMsg);
-
-        if (StringUtils.isNotEmpty(receiveMsg)){
-            String feedback = handleJG(receiveMsg);
-            // 由于数据报的数据是以字符数组传的形式存储的,所以传转数据
-            byte[] bytes = feedback.getBytes("UTF-8");
-            //在这里可以返回一个UDP消息给对方
-            ctx.write(new DatagramPacket(Unpooled.copiedBuffer(bytes), packet.sender()));
-        }else{
-            log.error("Received Error UDP Message:" + receiveMsg);
-        }
-    }
-
-    private String handleJG(String receiveMsg) {
-        StringBuffer feedback = new StringBuffer();
-        // 第1个字节起始字符(68H)
-        feedback.append("68");
-        StringBuffer lStr = new StringBuffer();
-        // 第7个字节控制字  主站下发报文固定为4B
-        lStr.append("4B");
-
-        log.warn("======接收到井盖传感器推送信息======");
-        String[] str = DeviceUtil.turnToArray(receiveMsg);
-        String afn  = str[12];
-        String fn = str[14]+str[15]+str[16]+str[17];
-        String frameNumber = str[13];
-        String deviceId = DeviceUtil.getJGDeviceID(str);
-        log.warn("设备号:"+deviceId);
-        // 第8-12个字节地址域,其中8-11是通信地址 将20160138按照(2.1主站回复报文的组织格式)中新终端地址格式转换,转为16 20 38 10 (每两字节高低位颠倒)再加上固定的04
-        lStr.append(DeviceUtil.getFeedBackJGDeviceID(str)).append("04");
-        // 第13个字节
-        lStr.append(afn);
-        // 第14个字节帧序号 按照终端上报报文的帧序号原样回复
-        lStr.append(frameNumber);
-        // 第15-18个字节
-        lStr.append(fn);
-
-        String body = receiveMsg.substring(36, receiveMsg.length()-4);
-        String[] bodyStr = DeviceUtil.turnToArray(body);
-        log.warn("数据体是:" + body);
-        if (StringUtils.isNotEmpty(body)){
-            log.warn("推送的是心跳、告警数据");
-            // 返回数据体
-            StringBuffer feedbackBody = new StringBuffer();
-            //上报失败重试次数(弃用)
-            feedbackBody.append("00");
-            //重发上报时间间隔(弃用)
-            feedbackBody.append("00");
-            //对时开关: 01-开 EE-关
-            feedbackBody.append("EE");
-            // 对时数据体
-            feedbackBody.append("32131031C318");
-            // 同步开关及数据(弃用)
-            feedbackBody.append("00000000000000000000000000000000000000");
-            // IP端口设置开关 01-开 EE-关
-            feedbackBody.append("EE");
-            // IP地址段1
-            feedbackBody.append("C0");
-            // IP地址段2
-            feedbackBody.append("A8");
-            // IP地址段3
-            feedbackBody.append("01");
-            // IP地址段4
-            feedbackBody.append("E1");
-            // IP地址段5
-            feedbackBody.append("2008");
-            // 通讯地址修改开关 01-开 EE-关
-            feedbackBody.append("EE");
-            // 新通讯地址
-            feedbackBody.append(DeviceUtil.getFeedBackJGDeviceID(str));
-            // 布防撤防状态: 55为布防  AA为撤防 其他终端不理会
-            feedbackBody.append("55");
-            // 预留(弃用)
-            feedbackBody.append("00000000");
-            // 上报时间设置开关 01-开 EE-关
-            feedbackBody.append("EE");
-            // 上报基准时间
-            feedbackBody.append("1008");
-            // 预留(弃用)
-            feedbackBody.append("00000000000000000000");
-            lStr.append(feedbackBody);
-
-            int count = (int) parseLong(bodyStr[0], 16);
-            log.warn("总共是:"+count + "个事件");
-
-            for (int i = 0, length = 26; i < count; i++){
-                String eventStr = body.substring(8 + i*length, (8 + i*length)+26);
-                log.warn("=======第"+(i+1)+"个事件:"+eventStr+"=======");
-                String[] eventStrArr = DeviceUtil.turnToArray(eventStr);
-                String type = "ERC" + parseLong(eventStrArr[0], 16);
-                if (jgDeviceStatusMap.get(type) != null){
-                    // 事件时间,作去重校验
-                    String dateStr = eventStrArr[6]+eventStrArr[5]+eventStrArr[4]+eventStrArr[3]+eventStrArr[2];
-                    DateTime dateTime = DateTime.parse(dateStr, DateTimeFormat.forPattern("yyMMddHHmm"));
-                    log.warn("=======事件:"+jgDeviceStatusMap.get(type)+";时间:"+ new DateTime().toString("yyyy-MM-dd HH:mm")+"=======\n");
-                    Device device = deviceService.findByDeviceId(deviceId);
-                    String content = jgDeviceStatusMap.get(type);
-                    boolean needEvent = false;
-                    if (device != null){
-                        if (LOW_PRESSURE_CODE.equals(type)){
-                            String warnPressure = eventStrArr[11];
-                            String currentPressure = eventStrArr[9];
-                            // 低压
-                            if (Integer.valueOf(currentPressure) <= Integer.valueOf(warnPressure)){
-                                device.setStatus((byte)2);
-                                needEvent = true;
-                            }
-                        }else {
-                            // 报警
-                            device.setStatus((byte)1);
-                            needEvent = true;
-                        }
-                        deviceService.update(device);
-
-                        if (needEvent){
-
-                            List<DeviceEvent> deviceEventList = deviceEventService.findByContentAndPostTime(content, dateTime.toDate());
-                            if (deviceEventList != null && deviceEventList.size() > 0){
-                                continue;
-                            }
-
-                            DeviceEvent event = new DeviceEvent();
-                            event.setDevice(device);
-                            event.setContent(content);
-                            event.setHandleStatus((byte)0);
-                            event.setCreateTime(new DateTime().toDate());
-                            event.setUpdateTime(new DateTime().toDate());
-                            event.setPostTime(dateTime.toDate());
-                            deviceEventService.save(event);
-                            log.warn(device.getDeviceId() + ":"+ event.getContent());
-
-                            JSONObject result = new JSONObject();
-                            result.put("id", device.getId());
-                            result.put("deviceType", device.getDeviceType());
-                            result.put("status", type);
-                            // 推送信息到前端
-                            messagingTemplate.convertAndSend("/topic/device", result.toJSONString());
-                        }
-                    }
-                }
-            }
-        }else{
-            log.warn("推送的是上报完毕报文");
-        }
-        // ===== 计算长度L start =====
-        StringBuffer countLength = new StringBuffer(ByteUtil.toBinary(lStr.toString().length()/2)).append("10");
-        StringBuffer zeroStr = new StringBuffer();
-        for (int i = 0; i < 16-countLength.length(); i++){
-            zeroStr.append("0");
-        }
-        zeroStr.append(countLength);
-        String ab = ByteUtil.binaryString2hexString(zeroStr.toString());
-        String[] abArr = DeviceUtil.turnToArray(ab);
-        // ===== 计算长度L end =====
-
-        // 第2-3个字节(长度L) 预留待替换
-        feedback.append(abArr[1]).append(abArr[0]);
-        // 第4-5个字节(长度L) 预留待替换
-        feedback.append(abArr[1]).append(abArr[0]);
-        // 第6个字节起始字符(68H)
-        feedback.append("68");
-        // 倒数第2个字节校验和CS  预留待替换
-        lStr.append(ByteUtil.makeChecksum(lStr.toString()));
-        // 最后一个字节结束字符(16H)
-        lStr.append("16");
-        feedback.append(lStr);
-        return feedback.toString().toUpperCase();
-    }
-
-    @Override
-    public void channelReadComplete(ChannelHandlerContext ctx) {
-        ctx.flush();
-    }
-
-    @Override
-    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
-        cause.printStackTrace();
-        // We don't close the channel because we can keep serving requests.
-    }
-
-    public Timestamp getTime(){
-        Date date = new Date();
-        Timestamp time = new Timestamp(date.getTime());
-        return time;
-    }
-
-}

+ 0 - 248
wsm-admin-web/src/main/java/com/wsm/admin/init/TcpServer.java

@@ -1,248 +0,0 @@
-package com.wsm.admin.init;
-
-import com.alibaba.fastjson.JSONObject;
-import com.wsm.admin.model.Device;
-import com.wsm.admin.model.DeviceEvent;
-import com.wsm.admin.service.IDeviceService;
-import com.wsm.admin.service.IDeviceEventService;
-import com.wsm.common.util.ByteUtil;
-import com.wsm.common.util.DeviceUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.messaging.simp.SimpMessagingTemplate;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.nio.ByteBuffer;
-import java.nio.channels.SelectionKey;
-import java.nio.channels.Selector;
-import java.nio.channels.ServerSocketChannel;
-import java.nio.channels.SocketChannel;
-import java.nio.charset.Charset;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-@Component
-public class TcpServer {
-    private static final Logger log = LoggerFactory.getLogger(TcpServer.class);
-
-    //解码buffer
-    private Charset cs = Charset.forName("UTF-8");
-    //发送数据缓冲区
-    private static ByteBuffer sBuffer = ByteBuffer.allocate(1024);
-    //接受数据缓冲区
-    private static ByteBuffer rBuffer = ByteBuffer.allocate(1024);
-    //选择器(叫监听器更准确些吧应该)
-    private static Selector selector;
-
-    @Autowired
-    private IDeviceEventService deviceEventService;
-    @Autowired
-    private IDeviceService deviceService;
-    @Autowired
-    private SimpMessagingTemplate messagingTemplate;
-
-    private static final String LOW_PRESSURE_CODE = "384";
-    private static final String SMOKE_CODE = "111";
-
-    private static final Map<String, String> deviceStatusMap = new HashMap<>();
-
-    static {
-        deviceStatusMap.put("08", "硬件版本号");
-        deviceStatusMap.put("15", "SIM 卡CCID 号码");
-        deviceStatusMap.put("05", "NB/GPRS 信号强度");
-        deviceStatusMap.put("2A00", "电池:低压");
-        deviceStatusMap.put("3500", "NB底座的电池:低压");
-        deviceStatusMap.put("3600", "烟感底座上的烟感电池:低压");
-        deviceStatusMap.put("3701", "消防门状态:打开");
-        deviceStatusMap.put("3801", "消防手报状态:弹起");
-        deviceStatusMap.put("3E01", "喷淋状态:打开");
-
-        deviceStatusMap.put(SMOKE_CODE, "烟雾报警");
-        deviceStatusMap.put(LOW_PRESSURE_CODE, "低压报警");
-        deviceStatusMap.put("993", "底座上的烟感低压");
-        deviceStatusMap.put("992", "NB 底座低压报警 ");
-        deviceStatusMap.put("991", "燃气报警");
-        deviceStatusMap.put("990", "消防手报按钮报警");
-        deviceStatusMap.put("989", "消防门打开");
-        deviceStatusMap.put("988", "消防门关闭");
-        deviceStatusMap.put("987", "消防门长时间未关闭");
-        deviceStatusMap.put("986", "高温报警");
-        deviceStatusMap.put("985", "漏电报警");
-        deviceStatusMap.put("984", "温感低压");
-        deviceStatusMap.put("966", "喷淋打开");
-        deviceStatusMap.put("965", "喷淋关闭");
-
-    }
-
-    /**
-     * 启动socket服务,开启监听
-     *
-     * @param port
-     * @throws IOException
-     */
-    @Async("updAsyncPool")
-    public void startSocketServer(int port) {
-        try {
-            //打开通信信道
-            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
-            //设置为非阻塞
-            serverSocketChannel.configureBlocking(false);
-            //获取套接字
-            ServerSocket serverSocket = serverSocketChannel.socket();
-            //绑定端口号
-            serverSocket.bind(new InetSocketAddress(port));
-            //打开监听器
-            selector = Selector.open();
-            //将通信信道注册到监听器
-            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
-
-            //监听器会一直监听,如果客户端有请求就会进入相应的事件处理
-            while (true) {
-                selector.select();//select方法会一直阻塞直到有相关事件发生或超时
-                Set<SelectionKey> selectionKeys = selector.selectedKeys();//监听到的事件
-                for (SelectionKey key : selectionKeys) {
-                    handle(key);
-                }
-                selectionKeys.clear();//清除处理过的事件
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 处理不同的事件
-     *
-     * @param selectionKey
-     * @throws IOException
-     */
-    private void handle(SelectionKey selectionKey) throws IOException {
-        ServerSocketChannel serverSocketChannel = null;
-        SocketChannel socketChannel = null;
-        String requestMsg = "";
-        String responseMsg = "";
-        int count = 0;
-        if (selectionKey.isAcceptable()) {
-            //每有客户端连接,即注册通信信道为可读
-            serverSocketChannel = (ServerSocketChannel) selectionKey.channel();
-            socketChannel = serverSocketChannel.accept();
-            socketChannel.configureBlocking(false);
-            socketChannel.register(selector, SelectionKey.OP_READ);
-        } else if (selectionKey.isReadable()) {
-            socketChannel = (SocketChannel) selectionKey.channel();
-            rBuffer.clear();
-            count = socketChannel.read(rBuffer);
-            //读取数据
-            if (count > 0) {
-                rBuffer.flip();
-
-                byte[] bytes = new byte[rBuffer.remaining()];
-                rBuffer.get(bytes, 0, bytes.length);
-
-                requestMsg = ByteUtil.bytesToHexString(bytes).toUpperCase();
-                log.warn("Received TCP Msg :" + requestMsg);
-
-                try {
-                    responseMsg = handleYG(requestMsg);
-                }catch (Exception ex){
-                    log.error(ex.getMessage());
-                }
-            }
-            //返回数据
-            sBuffer = ByteBuffer.allocate(responseMsg.getBytes("UTF-8").length);
-            sBuffer.put(responseMsg.getBytes("UTF-8"));
-            sBuffer.flip();
-            socketChannel.write(sBuffer);
-            socketChannel.close();
-        }
-    }
-
-    private String handleYG(String receiveMsg) {
-        log.warn("======接收到烟感传感器推送信息======");
-        String[] str = DeviceUtil.turnToArray(receiveMsg);
-        String deviceID = DeviceUtil.getYGDeviceID(str);
-        log.warn("deviceID:"+deviceID);
-        Device device = deviceService.findByDeviceId16Hex(deviceID);
-        if (device != null){
-            log.warn("接收到:"+device.getDeviceId()+" 推送的信息");
-        }
-
-        String type = str[6];
-        switch (type){
-            // 心跳
-            case "02":
-                log.warn("======心跳信息,无异常状态======");
-                break;
-            // 状态
-            case "04":
-                log.warn("======心跳信息,推送状态信息======");
-                /*int total = Integer.valueOf(str[16]);
-                for (int i = 0, length = 3; i < total; i++){
-                    String a = str[17 + i * length];
-                    //String b = str[18 + i * length];
-                    String c = str[19 + i * length];
-                    // 状态异常
-                    if (!StringUtils.isEmpty(deviceStatusMap.get(a+c)) && device != null){
-
-
-
-                        DeviceStatus status =  new DeviceStatus();
-                        status.setContent(deviceStatusMap.get(a+c));
-                        status.setDevice(device);
-                        status.setStatus((byte)0);
-                        deviceStatusService.save(status);
-                        log.warn(device.getDeviceId() + ":"+ status.getContent());
-
-                        JSONObject result = new JSONObject();
-                        result.put("id", device.getDeviceId());
-                        result.put("deviceType", device.getDeviceType());
-                        result.put("status", a+c);
-
-                        messagingTemplate.convertAndSend("/topic/device", result.toJSONString());
-                    }
-                }*/
-                break;
-            // 报警
-            case "09":
-                // 报警
-                String hex = ByteUtil.hexStringToString(str[24]+str[25]+str[26]);
-                if (!StringUtils.isEmpty(deviceStatusMap.get(hex)) && device != null){
-
-                    if (LOW_PRESSURE_CODE.equals(hex)){
-                        device.setStatus((byte)2);
-                    }else if (SMOKE_CODE.equals(hex)){
-                        device.setStatus((byte)1);
-                    }
-                    deviceService.update(device);
-
-                    DeviceEvent event =  new DeviceEvent();
-                    event.setContent(deviceStatusMap.get(hex));
-                    event.setDevice(device);
-                    event.setHandleStatus((byte)0);
-                    event.setPostTime(new Date());
-                    deviceEventService.save(event);
-                    log.warn(device.getDeviceId() + ":"+ event.getContent());
-
-                    JSONObject result = new JSONObject();
-                    result.put("id", device.getId());
-                    result.put("deviceType", device.getDeviceType());
-                    result.put("status", hex);
-
-                    // 推送报警事件给前端
-                    messagingTemplate.convertAndSend("/topic/device", result.toJSONString());
-                }
-                break;
-        }
-
-        return DeviceUtil.getOKFeedback(str);
-    }
-
-}

+ 0 - 43
wsm-admin-web/src/main/java/com/wsm/admin/init/UdpServer.java

@@ -1,43 +0,0 @@
-package com.wsm.admin.init;
-
-import com.wsm.admin.handle.UdpServerHandler;
-import io.netty.bootstrap.Bootstrap;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.nio.NioDatagramChannel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Component;
-
-/**
- * server服务器
- */
-@Component
-public class UdpServer {
-
-    private static final Logger log= LoggerFactory.getLogger(UdpServer.class);
-
-    @Async("updAsyncPool")
-    public void run(int udpReceivePort) {
-
-        EventLoopGroup group = new NioEventLoopGroup();
-        log.info("Server start!  Udp Receive msg Port:" + udpReceivePort );
-
-        try {
-            Bootstrap b = new Bootstrap();
-            b.group(group)
-                    .channel(NioDatagramChannel.class)
-                    .option(ChannelOption.SO_BROADCAST, true)
-                    .handler(new UdpServerHandler());
-
-            b.bind(udpReceivePort).sync().channel().closeFuture().await();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        } finally {
-            group.shutdownGracefully();
-        }
-    }
-
-}

+ 1 - 1
wsm-application/src/main/resources/application-dev.properties

@@ -1,7 +1,7 @@
 
 #DB
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-spring.datasource.url=jdbc:mysql://localhost:3306/jm-smart-city?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
+spring.datasource.url=jdbc:mysql://localhost:3306/jm-smart-city?useUnicode=true&characterEncoding=utf8&characterSetResults=utf-8&useSSL=false
 spring.datasource.username=root
 spring.datasource.password=root
 spring.datasource.driverClassName=com.mysql.jdbc.Driver

+ 1 - 1
wsm-application/src/main/resources/application-pro.properties

@@ -5,7 +5,7 @@
 #spring.datasource.password=4dage
 
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-spring.datasource.url=jdbc:mysql://192.168.0.248:3306/jm-smart-city?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
+spring.datasource.url=jdbc:mysql://192.168.0.248:3306/jm-smart-city?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf-8&useSSL=false
 spring.datasource.username=root
 spring.datasource.password=4dage
 spring.datasource.driverClassName=com.mysql.jdbc.Driver

+ 1 - 1
wsm-application/src/main/resources/application.properties

@@ -45,7 +45,7 @@ spring.redis.pool.max-wait=-1
 #spring.redis.sentinel.nodes=10.189.80.25:26379,10.189.80.26:26379,10.189.80.27:26378
 
 # 配置开机启动监听
-context.listener.classes=com.wsm.admin.init.StartupUdpEvent
+context.listener.classes=com.wsm.admin.device.init.StartupUdpEvent
 #线程池
 spring.task.pool.corePoolSize=5
 spring.task.pool.maxPoolSize=100