当前位置: 首页 > 工具软件 > FastCopy-M > 使用案例 >

【FastRTPS】Example--自定义话题类型、话题关键字

夏侯衡
2023-12-01

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

 

 

 类似资料: