前言
本文将对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。