GrabBag/App/ParkingSpaceGuide/Doc/停机引导对接协议.md

369 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 停机引导对接协议
## 版本信息
| 项目 | 内容 |
| --- | --- |
| 文档版本 | V1.1 |
| 更新日期 | 2026-07-21 |
| 适用范围 | UDP 组播状态包、HTTP 当前状态查询 |
| 说明 | 按 0720 LED 显示式样更新引导流程和显示规则。 |
## 1. 协议概述
停机引导系统支持通过组播主动发送检测结果,也支持作为 HTTP 服务端,由现场系统按需查询当前停机状态。现场系统获取数据后,可解析当前停机位、目标编号、机型、到停止线距离、机身偏转角等信息。
协议特点:
- 传输方式:组播,基于 UDP 数据报
- 查询方式HTTP停机引导系统作为服务端现场系统作为客户端
- 数据格式JSON
- 字符编码UTF-8
- 组播数据方向:停机引导系统发送,现场系统接收
- HTTP 数据方向:现场系统请求,停机引导系统响应
- 组播应答机制:无应答
- HTTP 应答机制:请求-响应
- 组播重发机制:无重发
- 组播发送时机:每次检测结果更新时发送 1 包数据
## 2. 组播网络参数
组播网络参数由停机引导系统配置。
| 参数 | 默认值 | 说明 |
| --- | --- | --- |
| enabled | true | 是否启用组播发送。 |
| address | 239.255.0.1 | 组播地址。 |
| port | 8800 | 组播端口。 |
| targetId | T001 | 目标编号,由软件配置或现场系统约定。 |
| parkId | P01 | 当前停机位编号,由软件配置。 |
配置兜底规则:
- 组播地址为空时使用 `239.255.0.1`
- 端口非法时使用 `8800`
- `targetId` 为空时使用 `T001`
- `parkId` 为空时使用 `P01`
## 3. HTTP 查询对接
HTTP 查询用于现场系统主动获取当前停机状态。停机引导系统作为 HTTP 服务端,返回最近一次检测状态;如果系统刚启动且尚未产生检测结果,则返回失败或无结果数据示例中的状态包。
HTTP 服务参数由停机引导系统配置,不放在参数配置界面。
| 参数 | 默认值 | 说明 |
| --- | --- | --- |
| enabled | true | 是否启用 HTTP 状态服务。 |
| address | 0.0.0.0 | HTTP 服务监听地址;`0.0.0.0` 表示监听本机所有网卡。 |
| port | 8801 | HTTP 服务端口。 |
| maxQueued | 16 | 等待处理的最大连接队列数。 |
| maxThreads | 4 | 最大处理线程数。 |
请求方式:
| 项目 | 内容 |
| --- | --- |
| URL | `http://<停机引导设备IP>:8801/api/parking/status` |
| Method | `GET` |
| Request Body | 无 |
| Response Content-Type | `application/json; charset=utf-8` |
兼容路径:
- `/`
- `/status`
- `/api/status`
- `/api/parking/status`
响应数据:
- HTTP 状态码 `200`:返回当前停机状态 JSON数据内容与 UDP 组播状态包一致,字段与第 4 至第 7 节定义一致。
- HTTP 状态码 `404`:请求路径不存在。
- HTTP 状态码 `405`:请求方法不支持。
现场系统建议按 `timestamp` 判断数据是否更新,避免重复处理同一包状态。
## 4. JSON 数据格式
每包组播数据为一个 JSON 对象。实际发送时为紧凑 JSON不包含格式化换行。
HTTP 查询接口返回的数据内容与 UDP 组播数据一致,字段、含义、单位和取值规则相同,仅传输方式不同。
本软件每次只检测一个飞机停机位,因此结果字段直接放在顶层对象中,不包含结果数组。
## 5. 成功数据示例
```json
{
"protocol": "ParkingSpaceGuideResult",
"version": "1.1",
"success": true,
"hasResult": true,
"targetId": "T001",
"parkId": "P01",
"expectedModelType": "A320",
"modelType": "飞机",
"modelMatched": false,
"modelVerificationSupported": false,
"modelConfidence": 0.932,
"personInChockRegion": true,
"chocksConfirmed": true,
"personCount": 1,
"personConfidence": 0.907,
"guideStateCode": 21,
"distanceToStop": 50.0,
"bodyYawAngle": 0.0,
"lateralOffset": 0.0,
"aircraftSpeed": 0.4,
"hasException": false,
"guideText": "CHOCK ON",
"message": "轮挡区域人员检测已确认,轮挡固定流程完成",
"errorCode": 0,
"timestamp": 1783339200000
}
```
## 6. 失败或无结果数据示例
检测失败、无有效目标、视野受阻等情况下,系统仍可发送状态包。此时 `success=false``hasResult=false`
```json
{
"protocol": "ParkingSpaceGuideResult",
"version": "1.1",
"success": false,
"hasResult": false,
"targetId": "T001",
"parkId": "P01",
"expectedModelType": "",
"modelType": "未知",
"modelMatched": false,
"modelVerificationSupported": true,
"modelConfidence": 0.0,
"personInChockRegion": false,
"chocksConfirmed": false,
"personCount": 0,
"personConfidence": 0.0,
"guideStateCode": 0,
"distanceToStop": 0.0,
"bodyYawAngle": 0.0,
"lateralOffset": 0.0,
"aircraftSpeed": 0.0,
"hasException": true,
"guideText": "",
"message": "无有效结果",
"errorCode": -1,
"timestamp": 1783339200000
}
```
## 7. 字段定义
| 字段 | 类型 | 单位 | 来源 | 说明 |
| --- | --- | --- | --- | --- |
| protocol | string | - | 软件固定值 | 协议名称,固定为 `ParkingSpaceGuideResult`。 |
| version | string | - | 软件固定值 | 协议版本,当前为 `1.1`。 |
| success | bool | - | 软件根据检测结果生成 | `errorCode=0` 且存在有效结果时为 `true`。 |
| hasResult | bool | - | 软件根据检测结果生成 | 本包是否包含有效结果。 |
| targetId | string | - | 软件界面组播参数配置 | 目标编号,默认 `T001`。 |
| parkId | string | - | 软件界面组播参数配置 | 当前停机位编号,默认 `P01`。 |
| expectedModelType | string | - | 操作员开始前选择 | 本次引导的期望机型;当前支持 `A320``B737`。 |
| modelType | string | - | 平面相机识别结果 | 当前通用模型检测到飞机时为“飞机”;未来细分模型可返回 A320/B737尚无结果时为“未知”。 |
| modelMatched | bool | - | 软件校验结果 | 实际机型与期望机型一致且置信度达到阈值时为 `true`。 |
| modelVerificationSupported | bool | - | 模型能力 | 当前模型是否支持 A320/B737 细分机型校验;通用飞机检测模型为 `false`。 |
| modelConfidence | number | - | 平面相机识别结果 | 实际识别置信度;未识别时为 `0`。 |
| personInChockRegion | bool | - | 平面相机检测结果 | 裁剪后的轮挡 ROI 内是否检测到人员。 |
| chocksConfirmed | bool | - | 软件连续帧判定 | 人员连续进入轮挡 ROI 达到配置次数后为 `true`。 |
| personCount | number | 人 | 平面相机检测结果 | 本次检测中位于轮挡 ROI 的人数。 |
| personConfidence | number | - | 平面相机检测结果 | 轮挡 ROI 内人员的最高置信度。 |
| guideStateCode | number | - | 算法检测结果或软件状态 | 引导状态序号;取值见“引导状态枚举”,无有效状态时为 `0`。 |
| distanceToStop | number | 毫米 | 算法检测结果 | 到停止线距离。正负方向按现场标定坐标定义执行。 |
| bodyYawAngle | number | 度 | 算法检测结果 | 机身偏转角。正负方向按现场标定坐标定义执行。 |
| lateralOffset | number | 毫米 | 算法检测结果 | 相对引导中心线的横向偏移。 |
| aircraftSpeed | number | 米/秒 | 算法检测结果 | 飞机接近速度。 |
| hasException | bool | - | 软件根据 `errorCode``guideStateCode` 生成 | 是否有异常;`errorCode != 0``guideStateCode` 属于异常情况时为 `true`。 |
| guideText | string | - | 算法检测结果 | 引导状态或显示文本。 |
| message | string | - | 算法结果或软件状态 | 本次数据说明或异常原因。 |
| errorCode | number | - | 算法返回值或软件状态 | 错误码。`0` 表示正常,非 `0` 表示异常或无有效结果。 |
| timestamp | number | 毫秒 | 软件发送时系统时间 | Unix 毫秒时间戳。 |
## 8. 引导状态枚举
`guideStateCode` 取值来源于 `App/ParkingSpaceGuide/Demand/T1-42_LED显示式样开发交底-0720.xlsx` 中“序号”列。绿色行发送 LED 内容,白色行发送空白动态区内容使 LED 清屏;清屏不影响 UI、UDP 或 HTTP 中的状态数据。
| 序号 | 流程/功能 | LED 输出 | 进入条件 |
| --- | --- | --- | --- |
| 1 | 泊位引导启动 | START + 选择机型 | 已点击开始,且有效点云测得距离不大于 100 m尚无有效测量时保持序号 12 等待状态。 |
| 2 | 捕获 | CAPTURE + 选择机型 | 距离大于 25 m 且不大于 80 m。 |
| 3 | 跟踪 | 清屏 | 内部跟踪状态。 |
| 4 | 接近率 | 清屏 | 内部接近率状态。 |
| 5 | 对准中心线 | 距离 + 选择机型 | 距离不大于 25 m横向和航向在配置容差内。 |
| 6 | 慢速 | SLOW + 距离 | 距离不大于 15 m接近速度不小于 2 m/s。 |
| 7 | 方位引导 | 距离 + 横向偏差 | 距离不大于 25 m横向或航向超出配置容差。 |
| 8 | 到达停止位置 | STOP | 到停止线距离在正负 0.1 m 内。 |
| 9 | 泊位引导完成 | 清屏 | 停止位置稳定,且人员检测功能被禁用时结束会话。 |
| 10 | 越位 | TOO FAR | 越过停止线不小于 0.5 m。 |
| 11 | 提前停止 | 清屏 | 内部提前停止判定。 |
| 12 | 等待 | 清屏 | 尚未进入 100 m 引导范围或系统空闲。 |
| 13 | 异常慢速-恶劣天气 | 清屏 | 外部或内部天气状态。 |
| 14 | 异常慢速-泊位引导中飞机丢失 | 清屏 | 连续丢失达到配置帧数。 |
| 15 | 飞机验证失败 | STOP + ID FAIL | 距离不大于 25 m平面相机两次验证仍与选择机型不一致。 |
| 16 | 机位受阻 | WAIT + GATE BLOCK | 外部机位受阻输入。 |
| 17 | 视野受阻 | WAIT + VIEW BLOCK | 外部视野受阻输入。 |
| 18 | SBU停止 | 清屏 | 外部 SBU 状态。 |
| 19 | 速度过快 | 清屏 | 内部速度状态。 |
| 20 | 紧急停止 | STOP | 板载急停输入有效。 |
| 21 | 挡轮挡 | CHOCK ON | 飞机停稳后,轮挡 ROI 裁剪图连续检测到人员达到稳定次数。发布本状态后结束会话并进入休眠。 |
| 22 | 系统错误 | ERROR + 错误代码 | 系统自检或算法错误。 |
| 23 | 系统故障 | 清屏 | 系统故障。 |
| 24 | 电源故障 | 清屏 | 电源故障。 |
当前协议中,`guideStateCode``10``20``22``24` 时按异常情况处理,并使 `hasException=true`;状态 `21 / CHOCK ON` 是正常完成状态。
## 9. 对接说明
现场系统如果只需要核心结果,建议优先解析以下字段:
- `targetId`
- `parkId`
- `expectedModelType`
- `modelType`
- `modelMatched`
- `modelVerificationSupported`
- `modelConfidence`
- `personInChockRegion`
- `chocksConfirmed`
- `personCount`
- `personConfidence`
- `guideStateCode`
- `distanceToStop`
- `bodyYawAngle`
- `lateralOffset`
- `aircraftSpeed`
- `hasException`
- `guideText`
- `errorCode`
- `timestamp`
状态判断建议:
- `success=true``hasResult=true`:本包包含有效引导结果。
- `success=false`:本包为异常、无目标或无有效结果状态包。
- `errorCode=0`:系统正常输出。
- `errorCode != 0`:接收端应结合 `message``guideText` 做异常显示或记录。
- `hasException=true`:本包存在异常,对应 `errorCode != 0` 或引导状态枚举中的异常情况。
注意事项:
- 组播数据不保证到达和顺序,接收端应以最新 `timestamp` 数据为准。
- 接收端应允许 JSON 增加字段,避免因协议扩展导致解析失败。
- 数值单位以本协议字段定义为准。
- 文本状态建议按原字符串解析。
## 10. ParkingSpaceGuideView 远程发现、控制和订阅协议
`ParkingSpaceGuideApp` 在后台提供远程服务,不改变本机现有页面和操作逻辑。独立程序 `ParkingSpaceGuideView` 通过 UDP 发现服务端,通过 ZeroMQ REQ/REP 发送控制命令,并通过 ZeroMQ PUB/SUB 接收实时引导结果。
默认参数由 `ParkingSpaceGuideConfig/config/config.xml``RemoteView` 节点配置:
```xml
<RemoteView enabled="true" discoveryPort="5555" controlPort="15655"
publishPort="15656" topic="parking_guide"/>
```
端口用途:
| 参数 | 默认值 | 传输方式 | 用途 |
| --- | ---: | --- | --- |
| discoveryPort | 5555 | UDP | View 广播搜索App 单播响应。 |
| controlPort | 15655 | ZeroMQ REQ/REP | 选择机型、开始、停止和查询状态。 |
| publishPort | 15656 | ZeroMQ PUB/SUB | 发布完整引导状态。 |
| topic | parking_guide | ZeroMQ topic | 状态订阅主题,客户端按完整主题校验。 |
### 10.1 UDP 发现
View 未连接设备时每 1 秒向全局广播地址和所有活动 IPv4 网卡的子网广播地址发送:
```json
{"cmd":"discover","service":"ParkingSpaceGuide","protocol":"ParkingSpaceGuideRemote"}
```
App 响应发送方的源 IP 和源端口:
```json
{
"ok": true,
"code": 0,
"cmd": "discover",
"protocol": "ParkingSpaceGuideRemote",
"version": "1.0",
"service": "ParkingSpaceGuide",
"deviceName": "ParkingSpaceGuideApp",
"deviceId": "设备唯一标识",
"controlPort": 15655,
"publishPort": 15656,
"topic": "parking_guide",
"guidanceRunning": false,
"timestamp": 1783339200000
}
```
客户端必须同时校验 `ok``cmd``protocol``service`,控制端口、发布端口及主题有效后才建立连接。未发现设备时持续广播;通信超时后释放旧订阅并恢复搜索。
### 10.2 ZeroMQ 控制
控制请求和应答均为单个紧凑 JSON。当前命令如下
| cmd | 请求附加字段 | 说明 |
| --- | --- | --- |
| start | `modelType`,允许空值、`A320``B737` | 开始完整停机引导;空值表示以实际识别机型完成流程。 |
| stop | 无 | 停止当前引导。 |
| get_status | 无 | 获取当前完整结果,供刚连接时补首帧。 |
| get_info | 无 | 获取服务端和端口信息。 |
| ping | 无 | 通信心跳。 |
开始请求示例:
```json
{"cmd":"start","protocol":"ParkingSpaceGuideRemote","modelType":"A320"}
```
不指定期望机型时发送空值:
```json
{"cmd":"start","protocol":"ParkingSpaceGuideRemote","modelType":""}
```
成功响应保留发现响应中的公共字段,并返回 `ok=true``code=0`、对应 `cmd``guidanceRunning`。失败响应示例:
```json
{
"ok": false,
"code": -3,
"cmd": "start",
"message": "服务端拒绝启动停机引导,请检查设备或安全状态",
"protocol": "ParkingSpaceGuideRemote",
"version": "1.0"
}
```
`get_status` 成功响应在 `status` 字段内携带第 48 节定义的完整 `ParkingSpaceGuideResult` 对象。View 的控制请求在后台线程执行,界面线程不会等待 ZeroMQ 超时。
### 10.3 ZeroMQ 状态订阅
App 在配置的 topic 下发布双帧消息:第一帧为 UTF-8 topic `parking_guide`,第二帧为第 48 节定义的完整结果 JSON。View 只接受完整 topic 匹配,并把接收线程的数据排队投递到界面线程。
View 每 3 秒发送一次 `ping`。请求或应答失败、3 秒内未收到控制应答、协议不匹配时View 将当前连接标记为异常,关闭订阅并重新进入每秒一次的 UDP 搜索。
### 10.4 ARM 程序与 DEB
`ParkingSpaceGuideView` 是独立 ARM AArch64 桌面程序和独立 deb 项目:
```text
./GrabBagPrj/project_release.sh ParkingSpaceGuideView
```
打包注册表会安装 View 可执行文件、桌面入口、程序图标及 ARM `libzmq.so`。ZeroMQClient、ZeroMQPubSub 和 VrUtils 为静态工程链接进入可执行文件。View 的 deb 配置为 `opencv=none``device_copy=none`,不会带入服务端的 OpenCV、相机 SDK、算法模型或 GPIO 文件。
引导显示内容由 `GuideDisplayWidget` 使用 `QPainter` 实时绘制,不依赖 24 张状态 PNG因此在 ARM 显示器上放大或高 DPI 缩放时不会产生位图模糊。qrc 中的程序图标编译进可执行文件deb 另外将同一图标安装到系统桌面图标目录,不依赖源码路径。