Browse Source

完成设备报警推送功能

zhifei 1 năm trước cách đây
mục cha
commit
6a1211e09e

+ 5 - 0
warewms-system/pom.xml

@@ -31,6 +31,11 @@
             <groupId>com.github.xingshuangs</groupId>
             <artifactId>iot-communication</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 121 - 0
warewms-system/src/main/java/com/warewms/hailiang/config/DeviceMessageSocket.java

@@ -0,0 +1,121 @@
+package com.warewms.hailiang.config;
+
+import com.warewms.common.annotation.Anonymous;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+@Component
+@Slf4j
+@Anonymous
+@ServerEndpoint("/websocket/device/{userName}")  // 接口路径 ws://localhost:8080/device/userName;
+public class DeviceMessageSocket {
+    //与某个客户端的连接会话,需要通过它来给客户端发送数据
+    private Session session;
+
+
+    private String userName;
+
+
+    private static CopyOnWriteArraySet<DeviceMessageSocket> webSockets =new CopyOnWriteArraySet<>();
+
+    // 用来存在线连接用户信息
+    private static ConcurrentHashMap<String,Session> sessionPool = new ConcurrentHashMap<String,Session>();
+
+    /**
+     * 链接成功调用的方法
+     */
+    @OnOpen
+    public void onOpen(Session session, @PathParam(value="userName")String userName) {
+        try {
+            this.session = session;
+            this.userName = userName;
+            webSockets.add(this);
+            sessionPool.put(userName, session);
+            log.info("【websocket消息】有新的连接,总数为:"+webSockets.size());
+        } catch (Exception e) {
+        }
+    }
+
+    /**
+     * 链接关闭调用的方法
+     */
+    @OnClose
+    public void onClose() {
+        try {
+            webSockets.remove(this);
+            sessionPool.remove(this.userName);
+        } catch (Exception e) {
+        }
+    }
+    /**
+     * 收到客户端消息后调用的方法
+     *
+     * @param message
+
+     */
+    @OnMessage
+    public void onMessage(String message) {
+        log.info("【websocket消息】收到客户端消息:"+message);
+    }
+
+    /** 发送错误时的处理
+     * @param session
+     * @param error
+     */
+    @OnError
+    public void onError(Session session, Throwable error) {
+
+        log.error("用户错误,原因:"+error.getMessage());
+        error.printStackTrace();
+    }
+
+
+    // 此为广播消息
+    public void sendAllMessage(String message) {
+        log.info("【websocket消息】广播消息:"+message);
+        for(DeviceMessageSocket webSocket : webSockets) {
+            try {
+                if(webSocket.session.isOpen()) {
+                    webSocket.session.getAsyncRemote().sendText(message);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    // 此为单点消息
+    public void sendOneMessage(String userName, String message) {
+        Session session = sessionPool.get(userName);
+        if (session != null&&session.isOpen()) {
+            try {
+                log.info("【websocket消息】 单点消息:"+message);
+                session.getAsyncRemote().sendText(message);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    // 此为单点消息(多人)
+    public void sendMoreMessage(String[] userNames, String message) {
+        for(String userName:userNames) {
+            Session session = sessionPool.get(userName);
+            if (session != null&&session.isOpen()) {
+                try {
+                    log.info("【websocket消息】 单点消息:"+message);
+                    session.getAsyncRemote().sendText(message);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+    }
+}

+ 17 - 0
warewms-system/src/main/java/com/warewms/hailiang/config/WebSocketConfig.java

@@ -0,0 +1,17 @@
+package com.warewms.hailiang.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+@Configuration
+public class WebSocketConfig {
+    /**
+     * 	注入ServerEndpointExporter,
+     */
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+
+}

+ 7 - 1
warewms-system/src/main/java/com/warewms/hailiang/service/impl/DeviceLogServiceImpl.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.warewms.common.core.domain.base.page.PageDomain;
 import com.warewms.common.core.domain.base.page.TableDataInfo;
 import com.warewms.common.utils.StringUtils;
+import com.warewms.hailiang.config.DeviceMessageSocket;
 import com.warewms.hailiang.domain.DeviceLog;
 import com.warewms.hailiang.mapper.DeviceLogMapper;
 import com.warewms.hailiang.service.DeviceLogService;
@@ -30,6 +31,9 @@ public class DeviceLogServiceImpl extends ServiceImpl<DeviceLogMapper, DeviceLog
     @Autowired
     DeviceLogMapper deviceLogMapper;
 
+    @Autowired
+    DeviceMessageSocket deviceMessageSocket;
+
 
     @Override
     public TableDataInfo<DeviceLog> getList(DeviceLog deviceLog, PageDomain pageDomain) {
@@ -47,10 +51,12 @@ public class DeviceLogServiceImpl extends ServiceImpl<DeviceLogMapper, DeviceLog
     @Override
     @Async
     @EventListener
-    public void crateLog(DeviceLog deviceLog) {
+    public void createLog(DeviceLog deviceLog) {
         deviceLog.setCreateBy("system");
         deviceLog.setUpdateBy("system");
         deviceLogMapper.insert(deviceLog);
+        //推送消息
+        deviceMessageSocket.sendAllMessage(deviceLog.toString());
     }
 
 }

+ 9 - 1
warewms-system/src/main/java/com/warewms/system/config/SecurityConfig.java

@@ -11,6 +11,7 @@ import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.builders.WebSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
 import org.springframework.security.config.http.SessionCreationPolicy;
@@ -77,6 +78,13 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
         return super.authenticationManagerBean();
     }
 
+    @Override
+    public void configure(WebSecurity web) throws Exception {
+        web.ignoring().antMatchers(
+                "/ws/**"
+        );
+    }
+
     /**
      * anyRequest          |   匹配所有请求路径
      * access              |   SpringEl表达式结果为true时可以访问
@@ -111,7 +119,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 过滤请求
                 .authorizeRequests()
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                .antMatchers("/login", "/register","/test/**").permitAll()
+                .antMatchers("/login", "/register","/test/**","/websocket/**").permitAll()
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()