Connext DDS实体的GUID构成

什么是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:

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前缀。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

道格拉斯范朋克

播种花生牛奶自留田

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

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

打赏作者

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

抵扣说明:

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

余额充值