【FastDDS源码剖析】GUID_T

FastDDS中每个entity(Reader/Writer/Participant等)都会有一个唯一的标识,类型是GUID_T。GUID在FastDDS中非常重要,除了做唯一标识外,还可以用于区分Reader/Writer是同进程还是同主机,或者是跨主机的。在发送数据时如何判断是应该走INTRA、SHM(data sharing)还是TCP/UDP都与GUID息息相关。


GUID_T的定义

struct RTPS_DllAPI GUID_t
{
    //!Guid prefix
    GuidPrefix_t guidPrefix;
    //!Entity id
    EntityId_t entityId;
    ...
}

GUID_T共占16字节,分两个部分,其中GuidPrefix_t为12字节,EntityId_t为4字节。

Participant Guid

GuidPrefix_t 的前8个字节为 0x010f + host_id(2bytes) + process_id(2bytes) + random_number(2bytes)
其中host_id是根据当前所有的ipv4地址做md5等算出的结果,具体可以参考eprosima::Host。由单例生成,所以一个进程启动后GuidPrefix_t 的前8个字节就固定了,不会更改。
GuidPrefix_t 的后4个字节为participant_id进程内唯一从1开始的自增ID。
GuidPrefix_t:0x010f + host_id(2bytes) + process_id(2bytes) + random_number(2bytes) + participant_id(4bytes)
EntityId_t 是一个常量ENTITYID_RTPSParticipant,更多常量ENTITYID如下:

#define ENTITYID_UNKNOWN 0x00000000
#define ENTITYID_RTPSParticipant  0x000001c1
#define ENTITYID_SEDP_BUILTIN_TOPIC_WRITER  0x000002c2
#define ENTITYID_SEDP_BUILTIN_TOPIC_READER 0x000002c7
#define ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER  0x000003c2
#define ENTITYID_SEDP_BUILTIN_PUBLICATIONS_READER  0x000003c7
#define ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER 0x000004c2
#define ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_READER  0x000004c7
#define ENTITYID_SPDP_BUILTIN_RTPSParticipant_WRITER  0x000100c2
#define ENTITYID_SPDP_BUILTIN_RTPSParticipant_READER  0x000100c7
#define ENTITYID_P2P_BUILTIN_RTPSParticipant_MESSAGE_WRITER  0x000200C2
#define ENTITYID_P2P_BUILTIN_RTPSParticipant_MESSAGE_READER  0x000200C7
#define ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_WRITER  0x000201C3
#define ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_READER  0x000201C4

Writer Guid

GuidPrefix_t:与所属Participant的GuidPrefix_t相同
EntityId_t:builtin的writer EntityId_t固定为上面的值,用户创建的前3个字节为Participant内唯一从1开始的自增序号,最后一个字节后四位0x3代表no key,0x2代表with key,前四位-2 == att.getUserDefinedID() && 0 < att.getEntityID()为6。

Reader Guid

同Writer Guid, 唯一的区别是最后一个字节的后四位0x4代表no key,0x7代表with key。


总结

以上就是今天要讲的内容,熟悉了GUID_T之后,我们就可以很清楚判断出Reader/Writer的位置,GuidPrefix_t前4个字节相同则属于同一个主机,前8个字节相同则属于同一个进程,全部相同则属于同一个Participant。当我们发送数据时,同进程直接发送,同主机跨进程并且支持data sharing时会使用data sharing,跨主机则使用TCP/UDP。

你可能感兴趣的:(FastDDS,源码剖析,网络协议,车载系统,开源软件)