#优化路径规划下发 任务状态接收相关
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
package com.maibu.core.business.dto;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.maibu.core.business.path.LatAndLngEntity;
|
||||
import com.maibu.core.enums.MesType;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class WebRouteStatusMessageDTO {
|
||||
private List<LatAndLngEntity> data;
|
||||
private String deviceId;
|
||||
private Long taskId;
|
||||
private MesType type;
|
||||
}
|
||||
@@ -14,5 +14,6 @@ public enum MesType {
|
||||
remoteControl,
|
||||
detectionReport, // 障碍物消息
|
||||
switchPermission, // 切换控制申请
|
||||
switchResult;// 切换结果
|
||||
switchResult,// 切换结果
|
||||
route_post;// 路径规划 点位推送
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.maibu.memory;
|
||||
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.maibu.core.business.device.Connector;
|
||||
import com.maibu.core.business.device.NettyDevice;
|
||||
@@ -30,7 +29,7 @@ public class DeviceSessionManager {
|
||||
// 设备ID -> 设备对象(业务实体)
|
||||
private final ConcurrentHashMap<String, NettyDevice> deviceMap = new ConcurrentHashMap<>();
|
||||
|
||||
//当前设备的控制权在哪 登录的账号 deviceId(下位机) -> token key 唯一保证一个deviceId 只有一个控制权
|
||||
// 当前设备的控制权在哪 登录的账号 deviceId(下位机) -> token key 唯一保证一个deviceId 只有一个控制权
|
||||
private final ConcurrentHashMap<String, String> controllerMap = new ConcurrentHashMap<>();
|
||||
|
||||
// 设备ID -> Channel(通信通道)
|
||||
@@ -39,7 +38,6 @@ public class DeviceSessionManager {
|
||||
// Channel -> 设备ID(反查)
|
||||
private final ConcurrentHashMap<Channel, String> channelToDeviceIdMap = new ConcurrentHashMap<>();
|
||||
|
||||
|
||||
public void clearChannelToDeviceIdMap(String deviceId) {
|
||||
if (StringUtils.isEmpty(deviceId) || CollectionUtils.isEmpty(channelToDeviceIdMap)) {
|
||||
return;
|
||||
@@ -67,7 +65,6 @@ public class DeviceSessionManager {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 注册设备连接(设备上线)
|
||||
*
|
||||
@@ -75,7 +72,8 @@ public class DeviceSessionManager {
|
||||
* @param channel 通信通道
|
||||
* @param deviceType 设备类型(MASTER/SLAVE)
|
||||
*/
|
||||
public void registerDevice(String deviceId, Channel channel, ConnectorType deviceType, ConnectorStatus status, String slaveId) {
|
||||
public void registerDevice(String deviceId, Channel channel, ConnectorType deviceType, ConnectorStatus status,
|
||||
String slaveId) {
|
||||
NettyDevice nettyDevice = deviceMap.computeIfAbsent(deviceId, id -> new NettyDevice(id, deviceType));
|
||||
nettyDevice.setChannel(channel);
|
||||
nettyDevice.setConnectorStatus(status); // 默认上线即ACTIVE
|
||||
@@ -109,7 +107,8 @@ public class DeviceSessionManager {
|
||||
*/
|
||||
public void bindConnector(String masterId, String slaveId) {
|
||||
NettyDevice master = deviceMap.get(masterId);
|
||||
if (master == null) return;
|
||||
if (master == null)
|
||||
return;
|
||||
NettyDevice slave = deviceMap.computeIfAbsent(slaveId, id -> new NettyDevice(id, ConnectorType.SLAVE));
|
||||
master.addConnectedDevice(slave);
|
||||
System.out.println("Bind connectors for master " + masterId + " and slave " + slaveId);
|
||||
@@ -147,7 +146,6 @@ public class DeviceSessionManager {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public boolean unLock(String token) {
|
||||
if (!StringUtils.isEmpty(token)) {
|
||||
Iterator<String> iterator = controllerMap.keySet().iterator();
|
||||
@@ -179,7 +177,6 @@ public class DeviceSessionManager {
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 模糊匹配
|
||||
public List<NettyDevice> getDevicesLike(String query) {
|
||||
return deviceMap.values().stream()
|
||||
@@ -187,7 +184,6 @@ public class DeviceSessionManager {
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
public List<NettyDevice> getSlaveControl(String slaveId) {
|
||||
// 获取所有连接的主机 且是active状态的
|
||||
return deviceMap.values().stream()
|
||||
@@ -196,7 +192,6 @@ public class DeviceSessionManager {
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
public List<NettyDevice> getAllSlaveControl(String slaveId) {
|
||||
// 获取所有连接的主机 不区分状态
|
||||
return deviceMap.values().stream()
|
||||
@@ -212,7 +207,6 @@ public class DeviceSessionManager {
|
||||
.findFirst().orElse(null);
|
||||
}
|
||||
|
||||
|
||||
/// 模糊匹配
|
||||
public NettyDevice getUserControl(String userName) {
|
||||
return deviceMap.values().stream()
|
||||
@@ -221,7 +215,6 @@ public class DeviceSessionManager {
|
||||
.findFirst().orElse(null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据设备ID获取Channel
|
||||
*/
|
||||
@@ -236,7 +229,6 @@ public class DeviceSessionManager {
|
||||
return channelToDeviceIdMap.get(channel);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据从机查控制的主机
|
||||
*/
|
||||
@@ -249,7 +241,8 @@ public class DeviceSessionManager {
|
||||
* 根据从机查所有主机
|
||||
*/
|
||||
public List<NettyDevice> getMastersBySlaveId(String slaveId) {
|
||||
return deviceMap.values().stream().filter(x -> Objects.equals(x.getCurrentSlaveId(), slaveId)).collect(Collectors.toList());
|
||||
return deviceMap.values().stream().filter(x -> Objects.equals(x.getCurrentSlaveId(), slaveId))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -257,12 +250,12 @@ public class DeviceSessionManager {
|
||||
*/
|
||||
public void removeDevice(String deviceId) {
|
||||
NettyDevice nettyDevice = deviceMap.remove(deviceId);
|
||||
// Channel channel = channelMap.remove(deviceId);
|
||||
// Channel channel = channelMap.remove(deviceId);
|
||||
clearChannelToDeviceIdMap(deviceId);
|
||||
// if (channel != null) {
|
||||
// channelToDeviceIdMap.remove(channel);
|
||||
// channel.close();
|
||||
// }
|
||||
// if (channel != null) {
|
||||
// channelToDeviceIdMap.remove(channel);
|
||||
// channel.close();
|
||||
// }
|
||||
if (nettyDevice != null) {
|
||||
// 仅当设备是上位机时,才解绑绑定关系
|
||||
if (nettyDevice.getDeviceType() == ConnectorType.MASTER) {
|
||||
@@ -281,7 +274,6 @@ public class DeviceSessionManager {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 判断设备是否在线
|
||||
*/
|
||||
@@ -306,5 +298,20 @@ public class DeviceSessionManager {
|
||||
return nettyDevice != null && nettyDevice.canReceive();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取客户端当前 控制的设备
|
||||
*/
|
||||
public String getDeviceByTaskId(Long taskId) {
|
||||
if (taskId == null) {
|
||||
return null;
|
||||
}
|
||||
for (String key : deviceMap.keySet()) {
|
||||
NettyDevice nettyDevice = deviceMap.get(key);
|
||||
if (nettyDevice != null && Objects.equals(nettyDevice.getCurrentTaskId(), taskId)) {
|
||||
return nettyDevice.getConnectorId();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -108,6 +108,7 @@ public class GlobalMemory {
|
||||
MqttTopic.MOWER_HEARTBEAT,//心跳
|
||||
MqttTopic.MOWER_WILDCARD_LOCATION,//位置 经纬度
|
||||
MqttTopic.MOWER_WILDCARD_TASK_ROUTE, //路径回复
|
||||
MqttTopic.MOWER_WILDCARD_TASK_STATUS,//任务状态
|
||||
MqttTopic.MOWER_WILDCARD_ERROR,//错误
|
||||
MqttTopic.MOWER_WILDCARD_REALTIME, //状态消息
|
||||
MqttTopic.MOWER_WILDCARD_TASK_TARGET_REPLY //路径规划下发回复
|
||||
|
||||
@@ -74,21 +74,17 @@ public class HostMessageHandler implements CustomMqttMessageHandler {
|
||||
case "realtime_post":
|
||||
handleRealtimePost(deviceId, topic, payload);
|
||||
break;
|
||||
case "status_post":
|
||||
handleStatusPost(deviceId, topic, payload);
|
||||
break;
|
||||
case "heartbeat_post":
|
||||
handleHeartbeatPost(deviceId, topic, payload);
|
||||
break;
|
||||
case "error_post":
|
||||
handleErrorPost(deviceId, topic, payload);
|
||||
break;
|
||||
case "route_post":
|
||||
case "point_post":
|
||||
handleTaskPost(deviceId, topic, payload, action);
|
||||
break;
|
||||
// case "route_post":
|
||||
// case "point_post":
|
||||
// handleTaskPost(deviceId, topic, payload, action);
|
||||
// break;
|
||||
case "task_status_post":
|
||||
case "task_finish_post":
|
||||
handleTaskPost(deviceId, topic, payload, action);
|
||||
break;
|
||||
case "config_reply":
|
||||
@@ -357,13 +353,11 @@ public class HostMessageHandler implements CustomMqttMessageHandler {
|
||||
|
||||
if (remaining.equals("property/location/post")) return "location_post";
|
||||
if (remaining.equals("property/realtime/post")) return "realtime_post";
|
||||
if (remaining.equals("event/status/post")) return "status_post";
|
||||
if (remaining.equals("event/heartbeat/post")) return "heartbeat_post";
|
||||
if (remaining.equals("event/error/post")) return "error_post";
|
||||
if (remaining.equals("task/route/post")) return "route_post";
|
||||
if (remaining.equals("task/point/post")) return "point_post";
|
||||
// if (remaining.equals("task/route/post")) return "route_post";
|
||||
// if (remaining.equals("task/point/post")) return "point_post";
|
||||
if (remaining.equals("task/status/post")) return "task_status_post";
|
||||
if (remaining.equals("task/finish/post")) return "task_finish_post";
|
||||
if (remaining.equals("action/config/reply")) return "config_reply";
|
||||
if (remaining.equals("action/control/reply")) return "control_reply";
|
||||
if (remaining.equals("task/target/reply")) return "route_reply";
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.maibu.mqtt;
|
||||
|
||||
|
||||
public class MqttTopic {
|
||||
|
||||
/** @deprecated 通用设备主题,建议使用 MOWER_* 系列主题 */
|
||||
@@ -13,6 +12,7 @@ public class MqttTopic {
|
||||
public static final String DEVICE_TASK_ARRIVE_TOPIC = "task/%s/arrive";
|
||||
/** @deprecated 通用设备主题,建议使用 MOWER_* 系列主题 */
|
||||
public static final String DEVICE_ERROR_PUSH_TOPIC = "device/%s/error";
|
||||
public static final String DEVICE_ROUTE_PUSH_TOPIC = "device/%s/route/post";
|
||||
|
||||
/** 产品标识:割草机 */
|
||||
public static final String MOWER_PRODUCT = "mower";
|
||||
@@ -47,8 +47,9 @@ public class MqttTopic {
|
||||
|
||||
// ==================== 任务管理 ====================
|
||||
/** 路径规划下发(平台->设备),对应 TCP 0x01 path */
|
||||
// public static final String MOWER_TASK_ROUTE_SET = "mower/%s/task/route/set";
|
||||
// public static final String MOWER_TASK_ROUTE_POST = "mower/%s/task/route/post";
|
||||
// public static final String MOWER_TASK_ROUTE_SET = "mower/%s/task/route/set";
|
||||
// public static final String MOWER_TASK_ROUTE_POST =
|
||||
// "mower/%s/task/route/post";
|
||||
|
||||
public static final String MOWER_TASK_ROUTE_SET = "mower/%s/task/target/set";
|
||||
|
||||
@@ -57,28 +58,32 @@ public class MqttTopic {
|
||||
public static final String MOWER_TASK_POINT_POST = "mower/%s/task/point/post";
|
||||
/** 任务状态变更上报:执行中/暂停/完成等(设备->平台) */
|
||||
public static final String MOWER_TASK_STATUS_POST = "mower/%s/task/status/post";
|
||||
/** 任务完成上报(设备->平台) */
|
||||
public static final String MOWER_TASK_FINISH_POST = "mower/%s/task/finish/post";
|
||||
|
||||
// ==================== 错误告警 ====================
|
||||
/** 设备错误告警上报:电机故障/传感器异常等(设备->平台) */
|
||||
public static final String MOWER_ERROR_POST = "mower/%s/event/error/post";
|
||||
|
||||
// ==================== OTA 固件升级 ====================
|
||||
// /** 下发 OTA 升级指令(平台->设备) */
|
||||
// public static final String MOWER_OTA_UPGRADE_SET = "mower/%s/ota/upgrade/set";
|
||||
// /** OTA 升级进度上报(设备->平台) */
|
||||
// public static final String MOWER_OTA_PROGRESS_POST = "mower/%s/ota/progress/post";
|
||||
// /** OTA 升级结果上报(设备->平台) */
|
||||
// public static final String MOWER_OTA_RESULT_POST = "mower/%s/ota/result/post";
|
||||
// /** 下发 OTA 升级指令(平台->设备) */
|
||||
// public static final String MOWER_OTA_UPGRADE_SET =
|
||||
// "mower/%s/ota/upgrade/set";
|
||||
// /** OTA 升级进度上报(设备->平台) */
|
||||
// public static final String MOWER_OTA_PROGRESS_POST =
|
||||
// "mower/%s/ota/progress/post";
|
||||
// /** OTA 升级结果上报(设备->平台) */
|
||||
// public static final String MOWER_OTA_RESULT_POST =
|
||||
// "mower/%s/ota/result/post";
|
||||
|
||||
// ==================== 设备信息 ====================
|
||||
// /** 查询设备信息(平台->设备) */
|
||||
// public static final String MOWER_INFO_DEVICE_GET = "mower/%s/info/device/get";
|
||||
// /** 设备信息响应(设备->平台) */
|
||||
// public static final String MOWER_INFO_DEVICE_REPLY = "mower/%s/info/device/reply";
|
||||
// /** 查询设备信息(平台->设备) */
|
||||
// public static final String MOWER_INFO_DEVICE_GET =
|
||||
// "mower/%s/info/device/get";
|
||||
// /** 设备信息响应(设备->平台) */
|
||||
// public static final String MOWER_INFO_DEVICE_REPLY =
|
||||
// "mower/%s/info/device/reply";
|
||||
/** 设备版本信息上报(设备->平台) */
|
||||
// public static final String MOWER_INFO_VERSION_POST = "mower/%s/info/version/post";
|
||||
// public static final String MOWER_INFO_VERSION_POST =
|
||||
// "mower/%s/info/version/post";
|
||||
|
||||
// ==================== 通配符订阅 ====================
|
||||
/** 订阅所有设备的状态变更事件 */
|
||||
@@ -98,9 +103,6 @@ public class MqttTopic {
|
||||
|
||||
public static final String MOWER_HEARTBEAT = "mower/+/event/heartbeat/post";
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 格式化 Topic 模板,将 %s 替换为设备ID
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user