跳到主要内容

协议层接口

协议层接口用于维护 NRCP 会话、建立 Flow、关闭 Flow、报告错误和执行恢复流程。本节只定义通用报文结构,不定义具体业务 Operation 或业务 Flow

ACK

ACK 使用 ACK Message Type,Payload Codec 为 JSON,related_id 指向被确认消息的 message_id

Payload:

{
"status": "received",
"message": "optional message"
}

字段说明:

字段类型必填说明
statusstringreceivedaccepted
messagestring可读说明

received 表示消息已收到并解析成功,accepted 表示消息已被协议状态机接受。业务执行结果不由 ACK 表达

Error

Error 使用 ERROROPERATION_ERROR Message Type,Payload Codec 为 JSON,related_id 指向失败消息的 message_id

Payload:

{
"category": "flow",
"code": "FLOW_NOT_FOUND",
"message": "flow context not found",
"retryable": false,
"recoverable": true,
"details": {}
}

字段说明:

字段类型必填说明
categorystring错误分类
codestring错误码
messagestring可读说明
retryablebool是否允许按本地策略重试
recoverablebool是否可通过恢复流程处理
detailsobject扩展字段

Subscribe Flow

Subscribe Flow 用于 Sub 向 Pub 申请订阅某个 Flow

FLOW_SUBSCRIBE_REQUEST

Payload:

{
"flow_name": "/battery_statuses",
"expected_qos": {
"reliability": "best_effort",
"ttl_us": 200000,
"liveliness_timeout_us": 1000000,
"max_rate_hz": 20,
"burst_limit": 4,
"max_bytes_per_sec": 65536
}
}

字段说明:

字段类型必填说明
flow_namestring目标 Flow Name
expected_qosobjectSub 期望 QoS

FLOW_SUBSCRIBE_RESPONSE

Payload:

{
"accepted": true,
"flow_name": "/battery_statuses",
"channel_id": 16385,
"flow_epoch": 1,
"payload_codec": "raw_binary",
"schema": "BatteryStatus",
"qos_grant": {
"reliability": "best_effort",
"ttl_us": 200000,
"liveliness_timeout_us": 1000000,
"max_rate_hz": 20,
"burst_limit": 4,
"max_bytes_per_sec": 65536
}
}

字段说明:

字段类型必填说明
acceptedbool是否接受订阅
flow_namestringFlow Name
channel_iduint16接受时必填Server 分配的 Flow Channel ID
flow_epochuint32接受时必填Flow 版本
payload_codecstring接受时必填Flow Data 的 Payload Codec
schemastring接受时必填Flow Data Schema
qos_grantobject接受时必填最终 QoS Grant
errorobject拒绝时必填拒绝原因

FLOW_SUBSCRIBE_ACK

Payload:

{
"accepted": true,
"flow_name": "/battery_statuses",
"channel_id": 16385,
"flow_epoch": 1
}

Pub 收到 FLOW_SUBSCRIBE_ACK 后才开始发送 FLOW_DATA

Publish Flow

Publish Flow 用于 Pub 通知 Sub 自己准备发布某个 Flow

FLOW_PUBLISH_REQUEST

Payload:

{
"flow_name": "/cmd_vel",
"payload_codec": "raw_binary",
"schema": "Twist",
"expected_qos": {
"reliability": "best_effort",
"ttl_us": 50000,
"liveliness_timeout_us": 200000,
"max_rate_hz": 50,
"burst_limit": 4,
"max_bytes_per_sec": 65536
}
}

FLOW_PUBLISH_RESPONSE

Payload:

{
"accepted": true,
"flow_name": "/cmd_vel",
"channel_id": 8193,
"flow_epoch": 1,
"qos_grant": {
"reliability": "best_effort",
"ttl_us": 50000,
"liveliness_timeout_us": 200000,
"max_rate_hz": 50,
"burst_limit": 4,
"max_bytes_per_sec": 65536
}
}

FLOW_PUBLISH_ACK

Payload:

{
"accepted": true,
"flow_name": "/cmd_vel",
"channel_id": 8193,
"flow_epoch": 1
}

Pub 发送 ACK 后允许开始发送 FLOW_DATA

Flow Close

Pub 和 Sub 均允许主动关闭 Flow,但必须通过 FLOW_CLOSE 通知对端

Payload:

{
"flow_name": "/cmd_vel",
"channel_id": 8193,
"flow_epoch": 1,
"reason": "UNSUBSCRIBE",
"message": "client stops publishing",
"final_sequence": 4096
}

常见 reason

  • NORMAL
  • UNSUBSCRIBE
  • PUBLISHER_STOPPED
  • QOS_NOT_ACCEPTABLE
  • FLOW_EXPIRED
  • SESSION_DEGRADED
  • RATE_LIMITED
  • PAYLOAD_SCHEMA_CHANGED
  • INTERNAL_ERROR

Recovery

RECOVER_REQUEST 由 Client 发起,用于在同一 QUIC 连接上恢复 NRCP 层状态

Payload:

{
"known_flows": [
{
"flow_name": "/battery_statuses",
"channel_id": 16385,
"flow_epoch": 1,
"last_sequence": 2048
}
]
}

RECOVER_RESPONSE Payload:

{
"status": "REBUILD_REQUIRED",
"flows": [
{
"flow_name": "/battery_statuses",
"channel_id": 16385,
"flow_epoch": 2,
"action": "resubscribe"
}
]
}

status 可选值:

  • RECOVERED
  • REBUILD_REQUIRED
  • SESSION_EXPIRED