# LD导航系统MQTT快速开始指南 ## 1. 配置MQTT连接 编辑 `application.yml`: ```yaml mqtt: broker: tcp://192.168.0.30:1883 username: your_username password: your_password clientId: server_client_001 deviceIds: ld000001,ld000002 # 你的设备ID列表 subscribeTopics: # 留空使用默认订阅 qos: 1 ``` ## 2. 启动应用 启动Spring Boot应用后,系统会自动: - 连接到MQTT Broker - 订阅所有LD导航系统相关主题 - 开始接收机器人消息 ## 3. 测试连接 ### 方式1: 使用Swagger UI 访问: `http://localhost:8080/swagger-ui.html` 找到"MQTT消息管理"分组,可以看到所有可用的API接口。 ### 方式2: 使用Postman或curl #### 请求地图列表 ```bash curl -X POST "http://localhost:8080/mqtt/ld/map/list?deviceId=ld000001" ``` #### 开启导航 ```bash curl -X POST "http://localhost:8080/mqtt/ld/navigation/start?deviceId=ld000001&mapName=map_a" ``` #### 前往目标点 ```bash curl -X POST "http://localhost:8080/mqtt/ld/task/gotoByNid?deviceId=ld000001&mapName=map_a&nid=19" ``` ## 4. 查看日志 启动后查看日志,应该能看到: ``` MQTT消息监听器初始化完成 接收MQTT消息 -> 主题:/robot4inspection/ld000001/localization/pose,QoS:0 处理LD导航系统消息 -> 设备ID:ld000001,短主题:/localization/pose ``` ## 5. 常用操作流程 ### 完整的导航流程 ```bash # 1. 请求地图列表 POST /mqtt/ld/map/list?deviceId=ld000001 # 2. 开启导航(使用某个地图) POST /mqtt/ld/navigation/start?deviceId=ld000001&mapName=map_a # 3. 位姿初始化(如果需要) POST /mqtt/ld/localization/initByNid?deviceId=ld000001&nid=1 # 4. 前往目标点 POST /mqtt/ld/task/gotoByNid?deviceId=ld000001&mapName=map_a&nid=19 # 5. 监听到达事件(自动接收) # 系统会自动接收 /task/target/event/arrive 消息 # 6. 如需暂停 POST /mqtt/ld/task/pause?deviceId=ld000001 # 7. 继续任务 POST /mqtt/ld/task/resume?deviceId=ld000001 # 8. 取消任务 POST /mqtt/ld/task/cancel?deviceId=ld000001 ``` ## 6. 在代码中使用 ### 注入服务 ```java @Autowired private MqttSendService mqttSendService; @Autowired private RedisCache redisCache; ``` ### 发送指令 ```java // 开启导航 boolean success = mqttSendService.startNavigation("ld000001", "map_a"); // 前往目标点 mqttSendService.gotoTargetByNid("ld000001", "map_a", 19); // 暂停任务 mqttSendService.pauseTask("ld000001"); ``` ### 获取机器人状态 ```java // 从Redis获取实时位姿 RobotPoseInfo poseInfo = redisCache.getCacheObject("ld:pose:ld000001"); if (poseInfo != null) { List xyz = poseInfo.getPose().getXyz(); Integer confidence = poseInfo.getConfidence(); Integer runState = poseInfo.getRunState(); } // 从Redis获取任务实时信息 TaskRealtimeInfo taskInfo = redisCache.getCacheObject("ld:task:realtime:ld000001"); if (taskInfo != null) { String driveMode = taskInfo.getDriveMode(); Double remainDistance = taskInfo.getOdom().getRemain(); } ``` ## 7. 自定义消息处理 编辑 `MqttMessageListener.java`,在对应的处理方法中添加业务逻辑: ```java private void handleArriveEvent(String deviceId, String payload) { try { JSONObject json = JSON.parseObject(payload); JSONArray argsArray = json.getJSONArray("args"); if (argsArray != null && !argsArray.isEmpty()) { ArriveEventInfo arriveInfo = argsArray.getObject(0, ArriveEventInfo.class); if ("ok".equals(arriveInfo.getStatus())) { // 到达成功 - 实现你的业务逻辑 log.info("机器人{}成功到达目标点", deviceId); // 例如: 更新数据库任务状态 // taskService.updateTaskStatus(deviceId, "completed"); } else { // 到达失败 - 处理错误 TaskErrorCode errorCode = TaskErrorCode.fromCode(arriveInfo.getError()); log.error("机器人{}到达失败: {}", deviceId, errorCode.getDescription()); // 例如: 记录错误日志 // errorLogService.recordError(deviceId, errorCode); } } } catch (Exception e) { log.error("解析到达事件失败", e); } } ``` ## 8. 常见问题 ### Q: 连接不上MQTT Broker? A: 检查: 1. broker地址是否正确 2. 用户名密码是否正确 3. 网络是否通畅 4. MQTT Broker是否正常运行 ### Q: 收不到消息? A: 检查: 1. 订阅主题是否正确 2. 设备是否在线并发送消息 3. 查看日志是否有错误信息 ### Q: 发送指令没反应? A: 检查: 1. 设备ID是否正确 2. 主题格式是否符合规范 3. 设备是否订阅了对应的指令主题 4. 查看MQTT Broker的消息日志 ### Q: 如何调试MQTT消息? A: 使用MQTT客户端工具: 1. MQTTX (推荐,图形化界面) 2. mosquitto_sub/mosquitto_pub (命令行) 3. 查看应用日志 ## 9. 下一步 - 阅读完整文档: `README.md` - 查看接口规范: `LD导航系统MQTT接口.md` - 查看变更日志: `CHANGELOG.md` - 实现自定义业务逻辑 - 编写单元测试 ## 10. 技术支持 如有问题,请查看: 1. 项目文档 2. 日志文件 3. MQTT Broker管理界面 4. 联系开发团队