package com.zhgd.xmgl.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.text.CharSequenceUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zhgd.xmgl.config.SafetyHatWSClient; import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.service.IProjectService; import com.zhgd.xmgl.util.RundeSafeyHatUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.websocket.DeploymentException; import javax.websocket.WebSocketContainer; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.List; import java.util.concurrent.CompletableFuture; /** * 智能安全帽task */ @Slf4j @RestController @RequestMapping("xmgl/task") public class SafetyHatTask { @Autowired IProjectService projectService; @Autowired WebSocketContainer webSocketContainer; @Autowired SafetyHatWSClient safetyHatWSClient; /** * 获取安全帽最新数据(30秒内的心跳) */ @Scheduled(cron = "*/10 * * * * ?") @RequestMapping("getHelmetData") public void getHelmetData() { try { log.info("定时获取安全帽最新数据(30秒内的心跳)"); List projectList = projectService.list(Wrappers.lambdaQuery().ne(Project::getHelmetUser, "").ne(Project::getHelmetPassword, "")); if (CollUtil.isNotEmpty(projectList)) { for (Project project : projectList) { log.info("安全帽user:{}", project.getHelmetUser()); SafetyHatWSClient client = SafetyHatWSClient.clientMap.get(project.getHelmetUser()); CompletableFuture.runAsync(() -> { try { if (client == null) { log.info("首次连接安全帽:user:{}", project.getHelmetUser()); connect(project); } else { log.info("发送安全帽获取实时数据,user:{}", project.getHelmetUser()); client.send("{\"act\":\"ma_get_active_devices\"}"); } } catch (IllegalStateException e) { log.info("异常重连:{}", e.getMessage()); connect(project); } }).exceptionally(throwable -> { log.error("err", throwable); return null; }); } } } catch (Exception e) { log.error("err:", e); } } /** * 连接ws和登录 * * @param project * @throws DeploymentException * @throws IOException * @throws URISyntaxException */ private SafetyHatWSClient connect(Project project) { SafetyHatWSClient client = new SafetyHatWSClient(); try { webSocketContainer.connectToServer(client, new URI("wss://caps.runde.pro/wss")); } catch (DeploymentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); } JSONObject token = RundeSafeyHatUtils.getToken(project.getHelmetUser(), project.getHelmetPassword()); if (token != null && CharSequenceUtil.isNotBlank(token.getString("session_id"))) { String sessionId = token.getString("session_id"); project.setRundeToken(sessionId); String message = "{\"act\":\"ma_login\",\"user_name\":\"" + project.getHelmetUser() + "\",\"access_token\":\"" + sessionId + "\"}"; client.send(message); log.info("登录安全帽user:{},ms:{}", project.getHelmetUser(), message); SafetyHatWSClient.clientMap.put(project.getHelmetUser(), client); } return client; } }