2024-03-18 17:34:55 +08:00
|
|
|
|
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;
|
2024-03-25 15:13:09 +08:00
|
|
|
|
import java.util.concurrent.CompletableFuture;
|
2024-03-18 17:34:55 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 智能安全帽task
|
|
|
|
|
|
*/
|
|
|
|
|
|
@Slf4j
|
|
|
|
|
|
@RestController
|
|
|
|
|
|
@RequestMapping("xmgl/task")
|
|
|
|
|
|
public class SafetyHatTask {
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
IProjectService projectService;
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
WebSocketContainer webSocketContainer;
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
SafetyHatWSClient safetyHatWSClient;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取安全帽最新数据(30秒内的心跳)
|
|
|
|
|
|
*/
|
2024-03-20 10:27:49 +08:00
|
|
|
|
@Scheduled(cron = "*/10 * * * * ?")
|
2024-03-18 17:34:55 +08:00
|
|
|
|
@RequestMapping("getHelmetData")
|
|
|
|
|
|
public void getHelmetData() {
|
|
|
|
|
|
try {
|
|
|
|
|
|
log.info("定时获取安全帽最新数据(30秒内的心跳)");
|
|
|
|
|
|
List<Project> projectList = projectService.list(Wrappers.<Project>lambdaQuery().ne(Project::getHelmetUser, "").ne(Project::getHelmetPassword, ""));
|
|
|
|
|
|
if (CollUtil.isNotEmpty(projectList)) {
|
|
|
|
|
|
for (Project project : projectList) {
|
2024-03-22 10:11:58 +08:00
|
|
|
|
log.info("安全帽user:{}", project.getHelmetUser());
|
2024-03-18 17:34:55 +08:00
|
|
|
|
SafetyHatWSClient client = SafetyHatWSClient.clientMap.get(project.getHelmetUser());
|
2024-03-25 15:13:09 +08:00
|
|
|
|
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());
|
2024-03-18 17:34:55 +08:00
|
|
|
|
connect(project);
|
|
|
|
|
|
}
|
2024-03-25 15:13:09 +08:00
|
|
|
|
}).exceptionally(throwable -> {
|
|
|
|
|
|
log.error("err", throwable);
|
|
|
|
|
|
return null;
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2024-03-18 17:34:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
log.error("err:", e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 连接ws和登录
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param project
|
|
|
|
|
|
* @throws DeploymentException
|
|
|
|
|
|
* @throws IOException
|
|
|
|
|
|
* @throws URISyntaxException
|
|
|
|
|
|
*/
|
2024-03-25 15:13:09 +08:00
|
|
|
|
private SafetyHatWSClient connect(Project project) {
|
2024-03-18 17:34:55 +08:00
|
|
|
|
SafetyHatWSClient client = new SafetyHatWSClient();
|
2024-03-25 15:13:09 +08:00
|
|
|
|
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();
|
|
|
|
|
|
}
|
2024-03-18 17:34:55 +08:00
|
|
|
|
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);
|
2024-03-25 15:13:09 +08:00
|
|
|
|
log.info("登录安全帽user:{},ms:{}", project.getHelmetUser(), message);
|
2024-03-18 17:34:55 +08:00
|
|
|
|
SafetyHatWSClient.clientMap.put(project.getHelmetUser(), client);
|
|
|
|
|
|
}
|
|
|
|
|
|
return client;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|