例子來自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);
...
};