例子来自FastRTPS文档。
用户可以通过fastrtpsgen自动生成话题类型,自定义话题类型时,需要实现serialize、deserialize和getKey方法。
关键字(Key)的作用:
不同的关键字可以看做同一个主题中的不同数据端点,这样接收端(Subscriber或者RTPSReader)就可以根据关键字区分数据源或者数据类别。
关键字的使用:
1. 定义实现主题类型中的getKey方法(使用IDL文件时,需指定@Key,再用fastrtpsgen生成)
2. 在创建Publisher / Subscriber 时设置参数WITH_KEY
类型声明:
typedef struct TestType{
char name[6]; //@key
int32_t value;
TestType()
{
value = -1;
COPYSTR(name,"UNDEF"); //Your preferred string copy method
}
void print()
{
printf("Name: %s",name);
cout << " |Value: "<< value << endl;
}
}TestType;
class TestTypeDataType:public TopicDataType
{
public:
TestTypeDataType()
{
setName("TestType");
m_typeSize = 6+4;
m_isGetKeyDefined = true;
};
~TestTypeDataType(){};
bool serialize(void*data,SerializedPayload_t* payload);
bool deserialize(SerializedPayload_t* payload,void * data);
bool getKey(void*data,InstanceHandle_t* ihandle);
};
方法实现:
bool TestTypeDataType::serialize(void*data,SerializedPayload_t* payload){
TestType* ptype = (TestType*)data;
payload->length = 6+4;
memcpy(payload->data,ptype->name,6);
memcpy(payload->data+6,ptype->value,4);
return true;
}
bool TestTypeDataType::deserialize(SerializedPayload_t* payload,void * data){
TestType* ptype = (TestType*)data;
memcpy(&ptype->name,payload->data,6);
memcpy(&ptype->value,payload->data+6,4);
return true;
}
bool TestTypeDataType::getKey(void*data,InstanceHandle_t* handle){
TestType* tp = (TestType*)data;
handle->value[0] = 0;
handle->value[1] = 0;
handle->value[2] = 0;
handle->value[3] = 5; //length of string in CDR BE
handle->value[4] = tp->name[0];
handle->value[5] = tp->name[1];
handle->value[6] = tp->name[2];
handle->value[7] = tp->name[3];
handle->value[8] = tp->name[4];
for(uint8_t i=9;i<16;i++)
handle->value[i] = 0;
return true;
}
注册话题类型:
int main()
{
Participant* part; //CREATE A PARTICIPANT SOMEWHERE
...
TestTypeDataType TestTypeData;
Domain::registerType(part,(TopicDataType*)&TestTypeData);
...
};