1. 理解EDP匹配的核心机制
FastDDS作为DDS规范的C++实现,其核心通信机制建立在Participant Discovery Protocol(PDP)和Endpoint Discovery Protocol(EDP)之上。当两个DomainParticipant在同一个域中发现彼此后,EDP便开始发挥作用——它负责匹配这两个Participant之间的DataWriter和DataReader。
EDP匹配过程本质上是一个"相亲"机制。想象你在一个大型技术会议中:PDP相当于会议注册处,记录所有参会者(Participant)的基本信息;而EDP则像会议中的自由交流环节,让有共同话题(相同Topic)的演讲者(DataWriter)和听众(DataReader)自动配对。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. EDP消息处理流程拆解
2.1 消息接收与初步过滤
当Participant收到PDP消息时,首先会经过多层过滤:
cpp复制// 示例:RTPSMessageGroup::processCDRMsg中的关键处理逻辑
if (message_identity.entityId == ENTITYID_SPDP_BUILTIN_PARTICIPANT)
{
// 处理PDP消息
PDP::processPDPTraffic();
}
else if (isEDPEntityId(message_identity.entityId))
{
// 触发EDP处理流程
EDP::processEDPData();
}
过滤标准包括:
- 实体ID检查(判断是否为EDP内置实体)
- 域ID匹配(确保在同一DDS域)
- GUID前缀校验(验证发送方身份)
2.2 端点信息解析
成功过滤后,系统会解析消息中的端点信息:
cpp复制// 示例:EDP::processEDPData中的参数解析
ReaderProxyData reader_data;
WriterProxyData writer_data;
if (is_reader)
{
CDRMessage::readSequenceNumber(&msg, &reader_data.expectsInlineQos);
CDRMessage::readEntityId(&msg, &reader_data.remoteWriterGuid.entityId);
}
else
{
CDRMessage::readLocatorList(&msg, &writer_data.unicastLocatorList);
CDRMessage::readLocatorList(&msg, &writer_data.multicastLocatorList);
}
关键解析字段包括:
- QoS策略集合(决定是否兼容)
- 端点GUID(全局唯一标识)
- 传输定位器(Locator,包含IP/端口信息)
- Topic名称和类型(匹配基础)
2.3 兼容性校验
匹配前的核心校验逻辑:
markdown复制| 校验维度 | DataWriter要求 | DataReader要求 | 匹配规则 |
|-------------------|--------------------
