写在开篇·蓉儿又开新坑上回说到郭靖搞清楚了DDS通信行为的三个核心疑问——启动顺序不影响连接、发现广播是轻量的、同一Writer有顺序保证。郭靖合上笔记本若有所思“蓉儿你说了这么多‘自动发现’‘自动配对’但我还是没亲眼看到——DDS到底是怎么从‘素不相识’到‘暗号配对’的中间走了几步发了哪些报文”黄蓉咬了口糖葫芦“问得好光说不练假把式。今天就用一张完整的时序图把DDS发现阶段的每一步数据流讲清楚——从ECU上电到开始传业务数据中间到底发生了什么。”一、先回顾DDS发现阶段要解决什么问题黄蓉在白板上写下三个问题问题答案DDS要做的事谁在发现网络里有哪些DDS应用DomainParticipant发什么发现每个应用提供了哪些Writer发布者需要哪些Reader订阅者谁和谁配把Topic名字相同的Writer和Reader匹配起来DDS发现分两步先找人再找内容。二、完整交互数据流时序图黄蓉画了一张完整的时序图以摄像头ECU发布者和域控制器ECU订阅者为例┌─────────────────────────────────────────────────────────────────────────────┐ │ DDS发现阶段完整数据流摄像头 → 域控 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ 摄像头ECU发布者 域控制器ECU订阅者 │ │ │ │ │ │ │ 第一步找人SPDP │ │ │ │ │ │ │ │ ① SPDP广播 │ │ │ │ “我是摄像头我的DomainParticipant │ │ │ │ GUIDxxx我在这里” │ │ │ │─────────────────────────────────────────│ │ │ │ │ │ │ │ │ ② SPDP广播 │ │ │ │ “我是域控我的 │ │ │ │ DomainParticipant │ │ │ │ GUIDyyy” │ │ │─────────────────────────────────────────│ │ │ │ │ │ │ │ 第二步找内容SEDP │ │ │ │ │ │ │ │ ③ SEDP广播 │ │ │ │ “我有一个WriterTopic/camera/front, │ │ │ │ 数据类型Image, QoSBEST_EFFORT” │ │ │ │─────────────────────────────────────────│ │ │ │ │ │ │ │ │ ④ SEDP广播 │ │ │ │ “我有一个Reader │ │ │ │ Topic/camera/front, │ │ │ │ 数据类型Image, │ │ │ │ QoSBEST_EFFORT” │ │ │─────────────────────────────────────────│ │ │ │ │ │ │ │ 第三步本地匹配 │ │ │ │ │ │ │ │ ⑤ 各自判断 │ │ │ │ Topic相同✅ │ │ │ │ 数据类型相同✅ │ │ │ │ QoS兼容✅ │ │ │ │ → 匹配成功 │ │ │ │ │ │ │ │ 第四步建立连接 │ │ │ │ │ │ │ │ ⑥ 单播握手互相告诉对方自己的地址 │ │ │ │─────────────────────────────────────────│ │ │ │ │ │ │ │ ⑦ 业务数据开始传输单播 │ │ │ │ DATA/camera/front, 图像数据 │ │ │ │─────────────────────────────────────────│ │ │ │ │ │ │ │ ⑧ 可靠性反馈如果需要 │ │ │ │ AckNack / Heartbeat │ │ │ │─────────────────────────────────────────│ │ │ │ └─────────────────────────────────────────────────────────────────────────────┘三、每一步拆解这些报文在干什么黄蓉把时序图中的每一步拆开细讲第一步找人SPDP步骤报文类型谁发内容作用①SPDP广播摄像头“我是摄像头我的GUIDxxx我在这里”告诉全网“我上线了”②SPDP广播域控“我是域控我的GUIDyyy我在这里”告诉全网“我上线了”SPDP Simple Participant Discovery Protocol简单的参与者发现协议。GUID 全局唯一标识符每个DDS应用DomainParticipant有唯一的ID。第二步找内容SEDP步骤报文类型谁发内容作用③SEDP广播摄像头“我有一个WriterTopic/camera/front数据类型ImageQoSBEST_EFFORT”告诉全网“我要发这个Topic”④SEDP广播域控“我有一个ReaderTopic/camera/front数据类型ImageQoSBEST_EFFORT”告诉全网“我要收这个Topic”SEDP Simple Endpoint Discovery Protocol简单的端点发现协议。Writer和Reader都是“端点”SEDP负责发现它们。第三步匹配检查项摄像头的值域控的值匹配Topic名字/camera/front/camera/front✅数据类型ImageImage✅QoSBEST_EFFORTBEST_EFFORT✅匹配成功后DDS底层记录“摄像头Writer ←→ 域控Reader”这对关系。第四步建立连接 数据传输步骤报文类型方向作用⑥单播握手互相交换网络地址建立点对点连接⑦DATA摄像头→域控业务数据图像、刹车指令等⑧AckNack/Heartbeat互相可靠性确认如果配置了RELIABLE四、广播 vs 单播什么时候用哪个郭靖问出了关键问题“哪些步骤用广播哪些用单播”黄蓉画了一张表阶段报文类型发送方式原因第一步SPDP广播不知道谁在喊一嗓子让所有人都知道第二步SEDP广播不知道谁感兴趣喊一嗓子让所有人知道第三步匹配本地计算不涉及网络通信第四步握手单播已经知道对方是谁点对点通信第四步DATA单播只发给匹配的订阅者不打扰别人第四步AckNack单播点对点确认核心原则不知道对方是谁时用广播知道对方是谁后用单播。五、一个具体的匹配例子黄蓉用一个具体的数字例子把整个流程串起来┌─────────────────────────────────────────────────────────────────────────────┐ │ 具体匹配例子 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ 摄像头ECU │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ DomainParticipant GUID 0x1111 │ │ │ │ Writer │ │ │ │ Topic /camera/front │ │ │ │ Type Image │ │ │ │ QoS BEST_EFFORT │ │ │ │ Writer GUID 0x1111:0x0001 │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ │ 域控制器ECU │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ DomainParticipant GUID 0x2222 │ │ │ │ Reader │ │ │ │ Topic /camera/front │ │ │ │ Type Image │ │ │ │ QoS BEST_EFFORT │ │ │ │ Reader GUID 0x2222:0x0001 │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ │ 匹配结果 │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ Writer 0x1111:0x0001 ←→ Reader 0x2222:0x0001 │ │ │ │ 摄像头图像数据 → 域控 │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────┘六、如果匹配失败会发生什么郭靖问“如果Topic名字写错了或者QoS不一致会怎样”黄蓉画了几个失败场景场景摄像头域控结果Topic名字不一致/camera/front/camera/rear❌ 匹配失败不连接数据类型不一致ImageCompressedImage❌ 匹配失败不连接QoS不一致BEST_EFFORTRELIABLE❌ 匹配失败不连接完全一致/camera/frontImageBEST_EFFORT相同✅ 匹配成功连接匹配失败时DDS不会建立连接。应用层收不到任何数据也不会报错——安静地失败。七、黄蓉的小本本郭靖翻开她的笔记本上面写着DDS发现阶段四步走第一步SPDP找人—— 广播“我上线了”第二步SEDP找内容—— 广播“我要发什么”“我要收什么”第三步匹配—— 本地判断Topic、数据类型、QoS是否一致第四步建立连接传数据—— 单播握手单播传业务数据广播 vs 单播不知道对方是谁 → 广播SPDP、SEDP知道对方是谁 → 单播握手、DATA、AckNack一句话先广播找人找内容再单播传数据。素不相识怎成对暗号配对天仙配。写在最后郭靖合上笔记本“我终于明白了DDS发现阶段的完整流程——先广播找人SPDP再广播找内容SEDP然后本地匹配最后单播传数据。不知道对方是谁时用广播知道后用单播。”黄蓉咬了口糖葫芦“全明白了”郭靖点头“明白了。SPDP找谁在SEDP找谁发谁收匹配成功就单播开干。素不相识怎成对暗号配对天仙配。”黄蓉眨眨眼“那QoS到底有哪些策略什么场景该用哪个”郭靖摇头。“下篇预告QoS花样真不少刹车插队视频跑——DDS的QoS策略详解。”打完收工886。