refactor(audio): 将terminalId替换为robotId以统一机器人标识

- 修改AudioService中terminalId为robotId,包括变量声明、参数传递和日志输出
- 更新BaseChannelSubscribeHandler中的注释和参数解析逻辑
- 修改CameraStreamTicketService中的方法参数和记录类定义
- 更新DeRobotConfig文档中的术语描述
- 替换DeviceListController和EdgeAgvController中的terminalId参数为robotId
- 修改EdgeAgvServiceImpl中所有方法的参数引用
- 更新EdgeArmController中所有终端ID参数为机器人ID
- 修改EdgeArmServiceImpl中所有gRPC客户端调用的参数
- 调整EdgeArmTeleopOpenVO中的字段定义顺序
This commit is contained in:
lixiaolong 2026-08-05 11:10:19 +08:00
parent 7278d2c0f0
commit 86a8e02d85
100 changed files with 1434 additions and 824 deletions

View File

@ -7,7 +7,7 @@ Java 包名、Maven 坐标统一使用 `com.cmvr`。旧项目 `cmvr-iot` 仅作
## 主要功能 ## 主要功能
- 系统管理:用户、角色、部门、菜单、字典、参数、日志和通知。 - 系统管理:用户、角色、部门、菜单、字典、参数、日志和通知。
- 设备管理:设备注册、终端配置、设备档案和机器人配置 - 机器人设备:以边缘端上报的永久 `robotId` 作为唯一业务身份,自动同步机器人地址、在线状态和设备清单
- 测试业务任务配置、任务编排、任务实例、检测项、语音唤醒、Flowise 和 AI 评估。 - 测试业务任务配置、任务编排、任务实例、检测项、语音唤醒、Flowise 和 AI 评估。
- 智能巡检:机器人、地图、点位、任务、执行实例、巡检结果和告警。 - 智能巡检:机器人、地图、点位、任务、执行实例、巡检结果和告警。
- 智能座舱语音交互、触控交互、TTS、语料库和车机操作配置。 - 智能座舱语音交互、触控交互、TTS、语料库和车机操作配置。
@ -41,7 +41,7 @@ Java 包名、Maven 坐标统一使用 `com.cmvr`。旧项目 `cmvr-iot` 仅作
| `cmvr-iot-system` | 用户、角色、菜单、字典、参数和通用分组 | | `cmvr-iot-system` | 用户、角色、菜单、字典、参数和通用分组 |
| `cmvr-iot-quartz` | Quartz 任务调度和任务日志 | | `cmvr-iot-quartz` | Quartz 任务调度和任务日志 |
| `cmvr-iot-generator` | 代码生成 | | `cmvr-iot-generator` | 代码生成 |
| `cmvr-iot-device` | 设备、终端和机器人配置 | | `cmvr-iot-device` | 设备协议模型、机器人配置和巡检告警监听 |
| `cmvr-iot-test` | 测试任务、流程、检测项和执行实例 | | `cmvr-iot-test` | 测试任务、流程、检测项和执行实例 |
| `cmvr-iot-vi` | 语音交互业务 | | `cmvr-iot-vi` | 语音交互业务 |
| `cmvr-iot-ti` | 触控交互业务 | | `cmvr-iot-ti` | 触控交互业务 |
@ -54,7 +54,7 @@ Java 包名、Maven 坐标统一使用 `com.cmvr`。旧项目 `cmvr-iot` 仅作
| `cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client` | 原有机器人 gRPC 客户端 | | `cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client` | 原有机器人 gRPC 客户端 |
| `cmvr-iot-quic-contract` | QUIC 控制、节点事件和媒体数据协议 | | `cmvr-iot-quic-contract` | QUIC 控制、节点事件和媒体数据协议 |
| `cmvr-iot-quic` | 与主应用同进程运行的 QUIC Gateway | | `cmvr-iot-quic` | 与主应用同进程运行的 QUIC Gateway |
| `ruoyi-ui` | Vue 3 管理控制台 | | `cmvr-iot-ui-lxl-dev-worktree` | Vue 3 管理控制台(同级独立前端仓库) |
## 环境准备 ## 环境准备
@ -79,7 +79,8 @@ Java 包名、Maven 坐标统一使用 `com.cmvr`。旧项目 `cmvr-iot` 仅作
- `sql/aima_module.sql`:爱玛业务。 - `sql/aima_module.sql`:爱玛业务。
- `sql/inspection_module.sql`、`inspection_result.sql`、`inspection_detection_alert.sql`:巡检业务。 - `sql/inspection_module.sql`、`inspection_result.sql`、`inspection_detection_alert.sql`:巡检业务。
- `sql/tts_corpus_module.sql`TTS 和语料业务。 - `sql/tts_corpus_module.sql`TTS 和语料业务。
- `sql/quic_gateway_terminal_migration.sql`QUIC 节点绑定及运行状态字段。 - `sql/robot_quic_identity_migration.sql`:机器人 QUIC 身份、运行状态和设备快照表。
- `sql/robot_id_only_migration.sql`:移除巡检机器人和任务实例中的历史终端 ID 字段。
补充脚本可能面向不同历史库版本。已有数据库升级前应先备份,并确认字段或索引尚未存在。 补充脚本可能面向不同历史库版本。已有数据库升级前应先备份,并确认字段或索引尚未存在。
@ -111,7 +112,7 @@ Knife4j 只展示带原有 `@ApiOperation` 注解的正式接口,并沿用中
## 前端运行 ## 前端运行
```bash ```bash
cd ruoyi-ui cd ../cmvr-iot-ui-lxl-dev-worktree
pnpm install pnpm install
pnpm dev pnpm dev
``` ```
@ -120,7 +121,9 @@ pnpm dev
## gRPC 与 QUIC ## gRPC 与 QUIC
原有机器人 gRPC 客户端与 proto 均保留。终端 gRPC 地址优先读取 `de_device_terminal_config``host``port`,没有终端配置时使用当前 profile 中的 `grpc.client.grpc-server.address` 原有机器人 gRPC 客户端与 proto 均保留,但业务调用只传永久 `robotId`。平台根据 `inspection_robot.robot_id` 查找 QUIC 最近同步的 `ip_address``port`,不再使用终端 ID 或终端配置解析 gRPC 地址。
边缘端通过 QUIC 上报设备快照后,平台按 `robotId + deviceId` 写入 `inspection_robot_device`。前端选择机器人后只展示该机器人当前在线且启用的设备;单一匹配设备会自动选中并锁定。
QUIC 不是独立服务,`cmvr-iot-quic` 已作为 `cmvr-iot-admin` 的运行时依赖。启用时主应用同时启动: QUIC 不是独立服务,`cmvr-iot-quic` 已作为 `cmvr-iot-admin` 的运行时依赖。启用时主应用同时启动:
@ -139,7 +142,7 @@ mvn test
mvn clean package -DskipTests mvn clean package -DskipTests
# 构建前端生产包 # 构建前端生产包
cd ruoyi-ui cd ../cmvr-iot-ui-lxl-dev-worktree
pnpm build:prod pnpm build:prod
``` ```
@ -148,6 +151,6 @@ Windows 下也可以使用 `bin/package.bat`、`bin/run.bat` 和 `bin/clean.bat`
## 排查提示 ## 排查提示
- `ApplicationContext ... has been closed already`:彻底停止旧 Java 进程后重新启动,不要使用 DevTools 热重启。 - `ApplicationContext ... has been closed already`:彻底停止旧 Java 进程后重新启动,不要使用 DevTools 热重启。
- `cannot find a NameResolver for static://...`:这是 gRPC target scheme 解析问题,不代表网络不通;检查 `GrpcServiceManager` 的通道创建方式和终端地址格式 - 找不到机器人或机器人离线:确认机器人表已登记相同的永久 `robotId`,并检查 QUIC 注册日志、`inspection_robot` 的地址和连接状态
- QUIC 启动失败检查证书、私钥、ALPN、UDP 端口占用和 native library 对应的操作系统架构。 - QUIC 启动失败检查证书、私钥、ALPN、UDP 端口占用和 native library 对应的操作系统架构。
- 数据库提示缺少字段:确认基础脚本版本及对应模块迁移脚本已经执行。 - 数据库提示缺少字段:确认基础脚本版本及对应模块迁移脚本已经执行。

View File

@ -28,9 +28,9 @@ public class DeviceListController {
@PreAuthorize("@ss.hasPermi('device:profile:list')") @PreAuthorize("@ss.hasPermi('device:profile:list')")
@GetMapping("/addList") @GetMapping("/addList")
@ApiOperation("同步设备信息列表") @ApiOperation("同步设备信息列表")
public int addDeviceList(@RequestParam String terminalId){ public int addDeviceList(@RequestParam String robotId){
List<DeDeviceRegistration> list = systemService.deviceList(terminalId); List<DeDeviceRegistration> list = systemService.deviceList(robotId);
return registrationService.addDeviceList(list); return registrationService.addDeviceList(list);
} }

View File

@ -51,11 +51,11 @@ public class EdgeAgvController {
@ApiOperation("获取AGV运行时状态") @ApiOperation("获取AGV运行时状态")
@GetMapping("/getRuntimeState") @GetMapping("/getRuntimeState")
public AjaxResult getRuntimeState( public AjaxResult getRuntimeState(
@ApiParam(value = "终端设备ID", required = true) @ApiParam(value = "机器人永久唯一ID", required = true)
@RequestParam("terminalId") String terminalId, @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @ApiParam(value = "设备ID", required = true)
@RequestParam("deviceId") String deviceId) { @RequestParam("deviceId") String deviceId) {
EdgeCommonVO vo = commonVo(terminalId, deviceId); EdgeCommonVO vo = commonVo(robotId, deviceId);
AgvUtils.AgvRuntimeState state = edgeAgvService.getRuntimeState(vo); AgvUtils.AgvRuntimeState state = edgeAgvService.getRuntimeState(vo);
return AjaxResult.ok(toRuntimeStateMap(state)); return AjaxResult.ok(toRuntimeStateMap(state));
} }
@ -66,11 +66,11 @@ public class EdgeAgvController {
@ApiOperation("获取导航状态") @ApiOperation("获取导航状态")
@GetMapping("/getNavigationStatus") @GetMapping("/getNavigationStatus")
public AjaxResult getNavigationStatus( public AjaxResult getNavigationStatus(
@ApiParam(value = "终端设备ID", required = true) @ApiParam(value = "机器人永久唯一ID", required = true)
@RequestParam("terminalId") String terminalId, @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @ApiParam(value = "设备ID", required = true)
@RequestParam("deviceId") String deviceId) { @RequestParam("deviceId") String deviceId) {
EdgeCommonVO vo = commonVo(terminalId, deviceId); EdgeCommonVO vo = commonVo(robotId, deviceId);
AgvUtils.AgvNavigationStatus status = edgeAgvService.getNavigationStatus(vo); AgvUtils.AgvNavigationStatus status = edgeAgvService.getNavigationStatus(vo);
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
resultMap.put("state", status.getState()); resultMap.put("state", status.getState());
@ -186,11 +186,11 @@ public class EdgeAgvController {
@ApiOperation("列出所有地图") @ApiOperation("列出所有地图")
@GetMapping("/listMaps") @GetMapping("/listMaps")
public AjaxResult listMaps( public AjaxResult listMaps(
@ApiParam(value = "终端设备ID", required = true) @ApiParam(value = "机器人永久唯一ID", required = true)
@RequestParam("terminalId") String terminalId, @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @ApiParam(value = "设备ID", required = true)
@RequestParam("deviceId") String deviceId) { @RequestParam("deviceId") String deviceId) {
EdgeCommonVO vo = commonVo(terminalId, deviceId); EdgeCommonVO vo = commonVo(robotId, deviceId);
List<String> maps = edgeAgvService.listMaps(vo); List<String> maps = edgeAgvService.listMaps(vo);
return AjaxResult.ok(maps); return AjaxResult.ok(maps);
} }
@ -201,11 +201,11 @@ public class EdgeAgvController {
@ApiOperation("列出所有站点") @ApiOperation("列出所有站点")
@GetMapping("/listStations") @GetMapping("/listStations")
public AjaxResult listStations( public AjaxResult listStations(
@ApiParam(value = "终端设备ID", required = true) @ApiParam(value = "机器人永久ID", required = true)
@RequestParam("terminalId") String terminalId, @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @ApiParam(value = "设备ID", required = true)
@RequestParam("deviceId") String deviceId) { @RequestParam("deviceId") String deviceId) {
EdgeCommonVO vo = commonVo(terminalId, deviceId); EdgeCommonVO vo = commonVo(robotId, deviceId);
List<AgvUtils.AgvStation> stations = edgeAgvService.listStations(vo); List<AgvUtils.AgvStation> stations = edgeAgvService.listStations(vo);
List<Map<String, Object>> stationList = new ArrayList<>(); List<Map<String, Object>> stationList = new ArrayList<>();
for (AgvUtils.AgvStation station : stations) { for (AgvUtils.AgvStation station : stations) {
@ -240,14 +240,14 @@ public class EdgeAgvController {
@ApiOperation("下载地图") @ApiOperation("下载地图")
@GetMapping("/downloadMap") @GetMapping("/downloadMap")
public AjaxResult downloadMap( public AjaxResult downloadMap(
@ApiParam(value = "终端设备ID", required = true) @ApiParam(value = "机器人永久唯一ID", required = true)
@RequestParam("terminalId") String terminalId, @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @ApiParam(value = "设备ID", required = true)
@RequestParam("deviceId") String deviceId, @RequestParam("deviceId") String deviceId,
@ApiParam(value = "地图名称", required = true) @ApiParam(value = "地图名称", required = true)
@RequestParam("mapName") String mapName) { @RequestParam("mapName") String mapName) {
EdgeAgvMapNameVO vo = new EdgeAgvMapNameVO(); EdgeAgvMapNameVO vo = new EdgeAgvMapNameVO();
vo.setTerminalId(terminalId); vo.setRobotId(robotId);
vo.setDeviceId(deviceId); vo.setDeviceId(deviceId);
vo.setMapName(mapName); vo.setMapName(mapName);
String content = edgeAgvService.downloadMap(vo, vo.getMapName()); String content = edgeAgvService.downloadMap(vo, vo.getMapName());
@ -284,9 +284,9 @@ public class EdgeAgvController {
/** /**
* protobuf 运行时状态转换为前端友好的 Map避免直接暴露 protobuf 对象结构 * protobuf 运行时状态转换为前端友好的 Map避免直接暴露 protobuf 对象结构
*/ */
private EdgeCommonVO commonVo(String terminalId, String deviceId) { private EdgeCommonVO commonVo(String robotId, String deviceId) {
EdgeCommonVO vo = new EdgeCommonVO(); EdgeCommonVO vo = new EdgeCommonVO();
vo.setTerminalId(terminalId); vo.setRobotId(robotId);
vo.setDeviceId(deviceId); vo.setDeviceId(deviceId);
return vo; return vo;
} }

View File

@ -33,9 +33,9 @@ public class EdgeArmController {
@ApiOperation("关闭力矩") @ApiOperation("关闭力矩")
@GetMapping("/torqueOff") @GetMapping("/torqueOff")
public AjaxResult torqueOff( public AjaxResult torqueOff(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) { @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) {
EdgeCommonVO vo = commonVo(terminalId, deviceId); EdgeCommonVO vo = commonVo(robotId, deviceId);
edgeArmService.torqueOff(vo); edgeArmService.torqueOff(vo);
return AjaxResult.ok(); return AjaxResult.ok();
} }
@ -43,9 +43,9 @@ public class EdgeArmController {
@ApiOperation("开启力矩") @ApiOperation("开启力矩")
@GetMapping("/torqueOn") @GetMapping("/torqueOn")
public AjaxResult torqueOn( public AjaxResult torqueOn(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) { @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) {
EdgeCommonVO vo = commonVo(terminalId, deviceId); EdgeCommonVO vo = commonVo(robotId, deviceId);
edgeArmService.torqueOn(vo); edgeArmService.torqueOn(vo);
return AjaxResult.ok(); return AjaxResult.ok();
} }
@ -56,9 +56,9 @@ public class EdgeArmController {
@ApiOperation("清除故障") @ApiOperation("清除故障")
@GetMapping("/clearFault") @GetMapping("/clearFault")
public AjaxResult clearFault( public AjaxResult clearFault(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) { @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) {
EdgeCommonVO vo = commonVo(terminalId, deviceId); EdgeCommonVO vo = commonVo(robotId, deviceId);
edgeArmService.clearFault(vo); edgeArmService.clearFault(vo);
return AjaxResult.ok(); return AjaxResult.ok();
} }
@ -137,9 +137,9 @@ public class EdgeArmController {
@ApiOperation("停止运动") @ApiOperation("停止运动")
@GetMapping("/stopMotion") @GetMapping("/stopMotion")
public AjaxResult stopMotion( public AjaxResult stopMotion(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) { @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) {
EdgeCommonVO vo = commonVo(terminalId, deviceId); EdgeCommonVO vo = commonVo(robotId, deviceId);
edgeArmService.stopMotion(vo); edgeArmService.stopMotion(vo);
return AjaxResult.ok(); return AjaxResult.ok();
} }
@ -147,9 +147,9 @@ public class EdgeArmController {
@ApiOperation("获取关节状态") @ApiOperation("获取关节状态")
@GetMapping("/getJointState") @GetMapping("/getJointState")
public AjaxResult getJointState( public AjaxResult getJointState(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) { @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) {
EdgeCommonVO vo = commonVo(terminalId, deviceId); EdgeCommonVO vo = commonVo(robotId, deviceId);
ArmCommand.JointResponse result = edgeArmService.getJointState(vo); ArmCommand.JointResponse result = edgeArmService.getJointState(vo);
ArmCommand.JointState state = result.getState(); ArmCommand.JointState state = result.getState();
@ -167,11 +167,11 @@ public class EdgeArmController {
@ApiOperation("获取末端位姿") @ApiOperation("获取末端位姿")
@GetMapping("/getPose") @GetMapping("/getPose")
public AjaxResult getPose( public AjaxResult getPose(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId, @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId,
@ApiParam("基座连杆名称") @RequestParam(value = "baseLink", required = false) String baseLink, @ApiParam("基座连杆名称") @RequestParam(value = "baseLink", required = false) String baseLink,
@ApiParam("末端执行器连杆名称") @RequestParam(value = "eeLink", required = false) String eeLink) { @ApiParam("末端执行器连杆名称") @RequestParam(value = "eeLink", required = false) String eeLink) {
EdgeArmPoseQueryVO vo = poseQueryVo(terminalId, deviceId, baseLink, eeLink); EdgeArmPoseQueryVO vo = poseQueryVo(robotId, deviceId, baseLink, eeLink);
ArmCommand.GetPose.Response result = edgeArmService.getPose(vo, vo.getBaseLink(), vo.getEeLink()); ArmCommand.GetPose.Response result = edgeArmService.getPose(vo, vo.getBaseLink(), vo.getEeLink());
ArmCommand.CartesianPose pose = result.getPose(); ArmCommand.CartesianPose pose = result.getPose();
@ -190,11 +190,11 @@ public class EdgeArmController {
@ApiOperation("标定零点") @ApiOperation("标定零点")
@GetMapping("/calibrateZeroQ") @GetMapping("/calibrateZeroQ")
public AjaxResult calibrateZeroQ( public AjaxResult calibrateZeroQ(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId, @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId,
@ApiParam(value = "关节名称", required = true) @RequestParam("jointName") String jointName) { @ApiParam(value = "关节名称", required = true) @RequestParam("jointName") String jointName) {
EdgeArmCalibrateZeroQVO vo = new EdgeArmCalibrateZeroQVO(); EdgeArmCalibrateZeroQVO vo = new EdgeArmCalibrateZeroQVO();
vo.setTerminalId(terminalId); vo.setRobotId(robotId);
vo.setDeviceId(deviceId); vo.setDeviceId(deviceId);
vo.setJointName(jointName); vo.setJointName(jointName);
edgeArmService.calibrateZeroQ(vo, vo.getJointName()); edgeArmService.calibrateZeroQ(vo, vo.getJointName());
@ -204,11 +204,11 @@ public class EdgeArmController {
@ApiOperation("获取位姿矩阵") @ApiOperation("获取位姿矩阵")
@GetMapping("/getPoseMatrix") @GetMapping("/getPoseMatrix")
public AjaxResult getPoseMatrix( public AjaxResult getPoseMatrix(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId, @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId,
@ApiParam("基座连杆名称") @RequestParam(value = "baseLink", required = false) String baseLink, @ApiParam("基座连杆名称") @RequestParam(value = "baseLink", required = false) String baseLink,
@ApiParam("末端执行器连杆名称") @RequestParam(value = "eeLink", required = false) String eeLink) { @ApiParam("末端执行器连杆名称") @RequestParam(value = "eeLink", required = false) String eeLink) {
EdgeArmPoseQueryVO vo = poseQueryVo(terminalId, deviceId, baseLink, eeLink); EdgeArmPoseQueryVO vo = poseQueryVo(robotId, deviceId, baseLink, eeLink);
ArmCommand.GetPoseMatrix.Response result = edgeArmService.getPoseMatrix(vo, vo.getBaseLink(), vo.getEeLink()); ArmCommand.GetPoseMatrix.Response result = edgeArmService.getPoseMatrix(vo, vo.getBaseLink(), vo.getEeLink());
// 将TransformMatrix4x4转换为Map // 将TransformMatrix4x4转换为Map
ArmCommand.TransformMatrix4x4 matrix = result.getMatrix(); ArmCommand.TransformMatrix4x4 matrix = result.getMatrix();
@ -263,16 +263,16 @@ public class EdgeArmController {
return AjaxResult.ok(matrixMap); return AjaxResult.ok(matrixMap);
} }
private EdgeCommonVO commonVo(String terminalId, String deviceId) { private EdgeCommonVO commonVo(String robotId, String deviceId) {
EdgeCommonVO vo = new EdgeCommonVO(); EdgeCommonVO vo = new EdgeCommonVO();
vo.setTerminalId(terminalId); vo.setRobotId(robotId);
vo.setDeviceId(deviceId); vo.setDeviceId(deviceId);
return vo; return vo;
} }
private EdgeArmPoseQueryVO poseQueryVo(String terminalId, String deviceId, String baseLink, String eeLink) { private EdgeArmPoseQueryVO poseQueryVo(String robotId, String deviceId, String baseLink, String eeLink) {
EdgeArmPoseQueryVO vo = new EdgeArmPoseQueryVO(); EdgeArmPoseQueryVO vo = new EdgeArmPoseQueryVO();
vo.setTerminalId(terminalId); vo.setRobotId(robotId);
vo.setDeviceId(deviceId); vo.setDeviceId(deviceId);
vo.setBaseLink(baseLink); vo.setBaseLink(baseLink);
vo.setEeLink(eeLink); vo.setEeLink(eeLink);

View File

@ -35,45 +35,45 @@ public class EdgeCameraController extends BaseController {
@ApiOperation("获取相机状态") @ApiOperation("获取相机状态")
@GetMapping("/status") @GetMapping("/status")
public AjaxResult status( public AjaxResult status(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) { @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) {
EdgeCommonVO edgeCommonVO = commonVo(terminalId, deviceId); EdgeCommonVO edgeCommonVO = commonVo(robotId, deviceId);
return success(JSON.toJSONString(edgeCameraService.status(edgeCommonVO))); return success(JSON.toJSONString(edgeCameraService.status(edgeCommonVO)));
} }
@ApiOperation("开启相机") @ApiOperation("开启相机")
@GetMapping("/start") @GetMapping("/start")
public AjaxResult start( public AjaxResult start(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) { @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) {
EdgeCommonVO edgeCommonVO = commonVo(terminalId, deviceId); EdgeCommonVO edgeCommonVO = commonVo(robotId, deviceId);
return success(edgeCameraService.start(edgeCommonVO)); return success(edgeCameraService.start(edgeCommonVO));
} }
@ApiOperation("关闭相机") @ApiOperation("关闭相机")
@GetMapping("/stop") @GetMapping("/stop")
public AjaxResult stop( public AjaxResult stop(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) { @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) {
EdgeCommonVO edgeCommonVO = commonVo(terminalId, deviceId); EdgeCommonVO edgeCommonVO = commonVo(robotId, deviceId);
return success(edgeCameraService.stop(edgeCommonVO)); return success(edgeCameraService.stop(edgeCommonVO));
} }
@ApiOperation("获取图片") @ApiOperation("获取图片")
@GetMapping("/getRGBImage") @GetMapping("/getRGBImage")
public AjaxResult getRGBImage( public AjaxResult getRGBImage(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) { @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) {
EdgeCommonVO edgeCommonVO = commonVo(terminalId, deviceId); EdgeCommonVO edgeCommonVO = commonVo(robotId, deviceId);
return success(edgeCameraService.getRGBImage(edgeCommonVO)); return success(edgeCameraService.getRGBImage(edgeCommonVO));
} }
@ApiOperation("Get one depth image") @ApiOperation("Get one depth image")
@GetMapping("/getDepthImage") @GetMapping("/getDepthImage")
public AjaxResult getDepthImage( public AjaxResult getDepthImage(
@RequestParam("terminalId") String terminalId, @RequestParam("robotId") String robotId,
@RequestParam("deviceId") String deviceId) { @RequestParam("deviceId") String deviceId) {
return success(edgeCameraService.getDepthImage(commonVo(terminalId, deviceId))); return success(edgeCameraService.getDepthImage(commonVo(robotId, deviceId)));
} }
@ApiOperation("Control camera PTZ") @ApiOperation("Control camera PTZ")
@ -85,9 +85,9 @@ public class EdgeCameraController extends BaseController {
@ApiOperation("Get a short-lived RGB video stream URL") @ApiOperation("Get a short-lived RGB video stream URL")
@GetMapping("/rgb-stream-url") @GetMapping("/rgb-stream-url")
public AjaxResult rgbStreamUrl( public AjaxResult rgbStreamUrl(
@RequestParam("terminalId") String terminalId, @RequestParam("robotId") String robotId,
@RequestParam("deviceId") String deviceId) { @RequestParam("deviceId") String deviceId) {
String ticket = cameraStreamTicketService.issue(terminalId, deviceId); String ticket = cameraStreamTicketService.issue(robotId, deviceId);
return success((Object) ("/api/edge/camera/rgb-stream?ticket=" + ticket)); return success((Object) ("/api/edge/camera/rgb-stream?ticket=" + ticket));
} }
@ -98,20 +98,20 @@ public class EdgeCameraController extends BaseController {
if (target == null) { if (target == null) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
} }
return videoStreamResponse(target.terminalId(), target.deviceId()); return videoStreamResponse(target.robotId(), target.deviceId());
} }
@ApiOperation("Public RGB fragmented MP4 live stream") @ApiOperation("Public RGB fragmented MP4 live stream")
@GetMapping(value = "/rgb-stream/public", produces = "video/mp4") @GetMapping(value = "/rgb-stream/public", produces = "video/mp4")
public ResponseEntity<StreamingResponseBody> publicRgbStream( public ResponseEntity<StreamingResponseBody> publicRgbStream(
@RequestParam("terminalId") String terminalId, @RequestParam("robotId") String robotId,
@RequestParam("deviceId") String deviceId) { @RequestParam("deviceId") String deviceId) {
return videoStreamResponse(terminalId, deviceId); return videoStreamResponse(robotId, deviceId);
} }
private ResponseEntity<StreamingResponseBody> videoStreamResponse(String terminalId, String deviceId) { private ResponseEntity<StreamingResponseBody> videoStreamResponse(String robotId, String deviceId) {
StreamingResponseBody body = outputStream -> edgeCameraService.writeRGBVideoStream( StreamingResponseBody body = outputStream -> edgeCameraService.writeRGBVideoStream(
terminalId, deviceId, outputStream); robotId, deviceId, outputStream);
return ResponseEntity.ok() return ResponseEntity.ok()
.contentType(MediaType.parseMediaType("video/mp4")) .contentType(MediaType.parseMediaType("video/mp4"))
.cacheControl(CacheControl.noStore()) .cacheControl(CacheControl.noStore())
@ -123,33 +123,33 @@ public class EdgeCameraController extends BaseController {
@ApiOperation("开始录制视频") @ApiOperation("开始录制视频")
@GetMapping("/startRecording") @GetMapping("/startRecording")
public AjaxResult startRecording( public AjaxResult startRecording(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) { @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) {
EdgeCommonVO edgeCommonVO = commonVo(terminalId, deviceId); EdgeCommonVO edgeCommonVO = commonVo(robotId, deviceId);
return success(edgeCameraService.startRecording(edgeCommonVO)); return success(edgeCameraService.startRecording(edgeCommonVO));
} }
@ApiOperation("停止录制视频") @ApiOperation("停止录制视频")
@GetMapping("/stopRecording") @GetMapping("/stopRecording")
public AjaxResult stopRecording( public AjaxResult stopRecording(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) { @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) {
EdgeCommonVO edgeCommonVO = commonVo(terminalId, deviceId); EdgeCommonVO edgeCommonVO = commonVo(robotId, deviceId);
return success(edgeCameraService.stopRecording(edgeCommonVO)); return success(edgeCameraService.stopRecording(edgeCommonVO));
} }
@ApiOperation("获取图片和视频") @ApiOperation("获取图片和视频")
@GetMapping("/getRGBDImages") @GetMapping("/getRGBDImages")
public AjaxResult getRGBDImages( public AjaxResult getRGBDImages(
@ApiParam(value = "终端设备ID", required = true) @RequestParam("terminalId") String terminalId, @ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam("robotId") String robotId,
@ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) { @ApiParam(value = "设备ID", required = true) @RequestParam("deviceId") String deviceId) {
EdgeCommonVO edgeCommonVO = commonVo(terminalId, deviceId); EdgeCommonVO edgeCommonVO = commonVo(robotId, deviceId);
return success(edgeCameraService.getRGBDImages(edgeCommonVO)); return success(edgeCameraService.getRGBDImages(edgeCommonVO));
} }
private EdgeCommonVO commonVo(String terminalId, String deviceId) { private EdgeCommonVO commonVo(String robotId, String deviceId) {
EdgeCommonVO vo = new EdgeCommonVO(); EdgeCommonVO vo = new EdgeCommonVO();
vo.setTerminalId(terminalId); vo.setRobotId(robotId);
vo.setDeviceId(deviceId); vo.setDeviceId(deviceId);
return vo; return vo;
} }

View File

@ -25,9 +25,9 @@ public class EdgeDexHandController extends BaseController {
@GetMapping("/status") @GetMapping("/status")
public AjaxResult status( public AjaxResult status(
@RequestParam("deviceId") String deviceId, @RequestParam("deviceId") String deviceId,
@RequestParam("terminalId") String terminalId @RequestParam("robotId") String robotId
) { ) {
return success(JSON.parseObject(JSON.toJSONString(edgeDexHandService.getStatus(terminalId, deviceId)), Map.class)); return success(JSON.parseObject(JSON.toJSONString(edgeDexHandService.getStatus(robotId, deviceId)), Map.class));
} }
@ -35,11 +35,11 @@ public class EdgeDexHandController extends BaseController {
@GetMapping("/angle") @GetMapping("/angle")
public AjaxResult setAngle( public AjaxResult setAngle(
@RequestParam("deviceId") String deviceId, @RequestParam("deviceId") String deviceId,
@RequestParam("terminalId") String terminalId, @RequestParam("robotId") String robotId,
@RequestParam("id") int id, @RequestParam("id") int id,
@RequestParam("value") float value @RequestParam("value") float value
) { ) {
edgeDexHandService.setDexHandAngle(terminalId, deviceId, id, value); edgeDexHandService.setDexHandAngle(robotId, deviceId, id, value);
return success("ok"); return success("ok");
} }
@ -48,8 +48,8 @@ public class EdgeDexHandController extends BaseController {
@GetMapping("/sensor") @GetMapping("/sensor")
public AjaxResult sensor( public AjaxResult sensor(
@RequestParam("deviceId") String deviceId, @RequestParam("deviceId") String deviceId,
@RequestParam("terminalId") String terminalId @RequestParam("robotId") String robotId
) { ) {
return success(JSON.parseObject(edgeDexHandService.getSensorData(terminalId, deviceId), Map.class)); return success(JSON.parseObject(edgeDexHandService.getSensorData(robotId, deviceId), Map.class));
} }
} }

View File

@ -25,9 +25,9 @@ public class EdgeMicrophoneController {
@ApiOperation("获取麦克风状态") @ApiOperation("获取麦克风状态")
@PreAuthorize("@ss.hasPermi('system:microphone:query')") @PreAuthorize("@ss.hasPermi('system:microphone:query')")
@GetMapping("/status") @GetMapping("/status")
public AjaxResult getStatus(@ApiParam(value = "终端设备ID", required = true) @RequestParam String terminalId, @ApiParam (value = "设备ID", required = true) @RequestParam String deviceId) { public AjaxResult getStatus(@ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam String robotId, @ApiParam (value = "设备ID", required = true) @RequestParam String deviceId) {
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
edgeCommonVO.setDeviceId(deviceId); edgeCommonVO.setDeviceId(deviceId);
return AjaxResult.success(microphoneService.getStatus(edgeCommonVO)); return AjaxResult.success(microphoneService.getStatus(edgeCommonVO));
} }
@ -75,9 +75,9 @@ public class EdgeMicrophoneController {
@ApiOperation("获取音量") @ApiOperation("获取音量")
@PreAuthorize("@ss.hasPermi('system:microphone:volume')") @PreAuthorize("@ss.hasPermi('system:microphone:volume')")
@GetMapping("/volume") @GetMapping("/volume")
public AjaxResult getVolume(@ApiParam(value = "终端设备ID", required = true) @RequestParam String terminalId, @ApiParam (value = "设备ID", required = true) @RequestParam String deviceId) { public AjaxResult getVolume(@ApiParam(value = "机器人永久唯一ID", required = true) @RequestParam String robotId, @ApiParam (value = "设备ID", required = true) @RequestParam String deviceId) {
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
edgeCommonVO.setDeviceId(deviceId); edgeCommonVO.setDeviceId(deviceId);
return AjaxResult.success(microphoneService.getVolume(edgeCommonVO)); return AjaxResult.success(microphoneService.getVolume(edgeCommonVO));
} }

View File

@ -33,13 +33,13 @@ public class EdgeSpeakerController {
@PreAuthorize("@ss.hasPermi('system:speaker:query')") @PreAuthorize("@ss.hasPermi('system:speaker:query')")
@GetMapping("/status") @GetMapping("/status")
public AjaxResult getStatus( public AjaxResult getStatus(
@ApiParam(value = "终端设备ID", required = true) @ApiParam(value = "机器人永久唯一ID", required = true)
@RequestParam String terminalId, @RequestParam String robotId,
@ApiParam(value = "设备ID", required = true) @ApiParam(value = "设备ID", required = true)
@RequestParam String deviceId) { @RequestParam String deviceId) {
try { try {
// 获取扬声器状态 // 获取扬声器状态
SpeakerCommand.GetSpeakerStateCommand.Feedback feedback = speakerService.getStatus(terminalId, deviceId); SpeakerCommand.GetSpeakerStateCommand.Feedback feedback = speakerService.getStatus(robotId, deviceId);
SpeakerCommand.SpeakerState state = feedback.getState(); SpeakerCommand.SpeakerState state = feedback.getState();
// 构建返回结果 // 构建返回结果
@ -73,7 +73,7 @@ public class EdgeSpeakerController {
@PreAuthorize("@ss.hasPermi('system:speaker:play')") @PreAuthorize("@ss.hasPermi('system:speaker:play')")
@PostMapping("/play") @PostMapping("/play")
public AjaxResult playAudio(@RequestBody EdgeSpeakerPlayAudioVO edgeSpeakerPlayAudioVO) { public AjaxResult playAudio(@RequestBody EdgeSpeakerPlayAudioVO edgeSpeakerPlayAudioVO) {
speakerService.playAudio(edgeSpeakerPlayAudioVO.getTerminalId(), edgeSpeakerPlayAudioVO.getDeviceId(), edgeSpeakerPlayAudioVO.getAudioPath()); speakerService.playAudio(edgeSpeakerPlayAudioVO.getRobotId(), edgeSpeakerPlayAudioVO.getDeviceId(), edgeSpeakerPlayAudioVO.getAudioPath());
return AjaxResult.success(); return AjaxResult.success();
} }
@ -84,7 +84,7 @@ public class EdgeSpeakerController {
@PreAuthorize("@ss.hasPermi('system:speaker:stop')") @PreAuthorize("@ss.hasPermi('system:speaker:stop')")
@PostMapping("/stop") @PostMapping("/stop")
public AjaxResult stopPlayback(@RequestBody EdgeCommonVO edgeCommonVO) { public AjaxResult stopPlayback(@RequestBody EdgeCommonVO edgeCommonVO) {
speakerService.stopPlayback(edgeCommonVO.getTerminalId(), edgeCommonVO.getDeviceId()); speakerService.stopPlayback(edgeCommonVO.getRobotId(), edgeCommonVO.getDeviceId());
return AjaxResult.success(); return AjaxResult.success();
} }
@ -95,7 +95,7 @@ public class EdgeSpeakerController {
@PreAuthorize("@ss.hasPermi('system:speaker:pause')") @PreAuthorize("@ss.hasPermi('system:speaker:pause')")
@PostMapping("/pause") @PostMapping("/pause")
public AjaxResult pausePlayback(@RequestBody EdgeCommonVO edgeCommonVO) { public AjaxResult pausePlayback(@RequestBody EdgeCommonVO edgeCommonVO) {
speakerService.pausePlayback(edgeCommonVO.getTerminalId(), edgeCommonVO.getDeviceId()); speakerService.pausePlayback(edgeCommonVO.getRobotId(), edgeCommonVO.getDeviceId());
return AjaxResult.success(); return AjaxResult.success();
} }
@ -106,7 +106,7 @@ public class EdgeSpeakerController {
@PreAuthorize("@ss.hasPermi('system:speaker:resume')") @PreAuthorize("@ss.hasPermi('system:speaker:resume')")
@PostMapping("/resume") @PostMapping("/resume")
public AjaxResult resumePlayback(@RequestBody EdgeCommonVO edgeCommonVO) { public AjaxResult resumePlayback(@RequestBody EdgeCommonVO edgeCommonVO) {
speakerService.resumePlayback(edgeCommonVO.getTerminalId(), edgeCommonVO.getDeviceId()); speakerService.resumePlayback(edgeCommonVO.getRobotId(), edgeCommonVO.getDeviceId());
return AjaxResult.success(); return AjaxResult.success();
} }
@ -117,7 +117,7 @@ public class EdgeSpeakerController {
@PreAuthorize("@ss.hasPermi('system:speaker:volume')") @PreAuthorize("@ss.hasPermi('system:speaker:volume')")
@PostMapping("/volume") @PostMapping("/volume")
public AjaxResult setVolume(@RequestBody EdgeMicrophoneVolumeVO edgeMicrophoneVolumeVO) { public AjaxResult setVolume(@RequestBody EdgeMicrophoneVolumeVO edgeMicrophoneVolumeVO) {
speakerService.setVolume(edgeMicrophoneVolumeVO.getTerminalId(), edgeMicrophoneVolumeVO.getDeviceId(), edgeMicrophoneVolumeVO.getVolume()); speakerService.setVolume(edgeMicrophoneVolumeVO.getRobotId(), edgeMicrophoneVolumeVO.getDeviceId(), edgeMicrophoneVolumeVO.getVolume());
return AjaxResult.success(); return AjaxResult.success();
} }
@ -128,11 +128,11 @@ public class EdgeSpeakerController {
@PreAuthorize("@ss.hasPermi('system:speaker:volume')") @PreAuthorize("@ss.hasPermi('system:speaker:volume')")
@GetMapping("/volume") @GetMapping("/volume")
public AjaxResult getVolume( public AjaxResult getVolume(
@ApiParam(value = "终端设备ID", required = true) @ApiParam(value = "机器人永久唯一ID", required = true)
@RequestParam String terminalId, @RequestParam String robotId,
@ApiParam(value = "设备ID", required = true) @ApiParam(value = "设备ID", required = true)
@RequestParam String deviceId) { @RequestParam String deviceId) {
return AjaxResult.success(speakerService.getVolume(terminalId, deviceId)); return AjaxResult.success(speakerService.getVolume(robotId, deviceId));
} }
@ApiOperation("获取所有音频") @ApiOperation("获取所有音频")

View File

@ -26,14 +26,14 @@ public class EdgeSystemController extends BaseController {
@ApiOperation("Get edge system information") @ApiOperation("Get edge system information")
@GetMapping("/info") @GetMapping("/info")
public AjaxResult info(@RequestParam("terminalId") String terminalId) { public AjaxResult info(@RequestParam("robotId") String robotId) {
return success(JSON.toJSONString(edgeSystemService.getSystemInfo(terminalId))); return success(JSON.toJSONString(edgeSystemService.getSystemInfo(robotId)));
} }
@ApiOperation("Get edge system runtime status") @ApiOperation("Get edge system runtime status")
@GetMapping("/status") @GetMapping("/status")
public AjaxResult status(@RequestParam("terminalId") String terminalId) { public AjaxResult status(@RequestParam("robotId") String robotId) {
return success(JSON.toJSONString(edgeSystemService.getSystemStatus(terminalId))); return success(JSON.toJSONString(edgeSystemService.getSystemStatus(robotId)));
} }
@ApiOperation("Update edge device parameters") @ApiOperation("Update edge device parameters")
@ -50,7 +50,7 @@ public class EdgeSystemController extends BaseController {
@ApiOperation("停止所有设备") @ApiOperation("停止所有设备")
@GetMapping("/stopAll") @GetMapping("/stopAll")
public AjaxResult stopAll(@RequestParam("terminalId") String terminalId) { public AjaxResult stopAll(@RequestParam("robotId") String robotId) {
return AjaxResult.ok(edgeSystemService.stopAll(terminalId)); return AjaxResult.ok(edgeSystemService.stopAll(robotId));
} }
} }

View File

@ -70,6 +70,25 @@ public class InspectionRobotController extends BaseController
return success(inspectionRobotService.selectInspectionRobotById(id)); return success(inspectionRobotService.selectInspectionRobotById(id));
} }
@ApiOperation("查询机器人自动发现的设备")
@PreAuthorize("@ss.hasPermi('inspection:robot:query')")
@GetMapping("/{id}/devices")
public AjaxResult devices(@PathVariable("id") String id)
{
return success(inspectionRobotService.selectRobotDevices(id));
}
@ApiOperation("按机器人ID查询自动发现的设备")
@PreAuthorize("@ss.hasPermi('inspection:robot:query')")
@GetMapping("/devices")
public AjaxResult devicesByRobotId(
@RequestParam @ApiParam(value = "机器人永久唯一ID", required = true) String robotId,
@RequestParam(required = false) @ApiParam("设备类型") Integer deviceKind,
@RequestParam(defaultValue = "true") @ApiParam("是否只查询在线且启用的设备") boolean onlineOnly)
{
return success(inspectionRobotService.selectRobotDevicesByRobotId(robotId, deviceKind, onlineOnly));
}
/** /**
* 新增巡检机器人 * 新增巡检机器人
*/ */

View File

@ -157,7 +157,7 @@ public class TeFlowController extends BaseController {
@PostMapping("/action") @PostMapping("/action")
@ApiOperation(value = "单个节点执行", @ApiOperation(value = "单个节点执行",
notes = "设备通用指令action=DEVICE_EXECUTE_JSON_COMMANDpayload需要terminalId、deviceId、requestJson" notes = "设备通用指令action=DEVICE_EXECUTE_JSON_COMMANDpayload需要robotId、deviceId、requestJson"
+ "巡检仪表节点action=INSPECTION_METER_RECOGNIZEpayload使用InspectionMeterRecognizeConfigVO" + "巡检仪表节点action=INSPECTION_METER_RECOGNIZEpayload使用InspectionMeterRecognizeConfigVO"
+ "人工判断节点action=INSPECTION_MANUAL_REVIEW_CREATEpayload使用InspectionManualReviewConfigVO。" + "人工判断节点action=INSPECTION_MANUAL_REVIEW_CREATEpayload使用InspectionManualReviewConfigVO。"
+ "该接口用于试调节点,不会生成正式巡检任务结果") + "该接口用于试调节点,不会生成正式巡检任务结果")

View File

@ -51,7 +51,7 @@ public class TeFlowiseController extends BaseController {
runParams.put("5bb26d52e1861c6936f3c3149eaf17e8", runParams1); runParams.put("5bb26d52e1861c6936f3c3149eaf17e8", runParams1);
TeTaskExecuteNormalVO taskExecuteNormalVO = TeTaskExecuteNormalVO.builder() TeTaskExecuteNormalVO taskExecuteNormalVO = TeTaskExecuteNormalVO.builder()
.taskId("b6ab5ffff783d9b25d0dc34f13be222d") .taskId("b6ab5ffff783d9b25d0dc34f13be222d")
.terminalId("4ed1246c465b97975f96c9ef8371a3bd") .robotId("4ed1246c465b97975f96c9ef8371a3bd")
.runParams(JSONObject.from(runParams)).build(); .runParams(JSONObject.from(runParams)).build();
if (!taskInstIdList.isEmpty()) { if (!taskInstIdList.isEmpty()) {
try { try {

View File

@ -13,11 +13,11 @@ public class CameraStreamTicketService {
private static final long TICKET_LIFETIME_MILLIS = Duration.ofSeconds(30).toMillis(); private static final long TICKET_LIFETIME_MILLIS = Duration.ofSeconds(30).toMillis();
private final Map<String, StreamTarget> tickets = new ConcurrentHashMap<>(); private final Map<String, StreamTarget> tickets = new ConcurrentHashMap<>();
public String issue(String terminalId, String deviceId) { public String issue(String robotId, String deviceId) {
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
tickets.entrySet().removeIf(entry -> entry.getValue().expiresAt() < now); tickets.entrySet().removeIf(entry -> entry.getValue().expiresAt() < now);
String ticket = UUID.randomUUID().toString().replace("-", ""); String ticket = UUID.randomUUID().toString().replace("-", "");
tickets.put(ticket, new StreamTarget(terminalId, deviceId, now + TICKET_LIFETIME_MILLIS)); tickets.put(ticket, new StreamTarget(robotId, deviceId, now + TICKET_LIFETIME_MILLIS));
return ticket; return ticket;
} }
@ -33,6 +33,6 @@ public class CameraStreamTicketService {
return target; return target;
} }
public record StreamTarget(String terminalId, String deviceId, long expiresAt) { public record StreamTarget(String robotId, String deviceId, long expiresAt) {
} }
} }

View File

@ -62,33 +62,33 @@ public class RobotAudioGrpcAdapter {
private final GrpcServiceManager grpcServiceManager; private final GrpcServiceManager grpcServiceManager;
private final ConcurrentMap<String, RobotAudioStream> streams = new ConcurrentHashMap<>(); private final ConcurrentMap<String, RobotAudioStream> streams = new ConcurrentHashMap<>();
public RobotAudioStream openStream(String terminalId, public RobotAudioStream openStream(String robotId,
String deviceId, String deviceId,
String sessionId, String sessionId,
String operatorId, String operatorId,
RobotAudioStreamListener listener) { RobotAudioStreamListener listener) {
return openStream(terminalId, deviceId, deviceId, sessionId, operatorId, listener); return openStream(robotId, deviceId, deviceId, sessionId, operatorId, listener);
} }
public RobotAudioStream openStream(String terminalId, public RobotAudioStream openStream(String robotId,
String speakerDeviceId, String speakerDeviceId,
String micDeviceId, String micDeviceId,
String sessionId, String sessionId,
String operatorId, String operatorId,
RobotAudioStreamListener listener) { RobotAudioStreamListener listener) {
SpeakerServiceGrpc.SpeakerServiceStub speakerStub = SpeakerServiceGrpc.SpeakerServiceStub speakerStub =
grpcServiceManager.getGrpcClient(terminalId, SpeakerServiceGrpc.SpeakerServiceStub.class); grpcServiceManager.getGrpcClient(robotId, SpeakerServiceGrpc.SpeakerServiceStub.class);
MicPhoneServiceGrpc.MicPhoneServiceStub micStub = MicPhoneServiceGrpc.MicPhoneServiceStub micStub =
grpcServiceManager.getGrpcClient(terminalId, MicPhoneServiceGrpc.MicPhoneServiceStub.class); grpcServiceManager.getGrpcClient(robotId, MicPhoneServiceGrpc.MicPhoneServiceStub.class);
SpeakerServiceGrpc.SpeakerServiceBlockingStub speakerBlockingStub = SpeakerServiceGrpc.SpeakerServiceBlockingStub speakerBlockingStub =
grpcServiceManager.getGrpcClient(terminalId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class); grpcServiceManager.getGrpcClient(robotId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class);
MicPhoneServiceGrpc.MicPhoneServiceBlockingStub micBlockingStub = MicPhoneServiceGrpc.MicPhoneServiceBlockingStub micBlockingStub =
grpcServiceManager.getGrpcClient(terminalId, MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class); grpcServiceManager.getGrpcClient(robotId, MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class);
preflightDeviceStatus(speakerBlockingStub, micBlockingStub, speakerDeviceId, micDeviceId, sessionId); preflightDeviceStatus(speakerBlockingStub, micBlockingStub, speakerDeviceId, micDeviceId, sessionId);
RobotAudioStream stream = new RobotAudioStream( RobotAudioStream stream = new RobotAudioStream(
terminalId, speakerDeviceId, micDeviceId, sessionId, operatorId, speakerStub, micStub, listener); robotId, speakerDeviceId, micDeviceId, sessionId, operatorId, speakerStub, micStub, listener);
RobotAudioStream exists = streams.putIfAbsent(sessionId, stream); RobotAudioStream exists = streams.putIfAbsent(sessionId, stream);
if (exists != null) { if (exists != null) {
throw new IllegalStateException("实时语音会话已存在:" + sessionId); throw new IllegalStateException("实时语音会话已存在:" + sessionId);
@ -96,8 +96,8 @@ public class RobotAudioGrpcAdapter {
try { try {
stream.start(); stream.start();
log.info("实时对讲 gRPC 流已创建sessionId={}terminalId={}speakerDeviceId={}micDeviceId={}operatorId={}sampleRate={}channels={}bits={}frameMs={}frameBytes={}", log.info("实时对讲 gRPC 流已创建sessionId={}robotId={}speakerDeviceId={}micDeviceId={}operatorId={}sampleRate={}channels={}bits={}frameMs={}frameBytes={}",
sessionId, terminalId, speakerDeviceId, micDeviceId, operatorId, SAMPLE_RATE, CHANNELS, BITS_PER_SAMPLE, FRAME_MS, FRAME_BYTES); sessionId, robotId, speakerDeviceId, micDeviceId, operatorId, SAMPLE_RATE, CHANNELS, BITS_PER_SAMPLE, FRAME_MS, FRAME_BYTES);
return stream; return stream;
} catch (RuntimeException e) { } catch (RuntimeException e) {
streams.remove(sessionId, stream); streams.remove(sessionId, stream);
@ -163,7 +163,7 @@ public class RobotAudioGrpcAdapter {
} }
public class RobotAudioStream { public class RobotAudioStream {
private final String terminalId; private final String robotId;
private final String speakerDeviceId; private final String speakerDeviceId;
private final String micDeviceId; private final String micDeviceId;
private final String sessionId; private final String sessionId;
@ -190,7 +190,7 @@ public class RobotAudioGrpcAdapter {
private volatile long lastStatsLogAt; private volatile long lastStatsLogAt;
private volatile byte[] pendingBrowserBytes = new byte[0]; private volatile byte[] pendingBrowserBytes = new byte[0];
private RobotAudioStream(String terminalId, private RobotAudioStream(String robotId,
String speakerDeviceId, String speakerDeviceId,
String micDeviceId, String micDeviceId,
String sessionId, String sessionId,
@ -198,7 +198,7 @@ public class RobotAudioGrpcAdapter {
SpeakerServiceGrpc.SpeakerServiceStub speakerStub, SpeakerServiceGrpc.SpeakerServiceStub speakerStub,
MicPhoneServiceGrpc.MicPhoneServiceStub micStub, MicPhoneServiceGrpc.MicPhoneServiceStub micStub,
RobotAudioStreamListener listener) { RobotAudioStreamListener listener) {
this.terminalId = terminalId; this.robotId = robotId;
this.speakerDeviceId = speakerDeviceId; this.speakerDeviceId = speakerDeviceId;
this.micDeviceId = micDeviceId; this.micDeviceId = micDeviceId;
this.sessionId = sessionId; this.sessionId = sessionId;
@ -365,8 +365,8 @@ public class RobotAudioGrpcAdapter {
return sessionId; return sessionId;
} }
public String getTerminalId() { public String getRobotId() {
return terminalId; return robotId;
} }
public String getDeviceId() { public String getDeviceId() {
@ -639,8 +639,8 @@ public class RobotAudioGrpcAdapter {
return; return;
} }
Throwable actual = throwable == null ? new RuntimeException("audio stream failed") : throwable; Throwable actual = throwable == null ? new RuntimeException("audio stream failed") : throwable;
log.error("实时对讲 gRPC 流异常source={}sessionId={}terminalId={}speakerDeviceId={}micDeviceId={}", log.error("实时对讲 gRPC 流异常source={}sessionId={}robotId={}speakerDeviceId={}micDeviceId={}",
source, sessionId, terminalId, speakerDeviceId, micDeviceId, actual); source, sessionId, robotId, speakerDeviceId, micDeviceId, actual);
sendExecutor.execute(new Runnable() { sendExecutor.execute(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -660,7 +660,7 @@ public class RobotAudioGrpcAdapter {
if (!closed.compareAndSet(false, true)) { if (!closed.compareAndSet(false, true)) {
return; return;
} }
log.info("实时对讲 gRPC 流远端结束sessionId={}terminalId={}speakerDeviceId={}micDeviceId={}", sessionId, terminalId, speakerDeviceId, micDeviceId); log.info("实时对讲 gRPC 流远端结束sessionId={}robotId={}speakerDeviceId={}micDeviceId={}", sessionId, robotId, speakerDeviceId, micDeviceId);
sendExecutor.execute(new Runnable() { sendExecutor.execute(new Runnable() {
@Override @Override
public void run() { public void run() {

View File

@ -14,7 +14,7 @@ import java.util.function.Function;
public class GrpcChannelCache { public class GrpcChannelCache {
private final long ttlSeconds; // 通道存活时间 private final long ttlSeconds; // 通道存活时间
private final Map<String, ChannelWrapper> channelMap = new ConcurrentHashMap<>(); // 设备 ID -> 通道包装器 private final Map<String, ChannelWrapper> channelMap = new ConcurrentHashMap<>(); // 机器人 ID -> 通道包装器
public GrpcChannelCache(long ttlSeconds) { public GrpcChannelCache(long ttlSeconds) {
this.ttlSeconds = ttlSeconds; this.ttlSeconds = ttlSeconds;
@ -23,11 +23,11 @@ public class GrpcChannelCache {
/** /**
* 获取通道存在则刷新时间过期则重建不存在则创建 * 获取通道存在则刷新时间过期则重建不存在则创建
*/ */
public ManagedChannel get(String terminalId, Function<String, ManagedChannel> supplier) { public ManagedChannel get(String robotId, Function<String, ManagedChannel> supplier) {
return channelMap.compute(terminalId, (k, v) -> { return channelMap.compute(robotId, (k, v) -> {
if (v == null || v.isExpired(ttlSeconds)) { // 为空或过期时重建 if (v == null || v.isExpired(ttlSeconds)) { // 为空或过期时重建
if (v != null) v.close(); // 关闭旧通道 if (v != null) v.close(); // 关闭旧通道
return new ChannelWrapper(supplier.apply(terminalId)); // 创建新通道包装器 return new ChannelWrapper(supplier.apply(robotId)); // 创建新通道包装器
} else { } else {
v.refresh(); // 更新最后访问时间 v.refresh(); // 更新最后访问时间
return v; return v;
@ -50,11 +50,11 @@ public class GrpcChannelCache {
} }
/** /**
* 终端主动上报的gRPC地址发生变化时立即关闭旧通道 * 机器人主动上报的gRPC地址发生变化时立即关闭旧通道
* 下一次业务调用仍通过原有supplier创建ManagedChannel * 下一次业务调用仍通过原有supplier创建ManagedChannel
*/ */
public void invalidate(String terminalId) { public void invalidate(String robotId) {
ChannelWrapper wrapper = channelMap.remove(terminalId); ChannelWrapper wrapper = channelMap.remove(robotId);
if (wrapper != null) { if (wrapper != null) {
wrapper.close(); wrapper.close();
} }

View File

@ -2,9 +2,8 @@ package com.cmvr.edge.client.manage;
import cmvr.api.*; import cmvr.api.*;
import cmvr.api.armteleop.v1.ArmTeleopServiceGrpc; import cmvr.api.armteleop.v1.ArmTeleopServiceGrpc;
import cn.hutool.core.util.ObjUtil; import com.cmvr.common.robot.RobotEndpoint;
import com.cmvr.device.domain.DeDeviceTerminalConfig; import com.cmvr.common.robot.RobotEndpointResolver;
import com.cmvr.device.service.IDeDeviceTerminalConfigService;
import io.grpc.ManagedChannel; import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder; import io.grpc.ManagedChannelBuilder;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -25,7 +24,7 @@ import java.util.function.Function;
@RequiredArgsConstructor @RequiredArgsConstructor
public class GrpcServiceManager { public class GrpcServiceManager {
private final IDeDeviceTerminalConfigService deviceTerminalConfigService; private final RobotEndpointResolver robotEndpointResolver;
@Value("${grpc.client.grpc-server.address}") @Value("${grpc.client.grpc-server.address}")
private String DEFAULT_GRPC_ADDRESS; private String DEFAULT_GRPC_ADDRESS;
@ -73,8 +72,8 @@ public class GrpcServiceManager {
* 获取 gRPC 客户端 Stub * 获取 gRPC 客户端 Stub
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <T> T getGrpcClient(String terminalId, Class<T> serviceClass) { public <T> T getGrpcClient(String robotId, Class<T> serviceClass) {
ManagedChannel channel = grpcChannelCache.get(terminalId, this::createChannel); ManagedChannel channel = grpcChannelCache.get(robotId, this::createChannel);
GrpcClientFactory<T> factory = (GrpcClientFactory<T>) clientFactories.get(serviceClass); GrpcClientFactory<T> factory = (GrpcClientFactory<T>) clientFactories.get(serviceClass);
if (factory == null) { if (factory == null) {
@ -87,8 +86,8 @@ public class GrpcServiceManager {
/** /**
* 创建gRPC通道 * 创建gRPC通道
*/ */
private ManagedChannel createChannel(String terminalId) { private ManagedChannel createChannel(String robotId) {
InetSocketAddress endpoint = getGrpcServiceEndpoint(terminalId); InetSocketAddress endpoint = getGrpcServiceEndpoint(robotId);
return ManagedChannelBuilder.forAddress(endpoint.getHostString(), endpoint.getPort()) return ManagedChannelBuilder.forAddress(endpoint.getHostString(), endpoint.getPort())
.usePlaintext() .usePlaintext()
.maxInboundMessageSize(50 * 1024 * 1024) // 50MB .maxInboundMessageSize(50 * 1024 * 1024) // 50MB
@ -98,12 +97,9 @@ public class GrpcServiceManager {
/** /**
* 获取终端地址 * 获取终端地址
*/ */
private InetSocketAddress getGrpcServiceEndpoint(String terminalId) { private InetSocketAddress getGrpcServiceEndpoint(String robotId) {
DeDeviceTerminalConfig terminal = deviceTerminalConfigService.selectDeDeviceTerminalConfigById(terminalId); RobotEndpoint endpoint = robotEndpointResolver.resolve(robotId);
if (ObjUtil.isEmpty(terminal)) { return createEndpoint(endpoint.host(), (long) endpoint.port(), "机器人 " + robotId);
return parseGrpcAddress(DEFAULT_GRPC_ADDRESS);
}
return createEndpoint(terminal.getHost(), terminal.getPort(), "终端 " + terminalId);
} }
/** /**
@ -172,8 +168,8 @@ public class GrpcServiceManager {
} }
/** QUIC发现终端地址变化后使指定终端的旧gRPC通道立即失效。 */ /** QUIC发现终端地址变化后使指定终端的旧gRPC通道立即失效。 */
public void invalidateTerminal(String terminalId) { public void invalidateRobot(String robotId) {
grpcChannelCache.invalidate(terminalId); grpcChannelCache.invalidate(robotId);
} }
/** /**

View File

@ -10,9 +10,9 @@ import jakarta.validation.constraints.NotEmpty;
@ApiModel("边缘系统通用VO") @ApiModel("边缘系统通用VO")
public class EdgeCommonVO { public class EdgeCommonVO {
@ApiModelProperty("终端ID") @ApiModelProperty("机器人ID")
@NotEmpty(message = "终端ID不能为空") @NotEmpty(message = "机器人ID不能为空")
private String terminalId; private String robotId;
@ApiModelProperty("设备ID") @ApiModelProperty("设备ID")
@NotEmpty(message = "设备ID不能为空") @NotEmpty(message = "设备ID不能为空")

View File

@ -6,11 +6,10 @@ import java.util.List;
@Data @Data
public class EdgeArmTeleopOpenVO { public class EdgeArmTeleopOpenVO {
private String terminalId; private String robotId;
private Integer protocolMajor; private Integer protocolMajor;
private Integer protocolMinor; private Integer protocolMinor;
private String clientInstanceId; private String clientInstanceId;
private String robotId;
private String modelSha256; private String modelSha256;
private String calibrationSha256; private String calibrationSha256;
private List<String> jointNames; private List<String> jointNames;

View File

@ -1,224 +0,0 @@
package com.cmvr.edge.client.quic;
import com.cmvr.device.domain.DeDeviceTerminalConfig;
import com.cmvr.device.service.IDeDeviceTerminalConfigService;
import com.cmvr.edge.client.manage.GrpcServiceManager;
import com.cmvr.quic.contract.QuicEventBus;
import com.cmvr.quic.gateway.v1.NodeEvent;
import com.cmvr.quic.gateway.v1.NodeEventType;
import com.cmvr.quic.gateway.v1.NodeSnapshot;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
/** 直接订阅进程内 QUIC 节点事件,并同步已绑定终端的运行状态和 gRPC 地址。 */
@Service
@RequiredArgsConstructor
public class QuicGatewayNodeSyncService {
private static final Logger log = LoggerFactory.getLogger(QuicGatewayNodeSyncService.class);
private static final long HEARTBEAT_PERSIST_INTERVAL_MS = 15000L;
private final IDeDeviceTerminalConfigService terminalConfigService;
private final GrpcServiceManager grpcServiceManager;
private final QuicEventBus quicEventBus;
@Value("${cmvr.quic.enabled:false}")
private boolean enabled;
/** observed-source 使用 QUIC 来源 IPadvertised 使用节点主动上报的 gRPC host。 */
@Value("${cmvr.quic.grpc-host-source:observed-source}")
private String grpcHostSource;
private final AtomicBoolean stopping = new AtomicBoolean(false);
private final AtomicBoolean grpcHostSourceWarningLogged = new AtomicBoolean(false);
private final Set<String> unknownNodes = ConcurrentHashMap.newKeySet();
private final Set<String> grpcAddressMismatchNodes = ConcurrentHashMap.newKeySet();
private final ConcurrentHashMap<String, Long> lastPersistedAt = new ConcurrentHashMap<String, Long>();
private final ConcurrentHashMap<String, String> synchronizedTerminals =
new ConcurrentHashMap<String, String>();
private ExecutorService eventExecutor;
private QuicEventBus.Subscription subscription;
@PostConstruct
public void start() {
if (!enabled) {
log.info("QUIC 节点状态同步未启用");
return;
}
eventExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable, "quic-node-sync");
thread.setDaemon(true);
return thread;
}
});
subscription = quicEventBus.watchNodes(true, this::enqueueEvent);
log.info("已通过进程内事件总线订阅 QUIC 节点事件");
}
private void enqueueEvent(final NodeEvent event) {
ExecutorService executor = eventExecutor;
if (stopping.get() || executor == null) {
return;
}
try {
executor.execute(new Runnable() {
@Override
public void run() {
handleEventSafely(event);
}
});
} catch (RejectedExecutionException ignored) {
if (!stopping.get()) {
log.warn("QUIC 节点事件线程已停止忽略事件nodeId={}", event.getNode().getNodeId());
}
}
}
private void handleEventSafely(NodeEvent event) {
try {
syncNode(event);
} catch (RuntimeException error) {
log.error("同步 QUIC 终端状态失败nodeId={}eventType={}",
event.getNode().getNodeId(), event.getType(), error);
}
}
private void syncNode(NodeEvent event) {
NodeSnapshot node = event.getNode();
if (node.getNodeId().isEmpty()) {
return;
}
DeDeviceTerminalConfig terminal = terminalConfigService.selectByQuicNodeId(node.getNodeId());
if (terminal == null) {
if (unknownNodes.add(node.getNodeId())) {
log.warn("QUIC 节点尚未绑定平台终端忽略运行状态同步nodeId={}remoteIp={}",
node.getNodeId(), node.getObservedSourceIp());
}
return;
}
unknownNodes.remove(node.getNodeId());
boolean offline = event.getType() == NodeEventType.NODE_EVENT_TYPE_OFFLINE || !node.getOnline();
if (offline) {
synchronizedTerminals.remove(node.getNodeId());
} else {
synchronizedTerminals.put(node.getNodeId(), terminal.getId());
}
String grpcHost = offline ? null : resolveGrpcHost(node);
Long grpcPort = offline || node.getGrpcEndpoint().getPort() == 0
? null : Long.valueOf(node.getGrpcEndpoint().getPort());
boolean endpointChanged = !offline && grpcHost != null && grpcPort != null
&& (!grpcHost.equals(terminal.getHost()) || !grpcPort.equals(terminal.getPort()));
long now = System.currentTimeMillis();
Long previousPersisted = lastPersistedAt.get(node.getNodeId());
boolean immediate = event.getType() == NodeEventType.NODE_EVENT_TYPE_REGISTERED
|| event.getType() == NodeEventType.NODE_EVENT_TYPE_OFFLINE || endpointChanged;
if (!immediate && previousPersisted != null
&& now - previousPersisted.longValue() < HEARTBEAT_PERSIST_INTERVAL_MS) {
return;
}
terminalConfigService.updateQuicRuntimeState(terminal.getId(), grpcHost, grpcPort,
node.getObservedSourceIp(), node.getSessionId(), node.getBootId(),
node.getSoftwareVersion(), offline ? "0" : "1",
new Date(event.getEventTimeUnixMs() == 0 ? now : event.getEventTimeUnixMs()));
lastPersistedAt.put(node.getNodeId(), now);
if (offline) {
lastPersistedAt.remove(node.getNodeId());
}
if (endpointChanged || offline) {
grpcServiceManager.invalidateTerminal(terminal.getId());
}
log.info("QUIC 终端状态已同步terminalId={}nodeId={}online={}grpc={}:{}",
terminal.getId(), node.getNodeId(), !offline,
grpcHost == null ? terminal.getHost() : grpcHost,
grpcPort == null ? terminal.getPort() : grpcPort);
}
private String resolveGrpcHost(NodeSnapshot node) {
String advertisedHost = emptyToNull(node.getGrpcEndpoint().getHost());
if ("advertised".equalsIgnoreCase(grpcHostSource)) {
return advertisedHost;
}
if (!"observed-source".equalsIgnoreCase(grpcHostSource)
&& grpcHostSourceWarningLogged.compareAndSet(false, true)) {
log.warn("未知的 QUIC gRPC 地址来源配置,按 observed-source 处理value={}", grpcHostSource);
}
String observedHost = emptyToNull(node.getObservedSourceIp());
if (observedHost == null) {
log.warn("QUIC 节点缺少来源 IP回退到节点上报地址nodeId={}advertisedHost={}",
node.getNodeId(), advertisedHost);
return advertisedHost;
}
if (advertisedHost != null && !observedHost.equals(advertisedHost)
&& grpcAddressMismatchNodes.add(node.getNodeId())) {
log.info("QUIC 节点上报的 gRPC 地址与来源 IP 不同,使用来源 IPnodeId={}"
+ "observedHost={}advertisedHost={}",
node.getNodeId(), observedHost, advertisedHost);
} else if (observedHost.equals(advertisedHost)) {
grpcAddressMismatchNodes.remove(node.getNodeId());
}
return observedHost;
}
private void markSynchronizedTerminalsOffline() {
for (Map.Entry<String, String> entry : synchronizedTerminals.entrySet()) {
try {
terminalConfigService.updateQuicRuntimeState(entry.getValue(), null, null,
null, null, null, null, "0", new Date());
grpcServiceManager.invalidateTerminal(entry.getValue());
} catch (RuntimeException error) {
log.error("标记 QUIC 终端离线失败nodeId={}terminalId={}",
entry.getKey(), entry.getValue(), error);
}
}
synchronizedTerminals.clear();
lastPersistedAt.clear();
}
private static String emptyToNull(String value) {
return value == null || value.trim().isEmpty() ? null : value.trim();
}
@PreDestroy
public void stop() {
if (!stopping.compareAndSet(false, true)) {
return;
}
QuicEventBus.Subscription currentSubscription = subscription;
if (currentSubscription != null) {
currentSubscription.close();
}
ExecutorService executor = eventExecutor;
if (executor != null) {
executor.shutdown();
try {
if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException interrupted) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
}
markSynchronizedTerminalsOffline();
}
}

View File

@ -176,7 +176,7 @@ public class AudioService implements RobotAudioStreamListener {
} }
private void handleJoin(WebSocketSession webSocketSession, JsonNode jsonNode) { private void handleJoin(WebSocketSession webSocketSession, JsonNode jsonNode) {
String terminalId = getText(jsonNode, "terminalId"); String robotId = getText(jsonNode, "robotId");
String deviceId = getText(jsonNode, "deviceId"); String deviceId = getText(jsonNode, "deviceId");
String speakerDeviceId = getText(jsonNode, "speakerDeviceId"); String speakerDeviceId = getText(jsonNode, "speakerDeviceId");
String micDeviceId = getText(jsonNode, "micDeviceId"); String micDeviceId = getText(jsonNode, "micDeviceId");
@ -190,8 +190,8 @@ public class AudioService implements RobotAudioStreamListener {
micDeviceId = deviceId; micDeviceId = deviceId;
} }
if (terminalId == null || speakerDeviceId == null || micDeviceId == null) { if (robotId == null || speakerDeviceId == null || micDeviceId == null) {
sendError(webSocketSession, sessionId, "terminalId、speakerDeviceId、micDeviceId不能为空"); sendError(webSocketSession, sessionId, "robotId、speakerDeviceId、micDeviceId不能为空");
return; return;
} }
if (deviceId == null) { if (deviceId == null) {
@ -213,7 +213,7 @@ public class AudioService implements RobotAudioStreamListener {
AudioSession session = new AudioSession(); AudioSession session = new AudioSession();
session.sessionId = sessionId; session.sessionId = sessionId;
session.terminalId = terminalId; session.robotId = robotId;
session.deviceId = deviceId; session.deviceId = deviceId;
session.speakerDeviceId = speakerDeviceId; session.speakerDeviceId = speakerDeviceId;
session.micDeviceId = micDeviceId; session.micDeviceId = micDeviceId;
@ -228,7 +228,7 @@ public class AudioService implements RobotAudioStreamListener {
sessionMap.put(sessionId, session); sessionMap.put(sessionId, session);
webSocketSessionMap.put(webSocketSession.getId(), sessionId); webSocketSessionMap.put(webSocketSession.getId(), sessionId);
try { try {
session.robotStream = robotAudioGrpcAdapter.openStream(terminalId, speakerDeviceId, micDeviceId, sessionId, operatorId, this); session.robotStream = robotAudioGrpcAdapter.openStream(robotId, speakerDeviceId, micDeviceId, sessionId, operatorId, this);
} catch (Exception e) { } catch (Exception e) {
sessionMap.remove(sessionId); sessionMap.remove(sessionId);
webSocketSessionMap.remove(webSocketSession.getId()); webSocketSessionMap.remove(webSocketSession.getId());
@ -236,7 +236,7 @@ public class AudioService implements RobotAudioStreamListener {
throw e; throw e;
} }
sendState(session, "joined"); sendState(session, "joined");
log.info("实时语音会话创建成功sessionId={}terminalId={}speakerDeviceId={}micDeviceId={}", sessionId, terminalId, speakerDeviceId, micDeviceId); log.info("实时语音会话创建成功sessionId={}robotId={}speakerDeviceId={}micDeviceId={}", sessionId, robotId, speakerDeviceId, micDeviceId);
} catch (Exception e) { } catch (Exception e) {
log.error("创建实时语音会话失败sessionId={}", sessionId, e); log.error("创建实时语音会话失败sessionId={}", sessionId, e);
sendError(webSocketSession, sessionId, "创建实时语音会话失败:" + e.getMessage()); sendError(webSocketSession, sessionId, "创建实时语音会话失败:" + e.getMessage());
@ -347,8 +347,8 @@ public class AudioService implements RobotAudioStreamListener {
continue; continue;
} }
if (now - session.lastRobotHeartbeatAt > ROBOT_HEARTBEAT_TIMEOUT_MS) { if (now - session.lastRobotHeartbeatAt > ROBOT_HEARTBEAT_TIMEOUT_MS) {
log.warn("机器人心跳超时sessionId={}terminalId={}speakerDeviceId={}micDeviceId={}", log.warn("机器人心跳超时sessionId={}robotId={}speakerDeviceId={}micDeviceId={}",
session.sessionId, session.terminalId, session.speakerDeviceId, session.micDeviceId); session.sessionId, session.robotId, session.speakerDeviceId, session.micDeviceId);
// 先从业务会话表摘除避免 cancel/close 触发的异步回调再次进入同一个会话并重复关闭 native 对象 // 先从业务会话表摘除避免 cancel/close 触发的异步回调再次进入同一个会话并重复关闭 native 对象
iterator.remove(); iterator.remove();
session.state = AudioSessionState.ROBOT_OFFLINE; session.state = AudioSessionState.ROBOT_OFFLINE;
@ -466,7 +466,7 @@ public class AudioService implements RobotAudioStreamListener {
private void sendState(AudioSession session, String type) { private void sendState(AudioSession session, String type) {
ObjectNode event = baseMessage(type, session.sessionId); ObjectNode event = baseMessage(type, session.sessionId);
event.put("terminalId", session.terminalId); event.put("robotId", session.robotId);
event.put("deviceId", session.deviceId); event.put("deviceId", session.deviceId);
event.put("speakerDeviceId", session.speakerDeviceId); event.put("speakerDeviceId", session.speakerDeviceId);
event.put("micDeviceId", session.micDeviceId); event.put("micDeviceId", session.micDeviceId);
@ -705,7 +705,7 @@ public class AudioService implements RobotAudioStreamListener {
*/ */
private static class AudioSession { private static class AudioSession {
private String sessionId; private String sessionId;
private String terminalId; private String robotId;
private String deviceId; private String deviceId;
private String speakerDeviceId; private String speakerDeviceId;
private String micDeviceId; private String micDeviceId;

View File

@ -33,7 +33,7 @@ public interface EdgeArmService {
/** /**
* 清除机械臂故障状态 * 清除机械臂故障状态
* *
* @param edgeCommonVO 边缘设备通用参数包含 terminalId deviceId * @param edgeCommonVO 边缘设备通用参数包含 robotId deviceId
* @return 机器人终端返回的通用反馈 * @return 机器人终端返回的通用反馈
*/ */
Common.CommandHeader.Feedback clearFault(EdgeCommonVO edgeCommonVO); Common.CommandHeader.Feedback clearFault(EdgeCommonVO edgeCommonVO);

View File

@ -37,6 +37,6 @@ public interface EdgeBioHeadService {
/** /**
* 表情 * 表情
*/ */
public String specialExpression(String terminalId,String deviceId,Integer expressKey); public String specialExpression(String robotId,String deviceId,Integer expressKey);
} }

View File

@ -58,9 +58,9 @@ public interface EdgeCameraService {
StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request> getRGBImageStream(EdgeCommonVO edgeCommonVO); StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request> getRGBImageStream(EdgeCommonVO edgeCommonVO);
StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request> getRGBImageStream(String terminalId, String deviceId); StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request> getRGBImageStream(String robotId, String deviceId);
void writeRGBVideoStream(String terminalId, String deviceId, OutputStream outputStream); void writeRGBVideoStream(String robotId, String deviceId, OutputStream outputStream);
void getDepthImageStream(EdgeCommonVO edgeCommonVO); void getDepthImageStream(EdgeCommonVO edgeCommonVO);
void getRGBDImagesStream(EdgeCommonVO edgeCommonVO); void getRGBDImagesStream(EdgeCommonVO edgeCommonVO);

View File

@ -8,12 +8,12 @@ import io.grpc.stub.StreamObserver;
*/ */
public interface EdgeDexHandService { public interface EdgeDexHandService {
// 基本控制 // 基本控制
DexhandCommand.DexHandState getStatus(String terminalId, String deviceId); DexhandCommand.DexHandState getStatus(String robotId, String deviceId);
void setDexHandPos(String terminalId, String deviceId); void setDexHandPos(String robotId, String deviceId);
void setDexHandAngle(String terminalId, String deviceId, int id, float value) ; void setDexHandAngle(String robotId, String deviceId, int id, float value) ;
void setDexHandForce(String terminalId, String deviceId) ; void setDexHandForce(String robotId, String deviceId) ;
void setDexHandSpeed(String terminalId, String deviceId) ; void setDexHandSpeed(String robotId, String deviceId) ;
void setDexHandPresetAct(String terminalId, String deviceId); void setDexHandPresetAct(String robotId, String deviceId);
String getSensorData(String terminalId, String deviceId) ; String getSensorData(String robotId, String deviceId) ;
StreamObserver<DexhandCommand.GetSensorDataStreamCommand.Request> getSensorDataStream(String terminalId, String deviceId) ; StreamObserver<DexhandCommand.GetSensorDataStreamCommand.Request> getSensorDataStream(String robotId, String deviceId) ;
} }

View File

@ -9,7 +9,7 @@ public interface EdgeHlcService {
/** /**
* 触控 * 触控
*/ */
public String touch(File image, String terminalId, String deviceId, int x, int y, double maxForce); public String touch(File image, String robotId, String deviceId, int x, int y, double maxForce);
/** /**
* 图片标注 * 图片标注

View File

@ -14,75 +14,75 @@ public interface EdgeSpeakerService {
* 获取扬声器当前状态 * 获取扬声器当前状态
* 通过gRPC调用获取扬声器的运行状态包括是否正在播放音量等信息 * 通过gRPC调用获取扬声器的运行状态包括是否正在播放音量等信息
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @return SpeakerState 返回扬声器的当前状态 * @return SpeakerState 返回扬声器的当前状态
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
SpeakerCommand.GetSpeakerStateCommand.Feedback getStatus(String terminalId, String deviceId); SpeakerCommand.GetSpeakerStateCommand.Feedback getStatus(String robotId, String deviceId);
/** /**
* 播放音频文件 * 播放音频文件
* 通过gRPC调用播放指定路径的音频文件 * 通过gRPC调用播放指定路径的音频文件
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @param audioPath 音频文件的路径 * @param audioPath 音频文件的路径
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
String playAudio(String terminalId, String deviceId, String audioPath); String playAudio(String robotId, String deviceId, String audioPath);
/** /**
* 停止当前播放 * 停止当前播放
* 通过gRPC调用停止扬声器的当前播放 * 通过gRPC调用停止扬声器的当前播放
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
void stopPlayback(String terminalId, String deviceId); void stopPlayback(String robotId, String deviceId);
/** /**
* 暂停当前播放 * 暂停当前播放
* 通过gRPC调用暂停扬声器的当前播放 * 通过gRPC调用暂停扬声器的当前播放
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
void pausePlayback(String terminalId, String deviceId); void pausePlayback(String robotId, String deviceId);
/** /**
* 恢复暂停的播放 * 恢复暂停的播放
* 通过gRPC调用恢复扬声器之前暂停的播放 * 通过gRPC调用恢复扬声器之前暂停的播放
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
void resumePlayback(String terminalId, String deviceId); void resumePlayback(String robotId, String deviceId);
/** /**
* 设置扬声器音量 * 设置扬声器音量
* 通过gRPC调用设置扬声器的音量大小 * 通过gRPC调用设置扬声器的音量大小
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @param volume 音量大小0-100 * @param volume 音量大小0-100
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
void setVolume(String terminalId, String deviceId, int volume); void setVolume(String robotId, String deviceId, int volume);
/** /**
* 获取当前音量 * 获取当前音量
* 通过gRPC调用获取扬声器的当前音量大小 * 通过gRPC调用获取扬声器的当前音量大小
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @return int 返回当前音量大小0-100 * @return int 返回当前音量大小0-100
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
int getVolume(String terminalId, String deviceId); int getVolume(String robotId, String deviceId);
/** /**
* 获取所有音频文件 * 获取所有音频文件

View File

@ -12,20 +12,20 @@ import java.util.List;
* 边缘系统服务接口 * 边缘系统服务接口
*/ */
public interface EdgeSystemService { public interface EdgeSystemService {
SystemCommand.GetSystemInfoCommand.Feedback getSystemInfo(String terminalId); SystemCommand.GetSystemInfoCommand.Feedback getSystemInfo(String robotId);
/** /**
* 获取系统状态 * 获取系统状态
* @return 系统状态信息包含CPU使用率内存使用情况磁盘使用情况和设备列表 * @return 系统状态信息包含CPU使用率内存使用情况磁盘使用情况和设备列表
*/ */
SystemCommand.GetSystemStatusCommand.Feedback getSystemStatus(String terminalId); SystemCommand.GetSystemStatusCommand.Feedback getSystemStatus(String robotId);
Common.CommandHeader.Feedback updateParams(EdgeSystemUpdateParamsVO request); Common.CommandHeader.Feedback updateParams(EdgeSystemUpdateParamsVO request);
Common.JsonDeviceCommand.Feedback executeJsonCommand(EdgeSystemJsonCommandVO request); Common.JsonDeviceCommand.Feedback executeJsonCommand(EdgeSystemJsonCommandVO request);
public List<DeDeviceRegistration> deviceList(String terminalId); public List<DeDeviceRegistration> deviceList(String robotId);
public String stopAll(String terminalId); public String stopAll(String robotId);
} }

View File

@ -32,7 +32,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
@Override @Override
public AgvUtils.AgvRuntimeState getRuntimeState(EdgeCommonVO edgeCommonVO) { public AgvUtils.AgvRuntimeState getRuntimeState(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.AgvRuntimeStateCommand.Request request = AgvCommand.AgvRuntimeStateCommand.Request.newBuilder() AgvCommand.AgvRuntimeStateCommand.Request request = AgvCommand.AgvRuntimeStateCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -42,7 +42,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
@Override @Override
public AgvUtils.AgvNavigationStatus getNavigationStatus(EdgeCommonVO edgeCommonVO) { public AgvUtils.AgvNavigationStatus getNavigationStatus(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.AgvNavigationStatusCommand.Request request = AgvCommand.AgvNavigationStatusCommand.Request.newBuilder() AgvCommand.AgvNavigationStatusCommand.Request request = AgvCommand.AgvNavigationStatusCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -52,7 +52,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
@Override @Override
public void emergencyStop(EdgeCommonVO edgeCommonVO) { public void emergencyStop(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()); Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId());
executeGrpcCall(() -> stub.emergencyStop(request)); executeGrpcCall(() -> stub.emergencyStop(request));
} }
@ -60,7 +60,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
@Override @Override
public void clearFault(EdgeCommonVO edgeCommonVO) { public void clearFault(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()); Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId());
executeGrpcCall(() -> stub.clearFault(request)); executeGrpcCall(() -> stub.clearFault(request));
} }
@ -72,7 +72,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
} }
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.AgvNavigateToPoseCommand.Request request = AgvCommand.AgvNavigateToPoseCommand.Request.newBuilder() AgvCommand.AgvNavigateToPoseCommand.Request request = AgvCommand.AgvNavigateToPoseCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.setPose(pose) .setPose(pose)
@ -87,7 +87,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
} }
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.AgvNavigateToStationCommand.Request request = AgvCommand.AgvNavigateToStationCommand.Request.newBuilder() AgvCommand.AgvNavigateToStationCommand.Request request = AgvCommand.AgvNavigateToStationCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.setStationId(stationId) .setStationId(stationId)
@ -102,7 +102,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
} }
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.AgvFollowPathCommand.Request request = AgvCommand.AgvFollowPathCommand.Request.newBuilder() AgvCommand.AgvFollowPathCommand.Request request = AgvCommand.AgvFollowPathCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.addAllPath(pathSegments) .addAllPath(pathSegments)
@ -113,7 +113,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
@Override @Override
public void pauseNavigation(EdgeCommonVO edgeCommonVO) { public void pauseNavigation(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()); Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId());
executeGrpcCall(() -> stub.pauseNavigation(request)); executeGrpcCall(() -> stub.pauseNavigation(request));
} }
@ -121,7 +121,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
@Override @Override
public void resumeNavigation(EdgeCommonVO edgeCommonVO) { public void resumeNavigation(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()); Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId());
executeGrpcCall(() -> stub.resumeNavigation(request)); executeGrpcCall(() -> stub.resumeNavigation(request));
} }
@ -129,7 +129,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
@Override @Override
public void cancelNavigation(EdgeCommonVO edgeCommonVO) { public void cancelNavigation(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()); Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId());
executeGrpcCall(() -> stub.cancelNavigation(request)); executeGrpcCall(() -> stub.cancelNavigation(request));
} }
@ -141,7 +141,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
} }
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.AgvSetVelocityCommand.Request request = AgvCommand.AgvSetVelocityCommand.Request.newBuilder() AgvCommand.AgvSetVelocityCommand.Request request = AgvCommand.AgvSetVelocityCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.setVelocity(velocity) .setVelocity(velocity)
@ -152,7 +152,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
@Override @Override
public void stopVelocityControl(EdgeCommonVO edgeCommonVO) { public void stopVelocityControl(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()); Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId());
executeGrpcCall(() -> stub.stopVelocityControl(request)); executeGrpcCall(() -> stub.stopVelocityControl(request));
} }
@ -160,7 +160,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
@Override @Override
public List<String> listMaps(EdgeCommonVO edgeCommonVO) { public List<String> listMaps(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.AgvListMapsCommand.Request request = AgvCommand.AgvListMapsCommand.Request.newBuilder() AgvCommand.AgvListMapsCommand.Request request = AgvCommand.AgvListMapsCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -170,7 +170,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
@Override @Override
public List<AgvUtils.AgvStation> listStations(EdgeCommonVO edgeCommonVO) { public List<AgvUtils.AgvStation> listStations(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.AgvListStationsCommand.Request request = AgvCommand.AgvListStationsCommand.Request.newBuilder() AgvCommand.AgvListStationsCommand.Request request = AgvCommand.AgvListStationsCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -184,7 +184,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
} }
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.AgvMapCommand.Request request = AgvCommand.AgvMapCommand.Request.newBuilder() AgvCommand.AgvMapCommand.Request request = AgvCommand.AgvMapCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.setMapName(mapName) .setMapName(mapName)
@ -202,7 +202,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
} }
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.AgvMapCommand.Request request = AgvCommand.AgvMapCommand.Request.newBuilder() AgvCommand.AgvMapCommand.Request request = AgvCommand.AgvMapCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.setMapName(mapName) .setMapName(mapName)
@ -218,7 +218,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
} }
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.AgvMapCommand.Request request = AgvCommand.AgvMapCommand.Request.newBuilder() AgvCommand.AgvMapCommand.Request request = AgvCommand.AgvMapCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.setMapName(mapName) .setMapName(mapName)
@ -229,7 +229,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
@Override @Override
public String startMapping(EdgeCommonVO edgeCommonVO, AgvUtils.AgvMapDimension dimension, String mapName, boolean realTime) { public String startMapping(EdgeCommonVO edgeCommonVO, AgvUtils.AgvMapDimension dimension, String mapName, boolean realTime) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.AgvStartMappingCommand.Request.Builder requestBuilder = AgvCommand.AgvStartMappingCommand.Request.newBuilder() AgvCommand.AgvStartMappingCommand.Request.Builder requestBuilder = AgvCommand.AgvStartMappingCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.setDimension(dimension != null ? dimension : AgvUtils.AgvMapDimension.AGV_MAP_DIMENSION_UNSPECIFIED) .setDimension(dimension != null ? dimension : AgvUtils.AgvMapDimension.AGV_MAP_DIMENSION_UNSPECIFIED)
@ -246,7 +246,7 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
@Override @Override
public void stopMapping(EdgeCommonVO edgeCommonVO) { public void stopMapping(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class); edgeCommonVO.getRobotId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()); Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId());
executeGrpcCall(() -> stub.stopMapping(request)); executeGrpcCall(() -> stub.stopMapping(request));
} }

View File

@ -31,7 +31,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
@Override @Override
public Common.CommandHeader.Feedback torqueOff(EdgeCommonVO edgeCommonVO) { public Common.CommandHeader.Feedback torqueOff(EdgeCommonVO edgeCommonVO) {
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()); Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId());
return executeGrpcCall(() -> stub.torqueOff(request)); return executeGrpcCall(() -> stub.torqueOff(request));
} }
@ -39,7 +39,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
@Override @Override
public Common.CommandHeader.Feedback torqueOn(EdgeCommonVO edgeCommonVO) { public Common.CommandHeader.Feedback torqueOn(EdgeCommonVO edgeCommonVO) {
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()); Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId());
return executeGrpcCall(() -> stub.torqueOn(request)); return executeGrpcCall(() -> stub.torqueOn(request));
} }
@ -47,7 +47,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
@Override @Override
public Common.CommandHeader.Feedback clearFault(EdgeCommonVO edgeCommonVO) { public Common.CommandHeader.Feedback clearFault(EdgeCommonVO edgeCommonVO) {
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()); Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId());
return executeGrpcCall(() -> stub.clearFault(request)); return executeGrpcCall(() -> stub.clearFault(request));
} }
@ -61,7 +61,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
} }
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
// 构建关节位置命令 // 构建关节位置命令
ArmCommand.JointPositionCommand targetCommand = ArmCommand.JointPositionCommand.newBuilder() ArmCommand.JointPositionCommand targetCommand = ArmCommand.JointPositionCommand.newBuilder()
@ -104,7 +104,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
double rx, double ry, double rz, String frame, double rx, double ry, double rz, String frame,
Double velocity, Double acceleration, Double blendRadius) { Double velocity, Double acceleration, Double blendRadius) {
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
// 构建笛卡尔位姿 // 构建笛卡尔位姿
ArmCommand.CartesianPose targetPose = ArmCommand.CartesianPose.newBuilder() ArmCommand.CartesianPose targetPose = ArmCommand.CartesianPose.newBuilder()
@ -149,7 +149,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
} }
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
// 构建关节速度命令 // 构建关节速度命令
ArmCommand.JointVelocityCommand velocityCommand = ArmCommand.JointVelocityCommand.newBuilder() ArmCommand.JointVelocityCommand velocityCommand = ArmCommand.JointVelocityCommand.newBuilder()
@ -177,7 +177,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
double wx, double wy, double wz, String frame, double wx, double wy, double wz, String frame,
Double acceleration, Double duration) { Double acceleration, Double duration) {
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
// 构建笛卡尔速度 // 构建笛卡尔速度
ArmCommand.CartesianVelocity velocity = ArmCommand.CartesianVelocity.newBuilder() ArmCommand.CartesianVelocity velocity = ArmCommand.CartesianVelocity.newBuilder()
@ -214,7 +214,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
} }
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
// 构建关节位置命令 // 构建关节位置命令
ArmCommand.JointPositionCommand targetCommand = ArmCommand.JointPositionCommand.newBuilder() ArmCommand.JointPositionCommand targetCommand = ArmCommand.JointPositionCommand.newBuilder()
@ -234,7 +234,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
@Override @Override
public Common.CommandHeader.Feedback stopMotion(EdgeCommonVO edgeCommonVO) { public Common.CommandHeader.Feedback stopMotion(EdgeCommonVO edgeCommonVO) {
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()); Common.CommandHeader.Request request = EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId());
return executeGrpcCall(() -> stub.stopMotion(request)); return executeGrpcCall(() -> stub.stopMotion(request));
} }
@ -242,7 +242,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
@Override @Override
public ArmCommand.JointResponse getJointState(EdgeCommonVO edgeCommonVO) { public ArmCommand.JointResponse getJointState(EdgeCommonVO edgeCommonVO) {
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
ArmCommand.JointRequest request = ArmCommand.JointRequest.newBuilder() ArmCommand.JointRequest request = ArmCommand.JointRequest.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -252,7 +252,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
@Override @Override
public ArmCommand.GetPose.Response getPose(EdgeCommonVO edgeCommonVO, String baseLink, String eeLink) { public ArmCommand.GetPose.Response getPose(EdgeCommonVO edgeCommonVO, String baseLink, String eeLink) {
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
ArmCommand.GetPose.Request.Builder requestBuilder = ArmCommand.GetPose.Request.newBuilder() ArmCommand.GetPose.Request.Builder requestBuilder = ArmCommand.GetPose.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())); .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()));
@ -270,7 +270,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
@Override @Override
public ArmCommand.CalibrateZeroQ.Response calibrateZeroQ(EdgeCommonVO edgeCommonVO, String jointName) { public ArmCommand.CalibrateZeroQ.Response calibrateZeroQ(EdgeCommonVO edgeCommonVO, String jointName) {
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
ArmCommand.CalibrateZeroQ.Request.Builder requestBuilder = ArmCommand.CalibrateZeroQ.Request.newBuilder() ArmCommand.CalibrateZeroQ.Request.Builder requestBuilder = ArmCommand.CalibrateZeroQ.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())); .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()));
@ -285,7 +285,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
@Override @Override
public ArmCommand.GetPoseMatrix.Response getPoseMatrix(EdgeCommonVO edgeCommonVO, String baseLink, String eeLink) { public ArmCommand.GetPoseMatrix.Response getPoseMatrix(EdgeCommonVO edgeCommonVO, String baseLink, String eeLink) {
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
ArmCommand.GetPoseMatrix.Request.Builder requestBuilder = ArmCommand.GetPoseMatrix.Request.newBuilder() ArmCommand.GetPoseMatrix.Request.Builder requestBuilder = ArmCommand.GetPoseMatrix.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())); .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()));
@ -310,7 +310,7 @@ public class EdgeArmServiceImpl implements EdgeArmService {
} }
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); edgeCommonVO.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
// 构建关节位置命令 // 构建关节位置命令
ArmCommand.JointPositionCommand jointsCommand = ArmCommand.JointPositionCommand.newBuilder() ArmCommand.JointPositionCommand jointsCommand = ArmCommand.JointPositionCommand.newBuilder()

View File

@ -23,8 +23,8 @@ public class EdgeArmTeleopServiceImpl implements EdgeArmTeleopService {
@Override @Override
public String open(EdgeArmTeleopOpenVO request) { public String open(EdgeArmTeleopOpenVO request) {
if (request.getTerminalId() == null || request.getTerminalId().trim().isEmpty()) { if (request.getRobotId() == null || request.getRobotId().trim().isEmpty()) {
throw new GlobalException("terminalId cannot be empty"); throw new GlobalException("robotId cannot be empty");
} }
ArmTeleopV1.RobotManifest.Builder manifest = ArmTeleopV1.RobotManifest.newBuilder(); ArmTeleopV1.RobotManifest.Builder manifest = ArmTeleopV1.RobotManifest.newBuilder();
if (request.getRobotId() != null) manifest.setRobotId(request.getRobotId()); if (request.getRobotId() != null) manifest.setRobotId(request.getRobotId());
@ -49,7 +49,7 @@ public class EdgeArmTeleopServiceImpl implements EdgeArmTeleopService {
if (request.getLeaseMs() != null) open.setRequestedLeaseMs(request.getLeaseMs()); if (request.getLeaseMs() != null) open.setRequestedLeaseMs(request.getLeaseMs());
ArmTeleopServiceGrpc.ArmTeleopServiceStub stub = grpcServiceManager.getGrpcClient( ArmTeleopServiceGrpc.ArmTeleopServiceStub stub = grpcServiceManager.getGrpcClient(
request.getTerminalId(), ArmTeleopServiceGrpc.ArmTeleopServiceStub.class); request.getRobotId(), ArmTeleopServiceGrpc.ArmTeleopServiceStub.class);
return sessions.open(stub::teleoperate, ArmTeleopV1.ClientFrame.newBuilder().setOpen(open).build()); return sessions.open(stub::teleoperate, ArmTeleopV1.ClientFrame.newBuilder().setOpen(open).build());
} }

View File

@ -23,9 +23,9 @@ public class EdgeBioHeadServiceImpl implements EdgeBioHeadService {
@Override @Override
public String setExpression(EdgeFacialExpressionVO facialExpressionVo) { public String setExpression(EdgeFacialExpressionVO facialExpressionVo) {
String terminalId = facialExpressionVo.getTerminalId(); String robotId = facialExpressionVo.getRobotId();
String deviceId = facialExpressionVo.getDeviceId(); String deviceId = facialExpressionVo.getDeviceId();
BioHeadServiceGrpc.BioHeadServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, BioHeadServiceGrpc.BioHeadServiceBlockingStub.class); BioHeadServiceGrpc.BioHeadServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, BioHeadServiceGrpc.BioHeadServiceBlockingStub.class);
// 请求头 // 请求头
Common.CommandHeader.Request header = EdgeCommonUtil.buildRequest(deviceId); Common.CommandHeader.Request header = EdgeCommonUtil.buildRequest(deviceId);
@ -110,9 +110,9 @@ public class EdgeBioHeadServiceImpl implements EdgeBioHeadService {
@Override @Override
public String getSystemStatus(EdgeCommonVO edgeCommonVO) { public String getSystemStatus(EdgeCommonVO edgeCommonVO) {
String terminalId = edgeCommonVO.getTerminalId(); String robotId = edgeCommonVO.getRobotId();
String deviceId = edgeCommonVO.getDeviceId(); String deviceId = edgeCommonVO.getDeviceId();
BioHeadServiceGrpc.BioHeadServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, BioHeadServiceGrpc.BioHeadServiceBlockingStub.class); BioHeadServiceGrpc.BioHeadServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, BioHeadServiceGrpc.BioHeadServiceBlockingStub.class);
// 请求头 // 请求头
Common.CommandHeader.Request header = EdgeCommonUtil.buildRequest(deviceId); Common.CommandHeader.Request header = EdgeCommonUtil.buildRequest(deviceId);
@ -126,9 +126,9 @@ public class EdgeBioHeadServiceImpl implements EdgeBioHeadService {
@Override @Override
public String emergencyStop(EdgeCommonVO edgeCommonVO) { public String emergencyStop(EdgeCommonVO edgeCommonVO) {
String terminalId = edgeCommonVO.getTerminalId(); String robotId = edgeCommonVO.getRobotId();
String deviceId = edgeCommonVO.getDeviceId(); String deviceId = edgeCommonVO.getDeviceId();
BioHeadServiceGrpc.BioHeadServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, BioHeadServiceGrpc.BioHeadServiceBlockingStub.class); BioHeadServiceGrpc.BioHeadServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, BioHeadServiceGrpc.BioHeadServiceBlockingStub.class);
// 请求头 // 请求头
Common.CommandHeader.Request header = EdgeCommonUtil.buildRequest(deviceId); Common.CommandHeader.Request header = EdgeCommonUtil.buildRequest(deviceId);
@ -142,9 +142,9 @@ public class EdgeBioHeadServiceImpl implements EdgeBioHeadService {
@Override @Override
public String speakStart(EdgeCommonVO edgeCommonVO) { public String speakStart(EdgeCommonVO edgeCommonVO) {
String terminalId = edgeCommonVO.getTerminalId(); String robotId = edgeCommonVO.getRobotId();
String deviceId = edgeCommonVO.getDeviceId(); String deviceId = edgeCommonVO.getDeviceId();
BioHeadServiceGrpc.BioHeadServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, BioHeadServiceGrpc.BioHeadServiceBlockingStub.class); BioHeadServiceGrpc.BioHeadServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, BioHeadServiceGrpc.BioHeadServiceBlockingStub.class);
// 请求头 // 请求头
Common.CommandHeader.Request header = EdgeCommonUtil.buildRequest(deviceId); Common.CommandHeader.Request header = EdgeCommonUtil.buildRequest(deviceId);
@ -155,9 +155,9 @@ public class EdgeBioHeadServiceImpl implements EdgeBioHeadService {
@Override @Override
public String speakStop(EdgeCommonVO edgeCommonVO) { public String speakStop(EdgeCommonVO edgeCommonVO) {
String terminalId = edgeCommonVO.getTerminalId(); String robotId = edgeCommonVO.getRobotId();
String deviceId = edgeCommonVO.getDeviceId(); String deviceId = edgeCommonVO.getDeviceId();
BioHeadServiceGrpc.BioHeadServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, BioHeadServiceGrpc.BioHeadServiceBlockingStub.class); BioHeadServiceGrpc.BioHeadServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, BioHeadServiceGrpc.BioHeadServiceBlockingStub.class);
// 请求头 // 请求头
Common.CommandHeader.Request header = EdgeCommonUtil.buildRequest(deviceId); Common.CommandHeader.Request header = EdgeCommonUtil.buildRequest(deviceId);
@ -167,8 +167,8 @@ public class EdgeBioHeadServiceImpl implements EdgeBioHeadService {
} }
@Override @Override
public String specialExpression(String terminalId, String deviceId, Integer expressKey) { public String specialExpression(String robotId, String deviceId, Integer expressKey) {
BioHeadServiceGrpc.BioHeadServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, BioHeadServiceGrpc.BioHeadServiceBlockingStub.class); BioHeadServiceGrpc.BioHeadServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, BioHeadServiceGrpc.BioHeadServiceBlockingStub.class);
// 请求头 // 请求头
Common.CommandHeader.Request header = EdgeCommonUtil.buildRequest(deviceId); Common.CommandHeader.Request header = EdgeCommonUtil.buildRequest(deviceId);

View File

@ -71,7 +71,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
@Override @Override
public CameraCommand.CameraState status(EdgeCommonVO edgeCommonVO) { public CameraCommand.CameraState status(EdgeCommonVO edgeCommonVO) {
CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), CameraServiceGrpc.CameraServiceBlockingStub.class); CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), CameraServiceGrpc.CameraServiceBlockingStub.class);
CameraCommand.GetCameraStateCommand.Request request = CameraCommand.GetCameraStateCommand.Request.newBuilder() CameraCommand.GetCameraStateCommand.Request request = CameraCommand.GetCameraStateCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -89,7 +89,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
@Override @Override
public String start(EdgeCommonVO edgeCommonVO) { public String start(EdgeCommonVO edgeCommonVO) {
CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), CameraServiceGrpc.CameraServiceBlockingStub.class); CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), CameraServiceGrpc.CameraServiceBlockingStub.class);
CameraCommand.StartCameraCommand.Request request = CameraCommand.StartCameraCommand.Request.newBuilder() CameraCommand.StartCameraCommand.Request request = CameraCommand.StartCameraCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -99,7 +99,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
@Override @Override
public String stop(EdgeCommonVO edgeCommonVO) { public String stop(EdgeCommonVO edgeCommonVO) {
CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), CameraServiceGrpc.CameraServiceBlockingStub.class); CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), CameraServiceGrpc.CameraServiceBlockingStub.class);
CameraCommand.StopCameraCommand.Request request = CameraCommand.StopCameraCommand.Request.newBuilder() CameraCommand.StopCameraCommand.Request request = CameraCommand.StopCameraCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -113,7 +113,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
if (!checkStatus(edgeCommonVO)) { if (!checkStatus(edgeCommonVO)) {
start(edgeCommonVO); start(edgeCommonVO);
} }
CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), CameraServiceGrpc.CameraServiceBlockingStub.class); CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), CameraServiceGrpc.CameraServiceBlockingStub.class);
CameraCommand.GetRGBImageCommand.Request request = CameraCommand.GetRGBImageCommand.Request.newBuilder() CameraCommand.GetRGBImageCommand.Request request = CameraCommand.GetRGBImageCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -131,7 +131,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
} finally { } finally {
deleteTempFile(filePath); deleteTempFile(filePath);
// todo 暂时不关闭摄像头 // todo 暂时不关闭摄像头
// stop(terminalId, deviceId); // stop(robotId, deviceId);
} }
} }
@ -141,7 +141,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
start(edgeCommonVO); start(edgeCommonVO);
} }
CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient( CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), CameraServiceGrpc.CameraServiceBlockingStub.class); edgeCommonVO.getRobotId(), CameraServiceGrpc.CameraServiceBlockingStub.class);
CameraCommand.GetDepthImageCommand.Request request = CameraCommand.GetDepthImageCommand.Request.newBuilder() CameraCommand.GetDepthImageCommand.Request request = CameraCommand.GetDepthImageCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -165,7 +165,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
if (!checkStatus(edgeCommonVO)) { if (!checkStatus(edgeCommonVO)) {
start(edgeCommonVO); start(edgeCommonVO);
} }
CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), CameraServiceGrpc.CameraServiceBlockingStub.class); CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), CameraServiceGrpc.CameraServiceBlockingStub.class);
String videoPath = StrUtil.format("{}/{}_{}.mp4", "/home/share/assets/video", edgeCommonVO.getDeviceId(), System.currentTimeMillis()); String videoPath = StrUtil.format("{}/{}_{}.mp4", "/home/share/assets/video", edgeCommonVO.getDeviceId(), System.currentTimeMillis());
CameraCommand.StartCameraRecordingCommand.Request request = CameraCommand.StartCameraRecordingCommand.Request.newBuilder() CameraCommand.StartCameraRecordingCommand.Request request = CameraCommand.StartCameraRecordingCommand.Request.newBuilder()
@ -178,7 +178,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
@Override @Override
public String stopRecording(EdgeCommonVO edgeCommonVO) { public String stopRecording(EdgeCommonVO edgeCommonVO) {
CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), CameraServiceGrpc.CameraServiceBlockingStub.class); CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), CameraServiceGrpc.CameraServiceBlockingStub.class);
CameraCommand.StopCameraRecordingCommand.Request request = CameraCommand.StopCameraRecordingCommand.Request.newBuilder() CameraCommand.StopCameraRecordingCommand.Request request = CameraCommand.StopCameraRecordingCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -192,7 +192,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
start(edgeCommonVO); start(edgeCommonVO);
} }
CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), CameraServiceGrpc.CameraServiceBlockingStub.class); CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), CameraServiceGrpc.CameraServiceBlockingStub.class);
CameraCommand.GetRGBDImagesCommand.Request request = CameraCommand.GetRGBDImagesCommand.Request.newBuilder() CameraCommand.GetRGBDImagesCommand.Request request = CameraCommand.GetRGBDImagesCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -221,7 +221,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
// deleteTempFile(filePath); // deleteTempFile(filePath);
// deleteTempFile(deepFilePath); // deleteTempFile(deepFilePath);
// todo 暂时不关闭摄像头 // todo 暂时不关闭摄像头
// stop(terminalId, deviceId); // stop(robotId, deviceId);
} }
// return JSON.toJSONString(result); // return JSON.toJSONString(result);
} }
@ -237,7 +237,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
throw new GlobalException("Invalid PTZ command or action"); throw new GlobalException("Invalid PTZ command or action");
} }
CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient( CameraServiceGrpc.CameraServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
ptzVO.getTerminalId(), CameraServiceGrpc.CameraServiceBlockingStub.class); ptzVO.getRobotId(), CameraServiceGrpc.CameraServiceBlockingStub.class);
CameraCommand.ControlPtzCommand.Request request = CameraCommand.ControlPtzCommand.Request.newBuilder() CameraCommand.ControlPtzCommand.Request request = CameraCommand.ControlPtzCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(ptzVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(ptzVO.getDeviceId()))
.setCommand(command) .setCommand(command)
@ -249,13 +249,13 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
@Override @Override
public StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request> getRGBImageStream(EdgeCommonVO edgeCommonVO) { public StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request> getRGBImageStream(EdgeCommonVO edgeCommonVO) {
return getRGBImageStream(edgeCommonVO.getTerminalId(), edgeCommonVO.getDeviceId()); return getRGBImageStream(edgeCommonVO.getRobotId(), edgeCommonVO.getDeviceId());
} }
@Override @Override
public StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request> getRGBImageStream(String terminalId, String deviceId) { public StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request> getRGBImageStream(String robotId, String deviceId) {
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
edgeCommonVO.setDeviceId(deviceId); edgeCommonVO.setDeviceId(deviceId);
CameraCommand.CameraState cameraState = status(edgeCommonVO); CameraCommand.CameraState cameraState = status(edgeCommonVO);
if (cameraState.getIsError()) { if (cameraState.getIsError()) {
@ -266,8 +266,8 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
cameraState = status(edgeCommonVO); cameraState = status(edgeCommonVO);
} }
int frameRate = cameraState.getFps(); int frameRate = cameraState.getFps();
String channel = "edgeCameraServiceImpl/getRGBImageStream/" + terminalId + "/" + deviceId; String channel = "edgeCameraServiceImpl/getRGBImageStream/" + robotId + "/" + deviceId;
String streamKey = terminalId + deviceId + "edgeCameraServiceImpl" + "getRGBImageStream"; String streamKey = robotId + deviceId + "edgeCameraServiceImpl" + "getRGBImageStream";
AtomicInteger sequence = new AtomicInteger(); AtomicInteger sequence = new AtomicInteger();
AtomicBoolean firstMediaChunk = new AtomicBoolean(true); AtomicBoolean firstMediaChunk = new AtomicBoolean(true);
AtomicReference<StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request>> requestObserverRef = new AtomicReference<>(); AtomicReference<StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request>> requestObserverRef = new AtomicReference<>();
@ -275,18 +275,18 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
H265Fmp4Transcoder transcoder; H265Fmp4Transcoder transcoder;
try { try {
transcoder = new H265Fmp4Transcoder( transcoder = new H265Fmp4Transcoder(
terminalId + "-" + deviceId, robotId + "-" + deviceId,
frameRate, frameRate,
chunk -> { chunk -> {
int currentSequence = sequence.incrementAndGet(); int currentSequence = sequence.incrementAndGet();
if (firstMediaChunk.compareAndSet(true, false)) { if (firstMediaChunk.compareAndSet(true, false)) {
log.info("摄像头流已输出首个fMP4片段, terminalId: {}, deviceId: {}, bytes: {}", log.info("摄像头流已输出首个fMP4片段, robotId: {}, deviceId: {}, bytes: {}",
terminalId, deviceId, chunk.length); robotId, deviceId, chunk.length);
} }
messagePushService.pushH264Fmp4ToChannel(channel, chunk, currentSequence); messagePushService.pushH264Fmp4ToChannel(channel, chunk, currentSequence);
}, },
throwable -> { throwable -> {
log.error("摄像头媒体转码失败, terminalId: {}, deviceId: {}", terminalId, deviceId, throwable); log.error("摄像头媒体转码失败, robotId: {}, deviceId: {}", robotId, deviceId, throwable);
messagePushService.pushToChannel(channel, "500"); messagePushService.pushToChannel(channel, "500");
StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request> observer = requestObserverRef.get(); StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request> observer = requestObserverRef.get();
if (observer != null) { if (observer != null) {
@ -299,7 +299,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
throw new GlobalException("摄像头媒体转码器初始化失败: " + exception.getMessage()); throw new GlobalException("摄像头媒体转码器初始化失败: " + exception.getMessage());
} }
CameraServiceGrpc.CameraServiceStub stub = grpcServiceManager.getGrpcClient(terminalId, CameraServiceGrpc.CameraServiceStub.class); CameraServiceGrpc.CameraServiceStub stub = grpcServiceManager.getGrpcClient(robotId, CameraServiceGrpc.CameraServiceStub.class);
StreamObserver<CameraCommand.GetRGBImageStreamCommand.Feedback> responseObserver = new StreamObserver<CameraCommand.GetRGBImageStreamCommand.Feedback>() { StreamObserver<CameraCommand.GetRGBImageStreamCommand.Feedback> responseObserver = new StreamObserver<CameraCommand.GetRGBImageStreamCommand.Feedback>() {
@Override @Override
public void onNext(CameraCommand.GetRGBImageStreamCommand.Feedback value) { public void onNext(CameraCommand.GetRGBImageStreamCommand.Feedback value) {
@ -307,7 +307,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
CameraCommand.FrameData frame = value.getColorFrame(); CameraCommand.FrameData frame = value.getColorFrame();
transcoder.write(frame.getData().toByteArray(), frame.getIsKeyFrame(), frame.getCodec()); transcoder.write(frame.getData().toByteArray(), frame.getIsKeyFrame(), frame.getCodec());
} catch (IOException exception) { } catch (IOException exception) {
log.error("写入摄像头媒体流失败, terminalId: {}, deviceId: {}", terminalId, deviceId, exception); log.error("写入摄像头媒体流失败, robotId: {}, deviceId: {}", robotId, deviceId, exception);
transcoder.close(); transcoder.close();
messagePushService.pushToChannel(channel, "500"); messagePushService.pushToChannel(channel, "500");
} }
@ -319,7 +319,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
GrpcStreamManager.removeStream(streamKey); GrpcStreamManager.removeStream(streamKey);
Status status = Status.fromThrowable(t); Status status = Status.fromThrowable(t);
if (status.getCode() != Status.Code.CANCELLED) { if (status.getCode() != Status.Code.CANCELLED) {
log.error("摄像头gRPC流异常, terminalId: {}, deviceId: {}", terminalId, deviceId, t); log.error("摄像头gRPC流异常, robotId: {}, deviceId: {}", robotId, deviceId, t);
messagePushService.pushToChannel(channel, "500"); messagePushService.pushToChannel(channel, "500");
} }
} }
@ -328,7 +328,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
public void onCompleted() { public void onCompleted() {
transcoder.close(); transcoder.close();
GrpcStreamManager.removeStream(streamKey); GrpcStreamManager.removeStream(streamKey);
log.info("摄像头gRPC流结束, terminalId: {}, deviceId: {}", terminalId, deviceId); log.info("摄像头gRPC流结束, robotId: {}, deviceId: {}", robotId, deviceId);
} }
}; };
StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request> grpcRequestObserver; StreamObserver<CameraCommand.GetRGBImageStreamCommand.Request> grpcRequestObserver;
@ -368,9 +368,9 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
} }
@Override @Override
public void writeRGBVideoStream(String terminalId, String deviceId, OutputStream outputStream) { public void writeRGBVideoStream(String robotId, String deviceId, OutputStream outputStream) {
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
edgeCommonVO.setDeviceId(deviceId); edgeCommonVO.setDeviceId(deviceId);
CameraCommand.CameraState cameraState = status(edgeCommonVO); CameraCommand.CameraState cameraState = status(edgeCommonVO);
if (cameraState.getIsError()) { if (cameraState.getIsError()) {
@ -394,7 +394,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
H265Fmp4Transcoder transcoder; H265Fmp4Transcoder transcoder;
try { try {
transcoder = new H265Fmp4Transcoder( transcoder = new H265Fmp4Transcoder(
"http-" + terminalId + "-" + deviceId, "http-" + robotId + "-" + deviceId,
cameraState.getFps(), cameraState.getFps(),
chunk -> { chunk -> {
try { try {
@ -406,8 +406,8 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
}, },
throwable -> { throwable -> {
if (!(throwable instanceof CameraStreamWriteException)) { if (!(throwable instanceof CameraStreamWriteException)) {
log.error("HTTP camera media transcoding failed, terminalId: {}, deviceId: {}", log.error("HTTP camera media transcoding failed, robotId: {}, deviceId: {}",
terminalId, deviceId, throwable); robotId, deviceId, throwable);
} }
finishStream.run(); finishStream.run();
} }
@ -418,7 +418,7 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
} }
CameraServiceGrpc.CameraServiceStub stub = grpcServiceManager.getGrpcClient( CameraServiceGrpc.CameraServiceStub stub = grpcServiceManager.getGrpcClient(
terminalId, CameraServiceGrpc.CameraServiceStub.class); robotId, CameraServiceGrpc.CameraServiceStub.class);
StreamObserver<CameraCommand.GetRGBImageStreamCommand.Feedback> responseObserver = StreamObserver<CameraCommand.GetRGBImageStreamCommand.Feedback> responseObserver =
new StreamObserver<CameraCommand.GetRGBImageStreamCommand.Feedback>() { new StreamObserver<CameraCommand.GetRGBImageStreamCommand.Feedback>() {
@Override @Override
@ -427,8 +427,8 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
try { try {
transcoder.write(frame.getData().toByteArray(), frame.getIsKeyFrame(), frame.getCodec()); transcoder.write(frame.getData().toByteArray(), frame.getIsKeyFrame(), frame.getCodec());
} catch (IOException exception) { } catch (IOException exception) {
log.error("Failed to write HTTP camera frame, terminalId: {}, deviceId: {}, codec: {}", log.error("Failed to write HTTP camera frame, robotId: {}, deviceId: {}, codec: {}",
terminalId, deviceId, frame.getCodec(), exception); robotId, deviceId, frame.getCodec(), exception);
finishStream.run(); finishStream.run();
} }
} }
@ -437,8 +437,8 @@ public class EdgeCameraServiceImpl implements EdgeCameraService, EdgeStreamServi
public void onError(Throwable throwable) { public void onError(Throwable throwable) {
Status status = Status.fromThrowable(throwable); Status status = Status.fromThrowable(throwable);
if (status.getCode() != Status.Code.CANCELLED && !streamFinished.get()) { if (status.getCode() != Status.Code.CANCELLED && !streamFinished.get()) {
log.warn("HTTP camera gRPC stream ended, terminalId: {}, deviceId: {}, status: {}", log.warn("HTTP camera gRPC stream ended, robotId: {}, deviceId: {}, status: {}",
terminalId, deviceId, status); robotId, deviceId, status);
} }
finishStream.run(); finishStream.run();
} }

View File

@ -24,8 +24,8 @@ public class EdgeDexHandServiceImpl implements EdgeDexHandService, EdgeStreamSer
private final MessagePushService messagePushService; private final MessagePushService messagePushService;
@Override @Override
public DexhandCommand.DexHandState getStatus(String terminalId, String deviceId) { public DexhandCommand.DexHandState getStatus(String robotId, String deviceId) {
DexHandServiceGrpc.DexHandServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, DexHandServiceGrpc.DexHandServiceBlockingStub.class); DexHandServiceGrpc.DexHandServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, DexHandServiceGrpc.DexHandServiceBlockingStub.class);
DexhandCommand.GetDexHandStateCommand.Request request = DexhandCommand.GetDexHandStateCommand.Request.newBuilder() DexhandCommand.GetDexHandStateCommand.Request request = DexhandCommand.GetDexHandStateCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(deviceId)) .setHeader(EdgeCommonUtil.buildRequest(deviceId))
.build(); .build();
@ -33,13 +33,13 @@ public class EdgeDexHandServiceImpl implements EdgeDexHandService, EdgeStreamSer
} }
@Override @Override
public void setDexHandPos(String terminalId, String deviceId) { public void setDexHandPos(String robotId, String deviceId) {
} }
@Override @Override
public void setDexHandAngle(String terminalId, String deviceId, int id, float value) { public void setDexHandAngle(String robotId, String deviceId, int id, float value) {
DexHandServiceGrpc.DexHandServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, DexHandServiceGrpc.DexHandServiceBlockingStub.class); DexHandServiceGrpc.DexHandServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, DexHandServiceGrpc.DexHandServiceBlockingStub.class);
DexhandCommand.FreedomValue.Builder builder = DexhandCommand.FreedomValue.newBuilder(); DexhandCommand.FreedomValue.Builder builder = DexhandCommand.FreedomValue.newBuilder();
builder.setId(id); builder.setId(id);
builder.setValue(value); builder.setValue(value);
@ -51,23 +51,23 @@ public class EdgeDexHandServiceImpl implements EdgeDexHandService, EdgeStreamSer
} }
@Override @Override
public void setDexHandForce(String terminalId, String deviceId) { public void setDexHandForce(String robotId, String deviceId) {
} }
@Override @Override
public void setDexHandSpeed(String terminalId, String deviceId) { public void setDexHandSpeed(String robotId, String deviceId) {
} }
@Override @Override
public void setDexHandPresetAct(String terminalId, String deviceId) { public void setDexHandPresetAct(String robotId, String deviceId) {
} }
@Override @Override
public String getSensorData(String terminalId, String deviceId) { public String getSensorData(String robotId, String deviceId) {
DexHandServiceGrpc.DexHandServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, DexHandServiceGrpc.DexHandServiceBlockingStub.class); DexHandServiceGrpc.DexHandServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, DexHandServiceGrpc.DexHandServiceBlockingStub.class);
DexhandCommand.GetSensorDataCommand.Request request = DexhandCommand.GetSensorDataCommand.Request.newBuilder() DexhandCommand.GetSensorDataCommand.Request request = DexhandCommand.GetSensorDataCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(deviceId)) .setHeader(EdgeCommonUtil.buildRequest(deviceId))
.build(); .build();
@ -76,14 +76,14 @@ public class EdgeDexHandServiceImpl implements EdgeDexHandService, EdgeStreamSer
} }
@Override @Override
public StreamObserver<DexhandCommand.GetSensorDataStreamCommand.Request> getSensorDataStream(String terminalId, String deviceId) { public StreamObserver<DexhandCommand.GetSensorDataStreamCommand.Request> getSensorDataStream(String robotId, String deviceId) {
DexHandServiceGrpc.DexHandServiceStub stub = grpcServiceManager.getGrpcClient(terminalId, DexHandServiceGrpc.DexHandServiceStub.class); DexHandServiceGrpc.DexHandServiceStub stub = grpcServiceManager.getGrpcClient(robotId, DexHandServiceGrpc.DexHandServiceStub.class);
StreamObserver<DexhandCommand.GetSensorDataStreamCommand.Feedback> responseObserver = new StreamObserver<DexhandCommand.GetSensorDataStreamCommand.Feedback>() { StreamObserver<DexhandCommand.GetSensorDataStreamCommand.Feedback> responseObserver = new StreamObserver<DexhandCommand.GetSensorDataStreamCommand.Feedback>() {
@Override @Override
public void onNext(DexhandCommand.GetSensorDataStreamCommand.Feedback value) { public void onNext(DexhandCommand.GetSensorDataStreamCommand.Feedback value) {
// 例如将传感器数据转换为JSON字符串 // 例如将传感器数据转换为JSON字符串
String playLoad = JSON.toJSONString(value.getSensorList()); String playLoad = JSON.toJSONString(value.getSensorList());
messagePushService.pushToChannel("edgeDexHandServiceImpl/getSensorDataStream/" + terminalId + "/" + deviceId, playLoad); messagePushService.pushToChannel("edgeDexHandServiceImpl/getSensorDataStream/" + robotId + "/" + deviceId, playLoad);
} }
@Override @Override

View File

@ -26,8 +26,8 @@ public class EdgeHlcServiceImpl implements EdgeHlcService {
private final GrpcServiceManager grpcServiceManager; private final GrpcServiceManager grpcServiceManager;
@Override @Override
public String touch(File image, String terminalId, String deviceId, int x, int y, double maxForce) { public String touch(File image, String robotId, String deviceId, int x, int y, double maxForce) {
HlcServiceGrpc.HlcServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, HlcServiceGrpc.HlcServiceBlockingStub.class); HlcServiceGrpc.HlcServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, HlcServiceGrpc.HlcServiceBlockingStub.class);
HlcCommand.Touch.Request request = HlcCommand.Touch.Request.newBuilder() HlcCommand.Touch.Request request = HlcCommand.Touch.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(deviceId)) .setHeader(EdgeCommonUtil.buildRequest(deviceId))
.setU(x) .setU(x)
@ -89,7 +89,7 @@ public class EdgeHlcServiceImpl implements EdgeHlcService {
if (edgeTouchVO.getX() == edgeTouchVO.getY() && edgeTouchVO.getX() == 0) { if (edgeTouchVO.getX() == edgeTouchVO.getY() && edgeTouchVO.getX() == 0) {
throw new GlobalException("触控坐标不能为0"); throw new GlobalException("触控坐标不能为0");
} }
HlcServiceGrpc.HlcServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeTouchVO.getTerminalId(), HlcServiceGrpc.HlcServiceBlockingStub.class); HlcServiceGrpc.HlcServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeTouchVO.getRobotId(), HlcServiceGrpc.HlcServiceBlockingStub.class);
HlcCommand.Touch.Request request = HlcCommand.Touch.Request.newBuilder() HlcCommand.Touch.Request request = HlcCommand.Touch.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeTouchVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeTouchVO.getDeviceId()))
.setU(edgeTouchVO.getX()) .setU(edgeTouchVO.getX())

View File

@ -41,7 +41,7 @@ public class EdgeMicrophoneServiceImpl implements EdgeMicrophoneService {
@Override @Override
public String getStatus(EdgeCommonVO edgeCommonVO) { public String getStatus(EdgeCommonVO edgeCommonVO) {
try { try {
MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class); MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class);
MicrophoneCommand.GetMicStateCommand.Request request = MicrophoneCommand.GetMicStateCommand.Request.newBuilder() MicrophoneCommand.GetMicStateCommand.Request request = MicrophoneCommand.GetMicStateCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId())) .setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build(); .build();
@ -63,7 +63,7 @@ public class EdgeMicrophoneServiceImpl implements EdgeMicrophoneService {
String deviceId = edgeCommonVO.getDeviceId(); String deviceId = edgeCommonVO.getDeviceId();
try { try {
// 获取gRPC客户端存根 // 获取gRPC客户端存根
MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class); MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class);
String filePath = StrUtil.format("{}/{}_{}.wav", "/home/share/assets/video", deviceId, System.currentTimeMillis()); String filePath = StrUtil.format("{}/{}_{}.wav", "/home/share/assets/video", deviceId, System.currentTimeMillis());
// 构建请求消息 // 构建请求消息
@ -89,7 +89,7 @@ public class EdgeMicrophoneServiceImpl implements EdgeMicrophoneService {
public String stopRecord(EdgeCommonVO edgeCommonVO) { public String stopRecord(EdgeCommonVO edgeCommonVO) {
try { try {
// 获取gRPC客户端存根 // 获取gRPC客户端存根
MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class); MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class);
// 构建请求消息 // 构建请求消息
MicrophoneCommand.StopMicRecordingCommand.Request request = MicrophoneCommand.StopMicRecordingCommand.Request.newBuilder() MicrophoneCommand.StopMicRecordingCommand.Request request = MicrophoneCommand.StopMicRecordingCommand.Request.newBuilder()
@ -113,7 +113,7 @@ public class EdgeMicrophoneServiceImpl implements EdgeMicrophoneService {
public void pauseRecord(EdgeCommonVO edgeCommonVO) { public void pauseRecord(EdgeCommonVO edgeCommonVO) {
try { try {
// 获取gRPC客户端存根 // 获取gRPC客户端存根
MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class); MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class);
// 构建请求消息 // 构建请求消息
MicrophoneCommand.PauseMicRecordingCommand.Request request = MicrophoneCommand.PauseMicRecordingCommand.Request.newBuilder() MicrophoneCommand.PauseMicRecordingCommand.Request request = MicrophoneCommand.PauseMicRecordingCommand.Request.newBuilder()
@ -136,7 +136,7 @@ public class EdgeMicrophoneServiceImpl implements EdgeMicrophoneService {
public void resumeRecord(EdgeCommonVO edgeCommonVO) { public void resumeRecord(EdgeCommonVO edgeCommonVO) {
try { try {
// 获取gRPC客户端存根 // 获取gRPC客户端存根
MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class); MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class);
// 构建请求消息 // 构建请求消息
MicrophoneCommand.ResumeMicRecordingCommand.Request request = MicrophoneCommand.ResumeMicRecordingCommand.Request.newBuilder() MicrophoneCommand.ResumeMicRecordingCommand.Request request = MicrophoneCommand.ResumeMicRecordingCommand.Request.newBuilder()
@ -159,7 +159,7 @@ public class EdgeMicrophoneServiceImpl implements EdgeMicrophoneService {
public void setVolume(EdgeMicrophoneVolumeVO edgeMicrophoneVolumeVO) { public void setVolume(EdgeMicrophoneVolumeVO edgeMicrophoneVolumeVO) {
try { try {
// 获取gRPC客户端存根 // 获取gRPC客户端存根
MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeMicrophoneVolumeVO.getTerminalId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class); MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeMicrophoneVolumeVO.getRobotId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class);
// 构建请求消息 // 构建请求消息
MicrophoneCommand.SetMicPhoneVolumeCommand.Request request = MicrophoneCommand.SetMicPhoneVolumeCommand.Request.newBuilder() MicrophoneCommand.SetMicPhoneVolumeCommand.Request request = MicrophoneCommand.SetMicPhoneVolumeCommand.Request.newBuilder()
@ -183,7 +183,7 @@ public class EdgeMicrophoneServiceImpl implements EdgeMicrophoneService {
public int getVolume(EdgeCommonVO edgeCommonVO) { public int getVolume(EdgeCommonVO edgeCommonVO) {
try { try {
// 获取gRPC客户端存根 // 获取gRPC客户端存根
MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getTerminalId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class); MicPhoneServiceGrpc.MicPhoneServiceBlockingStub stub = grpcServiceManager.getGrpcClient(edgeCommonVO.getRobotId(), MicPhoneServiceGrpc.MicPhoneServiceBlockingStub.class);
// 构建请求消息 // 构建请求消息
MicrophoneCommand.GetMicPhoneVolumeCommand.Request request = MicrophoneCommand.GetMicPhoneVolumeCommand.Request.newBuilder() MicrophoneCommand.GetMicPhoneVolumeCommand.Request request = MicrophoneCommand.GetMicPhoneVolumeCommand.Request.newBuilder()

View File

@ -31,7 +31,7 @@ public class EdgeMotorServiceImpl implements EdgeMotorService {
@Override @Override
public MotorCommand.MotorCommandResponse setZero(EdgeMotorTargetVO request) { public MotorCommand.MotorCommandResponse setZero(EdgeMotorTargetVO request) {
return blockingStub(request.getTerminalId()).setZero(MotorCommand.SetMotorZeroRequest.newBuilder() return blockingStub(request.getRobotId()).setZero(MotorCommand.SetMotorZeroRequest.newBuilder()
.setTarget(buildTarget(request)).build()); .setTarget(buildTarget(request)).build());
} }
@ -41,7 +41,7 @@ public class EdgeMotorServiceImpl implements EdgeMotorService {
.setTarget(buildTarget(request)).setWait(buildWait(request)); .setTarget(buildTarget(request)).setWait(buildWait(request));
if (request.getMaxVelocityRadS() != null) builder.setMaxVelocityRadS(request.getMaxVelocityRadS()); if (request.getMaxVelocityRadS() != null) builder.setMaxVelocityRadS(request.getMaxVelocityRadS());
if (request.getAccelerationRadS2() != null) builder.setAccelerationRadS2(request.getAccelerationRadS2()); if (request.getAccelerationRadS2() != null) builder.setAccelerationRadS2(request.getAccelerationRadS2());
return blockingStub(request.getTerminalId()).moveToZero(builder.build()); return blockingStub(request.getRobotId()).moveToZero(builder.build());
} }
@Override @Override
@ -55,7 +55,7 @@ public class EdgeMotorServiceImpl implements EdgeMotorService {
.setWait(buildWait(request)); .setWait(buildWait(request));
if (request.getMaxVelocityRadS() != null) builder.setMaxVelocityRadS(request.getMaxVelocityRadS()); if (request.getMaxVelocityRadS() != null) builder.setMaxVelocityRadS(request.getMaxVelocityRadS());
if (request.getAccelerationRadS2() != null) builder.setAccelerationRadS2(request.getAccelerationRadS2()); if (request.getAccelerationRadS2() != null) builder.setAccelerationRadS2(request.getAccelerationRadS2());
return blockingStub(request.getTerminalId()).profilePosition(builder.build()); return blockingStub(request.getRobotId()).profilePosition(builder.build());
} }
@Override @Override
@ -68,30 +68,30 @@ public class EdgeMotorServiceImpl implements EdgeMotorService {
.setTargetVelocityRadS(request.getTargetVelocityRadS()) .setTargetVelocityRadS(request.getTargetVelocityRadS())
.setWait(buildWait(request)); .setWait(buildWait(request));
if (request.getAccelerationRadS2() != null) builder.setAccelerationRadS2(request.getAccelerationRadS2()); if (request.getAccelerationRadS2() != null) builder.setAccelerationRadS2(request.getAccelerationRadS2());
return blockingStub(request.getTerminalId()).profileVelocity(builder.build()); return blockingStub(request.getRobotId()).profileVelocity(builder.build());
} }
@Override @Override
public MotorCommand.MotorCommandResponse emergencyStop(EdgeMotorTargetVO request) { public MotorCommand.MotorCommandResponse emergencyStop(EdgeMotorTargetVO request) {
return blockingStub(request.getTerminalId()).emergencyStop(MotorCommand.EmergencyStopRequest.newBuilder() return blockingStub(request.getRobotId()).emergencyStop(MotorCommand.EmergencyStopRequest.newBuilder()
.setTarget(buildTarget(request)).build()); .setTarget(buildTarget(request)).build());
} }
@Override @Override
public MotorCommand.GetMotorStatusResponse getStatus(EdgeMotorTargetVO request) { public MotorCommand.GetMotorStatusResponse getStatus(EdgeMotorTargetVO request) {
return blockingStub(request.getTerminalId()).getStatus(MotorCommand.GetMotorStatusRequest.newBuilder() return blockingStub(request.getRobotId()).getStatus(MotorCommand.GetMotorStatusRequest.newBuilder()
.setTarget(buildTarget(request)).build()); .setTarget(buildTarget(request)).build());
} }
@Override @Override
public MotorCommand.MotorCommandResponse setEnabled(EdgeMotorEnabledVO request) { public MotorCommand.MotorCommandResponse setEnabled(EdgeMotorEnabledVO request) {
return blockingStub(request.getTerminalId()).setEnabled(MotorCommand.SetMotorEnabledRequest.newBuilder() return blockingStub(request.getRobotId()).setEnabled(MotorCommand.SetMotorEnabledRequest.newBuilder()
.setTarget(buildTarget(request)).setEnabled(request.isEnabled()).build()); .setTarget(buildTarget(request)).setEnabled(request.isEnabled()).build());
} }
@Override @Override
public String openCyclicPosition(EdgeMotorCyclicOpenVO request) { public String openCyclicPosition(EdgeMotorCyclicOpenVO request) {
MotorServiceGrpc.MotorServiceStub stub = asyncStub(request.getTerminalId()); MotorServiceGrpc.MotorServiceStub stub = asyncStub(request.getRobotId());
MotorCommand.CyclicPositionRequest open = MotorCommand.CyclicPositionRequest.newBuilder() MotorCommand.CyclicPositionRequest open = MotorCommand.CyclicPositionRequest.newBuilder()
.setOpen(buildOpen(request)).build(); .setOpen(buildOpen(request)).build();
String sessionId = positionStreams.open(stub::streamCyclicPosition, open); String sessionId = positionStreams.open(stub::streamCyclicPosition, open);
@ -115,7 +115,7 @@ public class EdgeMotorServiceImpl implements EdgeMotorService {
@Override @Override
public String openCyclicVelocity(EdgeMotorCyclicOpenVO request) { public String openCyclicVelocity(EdgeMotorCyclicOpenVO request) {
MotorServiceGrpc.MotorServiceStub stub = asyncStub(request.getTerminalId()); MotorServiceGrpc.MotorServiceStub stub = asyncStub(request.getRobotId());
MotorCommand.CyclicVelocityRequest open = MotorCommand.CyclicVelocityRequest.newBuilder() MotorCommand.CyclicVelocityRequest open = MotorCommand.CyclicVelocityRequest.newBuilder()
.setOpen(buildOpen(request)).build(); .setOpen(buildOpen(request)).build();
String sessionId = velocityStreams.open(stub::streamCyclicVelocity, open); String sessionId = velocityStreams.open(stub::streamCyclicVelocity, open);
@ -179,11 +179,11 @@ public class EdgeMotorServiceImpl implements EdgeMotorService {
return builder.build(); return builder.build();
} }
private MotorServiceGrpc.MotorServiceBlockingStub blockingStub(String terminalId) { private MotorServiceGrpc.MotorServiceBlockingStub blockingStub(String robotId) {
return grpcServiceManager.getGrpcClient(terminalId, MotorServiceGrpc.MotorServiceBlockingStub.class); return grpcServiceManager.getGrpcClient(robotId, MotorServiceGrpc.MotorServiceBlockingStub.class);
} }
private MotorServiceGrpc.MotorServiceStub asyncStub(String terminalId) { private MotorServiceGrpc.MotorServiceStub asyncStub(String robotId) {
return grpcServiceManager.getGrpcClient(terminalId, MotorServiceGrpc.MotorServiceStub.class); return grpcServiceManager.getGrpcClient(robotId, MotorServiceGrpc.MotorServiceStub.class);
} }
} }

View File

@ -40,15 +40,15 @@ public class EdgeSpeakerServiceImpl implements EdgeSpeakerService {
* 获取扬声器当前状态 * 获取扬声器当前状态
* 通过gRPC调用获取扬声器的运行状态包括是否正在播放音量等信息 * 通过gRPC调用获取扬声器的运行状态包括是否正在播放音量等信息
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @return SpeakerState 返回扬声器的当前状态 * @return SpeakerState 返回扬声器的当前状态
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
@Override @Override
public SpeakerCommand.GetSpeakerStateCommand.Feedback getStatus(String terminalId, String deviceId) { public SpeakerCommand.GetSpeakerStateCommand.Feedback getStatus(String robotId, String deviceId) {
try { try {
SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class); SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class);
SpeakerCommand.GetSpeakerStateCommand.Request request = SpeakerCommand.GetSpeakerStateCommand.Request.newBuilder() SpeakerCommand.GetSpeakerStateCommand.Request request = SpeakerCommand.GetSpeakerStateCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(deviceId)) .setHeader(EdgeCommonUtil.buildRequest(deviceId))
.build(); .build();
@ -64,16 +64,16 @@ public class EdgeSpeakerServiceImpl implements EdgeSpeakerService {
* 播放音频文件 * 播放音频文件
* 通过gRPC调用播放指定路径的音频文件 * 通过gRPC调用播放指定路径的音频文件
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @param audioPath 音频文件的路径 * @param audioPath 音频文件的路径
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
@Override @Override
public String playAudio(String terminalId, String deviceId, String audioPath) { public String playAudio(String robotId, String deviceId, String audioPath) {
try { try {
// 获取gRPC客户端存根 // 获取gRPC客户端存根
SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class); SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class);
// 构建请求消息 // 构建请求消息
SpeakerCommand.PlayAudioCommand.Request request = SpeakerCommand.PlayAudioCommand.Request.newBuilder() SpeakerCommand.PlayAudioCommand.Request request = SpeakerCommand.PlayAudioCommand.Request.newBuilder()
@ -97,15 +97,15 @@ public class EdgeSpeakerServiceImpl implements EdgeSpeakerService {
* 停止当前播放 * 停止当前播放
* 通过gRPC调用停止扬声器的当前播放 * 通过gRPC调用停止扬声器的当前播放
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
@Override @Override
public void stopPlayback(String terminalId, String deviceId) { public void stopPlayback(String robotId, String deviceId) {
try { try {
// 获取gRPC客户端存根 // 获取gRPC客户端存根
SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class); SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class);
// 构建请求消息 // 构建请求消息
SpeakerCommand.StopSpeakerCommand.Request request = SpeakerCommand.StopSpeakerCommand.Request.newBuilder() SpeakerCommand.StopSpeakerCommand.Request request = SpeakerCommand.StopSpeakerCommand.Request.newBuilder()
@ -124,15 +124,15 @@ public class EdgeSpeakerServiceImpl implements EdgeSpeakerService {
* 暂停当前播放 * 暂停当前播放
* 通过gRPC调用暂停扬声器的当前播放 * 通过gRPC调用暂停扬声器的当前播放
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
@Override @Override
public void pausePlayback(String terminalId, String deviceId) { public void pausePlayback(String robotId, String deviceId) {
try { try {
// 获取gRPC客户端存根 // 获取gRPC客户端存根
SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class); SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class);
// 构建请求消息 // 构建请求消息
SpeakerCommand.PauseSpeakerCommand.Request request = SpeakerCommand.PauseSpeakerCommand.Request.newBuilder() SpeakerCommand.PauseSpeakerCommand.Request request = SpeakerCommand.PauseSpeakerCommand.Request.newBuilder()
@ -151,15 +151,15 @@ public class EdgeSpeakerServiceImpl implements EdgeSpeakerService {
* 恢复暂停的播放 * 恢复暂停的播放
* 通过gRPC调用恢复扬声器之前暂停的播放 * 通过gRPC调用恢复扬声器之前暂停的播放
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
@Override @Override
public void resumePlayback(String terminalId, String deviceId) { public void resumePlayback(String robotId, String deviceId) {
try { try {
// 获取gRPC客户端存根 // 获取gRPC客户端存根
SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class); SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class);
// 构建请求消息 // 构建请求消息
SpeakerCommand.ResumeSpeakerCommand.Request request = SpeakerCommand.ResumeSpeakerCommand.Request.newBuilder() SpeakerCommand.ResumeSpeakerCommand.Request request = SpeakerCommand.ResumeSpeakerCommand.Request.newBuilder()
@ -178,16 +178,16 @@ public class EdgeSpeakerServiceImpl implements EdgeSpeakerService {
* 设置扬声器音量 * 设置扬声器音量
* 通过gRPC调用设置扬声器的音量大小 * 通过gRPC调用设置扬声器的音量大小
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @param volume 音量大小0-100 * @param volume 音量大小0-100
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
@Override @Override
public void setVolume(String terminalId, String deviceId, int volume) { public void setVolume(String robotId, String deviceId, int volume) {
try { try {
// 获取gRPC客户端存根 // 获取gRPC客户端存根
SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class); SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class);
// 构建请求消息 // 构建请求消息
SpeakerCommand.SetSpeakerVolumeCommand.Request request = SpeakerCommand.SetSpeakerVolumeCommand.Request.newBuilder() SpeakerCommand.SetSpeakerVolumeCommand.Request request = SpeakerCommand.SetSpeakerVolumeCommand.Request.newBuilder()
@ -207,16 +207,16 @@ public class EdgeSpeakerServiceImpl implements EdgeSpeakerService {
* 获取当前音量 * 获取当前音量
* 通过gRPC调用获取扬声器的当前音量大小 * 通过gRPC调用获取扬声器的当前音量大小
* *
* @param terminalId 终端设备ID * @param robotId 机器人永久唯一ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @return int 返回当前音量大小0-100 * @return int 返回当前音量大小0-100
* @throws RuntimeException 当gRPC调用失败时抛出异常 * @throws RuntimeException 当gRPC调用失败时抛出异常
*/ */
@Override @Override
public int getVolume(String terminalId, String deviceId) { public int getVolume(String robotId, String deviceId) {
try { try {
// 获取gRPC客户端存根 // 获取gRPC客户端存根
SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(terminalId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class); SpeakerServiceGrpc.SpeakerServiceBlockingStub stub = grpcServiceManager.getGrpcClient(robotId, SpeakerServiceGrpc.SpeakerServiceBlockingStub.class);
// 构建请求消息 // 构建请求消息
SpeakerCommand.GetSpeakerVolumeCommand.Request request = SpeakerCommand.GetSpeakerVolumeCommand.Request.newBuilder() SpeakerCommand.GetSpeakerVolumeCommand.Request request = SpeakerCommand.GetSpeakerVolumeCommand.Request.newBuilder()

View File

@ -37,9 +37,9 @@ public class EdgeSystemServiceImpl implements EdgeSystemService {
private final GrpcServiceManager grpcServiceManager; private final GrpcServiceManager grpcServiceManager;
@Override @Override
public SystemCommand.GetSystemInfoCommand.Feedback getSystemInfo(String terminalId) { public SystemCommand.GetSystemInfoCommand.Feedback getSystemInfo(String robotId) {
SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient( SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
terminalId, SystemServiceGrpc.SystemServiceBlockingStub.class); robotId, SystemServiceGrpc.SystemServiceBlockingStub.class);
return stub.getSystemInfo(SystemCommand.GetSystemInfoCommand.Request.newBuilder().build()); return stub.getSystemInfo(SystemCommand.GetSystemInfoCommand.Request.newBuilder().build());
} }
@ -54,7 +54,7 @@ public class EdgeSystemServiceImpl implements EdgeSystemService {
} }
} }
SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient( SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
request.getTerminalId(), SystemServiceGrpc.SystemServiceBlockingStub.class); request.getRobotId(), SystemServiceGrpc.SystemServiceBlockingStub.class);
return stub.updateParams(requestBuilder.build()).getHeader(); return stub.updateParams(requestBuilder.build()).getHeader();
} }
@ -65,7 +65,7 @@ public class EdgeSystemServiceImpl implements EdgeSystemService {
.setRequestJson(request.getRequestJson() == null ? "" : request.getRequestJson()) .setRequestJson(request.getRequestJson() == null ? "" : request.getRequestJson())
.build(); .build();
ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient( ArmServiceGrpc.ArmServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
request.getTerminalId(), ArmServiceGrpc.ArmServiceBlockingStub.class); request.getRobotId(), ArmServiceGrpc.ArmServiceBlockingStub.class);
return stub.executeJsonCommand(grpcRequest); return stub.executeJsonCommand(grpcRequest);
} }
@ -107,10 +107,10 @@ public class EdgeSystemServiceImpl implements EdgeSystemService {
@Override @Override
public List<DeDeviceRegistration> deviceList(String terminalId) { public List<DeDeviceRegistration> deviceList(String robotId) {
try { try {
SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient( SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
terminalId, SystemServiceGrpc.SystemServiceBlockingStub.class); robotId, SystemServiceGrpc.SystemServiceBlockingStub.class);
SystemCommand.GetDeviceListCommand.Feedback response = stub.getDeviceList( SystemCommand.GetDeviceListCommand.Feedback response = stub.getDeviceList(
SystemCommand.GetDeviceListCommand.Request.newBuilder().build()); SystemCommand.GetDeviceListCommand.Request.newBuilder().build());
@ -120,7 +120,7 @@ public class EdgeSystemServiceImpl implements EdgeSystemService {
DeDeviceRegistration registration = new DeDeviceRegistration(); DeDeviceRegistration registration = new DeDeviceRegistration();
registration.setDeviceCode(device.getDeviceId()); registration.setDeviceCode(device.getDeviceId());
registration.setDeviceModel(toDeviceModel(device)); registration.setDeviceModel(toDeviceModel(device));
registration.setIdDeDeviceTerminalConfig(terminalId); registration.setIdDeDeviceTerminalConfig(robotId);
devices.add(registration); devices.add(registration);
} }
@ -173,9 +173,9 @@ public class EdgeSystemServiceImpl implements EdgeSystemService {
} }
@Override @Override
public String stopAll(String terminalId) { public String stopAll(String robotId) {
SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient( SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
terminalId, robotId,
SystemServiceGrpc.SystemServiceBlockingStub.class); SystemServiceGrpc.SystemServiceBlockingStub.class);
SystemCommand.StopAllCommand.Request build = SystemCommand.StopAllCommand.Request.newBuilder() SystemCommand.StopAllCommand.Request build = SystemCommand.StopAllCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest("")) .setHeader(EdgeCommonUtil.buildRequest(""))
@ -192,11 +192,11 @@ public class EdgeSystemServiceImpl implements EdgeSystemService {
* @return 系统状态信息如果获取失败则返回null * @return 系统状态信息如果获取失败则返回null
*/ */
@Override @Override
public SystemCommand.GetSystemStatusCommand.Feedback getSystemStatus(String terminalId) { public SystemCommand.GetSystemStatusCommand.Feedback getSystemStatus(String robotId) {
try { try {
// 创建gRPC阻塞式存根用于调用服务端方法 // 创建gRPC阻塞式存根用于调用服务端方法
SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient( SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
terminalId, robotId,
SystemServiceGrpc.SystemServiceBlockingStub.class); SystemServiceGrpc.SystemServiceBlockingStub.class);
// 构建请求对象由于是获取系统状态请求参数为空 // 构建请求对象由于是获取系统状态请求参数为空

View File

@ -39,7 +39,7 @@ public class GrpcClientServiceImpl implements GrpcClientService {
} }
@Override @Override
public void send(boolean isStart, String terminalId, String deviceId, String service, String method) { public void send(boolean isStart, String robotId, String deviceId, String service, String method) {
try { try {
// Map 中获取服务实例 // Map 中获取服务实例
EdgeStreamService serviceInstance = serviceMap.get(service); EdgeStreamService serviceInstance = serviceMap.get(service);
@ -48,8 +48,8 @@ public class GrpcClientServiceImpl implements GrpcClientService {
} }
// 构造流键 // 构造流键
String key = terminalId + deviceId + service + method; String key = robotId + deviceId + service + method;
String channel = service + "/" + method + "/" + terminalId + "/" + deviceId; String channel = service + "/" + method + "/" + robotId + "/" + deviceId;
Object streamLock = streamLocks.computeIfAbsent(key, ignored -> new Object()); Object streamLock = streamLocks.computeIfAbsent(key, ignored -> new Object());
synchronized (streamLock) { synchronized (streamLock) {
@ -58,7 +58,7 @@ public class GrpcClientServiceImpl implements GrpcClientService {
return; return;
} }
Method streamMethod = serviceInstance.getClass().getMethod(method, String.class, String.class); Method streamMethod = serviceInstance.getClass().getMethod(method, String.class, String.class);
StreamObserver<?> streamObserver = (StreamObserver<?>) streamMethod.invoke(serviceInstance, terminalId, deviceId); StreamObserver<?> streamObserver = (StreamObserver<?>) streamMethod.invoke(serviceInstance, robotId, deviceId);
if (streamObserver != null) { if (streamObserver != null) {
GrpcStreamManager.addStream(key, streamObserver); GrpcStreamManager.addStream(key, streamObserver);
} }

View File

@ -0,0 +1,5 @@
package com.cmvr.common.robot;
/** Resolved gRPC endpoint for a permanently identified robot. */
public record RobotEndpoint(String host, int port) {
}

View File

@ -0,0 +1,6 @@
package com.cmvr.common.robot;
public interface RobotEndpointResolver {
RobotEndpoint resolve(String robotId);
}

View File

@ -29,9 +29,9 @@ public class DeRobotConfig extends BaseEntity
@TableId(value = "id" , type = IdType.ASSIGN_UUID) @TableId(value = "id" , type = IdType.ASSIGN_UUID)
private String id; private String id;
/** 配置ID32位的UUID可以是设备ID或终端ID。 */ /** 配置ID32位的UUID可以是设备ID或机器人ID。 */
@Excel(name = "配置ID32位的UUID可以是设备ID或终端ID。") @Excel(name = "配置ID32位的UUID可以是设备ID或机器人ID。")
@ApiModelProperty("配置ID32位的UUID可以是设备ID或终端ID。") @ApiModelProperty("配置ID32位的UUID可以是设备ID或机器人ID。")
private String configId; private String configId;
/** 配置类型,区分是设备还是终端 */ /** 配置类型,区分是设备还是终端 */

View File

@ -1,7 +1,8 @@
package com.cmvr.device.service; package com.cmvr.device.service;
import com.cmvr.common.exception.GlobalException; import com.cmvr.common.exception.GlobalException;
import com.cmvr.device.domain.DeDeviceTerminalConfig; import com.cmvr.common.robot.RobotEndpoint;
import com.cmvr.common.robot.RobotEndpointResolver;
import lombok.Data; import lombok.Data;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -38,23 +39,23 @@ public class InspectionAlertListenService
SUPPORTED_EVENT_TYPES = Collections.unmodifiableSet(values); SUPPORTED_EVENT_TYPES = Collections.unmodifiableSet(values);
} }
private final IDeDeviceTerminalConfigService terminalConfigService; private final RobotEndpointResolver robotEndpointResolver;
/** key=grpcIpvalue=当前IP下的工作流监听订阅。 */ /** key=grpcIpvalue=当前IP下的工作流监听订阅。 */
private final ConcurrentMap<String, ConcurrentMap<String, ListenSubscription>> subscriptions = private final ConcurrentMap<String, ConcurrentMap<String, ListenSubscription>> subscriptions =
new ConcurrentHashMap<>(); new ConcurrentHashMap<>();
/** 兼容原有调用方式,创建一个不绑定工作流的监听。 */ /** 兼容原有调用方式,创建一个不绑定工作流的监听。 */
public ListenState startListen(String terminalId, Collection<String> eventTypes) public ListenState startListen(String robotId, Collection<String> eventTypes)
{ {
return startListen(terminalId, eventTypes, null, null, null, null, null); return startListen(robotId, eventTypes, null, null, null, null, null);
} }
public ListenState startListen(String terminalId, Collection<String> eventTypes, public ListenState startListen(String robotId, Collection<String> eventTypes,
String flowInstanceId, String taskId, String itemId, String flowInstanceId, String taskId, String itemId,
String nodeId, String listenerKey) String nodeId, String listenerKey)
{ {
String grpcIp = resolveTerminalIp(terminalId); String grpcIp = resolveRobotIp(robotId);
Set<String> normalizedTypes = normalizeEventTypes(eventTypes, true); Set<String> normalizedTypes = normalizeEventTypes(eventTypes, true);
ConcurrentMap<String, ListenSubscription> target = ConcurrentMap<String, ListenSubscription> target =
subscriptions.computeIfAbsent(grpcIp, key -> new ConcurrentHashMap<>()); subscriptions.computeIfAbsent(grpcIp, key -> new ConcurrentHashMap<>());
@ -63,7 +64,7 @@ public class InspectionAlertListenService
{ {
ListenSubscription subscription = new ListenSubscription(); ListenSubscription subscription = new ListenSubscription();
subscription.setSubscriptionId(buildSubscriptionId(flowInstanceId, itemId, listenerKey, eventType)); subscription.setSubscriptionId(buildSubscriptionId(flowInstanceId, itemId, listenerKey, eventType));
subscription.setTerminalId(terminalId); subscription.setRobotId(robotId);
subscription.setGrpcIp(grpcIp); subscription.setGrpcIp(grpcIp);
subscription.setEventType(eventType); subscription.setEventType(eventType);
subscription.setFlowInstanceId(flowInstanceId); subscription.setFlowInstanceId(flowInstanceId);
@ -75,28 +76,28 @@ public class InspectionAlertListenService
target.put(subscription.getSubscriptionId(), subscription); target.put(subscription.getSubscriptionId(), subscription);
} }
log.info("开始监听巡检报警,terminalId={}grpcIp={}flowInstanceId={}itemId={}eventTypes={}", log.info("开始监听巡检报警,robotId={}grpcIp={}flowInstanceId={}itemId={}eventTypes={}",
terminalId, grpcIp, flowInstanceId, itemId, normalizedTypes); robotId, grpcIp, flowInstanceId, itemId, normalizedTypes);
return new ListenState(terminalId, grpcIp, currentTypes(target)); return new ListenState(robotId, grpcIp, currentTypes(target));
} }
/** 兼容原有调用方式移除该IP下指定类型的全部监听。 */ /** 兼容原有调用方式移除该IP下指定类型的全部监听。 */
public ListenState stopListen(String terminalId, Collection<String> eventTypes) public ListenState stopListen(String robotId, Collection<String> eventTypes)
{ {
return stopListen(terminalId, eventTypes, null, null, null); return stopListen(robotId, eventTypes, null, null, null);
} }
public ListenState stopListen(String terminalId, Collection<String> eventTypes, public ListenState stopListen(String robotId, Collection<String> eventTypes,
String flowInstanceId, String itemId, String listenerKey) String flowInstanceId, String itemId, String listenerKey)
{ {
String grpcIp = resolveTerminalIp(terminalId); String grpcIp = resolveRobotIp(robotId);
Set<String> normalizedTypes = normalizeEventTypes(eventTypes, true); Set<String> normalizedTypes = normalizeEventTypes(eventTypes, true);
ConcurrentMap<String, ListenSubscription> current = subscriptions.get(grpcIp); ConcurrentMap<String, ListenSubscription> current = subscriptions.get(grpcIp);
if (current == null || current.isEmpty()) if (current == null || current.isEmpty())
{ {
log.warn("结束监听巡检报警时未找到IP监听状态terminalId={}grpcIp={}eventTypes={}", log.warn("结束监听巡检报警时未找到IP监听状态robotId={}grpcIp={}eventTypes={}",
terminalId, grpcIp, normalizedTypes); robotId, grpcIp, normalizedTypes);
return new ListenState(terminalId, grpcIp, Collections.emptyList()); return new ListenState(robotId, grpcIp, Collections.emptyList());
} }
for (String eventType : normalizedTypes) for (String eventType : normalizedTypes)
@ -104,8 +105,8 @@ public class InspectionAlertListenService
int removed = removeMatching(current, eventType, flowInstanceId, itemId, listenerKey); int removed = removeMatching(current, eventType, flowInstanceId, itemId, listenerKey);
if (removed == 0) if (removed == 0)
{ {
log.warn("结束监听巡检报警时未找到匹配订阅,terminalId={}grpcIp={}flowInstanceId={}itemId={}eventType={}", log.warn("结束监听巡检报警时未找到匹配订阅,robotId={}grpcIp={}flowInstanceId={}itemId={}eventType={}",
terminalId, grpcIp, flowInstanceId, itemId, eventType); robotId, grpcIp, flowInstanceId, itemId, eventType);
} }
} }
if (current.isEmpty()) if (current.isEmpty())
@ -114,9 +115,9 @@ public class InspectionAlertListenService
} }
List<String> remainingTypes = currentTypes(current); List<String> remainingTypes = currentTypes(current);
log.info("结束监听巡检报警,terminalId={}grpcIp={}flowInstanceId={}itemId={}remainingTypes={}", log.info("结束监听巡检报警,robotId={}grpcIp={}flowInstanceId={}itemId={}remainingTypes={}",
terminalId, grpcIp, flowInstanceId, itemId, remainingTypes); robotId, grpcIp, flowInstanceId, itemId, remainingTypes);
return new ListenState(terminalId, grpcIp, remainingTypes); return new ListenState(robotId, grpcIp, remainingTypes);
} }
/** 返回命中IP和任一标签的全部活动订阅。 */ /** 返回命中IP和任一标签的全部活动订阅。 */
@ -187,10 +188,10 @@ public class InspectionAlertListenService
} }
} }
public ListenState getListenState(String terminalId) public ListenState getListenState(String robotId)
{ {
String grpcIp = resolveTerminalIp(terminalId); String grpcIp = resolveRobotIp(robotId);
return new ListenState(terminalId, grpcIp, currentTypes(subscriptions.get(grpcIp))); return new ListenState(robotId, grpcIp, currentTypes(subscriptions.get(grpcIp)));
} }
private int removeMatching(ConcurrentMap<String, ListenSubscription> current, String eventType, private int removeMatching(ConcurrentMap<String, ListenSubscription> current, String eventType,
@ -221,23 +222,18 @@ public class InspectionAlertListenService
return flow + "|" + item + "|" + key + "|" + eventType; return flow + "|" + item + "|" + key + "|" + eventType;
} }
private String resolveTerminalIp(String terminalId) private String resolveRobotIp(String robotId)
{ {
String normalizedTerminalId = StringUtils.trimToNull(terminalId); String normalizedRobotId = StringUtils.trimToNull(robotId);
if (normalizedTerminalId == null) if (normalizedRobotId == null)
{ {
throw new GlobalException("terminalId不能为空"); throw new GlobalException("机器人ID不能为空");
} }
DeDeviceTerminalConfig terminalConfig = RobotEndpoint endpoint = robotEndpointResolver.resolve(normalizedRobotId);
terminalConfigService.selectDeDeviceTerminalConfigById(normalizedTerminalId); String grpcIp = StringUtils.trimToNull(endpoint.host());
if (terminalConfig == null)
{
throw new GlobalException("未找到终端配置terminalId=" + normalizedTerminalId);
}
String grpcIp = StringUtils.trimToNull(terminalConfig.getHost());
if (grpcIp == null) if (grpcIp == null)
{ {
throw new GlobalException("终端配置host不能为空terminalId=" + normalizedTerminalId); throw new GlobalException("机器人连接地址不能为空robotId=" + normalizedRobotId);
} }
return grpcIp; return grpcIp;
} }
@ -298,7 +294,7 @@ public class InspectionAlertListenService
@Data @Data
public static class ListenState public static class ListenState
{ {
private final String terminalId; private final String robotId;
private final String grpcIp; private final String grpcIp;
private final List<String> eventTypes; private final List<String> eventTypes;
} }
@ -308,9 +304,9 @@ public class InspectionAlertListenService
{ {
/** flowInstanceId、itemId、listenerKey、eventType组成的订阅唯一标识。 */ /** flowInstanceId、itemId、listenerKey、eventType组成的订阅唯一标识。 */
private String subscriptionId; private String subscriptionId;
/** 工作流节点配置的终端ID。 */ /** 工作流节点配置的机器人永久唯一 ID。 */
private String terminalId; private String robotId;
/** 由终端配置解析出的gRPC IP也是PPE事件匹配IP。 */ /** 由机器人在线信息解析出的 gRPC IP也是 PPE 事件匹配 IP。 */
private String grpcIp; private String grpcIp;
/** 当前订阅监听的PPE事件类型。 */ /** 当前订阅监听的PPE事件类型。 */
private String eventType; private String eventType;
@ -331,7 +327,7 @@ public class InspectionAlertListenService
{ {
ListenSubscription copy = new ListenSubscription(); ListenSubscription copy = new ListenSubscription();
copy.subscriptionId = subscriptionId; copy.subscriptionId = subscriptionId;
copy.terminalId = terminalId; copy.robotId = robotId;
copy.grpcIp = grpcIp; copy.grpcIp = grpcIp;
copy.eventType = eventType; copy.eventType = eventType;
copy.flowInstanceId = flowInstanceId; copy.flowInstanceId = flowInstanceId;

View File

@ -21,13 +21,13 @@ public abstract class BaseChannelSubscribeHandler implements WSMessageHandler<WS
/** /**
* 是否需要GRPC远程调用 * 是否需要GRPC远程调用
* true=格式 service/method/terminalId/deviceId 走grpc * true=格式 service/method/robotId/deviceId 走grpc
* false=普通频道只本地订阅不调用grpc * false=普通频道只本地订阅不调用grpc
*/ */
protected abstract boolean isNeedGrpc(String channel); protected abstract boolean isNeedGrpc(String channel);
/** /**
* 解析grpc四个参数 [service,method,terminalId,deviceId] * 解析grpc四个参数 [service,method,robotId,deviceId]
* 只有isNeedGrpc=true才会进入执行 * 只有isNeedGrpc=true才会进入执行
*/ */
protected abstract String[] parseGrpcParam(String channel); protected abstract String[] parseGrpcParam(String channel);
@ -70,11 +70,11 @@ public abstract class BaseChannelSubscribeHandler implements WSMessageHandler<WS
String[] params = parseGrpcParam(channel); String[] params = parseGrpcParam(channel);
String service = params[0]; String service = params[0];
String method = params[1]; String method = params[1];
String terminalId = params[2]; String robotId = params[2];
String deviceId = params[3]; String deviceId = params[3];
CompletableFuture.runAsync(() -> { CompletableFuture.runAsync(() -> {
try { try {
grpcClientService.send(true, terminalId, deviceId, service, method); grpcClientService.send(true, robotId, deviceId, service, method);
} catch (Exception e) { } catch (Exception e) {
log.error("频道{} grpc订阅异常", channel, e); log.error("频道{} grpc订阅异常", channel, e);
} }
@ -92,11 +92,11 @@ public abstract class BaseChannelSubscribeHandler implements WSMessageHandler<WS
String[] params = parseGrpcParam(channel); String[] params = parseGrpcParam(channel);
String service = params[0]; String service = params[0];
String method = params[1]; String method = params[1];
String terminalId = params[2]; String robotId = params[2];
String deviceId = params[3]; String deviceId = params[3];
CompletableFuture.runAsync(() -> { CompletableFuture.runAsync(() -> {
try { try {
grpcClientService.send(false, terminalId, deviceId, service, method); grpcClientService.send(false, robotId, deviceId, service, method);
} catch (Exception e) { } catch (Exception e) {
log.error("频道{} grpc取消订阅异常", channel, e); log.error("频道{} grpc取消订阅异常", channel, e);
} finally { } finally {

View File

@ -7,9 +7,9 @@ public interface GrpcClientService {
/** /**
* 发送 gRPC 请求 * 发送 gRPC 请求
* @param isStart 是否开始 * @param isStart 是否开始
* @param terminalId 终端ID * @param robotId 机器人永久唯一 ID
* @param deviceId 设备ID * @param deviceId 设备ID
* @param method 方法 * @param method 方法
*/ */
void send(boolean isStart, String terminalId, String deviceId, String service,String method); void send(boolean isStart, String robotId, String deviceId, String service,String method);
} }

View File

@ -11,6 +11,8 @@ import lombok.NoArgsConstructor;
import com.cmvr.common.annotation.Excel; import com.cmvr.common.annotation.Excel;
import com.cmvr.common.core.domain.BaseEntity; import com.cmvr.common.core.domain.BaseEntity;
import java.util.Date;
/** /**
* 巡检机器人对象 inspection_robot * 巡检机器人对象 inspection_robot
* *
@ -31,6 +33,11 @@ public class InspectionRobot extends BaseEntity
@TableId(value = "id", type = IdType.ASSIGN_UUID) @TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id; private String id;
/** Permanent robot identity reported by QUIC. */
@Excel(name = "机器人ID")
@ApiModelProperty("机器人永久唯一ID")
private String robotId;
/** 机器人编码 */ /** 机器人编码 */
@Excel(name = "机器人编码") @Excel(name = "机器人编码")
@ApiModelProperty("机器人编码") @ApiModelProperty("机器人编码")
@ -81,9 +88,29 @@ public class InspectionRobot extends BaseEntity
@ApiModelProperty("当前位置") @ApiModelProperty("当前位置")
private String currentPosition; private String currentPosition;
/** 终端id */ /** QUIC runtime state, independent from the robot business status. */
@Excel(name = "终端id") @ApiModelProperty("连接状态0离线1在线")
@ApiModelProperty("终端id") private String connectStatus;
private String terminalId;
@ApiModelProperty("当前QUIC节点ID")
private String quicNodeId;
@ApiModelProperty("当前QUIC会话ID")
private String quicSessionId;
@ApiModelProperty("边缘端启动ID")
private String quicBootId;
@ApiModelProperty("QUIC连接来源IP")
private String observedIp;
@ApiModelProperty("边缘端软件版本")
private String softwareVersion;
@ApiModelProperty("最后心跳时间")
private Date lastHeartbeatTime;
@ApiModelProperty("归档状态0正常1归档")
private String archivedStatus;
} }

View File

@ -0,0 +1,41 @@
package com.cmvr.inspection.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.cmvr.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel("机器人设备")
public class InspectionRobotDevice extends BaseEntity {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
@ApiModelProperty("机器人永久唯一ID")
private String robotId;
@ApiModelProperty("边缘端设备ID")
private String deviceId;
private String deviceName;
private Integer deviceKind;
private String typeName;
private String enabled;
private Integer managerState;
private Integer healthStatus;
private String onlineStatus;
private String hasError;
private String errorMessage;
private Date statusUpdatedTime;
private Date lastSeenTime;
private Date offlineTime;
}

View File

@ -9,6 +9,8 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.Date;
/** /**
* 巡检机器人视图对象包含关联信息 * 巡检机器人视图对象包含关联信息
* *
@ -28,6 +30,10 @@ public class InspectionRobotVo extends BaseEntity
@ApiModelProperty("id") @ApiModelProperty("id")
private String id; private String id;
@Excel(name = "机器人ID")
@ApiModelProperty("机器人永久唯一ID")
private String robotId;
/** 机器人编码 */ /** 机器人编码 */
@Excel(name = "机器人编码") @Excel(name = "机器人编码")
@ApiModelProperty("机器人编码") @ApiModelProperty("机器人编码")
@ -98,9 +104,34 @@ public class InspectionRobotVo extends BaseEntity
@ApiModelProperty("修改人昵称") @ApiModelProperty("修改人昵称")
private String updateByName; private String updateByName;
/** 终端id */ @ApiModelProperty("连接状态0离线1在线")
@Excel(name = "终端id") private String connectStatus;
@ApiModelProperty("终端id")
private String terminalId; @ApiModelProperty("当前QUIC节点ID")
private String quicNodeId;
@ApiModelProperty("当前QUIC会话ID")
private String quicSessionId;
@ApiModelProperty("边缘端启动ID")
private String quicBootId;
@ApiModelProperty("QUIC连接来源IP")
private String observedIp;
@ApiModelProperty("边缘端软件版本")
private String softwareVersion;
@ApiModelProperty("最后心跳时间")
private Date lastHeartbeatTime;
@ApiModelProperty("设备总数")
private Integer deviceTotal;
@ApiModelProperty("在线设备数")
private Integer onlineDeviceCount;
@ApiModelProperty("故障设备数")
private Integer faultDeviceCount;
} }

View File

@ -0,0 +1,29 @@
package com.cmvr.inspection.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cmvr.inspection.domain.InspectionRobotDevice;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
public interface InspectionRobotDeviceMapper extends BaseMapper<InspectionRobotDevice> {
List<InspectionRobotDevice> selectByRobotId(@Param("robotId") String robotId);
List<InspectionRobotDevice> selectByRobotIdAndKind(@Param("robotId") String robotId,
@Param("deviceKind") Integer deviceKind,
@Param("onlineOnly") boolean onlineOnly);
List<InspectionRobotDevice> selectByIdentity(@Param("robotId") String robotId,
@Param("deviceId") String deviceId);
int updateRuntimeState(InspectionRobotDevice device);
int markMissingOffline(@Param("robotId") String robotId,
@Param("deviceIds") List<String> deviceIds,
@Param("offlineTime") Date offlineTime);
int markAllOffline(@Param("robotId") String robotId,
@Param("offlineTime") Date offlineTime);
}

View File

@ -1,9 +1,11 @@
package com.cmvr.inspection.mapper; package com.cmvr.inspection.mapper;
import java.util.List; import java.util.List;
import java.util.Date;
import com.cmvr.inspection.domain.InspectionRobot; import com.cmvr.inspection.domain.InspectionRobot;
import com.cmvr.inspection.domain.vo.InspectionRobotVo; import com.cmvr.inspection.domain.vo.InspectionRobotVo;
import com.github.yulichang.base.MPJBaseMapper; import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Param;
/** /**
* 巡检机器人Mapper接口 * 巡检机器人Mapper接口
@ -21,6 +23,12 @@ public interface InspectionRobotMapper extends MPJBaseMapper<InspectionRobot>
*/ */
InspectionRobot selectInspectionRobotById(String id); InspectionRobot selectInspectionRobotById(String id);
List<InspectionRobot> selectByRobotId(String robotId);
int updateQuicRuntimeState(InspectionRobot robot);
int archiveInspectionRobotByIds(@Param("ids") String[] ids, @Param("updateBy") String updateBy);
/** /**
* 新增巡检机器人 * 新增巡检机器人
* *

View File

@ -6,6 +6,7 @@ import java.util.List;
import cmvr.msgs.AgvUtils; import cmvr.msgs.AgvUtils;
import com.baomidou.mybatisplus.spring.service.IService; import com.baomidou.mybatisplus.spring.service.IService;
import com.cmvr.inspection.domain.InspectionRobot; import com.cmvr.inspection.domain.InspectionRobot;
import com.cmvr.inspection.domain.InspectionRobotDevice;
import com.cmvr.inspection.domain.vo.InspectionRobotVo; import com.cmvr.inspection.domain.vo.InspectionRobotVo;
/** /**
@ -56,6 +57,11 @@ public interface IInspectionRobotService extends IService<InspectionRobot>
*/ */
int deleteInspectionRobotByIds(String[] ids); int deleteInspectionRobotByIds(String[] ids);
List<InspectionRobotDevice> selectRobotDevices(String id);
List<InspectionRobotDevice> selectRobotDevicesByRobotId(String robotId, Integer deviceKind,
boolean onlineOnly);
/** /**
* 获取机器人地图列表从AGV获取 * 获取机器人地图列表从AGV获取
* *

View File

@ -0,0 +1,45 @@
package com.cmvr.inspection.service;
import com.cmvr.common.exception.GlobalException;
import com.cmvr.common.robot.RobotEndpoint;
import com.cmvr.common.robot.RobotEndpointResolver;
import com.cmvr.inspection.domain.InspectionRobot;
import com.cmvr.inspection.mapper.InspectionRobotMapper;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class InspectionRobotEndpointResolver implements RobotEndpointResolver {
private final InspectionRobotMapper robotMapper;
@Override
public RobotEndpoint resolve(String robotId) {
String normalized = StringUtils.trimToNull(robotId);
if (normalized == null) {
throw new GlobalException("机器人ID不能为空");
}
List<InspectionRobot> robots = robotMapper.selectByRobotId(normalized);
if (robots.isEmpty()) {
throw new GlobalException("机器人不存在:" + normalized);
}
if (robots.size() > 1) {
throw new GlobalException("机器人ID存在重复数据" + normalized);
}
InspectionRobot robot = robots.get(0);
if ("1".equals(robot.getArchivedStatus())) {
throw new GlobalException("机器人已归档:" + normalized);
}
if (!"1".equals(robot.getConnectStatus())) {
throw new GlobalException("机器人当前离线:" + normalized);
}
if (StringUtils.isBlank(robot.getIpAddress()) || robot.getPort() == null) {
throw new GlobalException("机器人尚未上报gRPC地址" + normalized);
}
return new RobotEndpoint(robot.getIpAddress(), robot.getPort().intValue());
}
}

View File

@ -0,0 +1,21 @@
package com.cmvr.inspection.service;
import com.cmvr.test.flow.runtime.engine.RobotExecutionTarget;
import com.cmvr.test.flow.runtime.engine.RobotExecutionTargetResolver;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class InspectionRobotExecutionTargetResolver implements RobotExecutionTargetResolver {
private final InspectionRobotEndpointResolver endpointResolver;
@Override
public RobotExecutionTarget resolve(String robotId) {
String normalized = StringUtils.trimToNull(robotId);
endpointResolver.resolve(normalized);
return new RobotExecutionTarget(normalized);
}
}

View File

@ -0,0 +1,80 @@
package com.cmvr.inspection.service;
import com.cmvr.quic.contract.QuicEventBus;
import com.cmvr.quic.gateway.v1.NodeEvent;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;
@Service
@RequiredArgsConstructor
public class RobotQuicEventSubscriber {
private static final Logger log = LoggerFactory.getLogger(RobotQuicEventSubscriber.class);
private final QuicEventBus eventBus;
private final RobotQuicStateService stateService;
@Value("${cmvr.quic.enabled:false}")
private boolean enabled;
private ExecutorService executor;
private QuicEventBus.Subscription subscription;
@PostConstruct
public void start() {
if (!enabled) {
return;
}
executor = Executors.newSingleThreadExecutor(runnable -> {
Thread thread = new Thread(runnable, "quic-robot-sync");
thread.setDaemon(true);
return thread;
});
subscription = eventBus.watchNodes(true, this::enqueue);
log.info("已启动QUIC机器人身份和设备同步");
}
private void enqueue(NodeEvent event) {
try {
executor.execute(() -> {
try {
stateService.synchronize(event);
} catch (RuntimeException error) {
log.error("同步QUIC机器人失败robotId={}nodeId={}eventType={}",
event.getNode().getRobotId(), event.getNode().getNodeId(),
event.getType(), error);
}
});
} catch (RejectedExecutionException ignored) {
log.debug("QUIC机器人同步线程已停止");
}
}
@PreDestroy
public void stop() {
if (subscription != null) {
subscription.close();
}
if (executor != null) {
executor.shutdown();
try {
if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException error) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
}
}
}

View File

@ -0,0 +1,173 @@
package com.cmvr.inspection.service;
import com.cmvr.common.utils.DateUtils;
import com.cmvr.edge.client.manage.GrpcServiceManager;
import com.cmvr.inspection.domain.InspectionRobot;
import com.cmvr.inspection.domain.InspectionRobotDevice;
import com.cmvr.inspection.mapper.InspectionRobotDeviceMapper;
import com.cmvr.inspection.mapper.InspectionRobotMapper;
import com.cmvr.quic.gateway.v1.ManagedDeviceStatus;
import com.cmvr.quic.gateway.v1.NodeEvent;
import com.cmvr.quic.gateway.v1.NodeEventType;
import com.cmvr.quic.gateway.v1.NodeSnapshot;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@Service
@RequiredArgsConstructor
public class RobotQuicStateService {
private static final Logger log = LoggerFactory.getLogger(RobotQuicStateService.class);
private final InspectionRobotMapper robotMapper;
private final InspectionRobotDeviceMapper deviceMapper;
private final GrpcServiceManager grpcServiceManager;
@Value("${cmvr.quic.grpc-host-source:observed-source}")
private String grpcHostSource;
@Transactional(rollbackFor = Exception.class)
public void synchronize(NodeEvent event) {
NodeSnapshot node = event.getNode();
String robotId = StringUtils.trimToNull(node.getRobotId());
if (robotId == null) {
log.warn("忽略未携带机器人ID的QUIC事件nodeId={}eventType={}",
node.getNodeId(), event.getType());
return;
}
List<InspectionRobot> matches = robotMapper.selectByRobotId(robotId);
if (matches.isEmpty()) {
log.warn("QUIC机器人尚未在平台登记robotId={}nodeId={}", robotId, node.getNodeId());
return;
}
if (matches.size() != 1) {
log.error("机器人ID存在{}条重复记录拒绝同步robotId={}", matches.size(), robotId);
return;
}
InspectionRobot robot = matches.get(0);
if ("1".equals(robot.getArchivedStatus())) {
log.warn("已归档机器人尝试连接拒绝同步robotId={}", robotId);
return;
}
boolean offline = event.getType() == NodeEventType.NODE_EVENT_TYPE_OFFLINE || !node.getOnline();
if (offline && StringUtils.isNotBlank(robot.getQuicSessionId())
&& !robot.getQuicSessionId().equals(node.getSessionId())) {
log.info("忽略旧QUIC会话的离线事件robotId={}activeSession={}eventSession={}",
robotId, robot.getQuicSessionId(), node.getSessionId());
return;
}
Date eventTime = new Date(event.getEventTimeUnixMs() == 0
? System.currentTimeMillis() : event.getEventTimeUnixMs());
String oldHost = robot.getIpAddress();
Long oldPort = robot.getPort();
if (!offline) {
String host = resolveGrpcHost(node);
Long port = node.getGrpcEndpoint().getPort() == 0
? null : Long.valueOf(node.getGrpcEndpoint().getPort());
robot.setIpAddress(host);
robot.setPort(port);
}
robot.setConnectStatus(offline ? "0" : "1");
robot.setQuicNodeId(node.getNodeId());
robot.setQuicSessionId(node.getSessionId());
robot.setQuicBootId(node.getBootId());
robot.setObservedIp(node.getObservedSourceIp());
robot.setSoftwareVersion(node.getSoftwareVersion());
robot.setLastHeartbeatTime(eventTime);
robot.setUpdateTime(DateUtils.getNowDate());
robotMapper.updateQuicRuntimeState(robot);
if (offline) {
deviceMapper.markAllOffline(robotId, eventTime);
} else {
synchronizeDevices(robotId, node, eventTime);
}
if (offline || !Objects.equals(oldHost, robot.getIpAddress())
|| !Objects.equals(oldPort, robot.getPort())) {
grpcServiceManager.invalidateRobot(robotId);
}
if (event.getType() == NodeEventType.NODE_EVENT_TYPE_HEARTBEAT) {
log.debug("QUIC机器人心跳已同步robotId={}nodeId={}grpc={}:{}devices={}",
robotId, node.getNodeId(), robot.getIpAddress(), robot.getPort(),
node.getDeviceManager().getDevicesCount());
} else {
log.info("QUIC机器人状态已同步robotId={}nodeId={}online={}grpc={}:{}devices={}",
robotId, node.getNodeId(), !offline, robot.getIpAddress(), robot.getPort(),
node.getDeviceManager().getDevicesCount());
}
}
private void synchronizeDevices(String robotId, NodeSnapshot node, Date eventTime) {
List<String> reportedIds = new ArrayList<>();
for (ManagedDeviceStatus status : node.getDeviceManager().getDevicesList()) {
String deviceId = StringUtils.trimToNull(status.getDeviceId());
if (deviceId == null) {
continue;
}
reportedIds.add(deviceId);
List<InspectionRobotDevice> matches = deviceMapper.selectByIdentity(robotId, deviceId);
if (matches.size() > 1) {
log.error("机器人设备存在重复记录跳过更新robotId={}deviceId={}count={}",
robotId, deviceId, matches.size());
continue;
}
InspectionRobotDevice device = matches.isEmpty()
? createDevice(robotId, deviceId, eventTime) : matches.get(0);
device.setDeviceKind(status.getKind());
device.setTypeName(status.getTypeName());
device.setEnabled(status.getEnabled() ? "1" : "0");
device.setManagerState(status.getManagerState());
device.setHealthStatus(status.getHealth());
device.setOnlineStatus("1");
device.setHasError(status.getHasError() ? "1" : "0");
device.setErrorMessage(status.getErrorMessage());
device.setStatusUpdatedTime(status.getStatusUpdatedAtUnixMs() == 0
? null : new Date(status.getStatusUpdatedAtUnixMs()));
device.setLastSeenTime(eventTime);
device.setOfflineTime(null);
device.setUpdateBy("quic");
device.setUpdateTime(eventTime);
if (matches.isEmpty()) {
deviceMapper.insert(device);
} else {
deviceMapper.updateRuntimeState(device);
}
}
deviceMapper.markMissingOffline(robotId, reportedIds, eventTime);
}
private InspectionRobotDevice createDevice(String robotId, String deviceId, Date now) {
InspectionRobotDevice device = new InspectionRobotDevice();
device.setRobotId(robotId);
device.setDeviceId(deviceId);
device.setDeviceName(deviceId);
device.setCreateBy("quic");
device.setCreateTime(now);
return device;
}
private String resolveGrpcHost(NodeSnapshot node) {
String advertised = StringUtils.trimToNull(node.getGrpcEndpoint().getHost());
String observed = StringUtils.trimToNull(node.getObservedSourceIp());
if ("advertised".equalsIgnoreCase(grpcHostSource)) {
return advertised != null ? advertised : observed;
}
return observed != null ? observed : advertised;
}
}

View File

@ -1,20 +1,19 @@
package com.cmvr.inspection.service.impl; package com.cmvr.inspection.service.impl;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import cmvr.msgs.AgvUtils; import cmvr.msgs.AgvUtils;
import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl; import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
import com.cmvr.common.utils.SecurityUtils; import com.cmvr.common.utils.SecurityUtils;
import com.cmvr.device.domain.DeDeviceTerminalConfig;
import com.cmvr.device.service.IDeDeviceTerminalConfigService;
import com.cmvr.edge.client.model.EdgeCommonVO; import com.cmvr.edge.client.model.EdgeCommonVO;
import com.cmvr.edge.client.service.EdgeAgvService; import com.cmvr.edge.client.service.EdgeAgvService;
import com.cmvr.inspection.domain.InspectionMap; import com.cmvr.inspection.domain.InspectionMap;
import com.cmvr.inspection.domain.InspectionRobotDevice;
import com.cmvr.inspection.domain.vo.InspectionRobotVo; import com.cmvr.inspection.domain.vo.InspectionRobotVo;
import com.cmvr.inspection.mapper.InspectionMapMapper; import com.cmvr.inspection.mapper.InspectionMapMapper;
import com.cmvr.inspection.mapper.InspectionRobotDeviceMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.cmvr.common.utils.DateUtils; import com.cmvr.common.utils.DateUtils;
@ -43,7 +42,7 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
private EdgeAgvService edgeAgvService; private EdgeAgvService edgeAgvService;
@Autowired @Autowired
private IDeDeviceTerminalConfigService deDeviceTerminalConfigService; private InspectionRobotDeviceMapper inspectionRobotDeviceMapper;
/** /**
* 查询巡检机器人 * 查询巡检机器人
@ -76,17 +75,20 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
* @return 结果 * @return 结果
*/ */
@Override @Override
public int insertInspectionRobot(InspectionRobot inspectionRobot) public synchronized int insertInspectionRobot(InspectionRobot inspectionRobot)
{ {
DeDeviceTerminalConfig deDeviceTerminalConfig = new DeDeviceTerminalConfig(); String robotId = normalizeRobotId(inspectionRobot.getRobotId());
deDeviceTerminalConfig.setName(inspectionRobot.getRobotName()); if (StrUtil.isBlank(robotId)) {
deDeviceTerminalConfig.setDescription("机器人终端"); throw new GlobalException("机器人ID不能为空");
deDeviceTerminalConfig.setStatus("1"); }
deDeviceTerminalConfig.setHost(inspectionRobot.getIpAddress()); if (!inspectionRobotMapper.selectByRobotId(robotId).isEmpty()) {
deDeviceTerminalConfig.setPort(inspectionRobot.getPort()); throw new GlobalException("机器人ID已存在" + robotId);
// 自动创建设备管理模块的终端并将终端id保存机器人中 }
deDeviceTerminalConfigService.insertDeDeviceTerminalConfig(deDeviceTerminalConfig); inspectionRobot.setRobotId(robotId);
inspectionRobot.setTerminalId(deDeviceTerminalConfig.getId()); inspectionRobot.setIpAddress(null);
inspectionRobot.setPort(null);
inspectionRobot.setConnectStatus("0");
inspectionRobot.setArchivedStatus("0");
// 生成UUID作为主键 // 生成UUID作为主键
if (inspectionRobot.getId() == null || inspectionRobot.getId().isEmpty()) { if (inspectionRobot.getId() == null || inspectionRobot.getId().isEmpty()) {
inspectionRobot.setId(UUID.randomUUID().toString().replace("-", "")); inspectionRobot.setId(UUID.randomUUID().toString().replace("-", ""));
@ -105,13 +107,18 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
@Override @Override
public int updateInspectionRobot(InspectionRobot inspectionRobot) public int updateInspectionRobot(InspectionRobot inspectionRobot)
{ {
InspectionRobot existing = inspectionRobotMapper.selectInspectionRobotById(inspectionRobot.getId());
if (existing == null) {
throw new GlobalException("机器人不存在");
}
if (!java.util.Objects.equals(existing.getRobotId(), normalizeRobotId(inspectionRobot.getRobotId()))) {
throw new GlobalException("机器人ID是永久身份标识不允许修改");
}
inspectionRobot.setRobotId(null);
inspectionRobot.setIpAddress(null);
inspectionRobot.setPort(null);
inspectionRobot.setUpdateTime(DateUtils.getNowDate()); inspectionRobot.setUpdateTime(DateUtils.getNowDate());
inspectionRobot.setUpdateBy(SecurityUtils.getUsername()); inspectionRobot.setUpdateBy(SecurityUtils.getUsername());
DeDeviceTerminalConfig deDeviceTerminalConfig = deDeviceTerminalConfigService.selectDeDeviceTerminalConfigById(inspectionRobot.getTerminalId());
deDeviceTerminalConfig.setName(inspectionRobot.getRobotName());
deDeviceTerminalConfig.setHost(inspectionRobot.getIpAddress());
deDeviceTerminalConfig.setPort(inspectionRobot.getPort());
deDeviceTerminalConfigService.updateDeDeviceTerminalConfig(deDeviceTerminalConfig);
return inspectionRobotMapper.updateInspectionRobot(inspectionRobot); return inspectionRobotMapper.updateInspectionRobot(inspectionRobot);
} }
@ -124,9 +131,40 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
@Override @Override
public int deleteInspectionRobotByIds(String[] ids) public int deleteInspectionRobotByIds(String[] ids)
{ {
List<InspectionRobot> inspectionRobots = inspectionRobotMapper.selectBatchIds(Arrays.asList(ids)); return inspectionRobotMapper.archiveInspectionRobotByIds(ids, SecurityUtils.getUsername());
deDeviceTerminalConfigService.deleteDeDeviceTerminalConfigByIds(inspectionRobots.stream().map(InspectionRobot::getTerminalId).toArray(String[]::new)); }
return inspectionRobotMapper.deleteInspectionRobotByIds(ids);
@Override
public List<InspectionRobotDevice> selectRobotDevices(String id)
{
InspectionRobot robot = inspectionRobotMapper.selectInspectionRobotById(id);
if (robot == null) {
throw new GlobalException("机器人不存在");
}
if (StrUtil.isBlank(robot.getRobotId())) {
return java.util.Collections.emptyList();
}
return inspectionRobotDeviceMapper.selectByRobotId(robot.getRobotId());
}
@Override
public List<InspectionRobotDevice> selectRobotDevicesByRobotId(String robotId, Integer deviceKind,
boolean onlineOnly)
{
String normalizedRobotId = normalizeRobotId(robotId);
if (StrUtil.isBlank(normalizedRobotId)) {
throw new GlobalException("机器人ID不能为空");
}
if (inspectionRobotMapper.selectByRobotId(normalizedRobotId).isEmpty()) {
throw new GlobalException("机器人不存在:" + normalizedRobotId);
}
return inspectionRobotDeviceMapper.selectByRobotIdAndKind(
normalizedRobotId, deviceKind, onlineOnly);
}
private static String normalizeRobotId(String robotId)
{
return robotId == null ? null : robotId.trim();
} }
/** /**
@ -147,7 +185,7 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
} }
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(robot.getTerminalId()); edgeCommonVO.setRobotId(robot.getRobotId());
edgeCommonVO.setDeviceId(robot.getRobotCode()); edgeCommonVO.setDeviceId(robot.getRobotCode());
return edgeAgvService.listMaps(edgeCommonVO); return edgeAgvService.listMaps(edgeCommonVO);
@ -196,7 +234,7 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
} }
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(robot.getTerminalId()); edgeCommonVO.setRobotId(robot.getRobotId());
edgeCommonVO.setDeviceId(robot.getRobotCode()); edgeCommonVO.setDeviceId(robot.getRobotCode());
return edgeAgvService.downloadMap(edgeCommonVO, mapName); return edgeAgvService.downloadMap(edgeCommonVO, mapName);
@ -239,7 +277,7 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
// 5. 从来源机器人下载地图JSON // 5. 从来源机器人下载地图JSON
EdgeCommonVO sourceEdgeVO = new EdgeCommonVO(); EdgeCommonVO sourceEdgeVO = new EdgeCommonVO();
sourceEdgeVO.setTerminalId(sourceRobot.getTerminalId()); sourceEdgeVO.setRobotId(sourceRobot.getRobotId());
sourceEdgeVO.setDeviceId(sourceRobot.getRobotCode()); sourceEdgeVO.setDeviceId(sourceRobot.getRobotCode());
String mapContent = edgeAgvService.downloadMap(sourceEdgeVO, map.getMapSourceName()); String mapContent = edgeAgvService.downloadMap(sourceEdgeVO, map.getMapSourceName());
@ -250,7 +288,7 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
// 6. 上传地图到目标机器人 // 6. 上传地图到目标机器人
EdgeCommonVO targetEdgeVO = new EdgeCommonVO(); EdgeCommonVO targetEdgeVO = new EdgeCommonVO();
targetEdgeVO.setTerminalId(targetRobot.getTerminalId()); targetEdgeVO.setRobotId(targetRobot.getRobotId());
targetEdgeVO.setDeviceId(targetRobot.getRobotCode()); targetEdgeVO.setDeviceId(targetRobot.getRobotCode());
edgeAgvService.uploadMap(targetEdgeVO, map.getMapSourceName(), mapContent); edgeAgvService.uploadMap(targetEdgeVO, map.getMapSourceName(), mapContent);
@ -273,7 +311,7 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
} }
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(robot.getTerminalId()); edgeCommonVO.setRobotId(robot.getRobotId());
edgeCommonVO.setDeviceId(robot.getRobotCode()); edgeCommonVO.setDeviceId(robot.getRobotCode());
try { try {
@ -317,7 +355,7 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
} }
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(robot.getTerminalId()); edgeCommonVO.setRobotId(robot.getRobotId());
edgeCommonVO.setDeviceId(robot.getRobotCode()); edgeCommonVO.setDeviceId(robot.getRobotCode());
AgvUtils.AgvRuntimeState runtimeState = edgeAgvService.getRuntimeState(edgeCommonVO); AgvUtils.AgvRuntimeState runtimeState = edgeAgvService.getRuntimeState(edgeCommonVO);
@ -352,7 +390,7 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
.build(); .build();
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(robot.getTerminalId()); edgeCommonVO.setRobotId(robot.getRobotId());
edgeCommonVO.setDeviceId(robot.getRobotCode()); edgeCommonVO.setDeviceId(robot.getRobotCode());
// 调用边缘端接口进行导航 // 调用边缘端接口进行导航
@ -377,7 +415,7 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
} }
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(robot.getTerminalId()); edgeCommonVO.setRobotId(robot.getRobotId());
edgeCommonVO.setDeviceId(robot.getRobotCode()); edgeCommonVO.setDeviceId(robot.getRobotCode());
AgvUtils.AgvMapDimension mapDimension = AgvUtils.AgvMapDimension.forNumber(dimension); AgvUtils.AgvMapDimension mapDimension = AgvUtils.AgvMapDimension.forNumber(dimension);
@ -398,7 +436,7 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
} }
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(robot.getTerminalId()); edgeCommonVO.setRobotId(robot.getRobotId());
edgeCommonVO.setDeviceId(robot.getRobotCode()); edgeCommonVO.setDeviceId(robot.getRobotCode());
edgeAgvService.stopMapping(edgeCommonVO); edgeAgvService.stopMapping(edgeCommonVO);

View File

@ -7,10 +7,12 @@ import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl; import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
import com.cmvr.common.exception.ServiceException; import com.cmvr.common.exception.ServiceException;
import com.cmvr.common.utils.SecurityUtils; import com.cmvr.common.utils.SecurityUtils;
import com.cmvr.inspection.domain.InspectionRobot;
import com.cmvr.inspection.domain.InspectionTask; import com.cmvr.inspection.domain.InspectionTask;
import com.cmvr.inspection.domain.dto.InspectionTaskInstanceQuery; import com.cmvr.inspection.domain.dto.InspectionTaskInstanceQuery;
import com.cmvr.inspection.domain.vo.InspectionTaskInstanceVo; import com.cmvr.inspection.domain.vo.InspectionTaskInstanceVo;
import com.cmvr.inspection.enums.TaskStatusEnum; import com.cmvr.inspection.enums.TaskStatusEnum;
import com.cmvr.inspection.mapper.InspectionRobotMapper;
import com.cmvr.inspection.service.IInspectionTaskService; import com.cmvr.inspection.service.IInspectionTaskService;
import com.cmvr.test.flow.control.FlowControlService; import com.cmvr.test.flow.control.FlowControlService;
import com.cmvr.test.flow.runtime.engine.FlowTaskRuntimeService; import com.cmvr.test.flow.runtime.engine.FlowTaskRuntimeService;
@ -38,6 +40,8 @@ public class InspectionTaskInstanceServiceImpl extends ServiceImpl<InspectionTas
private IInspectionTaskService inspectionTaskService; private IInspectionTaskService inspectionTaskService;
@Autowired @Autowired
private InspectionTaskInstanceMapper inspectionTaskInstanceMapper; private InspectionTaskInstanceMapper inspectionTaskInstanceMapper;
@Autowired
private InspectionRobotMapper inspectionRobotMapper;
@Autowired @Autowired
private ITeTaskOrchestrationService teTaskOrchestrationService; private ITeTaskOrchestrationService teTaskOrchestrationService;
@ -155,12 +159,18 @@ public class InspectionTaskInstanceServiceImpl extends ServiceImpl<InspectionTas
update.setUpdateTime(DateUtils.getNowDate()); update.setUpdateTime(DateUtils.getNowDate());
update.setUpdateBy(SecurityUtils.getUsername()); update.setUpdateBy(SecurityUtils.getUsername());
InspectionTask inspectionTask = inspectionTaskService.selectInspectionTaskById(instance.getTaskId()); InspectionTask inspectionTask = inspectionTaskService.selectInspectionTaskById(instance.getTaskId());
InspectionRobot robot = inspectionRobotMapper.selectInspectionRobotById(instance.getRobotId());
if (robot == null) {
throw new ServiceException("巡检任务实例关联的机器人不存在");
}
JSONObject runParams = new JSONObject(); JSONObject runParams = new JSONObject();
// 获取所有的检测项id // 获取所有的检测项id
teTaskOrchestrationService.queryByTaskId(inspectionTask.getTaskConfigId()).forEach(item -> runParams.put(item.getItemId(), new JSONObject())); teTaskOrchestrationService.queryByTaskId(inspectionTask.getTaskConfigId()).forEach(item -> runParams.put(item.getItemId(), new JSONObject()));
// 调用真正的执行 // 调用真正的执行
String insId = flowTaskRuntimeService.executeTask(TeTaskExecuteNormalVO.builder() String insId = flowTaskRuntimeService.executeTask(TeTaskExecuteNormalVO.builder()
.taskId(inspectionTask.getTaskConfigId()) .taskId(inspectionTask.getTaskConfigId())
.robotId(robot.getRobotId())
.robotId(robot.getRobotId())
.moduleCode(FlowExecutionModuleCodes.INSPECTION) .moduleCode(FlowExecutionModuleCodes.INSPECTION)
.runParams(runParams) .runParams(runParams)
.build()); .build());

View File

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cmvr.inspection.mapper.InspectionRobotDeviceMapper">
<resultMap id="RobotDeviceResult" type="com.cmvr.inspection.domain.InspectionRobotDevice">
<id property="id" column="id"/>
<result property="robotId" column="robot_id"/>
<result property="deviceId" column="device_id"/>
<result property="deviceName" column="device_name"/>
<result property="deviceKind" column="device_kind"/>
<result property="typeName" column="type_name"/>
<result property="enabled" column="enabled"/>
<result property="managerState" column="manager_state"/>
<result property="healthStatus" column="health_status"/>
<result property="onlineStatus" column="online_status"/>
<result property="hasError" column="has_error"/>
<result property="errorMessage" column="error_message"/>
<result property="statusUpdatedTime" column="status_updated_time"/>
<result property="lastSeenTime" column="last_seen_time"/>
<result property="offlineTime" column="offline_time"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="remark" column="remark"/>
</resultMap>
<sql id="columns">id, robot_id, device_id, device_name, device_kind, type_name, enabled,
manager_state, health_status, online_status, has_error, error_message,
status_updated_time, last_seen_time, offline_time, create_by, create_time,
update_by, update_time, remark</sql>
<select id="selectByRobotId" resultMap="RobotDeviceResult">
select <include refid="columns"/> from inspection_robot_device
where robot_id = #{robotId}
order by online_status desc, device_kind, device_id
</select>
<select id="selectByRobotIdAndKind" resultMap="RobotDeviceResult">
select <include refid="columns"/> from inspection_robot_device
where robot_id = #{robotId}
<if test="deviceKind != null">
and device_kind = #{deviceKind}
</if>
<if test="onlineOnly">
and online_status = '1' and enabled = '1'
</if>
order by online_status desc, device_kind, device_name, device_id
</select>
<select id="selectByIdentity" resultMap="RobotDeviceResult">
select <include refid="columns"/> from inspection_robot_device
where robot_id = #{robotId} and device_id = #{deviceId}
</select>
<update id="updateRuntimeState" parameterType="com.cmvr.inspection.domain.InspectionRobotDevice">
update inspection_robot_device
set device_kind = #{deviceKind}, type_name = #{typeName}, enabled = #{enabled},
manager_state = #{managerState}, health_status = #{healthStatus},
online_status = #{onlineStatus}, has_error = #{hasError},
error_message = #{errorMessage}, status_updated_time = #{statusUpdatedTime},
last_seen_time = #{lastSeenTime}, offline_time = #{offlineTime},
update_by = #{updateBy}, update_time = #{updateTime}
where id = #{id}
</update>
<update id="markMissingOffline">
update inspection_robot_device
set online_status = '0', offline_time = #{offlineTime},
update_by = 'quic', update_time = #{offlineTime}
where robot_id = #{robotId} and online_status != '0'
<if test="deviceIds != null and deviceIds.size() > 0">
and device_id not in
<foreach collection="deviceIds" item="deviceId" open="(" separator="," close=")">
#{deviceId}
</foreach>
</if>
</update>
<update id="markAllOffline">
update inspection_robot_device
set online_status = '0', offline_time = #{offlineTime},
update_by = 'quic', update_time = #{offlineTime}
where robot_id = #{robotId} and online_status != '0'
</update>
</mapper>

View File

@ -6,6 +6,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<resultMap type="InspectionRobot" id="InspectionRobotResult"> <resultMap type="InspectionRobot" id="InspectionRobotResult">
<result property="id" column="id" /> <result property="id" column="id" />
<result property="robotId" column="robot_id" />
<result property="createBy" column="create_by" /> <result property="createBy" column="create_by" />
<result property="createTime" column="create_time" /> <result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" /> <result property="updateBy" column="update_by" />
@ -21,11 +22,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="status" column="status" /> <result property="status" column="status" />
<result property="batteryLevel" column="battery_level" /> <result property="batteryLevel" column="battery_level" />
<result property="currentPosition" column="current_position" /> <result property="currentPosition" column="current_position" />
<result property="terminalId" column="terminal_id" /> <result property="connectStatus" column="connect_status" />
<result property="quicNodeId" column="quic_node_id" />
<result property="quicSessionId" column="quic_session_id" />
<result property="quicBootId" column="quic_boot_id" />
<result property="observedIp" column="observed_ip" />
<result property="softwareVersion" column="software_version" />
<result property="lastHeartbeatTime" column="last_heartbeat_time" />
<result property="archivedStatus" column="archived_status" />
</resultMap> </resultMap>
<resultMap type="com.cmvr.inspection.domain.vo.InspectionRobotVo" id="InspectionRobotVoResult"> <resultMap type="com.cmvr.inspection.domain.vo.InspectionRobotVo" id="InspectionRobotVoResult">
<result property="id" column="id" /> <result property="id" column="id" />
<result property="robotId" column="robot_id" />
<result property="createBy" column="create_by" /> <result property="createBy" column="create_by" />
<result property="createTime" column="create_time" /> <result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" /> <result property="updateBy" column="update_by" />
@ -45,17 +54,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="currentPosition" column="current_position" /> <result property="currentPosition" column="current_position" />
<result property="createByName" column="create_by_name" /> <result property="createByName" column="create_by_name" />
<result property="updateByName" column="update_by_name" /> <result property="updateByName" column="update_by_name" />
<result property="terminalId" column="terminal_id" /> <result property="connectStatus" column="connect_status" />
<result property="quicNodeId" column="quic_node_id" />
<result property="quicSessionId" column="quic_session_id" />
<result property="quicBootId" column="quic_boot_id" />
<result property="observedIp" column="observed_ip" />
<result property="softwareVersion" column="software_version" />
<result property="lastHeartbeatTime" column="last_heartbeat_time" />
<result property="deviceTotal" column="device_total" />
<result property="onlineDeviceCount" column="online_device_count" />
<result property="faultDeviceCount" column="fault_device_count" />
</resultMap> </resultMap>
<sql id="selectInspectionRobotVo"> <sql id="selectInspectionRobotVo">
select id, create_by, create_time, update_by, update_time, remark, robot_code, robot_name, robot_model, robot_type, ip_address, port, current_map_id, status, battery_level, current_position, terminal_id from inspection_robot select id, robot_id, create_by, create_time, update_by, update_time, remark,
robot_code, robot_name, robot_model, robot_type, ip_address, port,
current_map_id, status, battery_level, current_position,
connect_status, quic_node_id, quic_session_id, quic_boot_id,
observed_ip, software_version, last_heartbeat_time, archived_status
from inspection_robot
</sql> </sql>
<select id="selectInspectionRobotList" parameterType="InspectionRobot" resultMap="InspectionRobotResult"> <select id="selectInspectionRobotList" parameterType="InspectionRobot" resultMap="InspectionRobotResult">
<include refid="selectInspectionRobotVo"/> <include refid="selectInspectionRobotVo"/>
<where> <where>
<if test="robotCode != null and robotCode != ''"> and robot_code = #{robotCode}</if> <if test="robotCode != null and robotCode != ''"> and robot_code = #{robotCode}</if>
<if test="robotId != null and robotId != ''"> and robot_id = #{robotId}</if>
<if test="robotName != null and robotName != ''"> and robot_name like concat('%', #{robotName}, '%')</if> <if test="robotName != null and robotName != ''"> and robot_name like concat('%', #{robotName}, '%')</if>
<if test="robotModel != null and robotModel != ''"> and robot_model = #{robotModel}</if> <if test="robotModel != null and robotModel != ''"> and robot_model = #{robotModel}</if>
<if test="robotType != null and robotType != ''"> and robot_type = #{robotType}</if> <if test="robotType != null and robotType != ''"> and robot_type = #{robotType}</if>
@ -69,10 +93,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where id = #{id} where id = #{id}
</select> </select>
<select id="selectByRobotId" parameterType="String" resultMap="InspectionRobotResult">
<include refid="selectInspectionRobotVo"/>
where robot_id = #{robotId}
</select>
<insert id="insertInspectionRobot" parameterType="InspectionRobot"> <insert id="insertInspectionRobot" parameterType="InspectionRobot">
insert into inspection_robot insert into inspection_robot
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">id,</if> <if test="id != null">id,</if>
<if test="robotId != null">robot_id,</if>
<if test="createBy != null">create_by,</if> <if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if> <if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if> <if test="updateBy != null">update_by,</if>
@ -88,10 +118,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="status != null">status,</if> <if test="status != null">status,</if>
<if test="batteryLevel != null">battery_level,</if> <if test="batteryLevel != null">battery_level,</if>
<if test="currentPosition != null">current_position,</if> <if test="currentPosition != null">current_position,</if>
<if test="terminalId != null">terminal_id,</if> <if test="connectStatus != null">connect_status,</if>
<if test="archivedStatus != null">archived_status,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if> <if test="id != null">#{id},</if>
<if test="robotId != null">#{robotId},</if>
<if test="createBy != null">#{createBy},</if> <if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if> <if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if> <if test="updateBy != null">#{updateBy},</if>
@ -107,7 +139,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="status != null">#{status},</if> <if test="status != null">#{status},</if>
<if test="batteryLevel != null">#{batteryLevel},</if> <if test="batteryLevel != null">#{batteryLevel},</if>
<if test="currentPosition != null">#{currentPosition},</if> <if test="currentPosition != null">#{currentPosition},</if>
<if test="terminalId != null">#{terminalId},</if> <if test="connectStatus != null">#{connectStatus},</if>
<if test="archivedStatus != null">#{archivedStatus},</if>
</trim> </trim>
</insert> </insert>
@ -129,11 +162,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="status != null">status = #{status},</if> <if test="status != null">status = #{status},</if>
<if test="batteryLevel != null">battery_level = #{batteryLevel},</if> <if test="batteryLevel != null">battery_level = #{batteryLevel},</if>
<if test="currentPosition != null">current_position = #{currentPosition},</if> <if test="currentPosition != null">current_position = #{currentPosition},</if>
<if test="terminalId != null">terminal_id = #{terminalId},</if>
</trim> </trim>
where id = #{id} where id = #{id}
</update> </update>
<update id="updateQuicRuntimeState" parameterType="InspectionRobot">
update inspection_robot
set ip_address = #{ipAddress}, port = #{port}, connect_status = #{connectStatus},
quic_node_id = #{quicNodeId}, quic_session_id = #{quicSessionId},
quic_boot_id = #{quicBootId}, observed_ip = #{observedIp},
software_version = #{softwareVersion}, last_heartbeat_time = #{lastHeartbeatTime},
update_by = 'quic', update_time = #{updateTime}
where id = #{id}
</update>
<update id="archiveInspectionRobotByIds" parameterType="String">
update inspection_robot set archived_status = '1', connect_status = '0',
update_time = sysdate(), update_by = #{updateBy}
where id in
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</update>
<delete id="deleteInspectionRobotById" parameterType="String"> <delete id="deleteInspectionRobotById" parameterType="String">
delete from inspection_robot where id = #{id} delete from inspection_robot where id = #{id}
</delete> </delete>
@ -147,20 +198,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectInspectionRobotVoList" parameterType="InspectionRobot" resultMap="InspectionRobotVoResult"> <select id="selectInspectionRobotVoList" parameterType="InspectionRobot" resultMap="InspectionRobotVoResult">
select r.id, r.create_by, r.create_time, r.update_by, r.update_time, r.remark, select r.id, r.create_by, r.create_time, r.update_by, r.update_time, r.remark,
r.robot_code, r.robot_name, r.robot_model, r.robot_type, r.robot_id, r.robot_code, r.robot_name, r.robot_model, r.robot_type,
r.ip_address, r.port, r.current_map_id, r.ip_address, r.port, r.current_map_id,
m.map_name as current_map_name, m.map_name as current_map_name,
r.status, r.battery_level, r.current_position, r.terminal_id, r.status, r.battery_level, r.current_position,
r.connect_status, r.quic_node_id, r.quic_session_id, r.quic_boot_id,
r.observed_ip, r.software_version, r.last_heartbeat_time,
(select count(*) from inspection_robot_device d where d.robot_id = r.robot_id) as device_total,
(select count(*) from inspection_robot_device d where d.robot_id = r.robot_id and d.online_status = '1') as online_device_count,
(select count(*) from inspection_robot_device d where d.robot_id = r.robot_id and (d.health_status = 3 or d.has_error = '1')) as fault_device_count,
u1.nick_name as create_by_name, u2.nick_name as update_by_name, m.map_source_name as robot_map_name u1.nick_name as create_by_name, u2.nick_name as update_by_name, m.map_source_name as robot_map_name
from inspection_robot r from inspection_robot r
left join inspection_map m on r.current_map_id = m.id left join inspection_map m on r.current_map_id = m.id
left join sys_user u1 on r.create_by = u1.user_name <!-- 创建人关联用户 --> left join sys_user u1 on r.create_by = u1.user_name <!-- 创建人关联用户 -->
left join sys_user u2 on r.update_by = u2.user_name <!-- 更新人关联用户 --> left join sys_user u2 on r.update_by = u2.user_name <!-- 更新人关联用户 -->
<where> <where>
and coalesce(r.archived_status, '0') = '0'
<if test="robotId != null and robotId != ''"> and r.robot_id = #{robotId}</if>
<if test="robotCode != null and robotCode != ''"> and r.robot_code = #{robotCode}</if> <if test="robotCode != null and robotCode != ''"> and r.robot_code = #{robotCode}</if>
<if test="robotName != null and robotName != ''"> and r.robot_name like concat('%', #{robotName}, '%')</if> <if test="robotName != null and robotName != ''"> and r.robot_name like concat('%', #{robotName}, '%')</if>
<if test="robotModel != null and robotModel != ''"> and r.robot_model = #{robotModel}</if> <if test="robotModel != null and robotModel != ''"> and r.robot_model = #{robotModel}</if>
<if test="robotType != null and robotType != ''"> and r.robot_type = #{robotType}</if> <if test="robotType != null and robotType != ''"> and r.robot_type = #{robotType}</if>
<if test="connectStatus != null and connectStatus != ''"> and r.connect_status = #{connectStatus}</if>
<if test="status != null and status != ''"> and r.status = #{status}</if> <if test="status != null and status != ''"> and r.status = #{status}</if>
<if test="currentMapId != null and currentMapId != ''"> and r.current_map_id = #{currentMapId}</if> <if test="currentMapId != null and currentMapId != ''"> and r.current_map_id = #{currentMapId}</if>
<if test="ipAddress != null and ipAddress != ''"> and r.ip_address = #{ipAddress}</if> <if test="ipAddress != null and ipAddress != ''"> and r.ip_address = #{ipAddress}</if>

View File

@ -13,12 +13,12 @@ cmvr-es / 边缘节点
cmvr-iot-admin cmvr-iot-admin
|-- QuicGatewayServer |-- QuicGatewayServer
|-- NodeEventBroker |-- NodeEventBroker
`-- QuicGatewayNodeSyncService(进程内直接订阅) `-- RobotQuicEventSubscriber(进程内直接订阅)
v v
de_device_terminal_config + 原有机器人 gRPC 客户端 inspection_robot + inspection_robot_device + 原有机器人 gRPC 客户端
``` ```
QUIC 链路不启动内部 gRPC Server也不经过本机 TCP 端口。平台调用机器人设备的原有 gRPC 客户端保持不变,两者只在终端 endpoint 同步和 channel 失效处理处协作 QUIC 链路不启动内部 gRPC Server也不经过本机 TCP 端口。QUIC 注册中的永久 `robotId` 是机器人唯一业务身份;平台据此同步机器人 gRPC endpoint、设备快照并在地址变化时清理对应 channel
## 组件职责 ## 组件职责
@ -27,7 +27,8 @@ QUIC 链路不启动内部 gRPC Server也不经过本机 TCP 端口。平台
- `ControlStreamHandler`:解析注册、心跳和设备快照控制帧。 - `ControlStreamHandler`:解析注册、心跳和设备快照控制帧。
- `MediaReassembler`:按帧重组媒体 DATAGRAM并限制内存和超时。 - `MediaReassembler`:按帧重组媒体 DATAGRAM并限制内存和超时。
- `NodeEventBroker`Spring 单例,向当前 JVM 内的订阅者直接发布节点和媒体事件。 - `NodeEventBroker`Spring 单例,向当前 JVM 内的订阅者直接发布节点和媒体事件。
- `QuicGatewayNodeSyncService`:把在线状态和 gRPC endpoint 同步到终端表,并清理旧 gRPC channel。 - `RobotQuicEventSubscriber`:订阅当前 JVM 中的 QUIC 节点事件。
- `RobotQuicStateService`:按永久 `robotId` 更新机器人、设备在线状态和 gRPC endpoint并清理旧 gRPC channel。
协议定义位于: 协议定义位于:
@ -79,25 +80,25 @@ Linux 部署时将证书路径换成实际绝对路径。对应配置也可以
首次使用前执行: 首次使用前执行:
```text ```text
sql/quic_gateway_terminal_migration.sql sql/robot_quic_identity_migration.sql
sql/robot_id_only_migration.sql
``` ```
然后把边缘节点的稳定 `node_id` 绑定到已有终端: 先在机器人管理页面新增机器人并填写边缘端上报的永久 `robotId`。机器人首次连接后平台自动补全地址、端口、QUIC 会话信息和设备清单,无需绑定终端:
```sql ```sql
UPDATE de_device_terminal_config INSERT INTO inspection_robot (id, robot_name, robot_id, connect_status, archived_status)
SET quic_node_id = 'robot-edge-001' VALUES ('业务主键', '测试机器人', '边缘端永久机器人ID', '0', '0');
WHERE id = '平台终端ID';
``` ```
平台不会根据陌生 QUIC 节点自动创建设备。未绑定节点只记录警告,不更新业务数据 平台不会根据陌生 `robotId` 自动创建机器人,未登记的机器人只记录警告;已登记机器人上报的新设备会自动写入设备快照表,未继续上报的设备会标记为离线
节点上线后,平台会根据 `cmvr.quic.grpc-host-source` 更新终端的 gRPC 地址: 机器人上线后,平台会根据 `cmvr.quic.grpc-host-source` 更新机器人的 gRPC 地址:
- `observed-source`:使用 Gateway 观察到的连接源 IP适合 QUIC 与机器人 gRPC 同机部署。 - `observed-source`:使用 Gateway 观察到的连接源 IP适合 QUIC 与机器人 gRPC 同机部署。
- `advertised`:使用节点注册时主动上报的 gRPC host。 - `advertised`:使用节点注册时主动上报的 gRPC host。
endpoint 变化或节点离线时,原有 `GrpcServiceManager` 缓存的 channel 会立即失效,下次业务调用建立连接。 endpoint 变化或机器人离线时,`GrpcServiceManager` 中按 `robotId` 缓存的 channel 会立即失效,下次业务调用使用最新地址建立连接。
## 构建与测试 ## 构建与测试

View File

@ -35,7 +35,7 @@
<artifactId>cmvr-iot-grpc-client</artifactId> <artifactId>cmvr-iot-grpc-client</artifactId>
</dependency> </dependency>
<!-- 设备终端配置用于工作流报警监听组件按终端ID解析边缘端IP --> <!-- 设备服务,供工作流报警监听组件使用 -->
<dependency> <dependency>
<groupId>com.cmvr</groupId> <groupId>com.cmvr</groupId>
<artifactId>cmvr-iot-device</artifactId> <artifactId>cmvr-iot-device</artifactId>

View File

@ -41,10 +41,11 @@ public class TaskContext {
*/ */
private String itemId; private String itemId;
/** /** 机器人永久唯一 ID用于执行路由和互斥。 */
* 所属终端 ID private String robotId;
*/
private String terminalId; /** 稳定的机器人锁键。 */
private String lockKey;
/** /**
* 当前运行状态运行中/已完成/失败/暂停/终止 * 当前运行状态运行中/已完成/失败/暂停/终止

View File

@ -25,20 +25,20 @@ public class TaskContextManager {
private final Map<String, TaskContext> instContextMap = new ConcurrentHashMap<>(); private final Map<String, TaskContext> instContextMap = new ConcurrentHashMap<>();
/** /**
* 终端 ID 实例 ID标识该终端被哪个任务占用 * 机器人锁键 实例 ID标识该机器人被哪个任务占用
*/ */
private final Map<String, String> terminalInstMap = new ConcurrentHashMap<>(); private final Map<String, String> robotInstMap = new ConcurrentHashMap<>();
/** /**
* 注册任务上下文任务启动时调用 * 注册任务上下文任务启动时调用
*/ */
public void register(TaskContext context) { public void register(TaskContext context) {
instContextMap.put(context.getInstId(), context); instContextMap.put(context.getInstId(), context);
if (context.getTerminalId() != null) { if (context.getLockKey() != null) {
terminalInstMap.put(context.getTerminalId(), context.getInstId()); robotInstMap.put(context.getLockKey(), context.getInstId());
} }
context.setTerminalStatus(TerminalStatusEnum.RUNNING); context.setTerminalStatus(TerminalStatusEnum.RUNNING);
log.info("注册任务上下文instId={}, terminalId={}", context.getInstId(), context.getTerminalId()); log.info("注册任务上下文instId={}, robotId={}", context.getInstId(), context.getRobotId());
} }
/** /**
@ -49,10 +49,10 @@ public class TaskContextManager {
if (ctx != null) { if (ctx != null) {
ctx.setTerminalStatus(TerminalStatusEnum.READY); ctx.setTerminalStatus(TerminalStatusEnum.READY);
ctx.setTerminalLocked(false); ctx.setTerminalLocked(false);
if (ctx.getTerminalId() != null) { if (ctx.getLockKey() != null) {
terminalInstMap.remove(ctx.getTerminalId()); robotInstMap.remove(ctx.getLockKey());
} }
log.info("注销任务上下文instId={}, terminalId={}", instId, ctx.getTerminalId()); log.info("注销任务上下文instId={}, robotId={}", instId, ctx.getRobotId());
} }
} }
@ -71,25 +71,25 @@ public class TaskContextManager {
} }
/** /**
* 判断某个终端是否已被占用用于任务启动前判断 * 判断某个机器人是否已被占用用于任务启动前判断
*/ */
public boolean isTerminalLocked(String terminalId) { public boolean isRobotLocked(String lockKey) {
return terminalInstMap.containsKey(terminalId); return robotInstMap.containsKey(lockKey);
} }
/** /**
* 判断终端是否被其他任务占用用于任务恢复时判断 * 判断机器人是否被其他任务占用用于任务恢复时判断
*/ */
public boolean isTerminalOccupied(String terminalId, String excludingInstId) { public boolean isRobotOccupied(String lockKey, String excludingInstId) {
return terminalInstMap.containsKey(terminalId) return robotInstMap.containsKey(lockKey)
&& !terminalInstMap.get(terminalId).equals(excludingInstId); && !robotInstMap.get(lockKey).equals(excludingInstId);
} }
/** /**
* 根据终端ID获取正在执行的实例ID * 根据机器人锁键获取正在执行的实例ID
*/ */
public String getInstIdByTerminal(String terminalId) { public String getInstIdByRobot(String lockKey) {
return terminalInstMap.get(terminalId); return robotInstMap.get(lockKey);
} }
/** /**
@ -97,7 +97,7 @@ public class TaskContextManager {
*/ */
public void clearAll() { public void clearAll() {
instContextMap.clear(); instContextMap.clear();
terminalInstMap.clear(); robotInstMap.clear();
log.info("任务上下文已清空"); log.info("任务上下文已清空");
} }

View File

@ -39,8 +39,8 @@ public class TaskInstHolder {
return taskContextManager.get(instId); return taskContextManager.get(instId);
} }
public boolean isTerminalLocked(String terminalId) { public boolean isRobotLocked(String lockKey) {
return taskContextManager.isTerminalLocked(terminalId); return taskContextManager.isRobotLocked(lockKey);
} }
public void markRunning(String instId, String taskId, String itemId, public void markRunning(String instId, String taskId, String itemId,
@ -87,7 +87,7 @@ public class TaskInstHolder {
// 更新任务状态为SUCCESS // 更新任务状态为SUCCESS
syncStatus(instId, TaskStatusEnum.SUCCESS); syncStatus(instId, TaskStatusEnum.SUCCESS);
// 注销任务上下文释放终端 // 注销任务上下文释放机器人
taskContextManager.unregister(instId); taskContextManager.unregister(instId);
// 发布任务完成事件 // 发布任务完成事件

View File

@ -55,7 +55,7 @@ public class FlowControlService {
throw new GlobalException("任务已终止,无需重复操作"); throw new GlobalException("任务已终止,无需重复操作");
} }
// 异步终止 // 异步终止
executor.execute(() -> edgeSystemService.stopAll(ctx.getTerminalId())); executor.execute(() -> edgeSystemService.stopAll(ctx.getRobotId()));
// 统一记录日志 + 设置上下文状态 + 数据库状态 // 统一记录日志 + 设置上下文状态 + 数据库状态
taskInstHolder.syncStatus(instId, TaskStatusEnum.STOPPED); taskInstHolder.syncStatus(instId, TaskStatusEnum.STOPPED);
@ -80,7 +80,7 @@ public class FlowControlService {
throw new GlobalException("任务已处于暂停状态"); throw new GlobalException("任务已处于暂停状态");
} }
// 异步停止终端 // 异步停止终端
executor.execute(() -> edgeSystemService.stopAll(ctx.getTerminalId())); executor.execute(() -> edgeSystemService.stopAll(ctx.getRobotId()));
ctx.setPaused(true); ctx.setPaused(true);
ctx.setTerminalStatus(TerminalStatusEnum.RUNNING); ctx.setTerminalStatus(TerminalStatusEnum.RUNNING);
ctx.setStatus(TaskStatusEnum.PAUSED); ctx.setStatus(TaskStatusEnum.PAUSED);

View File

@ -28,17 +28,17 @@ public class FlowTaskAsyncDispatcher {
* *
* @param instId 任务实例 ID * @param instId 任务实例 ID
* @param taskId 任务定义 ID * @param taskId 任务定义 ID
* @param terminalId 终端 ID * @param robotId 终端 ID
* @param runMode 运行模式NORMAL / TRIAL * @param runMode 运行模式NORMAL / TRIAL
* @param items 所有检测项详情 * @param items 所有检测项详情
*/ */
public void submit(String instId, String taskId, String terminalId, public void submit(String instId, String taskId, String robotId,
RunModeEnum runMode, List<TeQueryTaskDetailDTO> items) { RunModeEnum runMode, List<TeQueryTaskDetailDTO> items) {
executor.submit(() -> { executor.submit(() -> {
Thread.currentThread().setName("task-thread-" + Thread.currentThread().getId()); Thread.currentThread().setName("task-thread-" + Thread.currentThread().getId());
try { try {
log.info("异步任务开始执行threadName={}, instId={}, taskId={}", Thread.currentThread().getName(), instId, taskId); log.info("异步任务开始执行threadName={}, instId={}, taskId={}", Thread.currentThread().getName(), instId, taskId);
taskEngine.run(instId, taskId, terminalId, runMode, items); taskEngine.run(instId, taskId, robotId, runMode, items);
log.info("异步任务执行结束threadName={}, instId={}, taskId={}", Thread.currentThread().getName(), instId, taskId); log.info("异步任务执行结束threadName={}, instId={}, taskId={}", Thread.currentThread().getName(), instId, taskId);
} catch (Exception e) { } catch (Exception e) {
log.error("任务执行异常threadName={}, instId={}, taskId={}, 错误={}", Thread.currentThread().getName(), instId, taskId, e.getMessage(), e); log.error("任务执行异常threadName={}, instId={}, taskId={}, 错误={}", Thread.currentThread().getName(), instId, taskId, e.getMessage(), e);

View File

@ -22,7 +22,7 @@ public class FlowTaskEngine {
private final FlowItemExecutor flowTaskExecutor; private final FlowItemExecutor flowTaskExecutor;
public void run(String instId, String taskId, String terminalId, public void run(String instId, String taskId, String robotId,
RunModeEnum runMode, List<TeQueryTaskDetailDTO> items) { RunModeEnum runMode, List<TeQueryTaskDetailDTO> items) {
TaskContext context = taskInstHolder.getContext(instId); TaskContext context = taskInstHolder.getContext(instId);
context.setRunMode(runMode); context.setRunMode(runMode);
@ -40,7 +40,7 @@ public class FlowTaskEngine {
TaskNodeExecuteMessage message = new TaskNodeExecuteMessage(); TaskNodeExecuteMessage message = new TaskNodeExecuteMessage();
message.setInstId(instId); message.setInstId(instId);
message.setTaskId(taskId); message.setTaskId(taskId);
message.setTerminalId(terminalId); message.setRobotId(robotId);
message.setItemId(itemId); message.setItemId(itemId);
if (runMode.equals(RunModeEnum.VI_PROJECT)) { if (runMode.equals(RunModeEnum.VI_PROJECT)) {
message.setLoopDetail(item.getSchemeInfo()); message.setLoopDetail(item.getSchemeInfo());

View File

@ -24,6 +24,7 @@ import com.cmvr.test.service.ITeTaskOrchestrationService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@ -41,13 +42,15 @@ public class FlowTaskRuntimeEntry implements FlowTaskRuntimeService {
private final ITeDetectionItemService detectionItemService; private final ITeDetectionItemService detectionItemService;
private final TaskInstHolder taskInstHolder; private final TaskInstHolder taskInstHolder;
private final FlowTaskAsyncDispatcher flowTaskAsyncDispatcher; private final FlowTaskAsyncDispatcher flowTaskAsyncDispatcher;
private final ObjectProvider<RobotExecutionTargetResolver> targetResolverProvider;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public String executeTask(TeTaskExecuteNormalVO taskExecuteNormalVO) { public String executeTask(TeTaskExecuteNormalVO taskExecuteNormalVO) {
RobotExecutionTarget target = resolveTarget(taskExecuteNormalVO.getRobotId());
return executeTaskInternal( return executeTaskInternal(
taskExecuteNormalVO.getTerminalId(), target,
taskExecuteNormalVO.getTaskId(), taskExecuteNormalVO.getTaskId(),
taskExecuteNormalVO.getModuleCode(), taskExecuteNormalVO.getModuleCode(),
RunModeEnum.NORMAL, RunModeEnum.NORMAL,
@ -59,12 +62,14 @@ public class FlowTaskRuntimeEntry implements FlowTaskRuntimeService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public String executeTrialTask(TeTaskExecuteTrailVO taskExecuteTrailVO) { public String executeTrialTask(TeTaskExecuteTrailVO taskExecuteTrailVO) {
JSONObject runParams = taskExecuteTrailVO.getRunParams(); JSONObject runParams = taskExecuteTrailVO.getRunParams();
String terminalId = taskExecuteTrailVO.getTerminalId(); RobotExecutionTarget target = resolveTarget(taskExecuteTrailVO.getRobotId());
if (StrUtil.isEmpty(terminalId)) { String robotId = target.getRobotId();
throw new GlobalException("终端ID不能为空"); String lockKey = target.lockKey();
if (lockKey == null) {
throw new GlobalException("机器人ID不能为空");
} }
if (taskInstHolder.isTerminalLocked(terminalId)) { if (taskInstHolder.isRobotLocked(lockKey)) {
throw new GlobalException("当前终端正在执行其他任务,请稍后再试"); throw new GlobalException("当前机器人正在执行其他任务,请稍后再试");
} }
// 构建试运行任务定义临时任务 // 构建试运行任务定义临时任务
@ -78,7 +83,7 @@ public class FlowTaskRuntimeEntry implements FlowTaskRuntimeService {
String taskId = taskOrchestrationService.buildTrialTask(itemId); String taskId = taskOrchestrationService.buildTrialTask(itemId);
// 创建并保存任务实例 // 创建并保存任务实例
TeTaskInst instance = createAndSaveTaskInstance(taskId, terminalId, RunModeEnum.TRIAL); TeTaskInst instance = createAndSaveTaskInstance(taskId, target, RunModeEnum.TRIAL);
String instId = instance.getId(); String instId = instance.getId();
try { try {
@ -91,10 +96,10 @@ public class FlowTaskRuntimeEntry implements FlowTaskRuntimeService {
List<TeQueryTaskDetailDTO> details = CollUtil.newArrayList(teQueryTaskDetailDTO); List<TeQueryTaskDetailDTO> details = CollUtil.newArrayList(teQueryTaskDetailDTO);
// 注册上下文 // 注册上下文
registerTaskContext(instId, taskId, null, terminalId, itemId, RunModeEnum.TRIAL, runParams); registerTaskContext(instId, taskId, null, target, itemId, RunModeEnum.TRIAL, runParams);
// 异步调度执行与正式任务一致只是模式为 TRIAL // 异步调度执行与正式任务一致只是模式为 TRIAL
flowTaskAsyncDispatcher.submit(instId, taskId, terminalId, RunModeEnum.TRIAL, details); flowTaskAsyncDispatcher.submit(instId, taskId, robotId, RunModeEnum.TRIAL, details);
return instId; return instId;
} catch (Exception e) { } catch (Exception e) {
@ -111,8 +116,9 @@ public class FlowTaskRuntimeEntry implements FlowTaskRuntimeService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public String executeProjectTask(TeTaskExecuteProjectVO taskExecuteProjectVO) { public String executeProjectTask(TeTaskExecuteProjectVO taskExecuteProjectVO) {
RobotExecutionTarget target = resolveTarget(taskExecuteProjectVO.getRobotId());
return executeTaskInternal( return executeTaskInternal(
taskExecuteProjectVO.getTerminalId(), target,
taskExecuteProjectVO.getProjectId(), taskExecuteProjectVO.getProjectId(),
null, null,
RunModeEnum.VI_PROJECT, RunModeEnum.VI_PROJECT,
@ -122,15 +128,18 @@ public class FlowTaskRuntimeEntry implements FlowTaskRuntimeService {
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public String executeTaskInternal(String terminalId, String taskId, String moduleCode, public String executeTaskInternal(String robotId, String taskId, String moduleCode,
RunModeEnum runMode, JSONObject runParams, Object originalVO) { RunModeEnum runMode, JSONObject runParams, Object originalVO) {
// 终端id可能为空 return executeTaskInternal(new RobotExecutionTarget(robotId), taskId,
if (StrUtil.isEmpty(terminalId)) { moduleCode, runMode, runParams, originalVO);
// throw new GlobalException("终端ID不能为空");
} }
// 检查终端状态
if (!StrUtil.isEmpty(terminalId) && taskInstHolder.isTerminalLocked(terminalId)) { private String executeTaskInternal(RobotExecutionTarget target, String taskId, String moduleCode,
throw new GlobalException("当前终端正在执行其他任务,请稍后再试"); RunModeEnum runMode, JSONObject runParams, Object originalVO) {
String robotId = target.getRobotId();
String lockKey = target.lockKey();
if (lockKey != null && taskInstHolder.isRobotLocked(lockKey)) {
throw new GlobalException("当前机器人正在执行其他任务,请稍后再试");
} }
// 查询任务详情检测项信息 // 查询任务详情检测项信息
List<TeQueryTaskDetailDTO> details = taskOrchestrationService.queryTaskDetail(taskId); List<TeQueryTaskDetailDTO> details = taskOrchestrationService.queryTaskDetail(taskId);
@ -139,15 +148,15 @@ public class FlowTaskRuntimeEntry implements FlowTaskRuntimeService {
throw new GlobalException("当前任务存在未发布的检测项!"); throw new GlobalException("当前任务存在未发布的检测项!");
} }
// 创建任务实例 // 创建任务实例
TeTaskInst instance = createAndSaveTaskInstance(taskId, terminalId, runMode); TeTaskInst instance = createAndSaveTaskInstance(taskId, target, runMode);
String instId = instance.getId(); String instId = instance.getId();
try { try {
// 注册上下文 // 注册上下文
registerTaskContext(instId, taskId, moduleCode, terminalId, null, runMode, runParams); registerTaskContext(instId, taskId, moduleCode, target, null, runMode, runParams);
// 异步提交执行 // 异步提交执行
flowTaskAsyncDispatcher.submit(instId, taskId, terminalId, runMode, details); flowTaskAsyncDispatcher.submit(instId, taskId, robotId, runMode, details);
return instId; return instId;
} catch (Exception e) { } catch (Exception e) {
taskInstHolder.markFailed( taskInstHolder.markFailed(
@ -163,10 +172,10 @@ public class FlowTaskRuntimeEntry implements FlowTaskRuntimeService {
/** /**
* 创建并保存任务实例 * 创建并保存任务实例
*/ */
private TeTaskInst createAndSaveTaskInstance(String taskId, String terminalId, RunModeEnum runMode) { private TeTaskInst createAndSaveTaskInstance(String taskId, RobotExecutionTarget target, RunModeEnum runMode) {
TeTaskInst instance = new TeTaskInst(); TeTaskInst instance = new TeTaskInst();
instance.setTaskId(taskId); instance.setTaskId(taskId);
instance.setTerminalId(terminalId); instance.setRobotId(target.getRobotId());
instance.setRunMode(runMode.name()); instance.setRunMode(runMode.name());
instance.setStatus(String.valueOf(TaskStatusEnum.RUNNING.getCode())); instance.setStatus(String.valueOf(TaskStatusEnum.RUNNING.getCode()));
boolean save = taskInstService.save(instance); boolean save = taskInstService.save(instance);
@ -179,14 +188,15 @@ public class FlowTaskRuntimeEntry implements FlowTaskRuntimeService {
/** /**
* 注册上下文 * 注册上下文
*/ */
private void registerTaskContext(String instId, String taskId, String moduleCode, String terminalId, private void registerTaskContext(String instId, String taskId, String moduleCode, RobotExecutionTarget target,
String itemId, RunModeEnum mode, JSONObject runParams) { String itemId, RunModeEnum mode, JSONObject runParams) {
TaskContext ctx = new TaskContext(); TaskContext ctx = new TaskContext();
ctx.setInstId(instId); ctx.setInstId(instId);
ctx.setTaskId(taskId); ctx.setTaskId(taskId);
ctx.setModuleCode(moduleCode); ctx.setModuleCode(moduleCode);
ctx.setRunMode(mode); ctx.setRunMode(mode);
ctx.setTerminalId(terminalId); ctx.setRobotId(target.getRobotId());
ctx.setLockKey(target.lockKey());
ctx.setItemId(itemId); ctx.setItemId(itemId);
ctx.setStatus(TaskStatusEnum.RUNNING); ctx.setStatus(TaskStatusEnum.RUNNING);
ctx.setTerminalLocked(true); ctx.setTerminalLocked(true);
@ -194,4 +204,16 @@ public class FlowTaskRuntimeEntry implements FlowTaskRuntimeService {
taskInstHolder.register(ctx); taskInstHolder.register(ctx);
} }
private RobotExecutionTarget resolveTarget(String robotId) {
if (StrUtil.isNotBlank(robotId)) {
RobotExecutionTargetResolver resolver = targetResolverProvider.getIfAvailable();
if (resolver == null) {
throw new GlobalException("机器人执行解析服务不可用");
}
return resolver.resolve(robotId);
}
// 纯逻辑工作流不调用边缘设备可不绑定机器人
return new RobotExecutionTarget(null);
}
} }

View File

@ -13,7 +13,7 @@ public interface FlowTaskRuntimeService {
/** /**
* 执行正式任务NORMAL 模式 * 执行正式任务NORMAL 模式
* *
* @param taskExecuteNormalVO 任务执行请求对象包含终端ID任务ID等 * @param taskExecuteNormalVO 任务执行请求对象包含机器人ID任务ID等
* @return 返回任务实例IDinstId * @return 返回任务实例IDinstId
*/ */
String executeTask(TeTaskExecuteNormalVO taskExecuteNormalVO); String executeTask(TeTaskExecuteNormalVO taskExecuteNormalVO);

View File

@ -0,0 +1,17 @@
package com.cmvr.test.flow.runtime.engine;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class RobotExecutionTarget {
private String robotId;
public String lockKey() {
if (robotId != null && !robotId.isBlank()) {
return "robot:" + robotId;
}
return null;
}
}

View File

@ -0,0 +1,5 @@
package com.cmvr.test.flow.runtime.engine;
public interface RobotExecutionTargetResolver {
RobotExecutionTarget resolve(String robotId);
}

View File

@ -77,9 +77,9 @@ public class FlowExecutionEvent {
private JSONObject outputParams; private JSONObject outputParams;
/** /**
* 当前工作流绑定的终端ID * 当前工作流绑定的机器人永久唯一 ID
*/ */
private String terminalId; private String robotId;
/** /**
* 循环节点迭代路径用于区分同一节点的多次执行结果 * 循环节点迭代路径用于区分同一节点的多次执行结果

View File

@ -58,7 +58,7 @@ public class FlowAfterInterceptor extends AbstractFlowMsgPreInterceptor{
.nodeType(message.getNodeType()) .nodeType(message.getNodeType())
.action(message.getAction()) .action(message.getAction())
.outputParams(result != null ? result.getOutputParams() : null) .outputParams(result != null ? result.getOutputParams() : null)
.terminalId(message.getTerminalId()) .robotId(message.getRobotId())
.iterations(message.getIterations() == null .iterations(message.getIterations() == null
? new ArrayList<>() : new ArrayList<>(message.getIterations())) ? new ArrayList<>() : new ArrayList<>(message.getIterations()))
.errorMessage(errorMessage) .errorMessage(errorMessage)

View File

@ -78,9 +78,9 @@ public class TaskNodeExecuteMessage {
private boolean trial; private boolean trial;
/** /**
* 所属终端ID * 所属机器人永久唯一 ID
*/ */
private String terminalId; private String robotId;
/** /**
* 节点入参 * 节点入参

View File

@ -35,7 +35,7 @@ public class EdgeAgvOperateService implements EdgeOperateService {
public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) { public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) {
ActionEnum action = message.getAction(); ActionEnum action = message.getAction();
JSONObject inputParams = message.getInputParams(); JSONObject inputParams = message.getInputParams();
String terminalId = message.getTerminalId(); String robotId = message.getRobotId();
// 从输入参数中获取机器人ID // 从输入参数中获取机器人ID
String deviceId = inputParams.getString("deviceId"); String deviceId = inputParams.getString("deviceId");
@ -67,7 +67,7 @@ public class EdgeAgvOperateService implements EdgeOperateService {
// 构建边缘端通用参数 // 构建边缘端通用参数
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
edgeCommonVO.setDeviceId(deviceId); edgeCommonVO.setDeviceId(deviceId);
// 直接调用边缘端AGV服务执行导航 // 直接调用边缘端AGV服务执行导航
@ -85,7 +85,7 @@ public class EdgeAgvOperateService implements EdgeOperateService {
} }
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
edgeCommonVO.setDeviceId(deviceId); edgeCommonVO.setDeviceId(deviceId);
edgeAgvService.navigateToStation(edgeCommonVO, stationId.trim()); edgeAgvService.navigateToStation(edgeCommonVO, stationId.trim());
log.info("AGV移动到指定站点任务下发成功设备ID: {}站点ID: {}", deviceId, stationId); log.info("AGV移动到指定站点任务下发成功设备ID: {}站点ID: {}", deviceId, stationId);

View File

@ -38,7 +38,7 @@ public class EdgeArmOperateService implements EdgeOperateService {
public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) { public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) {
ActionEnum action = message.getAction(); ActionEnum action = message.getAction();
JSONObject inputParams = message.getInputParams(); JSONObject inputParams = message.getInputParams();
String terminalId = message.getTerminalId(); String robotId = message.getRobotId();
// 从输入参数中获取设备ID // 从输入参数中获取设备ID
String deviceId = inputParams.getString("deviceId"); String deviceId = inputParams.getString("deviceId");
@ -48,7 +48,7 @@ public class EdgeArmOperateService implements EdgeOperateService {
} }
// 构建边缘端通用参数 // 构建边缘端通用参数
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
edgeCommonVO.setDeviceId(deviceId); edgeCommonVO.setDeviceId(deviceId);
// 先调用开启力矩 // 先调用开启力矩

View File

@ -53,18 +53,18 @@ public class EdgeCameraOperateService implements EdgeOperateService {
ActionEnum action = message.getAction(); ActionEnum action = message.getAction();
JSONObject inputParams = message.getInputParams(); JSONObject inputParams = message.getInputParams();
String deviceId = inputParams.getString("deviceId"); String deviceId = inputParams.getString("deviceId");
String terminalId = message.getTerminalId(); String robotId = message.getRobotId();
JSONObject upstreamOutput = message.getUpStreamOutput(); JSONObject upstreamOutput = message.getUpStreamOutput();
JSONObject output = new JSONObject(); JSONObject output = new JSONObject();
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setDeviceId(deviceId); edgeCommonVO.setDeviceId(deviceId);
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
switch (action) { switch (action) {
case CAMERA_START: { case CAMERA_START: {
// String result = edgeCameraService.start(terminalId, deviceId); // String result = edgeCameraService.start(robotId, deviceId);
String result = StrUtil.format("id为 [{}] 的相机开启了", deviceId); String result = StrUtil.format("id为 [{}] 的相机开启了", deviceId);
output.put("result", result); output.put("result", result);
break; break;
@ -72,7 +72,7 @@ public class EdgeCameraOperateService implements EdgeOperateService {
case CAMERA_STOP: { case CAMERA_STOP: {
String result = StrUtil.format("id为 [{}] 的相机关闭了", deviceId); String result = StrUtil.format("id为 [{}] 的相机关闭了", deviceId);
// String result = edgeCameraService.stop(terminalId, deviceId); // String result = edgeCameraService.stop(robotId, deviceId);
output.put("result", result); output.put("result", result);
break; break;
} }

View File

@ -28,10 +28,10 @@ public class EdgeDeviceCommandOperateService implements EdgeOperateService {
@Override @Override
public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) { public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) {
JSONObject input = message.getInputParams() == null ? new JSONObject() : message.getInputParams(); JSONObject input = message.getInputParams() == null ? new JSONObject() : message.getInputParams();
String terminalId = StringUtils.defaultIfBlank(message.getTerminalId(), input.getString("terminalId")); String robotId = StringUtils.defaultIfBlank(message.getRobotId(), input.getString("robotId"));
String deviceId = StringUtils.trimToNull(input.getString("deviceId")); String deviceId = StringUtils.trimToNull(input.getString("deviceId"));
if (StringUtils.isBlank(terminalId)) { if (StringUtils.isBlank(robotId)) {
throw new GlobalException("终端ID(terminalId)不能为空"); throw new GlobalException("机器人ID(robotId)不能为空");
} }
if (deviceId == null) { if (deviceId == null) {
throw new GlobalException("设备ID(deviceId)不能为空"); throw new GlobalException("设备ID(deviceId)不能为空");
@ -40,7 +40,7 @@ public class EdgeDeviceCommandOperateService implements EdgeOperateService {
Object rawRequest = input.get("requestJson"); Object rawRequest = input.get("requestJson");
String requestJson = normalizeRequestJson(rawRequest); String requestJson = normalizeRequestJson(rawRequest);
EdgeSystemJsonCommandVO request = new EdgeSystemJsonCommandVO(); EdgeSystemJsonCommandVO request = new EdgeSystemJsonCommandVO();
request.setTerminalId(terminalId); request.setRobotId(robotId);
request.setDeviceId(deviceId); request.setDeviceId(deviceId);
request.setRequestJson(requestJson); request.setRequestJson(requestJson);

View File

@ -27,27 +27,27 @@ public class EdgeHeadOperateService implements EdgeOperateService {
public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) { public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) {
ActionEnum action = message.getAction(); ActionEnum action = message.getAction();
JSONObject inputParams = message.getInputParams(); JSONObject inputParams = message.getInputParams();
String terminalId = message.getTerminalId(); String robotId = message.getRobotId();
String deviceId = inputParams.getString("deviceId"); String deviceId = inputParams.getString("deviceId");
switch (action) { switch (action) {
case BIO_HEAD_SPEAK_START: { case BIO_HEAD_SPEAK_START: {
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setDeviceId(deviceId); edgeCommonVO.setDeviceId(deviceId);
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
edgeBioHeadService.speakStart(edgeCommonVO); edgeBioHeadService.speakStart(edgeCommonVO);
break; break;
} }
case BIO_HEAD_SPEAK_STOP: { case BIO_HEAD_SPEAK_STOP: {
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setDeviceId(deviceId); edgeCommonVO.setDeviceId(deviceId);
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
edgeBioHeadService.speakStop(edgeCommonVO); edgeBioHeadService.speakStop(edgeCommonVO);
break; break;
} }
case BIO_HEAD_SPECIAL_EXPRESSION: { case BIO_HEAD_SPECIAL_EXPRESSION: {
Integer expressKey = inputParams.getInteger("expressKey"); Integer expressKey = inputParams.getInteger("expressKey");
edgeBioHeadService.specialExpression(terminalId,deviceId,expressKey); edgeBioHeadService.specialExpression(robotId,deviceId,expressKey);
break; break;
} }

View File

@ -35,7 +35,7 @@ public class EdgeInspectionAlertOperateService implements EdgeOperateService
public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message)
{ {
JSONObject inputParams = message.getInputParams() == null ? new JSONObject() : message.getInputParams(); JSONObject inputParams = message.getInputParams() == null ? new JSONObject() : message.getInputParams();
String terminalId = StringUtils.defaultIfBlank(inputParams.getString("terminalId"), message.getTerminalId()); String robotId = StringUtils.defaultIfBlank(inputParams.getString("robotId"), message.getRobotId());
Collection<String> eventTypes = resolveEventTypes(inputParams); Collection<String> eventTypes = resolveEventTypes(inputParams);
String listenerKey = inputParams.getString("listenerKey"); String listenerKey = inputParams.getString("listenerKey");
@ -43,12 +43,12 @@ public class EdgeInspectionAlertOperateService implements EdgeOperateService
switch (message.getAction()) switch (message.getAction())
{ {
case INSPECTION_ALERT_LISTEN_START: case INSPECTION_ALERT_LISTEN_START:
state = inspectionAlertListenService.startListen(terminalId, eventTypes, state = inspectionAlertListenService.startListen(robotId, eventTypes,
message.getInstId(), message.getTaskId(), message.getItemId(), message.getInstId(), message.getTaskId(), message.getItemId(),
message.getNodeId(), listenerKey); message.getNodeId(), listenerKey);
break; break;
case INSPECTION_ALERT_LISTEN_STOP: case INSPECTION_ALERT_LISTEN_STOP:
state = inspectionAlertListenService.stopListen(terminalId, eventTypes, state = inspectionAlertListenService.stopListen(robotId, eventTypes,
message.getInstId(), message.getItemId(), listenerKey); message.getInstId(), message.getItemId(), listenerKey);
break; break;
default: default:
@ -56,7 +56,7 @@ public class EdgeInspectionAlertOperateService implements EdgeOperateService
} }
JSONObject output = new JSONObject(); JSONObject output = new JSONObject();
output.put("terminalId", state.getTerminalId()); output.put("robotId", state.getRobotId());
output.put("grpcIp", state.getGrpcIp()); output.put("grpcIp", state.getGrpcIp());
output.put("eventTypes", state.getEventTypes()); output.put("eventTypes", state.getEventTypes());
return TaskNodeExecuteResult.success(output); return TaskNodeExecuteResult.success(output);

View File

@ -45,12 +45,12 @@ public class EdgeMicrophoneOperateService implements EdgeOperateService {
ActionEnum action = message.getAction(); ActionEnum action = message.getAction();
JSONObject inputParams = message.getInputParams(); JSONObject inputParams = message.getInputParams();
String deviceId = inputParams.getString("deviceId"); String deviceId = inputParams.getString("deviceId");
String terminalId = message.getTerminalId(); String robotId = message.getRobotId();
JSONObject output = new JSONObject(); JSONObject output = new JSONObject();
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setDeviceId(deviceId); edgeCommonVO.setDeviceId(deviceId);
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
switch (action) { switch (action) {
case MICROPHONE_START: { case MICROPHONE_START: {
// String audioPath = edgeMicrophoneService.startRecord(edgeCommonVO); // String audioPath = edgeMicrophoneService.startRecord(edgeCommonVO);

View File

@ -27,7 +27,7 @@ public class EdgeSpeakerOperateService implements EdgeOperateService {
// ActionEnum action = message.getAction(); // ActionEnum action = message.getAction();
// JSONObject inputParams = message.getInputParams(); // JSONObject inputParams = message.getInputParams();
// String deviceId = inputParams.getString("deviceId"); // String deviceId = inputParams.getString("deviceId");
// String terminalId = message.getTerminalId(); // String robotId = message.getRobotId();
// switch (action) { // switch (action) {
// case SPEAKER_PLAYAUDIO: { // case SPEAKER_PLAYAUDIO: {
// log.info("speaker play audio"); // log.info("speaker play audio");
@ -37,7 +37,7 @@ public class EdgeSpeakerOperateService implements EdgeOperateService {
// for (int i = 0; i < 3; i++) { // for (int i = 0; i < 3; i++) {
// int index = new Random().nextInt(all.size()); // int index = new Random().nextInt(all.size());
// String audioUrl = "/home/share/assets/upload/" + all.get(index); // String audioUrl = "/home/share/assets/upload/" + all.get(index);
// edgeSpeakerService.playAudio(terminalId, deviceId, audioUrl); // edgeSpeakerService.playAudio(robotId, deviceId, audioUrl);
// // 等待播放完成 // // 等待播放完成
// while (true) { // while (true) {
// try { // try {
@ -45,7 +45,7 @@ public class EdgeSpeakerOperateService implements EdgeOperateService {
// } catch (InterruptedException e) { // } catch (InterruptedException e) {
// throw new RuntimeException(e); // throw new RuntimeException(e);
// } // }
// SpeakerCommand.GetSpeakerStateCommand.Feedback status = edgeSpeakerService.getStatus(terminalId, deviceId); // SpeakerCommand.GetSpeakerStateCommand.Feedback status = edgeSpeakerService.getStatus(robotId, deviceId);
// boolean isRunning = status.getState().getIsRunning(); // boolean isRunning = status.getState().getIsRunning();
// if (!isRunning) { // if (!isRunning) {
// break; // break;

View File

@ -31,13 +31,13 @@ public class EdgeTouchOperateService implements EdgeOperateService {
public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) { public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) {
ActionEnum action = message.getAction(); ActionEnum action = message.getAction();
JSONObject inputParams = message.getInputParams(); JSONObject inputParams = message.getInputParams();
String terminalId = message.getTerminalId(); String robotId = message.getRobotId();
String deviceId = inputParams.getString("deviceId"); String deviceId = inputParams.getString("deviceId");
String touchParams = inputParams.getString("touchParams"); String touchParams = inputParams.getString("touchParams");
if (Objects.requireNonNull(action) == ActionEnum.TOUCH) { if (Objects.requireNonNull(action) == ActionEnum.TOUCH) {
EdgeArmMoveJVO edgeArmMoveJVO = JSON.parseObject(touchParams, EdgeArmMoveJVO.class); EdgeArmMoveJVO edgeArmMoveJVO = JSON.parseObject(touchParams, EdgeArmMoveJVO.class);
edgeArmMoveJVO.setTerminalId(terminalId); edgeArmMoveJVO.setRobotId(robotId);
edgeArmMoveJVO.setDeviceId(deviceId); edgeArmMoveJVO.setDeviceId(deviceId);
edgeArmService.moveJ( edgeArmService.moveJ(

View File

@ -46,7 +46,7 @@ public class ViPlayOperateService implements EdgeOperateService {
String deviceId = inputParams.getString("deviceId"); String deviceId = inputParams.getString("deviceId");
String bioId = inputParams.getString("bioId"); String bioId = inputParams.getString("bioId");
String audioPath = inputParams.getString("audioPath"); String audioPath = inputParams.getString("audioPath");
String terminalId = message.getTerminalId(); String robotId = message.getRobotId();
// 仅当 bioId 不为空时才构造 VO // 仅当 bioId 不为空时才构造 VO
EdgeCommonVO edgeCommonVO = null; EdgeCommonVO edgeCommonVO = null;
@ -54,14 +54,14 @@ public class ViPlayOperateService implements EdgeOperateService {
if (needBioSpeak) { if (needBioSpeak) {
edgeCommonVO = new EdgeCommonVO(); edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setDeviceId(bioId); edgeCommonVO.setDeviceId(bioId);
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
} }
log.info("语料播放成功audioPath={}", audioPath); log.info("语料播放成功audioPath={}", audioPath);
/*try { /*try {
// 播放音频 // 播放音频
edgeSpeakerService.playAudio(terminalId, deviceId, audioPath); edgeSpeakerService.playAudio(robotId, deviceId, audioPath);
// 播放开始时 bioId 存在才张嘴 // 播放开始时 bioId 存在才张嘴
if (needBioSpeak) { if (needBioSpeak) {
@ -82,7 +82,7 @@ public class ViPlayOperateService implements EdgeOperateService {
} }
SpeakerCommand.GetSpeakerStateCommand.Feedback status = SpeakerCommand.GetSpeakerStateCommand.Feedback status =
edgeSpeakerService.getStatus(terminalId, deviceId); edgeSpeakerService.getStatus(robotId, deviceId);
if (!status.getState().getIsRunning()) { if (!status.getState().getIsRunning()) {
break; break;

View File

@ -39,7 +39,7 @@ public class LLMTouchOperateService implements LLMOperateService {
ActionEnum action = message.getAction(); ActionEnum action = message.getAction();
JSONObject inputParams = message.getInputParams(); JSONObject inputParams = message.getInputParams();
String deviceId = inputParams.getString("deviceId"); String deviceId = inputParams.getString("deviceId");
String terminalId = message.getTerminalId(); String robotId = message.getRobotId();
JSONObject output = new JSONObject(); JSONObject output = new JSONObject();
switch (action) { switch (action) {
@ -84,7 +84,7 @@ public class LLMTouchOperateService implements LLMOperateService {
output.put("coordinates", cal); output.put("coordinates", cal);
// todo 获取坐标后调用边缘系统 // todo 获取坐标后调用边缘系统
edgeHlcService.touch(image, terminalId, "hlc01", x, y, 100d); edgeHlcService.touch(image, robotId, "hlc01", x, y, 100d);
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@ -19,8 +19,8 @@ public class TeTaskInst extends BaseEntity {
@ApiModelProperty("任务id") @ApiModelProperty("任务id")
private String taskId; private String taskId;
@ApiModelProperty("终端id") @ApiModelProperty("机器人永久唯一ID")
private String terminalId; private String robotId;
@ApiModelProperty("任务配置信息(对应检测项参数)") @ApiModelProperty("任务配置信息(对应检测项参数)")
private String config; private String config;

View File

@ -22,7 +22,7 @@ public class FlowActionRequestVO {
/** /**
* 执行参数 * 执行参数
*/ */
@ApiModelProperty(value = "节点参数。设备通用指令需要 terminalId、deviceId、requestJson", @ApiModelProperty(value = "节点参数。设备通用指令需要 robotId、deviceId、requestJson",
required = true) required = true)
private JSONObject payload; private JSONObject payload;
} }

View File

@ -23,9 +23,8 @@ public class TeTaskExecuteNormalVO {
@ApiModelProperty("模块编码") @ApiModelProperty("模块编码")
private String moduleCode; private String moduleCode;
@ApiModelProperty("终端ID") @ApiModelProperty("机器人永久唯一ID")
@NotEmpty(message = "终端ID不能为空") private String robotId;
private String terminalId;
@ApiModelProperty(value = "运行时参数") @ApiModelProperty(value = "运行时参数")
private JSONObject runParams = new JSONObject(); private JSONObject runParams = new JSONObject();

View File

@ -15,9 +15,8 @@ public class TeTaskExecuteProjectVO {
@NotEmpty(message = "项目ID不能为空") @NotEmpty(message = "项目ID不能为空")
private String projectId; private String projectId;
@ApiModelProperty("终端ID") @ApiModelProperty("机器人永久唯一ID")
@NotEmpty(message = "终端ID不能为空") private String robotId;
private String terminalId;
@ApiModelProperty(value = "运行时参数") @ApiModelProperty(value = "运行时参数")
private JSONObject runParams = new JSONObject(); private JSONObject runParams = new JSONObject();

View File

@ -19,9 +19,9 @@ public class TeTaskExecuteTrailVO {
@NotEmpty(message = "流程JSON数据不可为空") @NotEmpty(message = "流程JSON数据不可为空")
private String flowData; private String flowData;
@ApiModelProperty("终端ID") @ApiModelProperty("机器人永久唯一ID")
// @NotEmpty(message = "终端ID不能为空") @NotEmpty(message = "机器人ID不能为空")
private String terminalId; private String robotId;
@ApiModelProperty(value = "运行时参数") @ApiModelProperty(value = "运行时参数")
private JSONObject runParams = new JSONObject(); private JSONObject runParams = new JSONObject();

View File

@ -66,10 +66,10 @@ public class FlowActionExecutorService {
private String executeEdgeAction(ActionEnum action, FlowActionRequestVO req) { private String executeEdgeAction(ActionEnum action, FlowActionRequestVO req) {
JSONObject payload = req.getPayload() == null ? new JSONObject() : req.getPayload(); JSONObject payload = req.getPayload() == null ? new JSONObject() : req.getPayload();
String terminalId = payload.getString("terminalId"); String robotId = payload.getString("robotId");
String deviceId = payload.getString("deviceId"); String deviceId = payload.getString("deviceId");
// 巡检报警监听组件只需要终端ID和事件类型不需要设备ID // 巡检报警监听组件只需要机器人 ID 和事件类型不需要设备 ID
if (ActionEnum.INSPECTION_ALERT_LISTEN_START.equals(action) if (ActionEnum.INSPECTION_ALERT_LISTEN_START.equals(action)
|| ActionEnum.INSPECTION_ALERT_LISTEN_STOP.equals(action)) { || ActionEnum.INSPECTION_ALERT_LISTEN_STOP.equals(action)) {
return executeInspectionAlertAction(action, payload); return executeInspectionAlertAction(action, payload);
@ -80,16 +80,16 @@ public class FlowActionExecutorService {
} }
if (ActionEnum.DEVICE_EXECUTE_JSON_COMMAND.equals(action)) { if (ActionEnum.DEVICE_EXECUTE_JSON_COMMAND.equals(action)) {
TaskNodeExecuteMessage message = buildSingleNodeMessage(action, payload); TaskNodeExecuteMessage message = buildSingleNodeMessage(action, payload);
message.setTerminalId(terminalId); message.setRobotId(robotId);
return edgeDeviceCommandOperateService.execute(message).getOutputParams().toJSONString(); return edgeDeviceCommandOperateService.execute(message).getOutputParams().toJSONString();
} }
if (StrUtil.isEmpty(terminalId) || StrUtil.isEmpty(deviceId)) { if (StrUtil.isEmpty(robotId) || StrUtil.isEmpty(deviceId)) {
throw new GlobalException("EDGE 类型动作必须提供 terminalId 和 deviceId"); throw new GlobalException("EDGE 类型动作必须提供 robotId 和 deviceId");
} }
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(terminalId); edgeCommonVO.setRobotId(robotId);
edgeCommonVO.setDeviceId(deviceId); edgeCommonVO.setDeviceId(deviceId);
switch (action) { switch (action) {
// ==== 相机 ==== // ==== 相机 ====
@ -119,7 +119,7 @@ public class FlowActionExecutorService {
case ARM_MOVE_TO_POINT: case ARM_MOVE_TO_POINT:
case ARM_MOVE_TO_J: { case ARM_MOVE_TO_J: {
TaskNodeExecuteMessage message = buildSingleNodeMessage(action, payload); TaskNodeExecuteMessage message = buildSingleNodeMessage(action, payload);
message.setTerminalId(terminalId); message.setRobotId(robotId);
edgeArmOperateService.execute(message); edgeArmOperateService.execute(message);
return action == ActionEnum.ARM_MOVE_TO_J return action == ActionEnum.ARM_MOVE_TO_J
? "机械臂关节空间运动任务下发成功" ? "机械臂关节空间运动任务下发成功"
@ -129,7 +129,7 @@ public class FlowActionExecutorService {
// ==== 语料 ==== // ==== 语料 ====
case VI_PLAY_CORPUS: case VI_PLAY_CORPUS:
String audioPath = payload.getString("audioPath"); String audioPath = payload.getString("audioPath");
return edgeSpeakerService.playAudio(terminalId, deviceId, audioPath); return edgeSpeakerService.playAudio(robotId, deviceId, audioPath);
// ==== 头部 ==== // ==== 头部 ====
case BIO_HEAD_SPEAK_START: case BIO_HEAD_SPEAK_START:
@ -138,7 +138,7 @@ public class FlowActionExecutorService {
return edgeBioHeadService.speakStop(edgeCommonVO); return edgeBioHeadService.speakStop(edgeCommonVO);
case BIO_HEAD_SPECIAL_EXPRESSION: case BIO_HEAD_SPECIAL_EXPRESSION:
EdgeFacialExpressionVO edgeFacialExpressionVO = payload.to(EdgeFacialExpressionVO.class); EdgeFacialExpressionVO edgeFacialExpressionVO = payload.to(EdgeFacialExpressionVO.class);
edgeFacialExpressionVO.setTerminalId(terminalId); edgeFacialExpressionVO.setRobotId(robotId);
edgeFacialExpressionVO.setDeviceId(deviceId); edgeFacialExpressionVO.setDeviceId(deviceId);
return edgeBioHeadService.setExpression(edgeFacialExpressionVO); return edgeBioHeadService.setExpression(edgeFacialExpressionVO);
@ -193,14 +193,14 @@ public class FlowActionExecutorService {
} }
private String executeInspectionAlertAction(ActionEnum action, JSONObject payload) { private String executeInspectionAlertAction(ActionEnum action, JSONObject payload) {
String terminalId = payload.getString("terminalId"); String robotId = payload.getString("robotId");
java.util.List<String> types = resolveInspectionAlertEventTypes(payload); java.util.List<String> types = resolveInspectionAlertEventTypes(payload);
InspectionAlertListenService.ListenState state; InspectionAlertListenService.ListenState state;
if (ActionEnum.INSPECTION_ALERT_LISTEN_START.equals(action)) { if (ActionEnum.INSPECTION_ALERT_LISTEN_START.equals(action)) {
state = inspectionAlertListenService.startListen(terminalId, types); state = inspectionAlertListenService.startListen(robotId, types);
} else { } else {
state = inspectionAlertListenService.stopListen(terminalId, types); state = inspectionAlertListenService.stopListen(robotId, types);
} }
return JSONObject.toJSONString(state); return JSONObject.toJSONString(state);
} }

View File

@ -124,22 +124,22 @@ public class FlowiseActionService {
log.info("command start: {}", System.currentTimeMillis()); log.info("command start: {}", System.currentTimeMillis());
String action = request.getAction(); String action = request.getAction();
FlowiseActionEnum actionEnum = FlowiseActionEnum.fromAction(action); FlowiseActionEnum actionEnum = FlowiseActionEnum.fromAction(action);
String terminalId = "4ed1246c465b97975f96c9ef8371a3bd"; String robotId = "4ed1246c465b97975f96c9ef8371a3bd";
String bioId = "bio_head"; String bioId = "bio_head";
switch (actionEnum) { switch (actionEnum) {
// ==== 表情 ==== // ==== 表情 ====
case SMILE: case SMILE:
log.info("高兴"); log.info("高兴");
return edgeBioHeadService.specialExpression(terminalId, bioId, 1); return edgeBioHeadService.specialExpression(robotId, bioId, 1);
case SAD: case SAD:
log.info("悲伤"); log.info("悲伤");
return edgeBioHeadService.specialExpression(terminalId, bioId, 4); return edgeBioHeadService.specialExpression(robotId, bioId, 4);
case SURPRISED: case SURPRISED:
log.info("惊讶"); log.info("惊讶");
return edgeBioHeadService.specialExpression(terminalId, bioId, 2); return edgeBioHeadService.specialExpression(robotId, bioId, 2);
case TIRED: case TIRED:
log.info("累了"); log.info("累了");
return edgeBioHeadService.specialExpression(terminalId, bioId, 5); return edgeBioHeadService.specialExpression(robotId, bioId, 5);
// ==== 动作 ==== // ==== 动作 ====
case AC_ON: case AC_ON:
@ -252,11 +252,11 @@ public class FlowiseActionService {
@NotNull @NotNull
private static EdgeCommonVO getEdgeCommonVO() { private static EdgeCommonVO getEdgeCommonVO() {
String terminalId = "4ed1246c465b97975f96c9ef8371a3bd"; String robotId = "4ed1246c465b97975f96c9ef8371a3bd";
String bioId = "bio_head"; String bioId = "bio_head";
EdgeCommonVO speakVO = new EdgeCommonVO(); EdgeCommonVO speakVO = new EdgeCommonVO();
speakVO.setTerminalId(terminalId); speakVO.setRobotId(robotId);
speakVO.setDeviceId(bioId); speakVO.setDeviceId(bioId);
return speakVO; return speakVO;
} }

View File

@ -136,11 +136,11 @@ public class TeDetectionItemServiceImpl extends ServiceImpl<TeDetectionItemMappe
continue; continue;
} }
// 移除"terminalId" 的参数 // 移除"robotId" 的参数
Iterator<Object> iterator = inputParams.iterator(); Iterator<Object> iterator = inputParams.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
JSONObject param = (JSONObject) iterator.next(); JSONObject param = (JSONObject) iterator.next();
if ("terminalId".equals(param.getString("name"))) { if ("robotId".equals(param.getString("name"))) {
iterator.remove(); iterator.remove();
} }
} }

View File

@ -0,0 +1,23 @@
package com.cmvr.test.flow.runtime.engine;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
public class RobotExecutionTargetTest {
@Test
public void robotIdentityIsUsedForLocking() {
RobotExecutionTarget target = new RobotExecutionTarget("robot-001");
assertEquals("robot:robot-001", target.lockKey());
}
@Test
public void pureLogicWorkflowDoesNotCreateARobotLock() {
RobotExecutionTarget target = new RobotExecutionTarget(null);
assertNull(target.lockKey());
}
}

View File

@ -27,7 +27,7 @@ public class EdgeDeviceCommandOperateServiceTest {
TaskNodeExecuteMessage message = new TaskNodeExecuteMessage(); TaskNodeExecuteMessage message = new TaskNodeExecuteMessage();
message.setAction(ActionEnum.DEVICE_EXECUTE_JSON_COMMAND); message.setAction(ActionEnum.DEVICE_EXECUTE_JSON_COMMAND);
message.setTerminalId("terminal-1"); message.setRobotId("terminal-1");
message.setInputParams(new JSONObject() message.setInputParams(new JSONObject()
.fluentPut("deviceId", "device-1") .fluentPut("deviceId", "device-1")
.fluentPut("requestJson", new JSONObject().fluentPut("command", "reset"))); .fluentPut("requestJson", new JSONObject().fluentPut("command", "reset")));
@ -35,7 +35,7 @@ public class EdgeDeviceCommandOperateServiceTest {
TaskNodeExecuteResult result = service.execute(message); TaskNodeExecuteResult result = service.execute(message);
assertTrue(result.isSuccess()); assertTrue(result.isSuccess());
assertEquals("terminal-1", captured.get().getTerminalId()); assertEquals("terminal-1", captured.get().getRobotId());
assertEquals("device-1", captured.get().getDeviceId()); assertEquals("device-1", captured.get().getDeviceId());
assertEquals("reset", JSONObject.parseObject(captured.get().getRequestJson()).getString("command")); assertEquals("reset", JSONObject.parseObject(captured.get().getRequestJson()).getString("command"));
assertEquals("ready", result.getOutputParams().getJSONObject("responseJson").getString("state")); assertEquals("ready", result.getOutputParams().getJSONObject("responseJson").getString("state"));
@ -43,20 +43,20 @@ public class EdgeDeviceCommandOperateServiceTest {
} }
@Test @Test
public void usesTerminalIdFromTrialPayload() { public void usesRobotIdFromTrialPayload() {
AtomicReference<EdgeSystemJsonCommandVO> captured = new AtomicReference<>(); AtomicReference<EdgeSystemJsonCommandVO> captured = new AtomicReference<>();
EdgeDeviceCommandOperateService service = new EdgeDeviceCommandOperateService( EdgeDeviceCommandOperateService service = new EdgeDeviceCommandOperateService(
edgeSystemService(captured, feedback(true, "", "ok"))); edgeSystemService(captured, feedback(true, "", "ok")));
TaskNodeExecuteMessage message = new TaskNodeExecuteMessage(); TaskNodeExecuteMessage message = new TaskNodeExecuteMessage();
message.setAction(ActionEnum.DEVICE_EXECUTE_JSON_COMMAND); message.setAction(ActionEnum.DEVICE_EXECUTE_JSON_COMMAND);
message.setInputParams(new JSONObject() message.setInputParams(new JSONObject()
.fluentPut("terminalId", "trial-terminal") .fluentPut("robotId", "trial-terminal")
.fluentPut("deviceId", "device-2") .fluentPut("deviceId", "device-2")
.fluentPut("requestJson", "{\"value\":1}")); .fluentPut("requestJson", "{\"value\":1}"));
TaskNodeExecuteResult result = service.execute(message); TaskNodeExecuteResult result = service.execute(message);
assertEquals("trial-terminal", captured.get().getTerminalId()); assertEquals("trial-terminal", captured.get().getRobotId());
assertEquals("ok", result.getOutputParams().getString("responseJson")); assertEquals("ok", result.getOutputParams().getString("responseJson"));
} }
@ -65,7 +65,7 @@ public class EdgeDeviceCommandOperateServiceTest {
EdgeDeviceCommandOperateService service = new EdgeDeviceCommandOperateService( EdgeDeviceCommandOperateService service = new EdgeDeviceCommandOperateService(
edgeSystemService(new AtomicReference<>(), feedback(true, "", "{}"))); edgeSystemService(new AtomicReference<>(), feedback(true, "", "{}")));
TaskNodeExecuteMessage message = new TaskNodeExecuteMessage(); TaskNodeExecuteMessage message = new TaskNodeExecuteMessage();
message.setTerminalId("terminal-1"); message.setRobotId("terminal-1");
message.setInputParams(new JSONObject() message.setInputParams(new JSONObject()
.fluentPut("deviceId", "device-1") .fluentPut("deviceId", "device-1")
.fluentPut("requestJson", "{invalid}")); .fluentPut("requestJson", "{invalid}"));
@ -78,7 +78,7 @@ public class EdgeDeviceCommandOperateServiceTest {
EdgeDeviceCommandOperateService service = new EdgeDeviceCommandOperateService( EdgeDeviceCommandOperateService service = new EdgeDeviceCommandOperateService(
edgeSystemService(new AtomicReference<>(), feedback(false, "command rejected", ""))); edgeSystemService(new AtomicReference<>(), feedback(false, "command rejected", "")));
TaskNodeExecuteMessage message = new TaskNodeExecuteMessage(); TaskNodeExecuteMessage message = new TaskNodeExecuteMessage();
message.setTerminalId("terminal-1"); message.setRobotId("terminal-1");
message.setInputParams(new JSONObject() message.setInputParams(new JSONObject()
.fluentPut("deviceId", "device-1") .fluentPut("deviceId", "device-1")
.fluentPut("requestJson", "{}")); .fluentPut("requestJson", "{}"));

View File

@ -138,7 +138,8 @@ public class TiProjectServiceImpl extends ServiceImpl<TiProjectMapper, TiProject
TeTaskExecuteProjectVO normalVO = new TeTaskExecuteProjectVO(); TeTaskExecuteProjectVO normalVO = new TeTaskExecuteProjectVO();
normalVO.setProjectId(taskExecuteProjectVO.getProjectId()); normalVO.setProjectId(taskExecuteProjectVO.getProjectId());
normalVO.setRunParams(taskExecuteProjectVO.getRunParams()); normalVO.setRunParams(taskExecuteProjectVO.getRunParams());
normalVO.setTerminalId(taskExecuteProjectVO.getTerminalId()); normalVO.setRobotId(taskExecuteProjectVO.getRobotId());
normalVO.setRobotId(taskExecuteProjectVO.getRobotId());
String instId = flowTaskRuntimeService.executeProjectTask(normalVO); String instId = flowTaskRuntimeService.executeProjectTask(normalVO);
// this.update( // this.update(
// new LambdaUpdateWrapper<TiProject>() // new LambdaUpdateWrapper<TiProject>()

View File

@ -135,7 +135,8 @@ public class ViProjectServiceImpl extends ServiceImpl<ViProjectMapper, ViProject
TeTaskExecuteProjectVO normalVO = new TeTaskExecuteProjectVO(); TeTaskExecuteProjectVO normalVO = new TeTaskExecuteProjectVO();
normalVO.setProjectId(taskExecuteProjectVO.getProjectId()); normalVO.setProjectId(taskExecuteProjectVO.getProjectId());
normalVO.setRunParams(taskExecuteProjectVO.getRunParams()); normalVO.setRunParams(taskExecuteProjectVO.getRunParams());
normalVO.setTerminalId(taskExecuteProjectVO.getTerminalId()); normalVO.setRobotId(taskExecuteProjectVO.getRobotId());
normalVO.setRobotId(taskExecuteProjectVO.getRobotId());
String instId = flowTaskRuntimeService.executeProjectTask(normalVO); String instId = flowTaskRuntimeService.executeProjectTask(normalVO);
this.update( this.update(
new ViProject(), new ViProject(),

View File

@ -6,6 +6,7 @@
DROP TABLE IF EXISTS `inspection_robot`; DROP TABLE IF EXISTS `inspection_robot`;
CREATE TABLE `inspection_robot` ( CREATE TABLE `inspection_robot` (
`id` varchar(64) NOT NULL COMMENT '主键ID', `id` varchar(64) NOT NULL COMMENT '主键ID',
`robot_id` varchar(128) DEFAULT NULL COMMENT 'QUIC上报的永久机器人ID',
`create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间', `create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT '' COMMENT '更新者', `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
@ -21,11 +22,49 @@ CREATE TABLE `inspection_robot` (
`status` char(1) DEFAULT '0' COMMENT '状态(0在线 1离线 2充电中 3巡检中)', `status` char(1) DEFAULT '0' COMMENT '状态(0在线 1离线 2充电中 3巡检中)',
`battery_level` int(3) DEFAULT NULL COMMENT '电量百分比', `battery_level` int(3) DEFAULT NULL COMMENT '电量百分比',
`current_position` varchar(200) DEFAULT NULL COMMENT '当前位置', `current_position` varchar(200) DEFAULT NULL COMMENT '当前位置',
`terminal_id` varchar(64) DEFAULT NULL COMMENT '终端ID', `connect_status` char(1) NOT NULL DEFAULT '0' COMMENT '连接状态(0离线 1在线)',
`quic_node_id` varchar(128) DEFAULT NULL COMMENT '当前QUIC节点实例',
`quic_session_id` varchar(128) DEFAULT NULL COMMENT '当前QUIC会话',
`quic_boot_id` varchar(128) DEFAULT NULL COMMENT '边缘端启动ID',
`observed_ip` varchar(64) DEFAULT NULL COMMENT 'QUIC连接来源IP',
`software_version` varchar(64) DEFAULT NULL COMMENT '边缘端软件版本',
`last_heartbeat_time` datetime(3) DEFAULT NULL COMMENT '最后心跳时间',
`archived_status` char(1) NOT NULL DEFAULT '0' COMMENT '归档状态(0正常 1归档)',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `uk_robot_code` (`robot_code`) UNIQUE KEY `uk_robot_code` (`robot_code`),
KEY `idx_inspection_robot_robot_id` (`robot_id`),
KEY `idx_inspection_robot_connect_status` (`connect_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='巡检机器人表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='巡检机器人表';
-- 1.1 QUIC自动发现的机器人设备表逻辑唯一性由后端校验
DROP TABLE IF EXISTS `inspection_robot_device`;
CREATE TABLE `inspection_robot_device` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`robot_id` varchar(128) NOT NULL COMMENT '永久机器人ID',
`device_id` varchar(128) NOT NULL COMMENT '边缘端设备ID',
`device_name` varchar(128) DEFAULT NULL COMMENT '设备显示名称',
`device_kind` int DEFAULT NULL COMMENT '设备类型',
`type_name` varchar(128) DEFAULT NULL COMMENT '设备实现类型',
`enabled` char(1) NOT NULL DEFAULT '1' COMMENT '是否启用',
`manager_state` int DEFAULT NULL COMMENT '设备管理状态',
`health_status` int DEFAULT NULL COMMENT '健康状态',
`online_status` char(1) NOT NULL DEFAULT '0' COMMENT '在线状态',
`has_error` char(1) NOT NULL DEFAULT '0' COMMENT '是否有错误',
`error_message` varchar(1000) DEFAULT NULL COMMENT '错误信息',
`status_updated_time` datetime(3) DEFAULT NULL COMMENT '边缘端状态更新时间',
`last_seen_time` datetime(3) DEFAULT NULL COMMENT '最后发现时间',
`offline_time` datetime(3) DEFAULT NULL COMMENT '离线时间',
`create_by` varchar(64) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_by` varchar(64) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`remark` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_robot_device_robot_id` (`robot_id`),
KEY `idx_robot_device_identity` (`robot_id`, `device_id`),
KEY `idx_robot_device_online` (`robot_id`, `online_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='机器人自动发现设备';
-- 2. 巡检地图表 -- 2. 巡检地图表
DROP TABLE IF EXISTS `inspection_map`; DROP TABLE IF EXISTS `inspection_map`;
CREATE TABLE `inspection_map` ( CREATE TABLE `inspection_map` (

View File

@ -0,0 +1,4 @@
-- The permanent robot_id is the only edge routing identity.
-- Historical data is intentionally not migrated.
alter table inspection_robot drop column terminal_id;
alter table te_task_inst drop column terminal_id;

View File

@ -0,0 +1,45 @@
-- Existing robot rows are intentionally left with robot_id = NULL.
alter table inspection_robot
add column robot_id varchar(128) null comment 'Permanent robot identity reported by QUIC' after id,
add column connect_status char(1) not null default '0' comment '0 offline, 1 online' after robot_id,
add column quic_node_id varchar(128) null comment 'Current QUIC node instance' after connect_status,
add column quic_session_id varchar(128) null comment 'Current QUIC session' after quic_node_id,
add column quic_boot_id varchar(128) null comment 'Current edge boot id' after quic_session_id,
add column observed_ip varchar(64) null comment 'Observed QUIC source IP' after quic_boot_id,
add column software_version varchar(64) null comment 'Edge software version' after observed_ip,
add column last_heartbeat_time datetime(3) null comment 'Last accepted heartbeat time' after software_version,
add column archived_status char(1) not null default '0' comment '0 active, 1 archived' after last_heartbeat_time,
add index idx_inspection_robot_robot_id (robot_id),
add index idx_inspection_robot_connect_status (connect_status);
create table inspection_robot_device (
id varchar(64) not null,
robot_id varchar(128) not null,
device_id varchar(128) not null,
device_name varchar(128) null,
device_kind int null,
type_name varchar(128) null,
enabled char(1) not null default '1',
manager_state int null,
health_status int null,
online_status char(1) not null default '0',
has_error char(1) not null default '0',
error_message varchar(1000) null,
status_updated_time datetime(3) null,
last_seen_time datetime(3) null,
offline_time datetime(3) null,
create_by varchar(64) null,
create_time datetime null,
update_by varchar(64) null,
update_time datetime null,
remark varchar(500) null,
primary key (id),
index idx_robot_device_robot_id (robot_id),
index idx_robot_device_identity (robot_id, device_id),
index idx_robot_device_online (robot_id, online_status)
) comment='Devices discovered from robot QUIC heartbeat';
-- New task instances record the permanent identity. Legacy instances remain NULL.
alter table te_task_inst
add column robot_id varchar(128) null comment 'Permanent robot identity' after task_id,
add index idx_te_task_inst_robot_id (robot_id);