【FastDDS源码剖析】GUID_T

17 篇文章 16 订阅 ¥99.90 ¥299.90
本文深入探讨Fast DDS中的GUID_T,它是Fast DDS中用于唯一标识实体的关键标识符。内容涵盖GUID_T的定义、结构、生成算法,以及在Participant、Writer和Reader Guid中的应用,帮助读者理解数据交换和通信的可靠性。
摘要由CSDN通过智能技术生成

前言

本文将对Fast DDS中的GUID_T进行分析,并探讨GUID_T在Fast DDS内部的关键作用。GUID_T是Fast DDS中一种重要的标识符类型,用于唯一标识实体。

在分布式系统中,实体的唯一标识对于数据交换和通信的正确性至关重要。GUID_T作为全局唯一标识符,在Fast DDS中扮演着关键的角色。它用于标识DDS实体(如主题、订阅者、发布者)。GUID_T的生成和管理机制保证了在Fast DDS中的实体的唯一性。

本文将深入研究Fast DDS中GUID_T的实现细节和关键功能。我们将详细解释GUID_T的结构和生成算法。

通过深入研究Fast DDS中GUID_T的源码实现,读者将能够更好地理解Fast DDS的标识机制,并了解如何有效地利用GUID_T来实现可靠的数据交换和通信。


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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桃花朵朵~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值