什么是GUID?
在RTI Connext DDS部署中,每个实体 - 本地或远程 - 都可以通过其GUID进行单一标识, GUID是全球唯一标识符的首字母缩写。 这样
应用程序可以使用标识来忽略某些实体,识别发布某个样本的人员,或者检测哪个实体已更改其状态。
在RTI Connext中, GUID实现为128位值(16个八位字节),并且可以以不同方式访问它。
访问本地RTI Connext实体的GUID
InstanceHandle是RTI Connext用于标识不同实例的128位值。 在RTI Connext中, DDS_instanceHandle_t
等同于DDS_GUID_t
类型,因为两者都包含
16个八位字节。
DDS_Entity::get_instance_handle()方法可用于访问 RTI Connext实体的DDS_InstanceHandle_t。 例如:
在C:
DDS_InstanceHandle_t handle = DDS_HANDLE_NIL;
handle =DDS_Entity_get_instance_handle((DDS_Entity *) participant );
或者在C ++中:
DDS_InstanceHandle_t handle;
/* Create participant and publications */
...
handle = participant->get_instance_handle();
获得实体的实例句柄后,可以使用以下代码将其轻松转换为DDS_GUID_t
:
memcpy(guid->value, (DDS_Octet *)instanceHandle->keyHash->value, 16);
访问远程RTI Connext实体的GUID:
在RTI Connnext中,还可以使用两种不同的方法访问远程实体的GUID:
- 通过他们的实例句柄,就像我们对本地实体所做的那样。
- 通过用于发现的BuiltinTopics中的
key
和participant_key
成员:- 远程DomainParticipant:使用DDS_ParticipantBuiltinTopicData中的成员key或使用DDS_ParticipantBuiltinTopicData中的成员DDS_PublicationBuiltinTopicData或DDS_SubscriptionBuiltinTopicData
- 远程DataReaders:使用DDS_SubscriptionBuiltinTopicData的成员key
- 远程DataWriters:使用DDS_PublicationBuiltinTopicData的成员key
DDS_BuiltinTopicKey_t
包含与DDS_GUID_t
类型相同的信息,但使用不同的表示:在DDS_BuiltinTopicKey_t
的情况下,密钥存储为四个32位整数,在DDS_GUID_t
的情况下,它包含16个八位字节的数组。 因此,如果我们拥有远程实体的密钥,那么从一个实体转换到另一个实体是非常简单的。 唯一需要考虑的是机器在必要时交换字节的字节顺序,如下面的代码所示:
#include <endian.h>
...
void DDS_BuiltinTopicKey_to_GUID(struct DDS_GUID_t *guid /* out */ , DDS_BuiltinTopicKey_t *buitinTopicKey /* in */ ) {
#if __BYTE_ORDER == __LITTLE_ENDIAN /* Little Endian */
int i;
DDS_Octet *guidElement;
DDS_Octet *topicKeyBuffer = (DDS_Octet *)buitinTopicKey;
DDS_Octet *keyBufferElement;
for ( i=0; i< 4; ++i ) {
DDS_Octet *guidElement = &guid->value[i*4];
DDS_Octet *keyBufferElement = (DDS_Octet *)(&buitinTopicKey->value[i]);
guidElement[0] = keyBufferElement[3];
guidElement[1] = keyBufferElement[2];
guidElement[2] = keyBufferElement[1];
guidElement[3] = keyBufferElement[0];
}
#else /* Big Endian */
memcpy(guid->value, (DDS_Octet *)buitinTopicKey->value, 16);
#endif
}
手动设置GUID:
虽然RTI Connext通常自动将DDS_GUID_t
分配给DDS实体,但可以手动设置DDS域参与者和所包含实体使用的GUID前缀。 可以在使用QoS策略WireProtocolQosPolicy启用DDS DomainParticipant之前建立它。 此策略包含三个成员( rtps_host_id
, rtps_app_id
和 rtps_instance_id
),用于定义在此类DDS DomainParticipant中创建的所有实体共享的GUID前缀。