车载以太网之要火系列 - 第59篇郭大侠学DDS(QoS实现):纸上约定落实践,报文头里藏信笺
写在开篇·蓉儿继续挖坑上回说到郭靖搞清楚了QoS策略的含义和作用——可靠性、优先级、延迟预算、持久性……一套一套的。郭靖合上笔记本眉头微皱“蓉儿QoS我大概懂了。但我还有个疑问——这些QoS配置是只在发布者和订阅者本地生效还是也会写在报文里如果写在报文里对方怎么知道我的QoS要求”黄蓉咬了口糖葫芦“问得好纸上约定落实践报文头里藏玄机。今天就把QoS在DDS数据帧中的实现讲透——用刹车指令RELIABLE和摄像头图像BEST_EFFORT两个完整的数据流对比让你亲眼看到QoS是怎么在报文里体现的。”一、QoS的“两个战场”黄蓉在白板上画了一张图把QoS分成两部分┌─────────────────────────────────────────────────────────────────────┐ │ QoS的“两个战场” │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ ① 本地战场ECU内部 │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 应用代码设置QoS可靠性、优先级、延迟预算等 │ │ │ │ ↓ │ │ │ │ DDS协议栈根据QoS配置行为 │ │ │ │ ├── 可靠传输 → 启用重传机制 │ │ │ │ ├── 高优先级 → 放在发送队列前面 │ │ │ │ └── 延迟预算 → 启动超时计时器 │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ ② 网络战场ECU之间 │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ RTPS报文中的QoS相关字段 │ │ │ │ ├── 可靠性信息在发现阶段交换 │ │ │ │ ├── 持久性信息在发现阶段交换 │ │ │ │ └── 历史记录信息在发现阶段交换 │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘关键点有些QoS只在本地生效如优先级有些QoS必须在报文中告知对方如可靠性。二、完整数据流一刹车指令RELIABLE HIGH 1ms2.1 场景设定配置项值Topic/vehicle/brake/cmd可靠性RELIABLE必须确认优先级HIGH插队发送延迟预算1ms超时丢弃2.2 发现阶段SEDP广播中的QoS信息制动ECU发布者广播┌─────────────────────────────────────────────────────────────────────┐ │ SEDP广播制动ECU → 全网 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Writer宣告 │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Topic /vehicle/brake/cmd │ │ │ │ Type BrakeCommand │ │ │ │ QoS { │ │ │ │ reliability RELIABLE ← 告诉对方“我需要确认” │ │ │ │ durability VOLATILE ← 不需要历史数据 │ │ │ │ history KEEP_LAST(1) ← 只保留最新1条 │ │ │ │ } │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘域控制器订阅者广播┌─────────────────────────────────────────────────────────────────────┐ │ SEDP广播域控制器 → 全网 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Reader宣告 │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Topic /vehicle/brake/cmd │ │ │ │ Type BrakeCommand │ │ │ │ QoS { │ │ │ │ reliability RELIABLE ← 告诉对方“我需要确认” │ │ │ │ durability VOLATILE ← 不需要历史数据 │ │ │ │ history KEEP_LAST(1) ← 只保留最新1条 │ │ │ │ } │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘2.3 数据传输阶段DATA报文 Heartbeat AckNack时序图QoS体现text制动ECUWriter 域控制器Reader │ │ │ RELIABLE的体现 │ │ │ │ ① DATASN1刹车指令 │ │ ┌─────────────────────────────────────┐ │ │ │ DATA子消息 │ │ │ │ writerSN 1 │ │ │ │ serializedPayload 刹车指令数据 │ │ │ └─────────────────────────────────────┘ │ │──────────────────────────────────────────│ │ │ │ ② 收到数据回复AckNack │ │ ┌─────────────────────────────────────┐ │ │ │ AckNack子消息 │ │ │ │ readerSN状态 已收到1 │ │ │ └─────────────────────────────────────┘ │ │──────────────────────────────────────────│ │ │ │ 优先级的体现 │ │ 假设同时有刹车指令和视频流在发 │ │ │ │ ③ 刹车指令HIGH优先级 │ │ ┌─────────────────────────────────────┐ │ │ │ 放入发送队列前端 → 立即发送 │ │ │ └─────────────────────────────────────┘ │ │──────────────────────────────────────────│ │ │ │ ④ 视频流NORMAL优先级 │ │ ┌─────────────────────────────────────┐ │ │ │ 放入发送队列后端 → 排队等待 │ │ │ └─────────────────────────────────────┘ │ │──────稍后发送─────────────────────── │ │ │ │ 延迟预算的体现 │ │ │ │ ⑤ 刹车指令发出启动1ms计时器 │ │ │ │ ⑥ 1ms内没收到确认 │ │ ┌─────────────────────────────────┐ │ │ │ 重发刹车指令 │ │ │ │ 或应用层报超时 │ │ │ └─────────────────────────────────┘ │ │ │2.4 完整RTPS DATA报文中的体现刹车指令的DATA报文带QoS相关字段text┌─────────────────────────────────────────────────────────────────────┐ │ 刹车指令 DATA子消息RELIABLE HIGH │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Submessage ID 0x15DATA │ │ Flags 0x03大端 内联QoS │ │ Submessage Length 0x003048字节 │ │ │ │ readerId 0x00000100匹配的Reader │ │ writerId 0x00000200发送的Writer │ │ writerSN 0x0000000000000001序列号1用于可靠传输 │ │ │ │ inlineQoS内联QoS │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 【关键】这里可以携带临时QoS信息 │ │ │ │ - 延迟预算1ms │ │ │ │ - 优先级HIGH255 │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ serializedPayload 01 F4 01 65 5B 5B 00刹车指令数据 │ │ │ └─────────────────────────────────────────────────────────────────────┘三、完整数据流二摄像头图像BEST_EFFORT NORMAL 100ms3.1 场景设定配置项值Topic/vehicle/camera/front可靠性BEST_EFFORT尽力而为优先级NORMAL正常排队延迟预算100ms100ms内到即可3.2 发现阶段SEDP广播中的QoS信息摄像头ECU发布者广播┌─────────────────────────────────────────────────────────────────────┐ │ SEDP广播摄像头ECU → 全网 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Writer宣告 │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Topic /vehicle/camera/front │ │ │ │ Type Image │ │ │ │ QoS { │ │ │ │ reliability BEST_EFFORT ← 告诉对方“不需要确认” │ │ │ │ durability VOLATILE ← 不需要历史数据 │ │ │ │ history KEEP_LAST(1) ← 只保留最新1帧 │ │ │ │ } │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘域控制器订阅者广播┌─────────────────────────────────────────────────────────────────────┐ │ SEDP广播域控制器 → 全网 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Reader宣告 │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Topic /vehicle/camera/front │ │ │ │ Type Image │ │ │ │ QoS { │ │ │ │ reliability BEST_EFFORT ← 告诉对方“不需要确认” │ │ │ │ durability VOLATILE ← 不需要历史数据 │ │ │ │ history KEEP_LAST(1) ← 只保留最新1帧 │ │ │ │ } │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘3.3 数据传输阶段DATA报文无确认时序图QoS体现摄像头ECUWriter 域控制器Reader │ │ │ BEST_EFFORT的体现 │ │ │ │ ① DATASN1图像帧1 │ │ ┌─────────────────────────────────────┐ │ │ │ DATA子消息 │ │ │ │ writerSN 1 │ │ │ │ serializedPayload 图像数据 │ │ │ └─────────────────────────────────────┘ │ │──────────────────────────────────────────│ │ │ │ 【没有AckNack发完不管】 │ │ │ │ ② DATASN2图像帧2 │ │──────────────────────────────────────────│ │ │ │ 丢帧场景 │ │ │ │ ③ DATASN3图像帧3 │ │──────────────────────────────────────────│网络丢包没收到 │ │ │ ④ DATASN4图像帧4 │ │──────────────────────────────────────────│ │ │ │ 【摄像头不知道帧3丢了不会重传】 │ │ 【域控丢了帧3也不会要求重传】 │ │ │3.4 完整RTPS DATA报文中的体现摄像头图像的DATA报文BEST_EFFORT┌─────────────────────────────────────────────────────────────────────┐ │ 摄像头图像 DATA子消息BEST_EFFORT │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Submessage ID 0x15DATA │ │ Flags 0x01大端无内联QoS │ │ Submessage Length 0x20008192字节 │ │ │ │ readerId 0x00000100匹配的Reader │ │ writerId 0x00000300发送的Writer │ │ writerSN 0x0000000000000001序列号1 │ │ │ │ 【没有inlineQoS】 │ │ │ │ serializedPayload 图像数据1920×1080×3字节 │ │ │ └─────────────────────────────────────────────────────────────────────┘四、QoS对比总结黄蓉画了一张对比表QoS策略刹车指令摄像头图像报文中的体现可靠性RELIABLEBEST_EFFORTSEDP广播中的reliability字段确认机制✅ 有AckNack❌ 无DATA后有AckNack子消息重传机制✅ 丢包重传❌ 不重传Heartbeat AckNack交互优先级HIGHNORMAL本地队列排序不在报文里延迟预算1ms100msinlineQoS中的延迟预算字段内联QoS✅ 有❌ 无DATA子消息中的inlineQoS适用场景安全关键实时感知—五、关键发现QoS在报文中的“藏身之处”黄蓉总结出QoS在RTPS报文中的三个位置位置携带的QoS信息何时出现SEDP广播可靠性、持久性、历史记录发现阶段建立连接前DATA子消息的inlineQoS延迟预算、优先级、时间戳传输阶段可选不常用Heartbeat/AckNack子消息可靠性相关的序列号状态传输阶段仅RELIABLE时郭靖的理解“SEDP里的QoS是‘自我介绍’告诉对方‘我是什么要求’inlineQoS是‘临时备注’告诉对方‘这次数据有特殊要求’Heartbeat/AckNack是‘可靠性的体现’只在RELIABLE时出现。”六、黄蓉的小本本郭靖翻开她的笔记本上面写着QoS在数据流中的体现刹车指令 vs 摄像头图像1. 发现阶段SEDP广播刹车指令reliabilityRELIABLE明确告诉对方“我要确认”摄像头图像reliabilityBEST_EFFORT明确告诉对方“我不需要确认”2. 传输阶段DATA报文刹车指令有inlineQoS延迟预算1ms 有AckNack确认摄像头图像无inlineQoS 无AckNack确认3. 丢包时刹车指令重传摄像头图像不重传丢了就丢了一句话QoS不是空口白话是写在SEDP广播里的、体现在DATA报文里的、落实在AckNack交互中的。写在最后郭靖合上笔记本“我终于亲眼看到了——刹车指令和摄像头图像的QoS从SEDP广播里的reliability字段到DATA报文里的inlineQoS到丢包时的AckNack交互每一步都不一样。RELIABLE的刹车指令有确认、有重传BEST_EFFORT的摄像头图像没有确认、丢了不管。”黄蓉咬了口糖葫芦“全明白了”郭靖点头“明白了。QoS不是概念是写在报文里的字段是体现在交互中的行为。”黄蓉眨眨眼“DDS从概念到报文到发现到QoS你算是完整过了一遍。那你知道在实际项目中DDS和SOME/IP怎么分工吗”郭靖摇头。“下篇预告两强相遇不打架各司其职顶呱呱——DDS和SOME/IP的分工与协作。”打完收工886。