|
|
@@ -10,6 +10,7 @@ import com.xunmei.common.core.domain.iot.domain.IotServerInfo;
|
|
|
import com.xunmei.common.core.enums.iot.IotServerConnectStatus;
|
|
|
import com.xunmei.common.core.utils.JacksonUtils;
|
|
|
import com.xunmei.common.core.utils.StringUtils;
|
|
|
+import com.xunmei.host.north.service.IotWebsocketMsgService;
|
|
|
import com.xunmei.host.server.service.IotServerInfoService;
|
|
|
import com.xunmei.host.websocket.dto.WebsocketExecuteReq;
|
|
|
import com.xunmei.host.websocket.dto.WebsocketPayloadResolve;
|
|
|
@@ -18,7 +19,6 @@ import com.xunmei.host.websocket.enums.TopicTypeEnums;
|
|
|
import com.xunmei.host.websocket.enums.WebsocketStatus;
|
|
|
import com.xunmei.host.websocket.holder.WebSocketSessionHolder;
|
|
|
import com.xunmei.host.websocket.service.RouterService;
|
|
|
-import com.xunmei.host.websocket.service.WebsocketService;
|
|
|
import com.xunmei.host.websocket.utils.WebSocketUtils;
|
|
|
import com.xunmei.system.api.RemoteOrgService;
|
|
|
import com.xunmei.system.api.domain.SysOrg;
|
|
|
@@ -54,7 +54,7 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
|
|
|
private RemoteOrgService orgService;
|
|
|
|
|
|
@Autowired
|
|
|
- private WebsocketService websocketService;
|
|
|
+ private IotWebsocketMsgService websocketMsgService;
|
|
|
|
|
|
/**
|
|
|
* 连接成功后
|
|
|
@@ -155,68 +155,83 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
|
|
|
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
|
|
|
// 从WebSocket会话中获取登录用户信息
|
|
|
String token = WebSocketSessionHolder.updateToken(session);
|
|
|
- //String token = "f1418fd8-64c3-4b9f-91b1-9bbe76b0314c";
|
|
|
if (StringUtils.isEmpty(token)) {
|
|
|
- LogUtils.WEBSOCKET_MSG.error("会话消息不存在,ip:{}", WebSocketUtils.getIp(session));
|
|
|
+ logErrorAndReturn("会话消息不存在", session);
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
String payload = message.getPayload();
|
|
|
final String ip = WebSocketUtils.getIp(session);
|
|
|
- LogUtils.WEBSOCKET_MSG.info("ip:{},接收到消息:{}", ip, message.getPayload());
|
|
|
- if (payload.isEmpty()) {
|
|
|
- LogUtils.WEBSOCKET_MSG.error("消息内容为空,ip:{}", ip);
|
|
|
+ LogUtils.WEBSOCKET_MSG.info("ip:{},接收到消息:{}", ip, payload);
|
|
|
+ if (StringUtils.isEmpty(payload)) {
|
|
|
+ logErrorAndReturn("消息内容为空", ip);
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
+ WebsocketResult websocketResult;
|
|
|
try {
|
|
|
- WebsocketResult websocketResult = JSON.parseObject(payload, WebsocketResult.class);
|
|
|
+ websocketResult = JSON.parseObject(payload, WebsocketResult.class);
|
|
|
Object obj = websocketResult.getPayload();
|
|
|
if (ObjectUtil.isEmpty(obj)) {
|
|
|
- LogUtils.WEBSOCKET_MSG.error("消息内容为空,ip:{}", ip);
|
|
|
+ logErrorAndReturn("消息内容为空", ip);
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
WebsocketPayloadResolve payloadResolve = new WebsocketPayloadResolve(websocketResult);
|
|
|
String topic = payloadResolve.getTopic();
|
|
|
TopicTypeEnums typeEnums = TopicTypeEnums.matcherTopicTypeEnums(topic);
|
|
|
if (typeEnums == null) {
|
|
|
- LogUtils.WEBSOCKET_MSG.error("消息topic错误,ip:{},topic:{}", ip, topic);
|
|
|
+ logErrorAndReturn("消息topic错误", ip, topic);
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
IotServerInfo serverInfo = iotServerInfoService.selectByToken(token);
|
|
|
if (ObjectUtil.isEmpty(serverInfo)) {
|
|
|
- LogUtils.WEBSOCKET_MSG.error("服务器信息不存在或链接信息已不可用,token:{}", token);
|
|
|
+ logErrorAndReturn("服务器信息不存在或链接信息已不可用", token);
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
//上报消息内容
|
|
|
final Object args = payloadResolve.getData();
|
|
|
WebsocketExecuteReq executeReq = new WebsocketExecuteReq(payloadResolve.getRoutingKey(), args, serverInfo, websocketResult.getId(), topic, payloadResolve.getHeader(), typeEnums.getProductName(), typeEnums.getDeviceName());
|
|
|
- WebsocketResult result = null;
|
|
|
- switch (typeEnums) {
|
|
|
-
|
|
|
- case PRODUCT_EVENT_NOTICE:
|
|
|
- //IoT返回服务调用消息
|
|
|
- case PRODUCT_SERVICE_REPLY:
|
|
|
- RouterService routeService = RouterServiceHandler.getRouteService(typeEnums.getProductName(), payloadResolve.getRoutingKey());
|
|
|
- if (routeService == null) {
|
|
|
- WebSocketUtils.sendMessage(session, WebsocketResult.replyError(executeReq, ErrorMsgConstants.ERROR_TOPIC));
|
|
|
- return;
|
|
|
- }
|
|
|
- try {
|
|
|
- result = routeService.execute(executeReq);
|
|
|
- } catch (Exception e) {
|
|
|
- LogUtils.WEBSOCKET_MSG.error("消息处理失败,ip:{},异常内容:{},消息id:{}", ip, e,executeReq.getId());
|
|
|
- result = WebsocketResult.replyError(executeReq, e.getMessage());
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- WebSocketUtils.sendMessage(session, WebsocketResult.replyError(executeReq, ErrorMsgConstants.ERROR_TOPIC));
|
|
|
- break;
|
|
|
- }
|
|
|
- WebSocketUtils.sendMessage(session, result);
|
|
|
+ handleRequestBasedOnType(executeReq, typeEnums, session, payload);
|
|
|
} catch (Exception e) {
|
|
|
- LogUtils.WEBSOCKET_MSG.error("消息处理失败,ip:{},异常内容:{}", ip, e);
|
|
|
+ logErrorAndReturn("消息处理失败", ip, e);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void logErrorAndReturn(String message, Object... args) {
|
|
|
+ LogUtils.WEBSOCKET_MSG.error(message + ",ip:{}", args);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void handleRequestBasedOnType(WebsocketExecuteReq executeReq, TopicTypeEnums typeEnums, WebSocketSession session, String payload) {
|
|
|
+ final String iotCode = executeReq.getServerInfo().getIotCode();
|
|
|
+ WebsocketResult result;
|
|
|
+ switch (typeEnums) {
|
|
|
+ case PRODUCT_EVENT_NOTICE:
|
|
|
+ case PRODUCT_SERVICE_REPLY:
|
|
|
+ RouterService routeService = RouterServiceHandler.getRouteService(typeEnums.getProductName(), executeReq.getEvent());
|
|
|
+ if (routeService == null) {
|
|
|
+ // WebSocketUtils.sendMessage(session, WebsocketResult.replyError(executeReq, ErrorMsgConstants.ERROR_TOPIC));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ websocketMsgService.saveMsg(executeReq, payload);
|
|
|
+ result = routeService.execute(executeReq);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ result = WebsocketResult.replyError(executeReq, ErrorMsgConstants.ERROR_TOPIC);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ final boolean sendFlag = WebSocketUtils.sendMessage(session, result);
|
|
|
+ if (sendFlag) {
|
|
|
+ websocketMsgService.sendSuccessMsg(result, executeReq.getId());
|
|
|
+ } else {
|
|
|
+ websocketMsgService.sendFailMsg(result, executeReq.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 处理接收到的二进制消息
|
|
|
*
|