参考《FastRTPS User Manual.odt》第五章
基于时间的过滤和基于内容的过滤:
class MySubscriber : public SubscriberListener
{
Subscriber *mp_sub;
SubscriberAttributes m_att;
SampleInfo_t m_lastInfo;
void onNewDataMessage(Subscriber *sub)
{
TestType tp;
SampleInfo_t info;
if (mp_sub->readNextData((void *)&tp, &info))
{ //Read Data
if (info.sampleKind == ALIVE)
{
if (passTimeFilter(info) && passContentFilter(tp))
{
m_lastInfo = info;
//USE THE DATA
}
}
}
}
bool passTimeFilter(SampleInfo_t &info)
{
if (TimeConv::Time_tAbsDiff2DoubleMillisec(m_lastInfo.sourceTimestamp, info.sourceTimestamp) >=
TimeConv::Time_t2MilliSecondsDouble(
m_att.qos.m_timeBasedFilter.minimum_separation))
{
return true;
}
return false;
}
bool passContentFilter(TesType &tp)
{
//Check data against your filter and return true or false;
}
}
所有权OwnerShip:
该例子中,我们假设只有一个关键字。多个关键字的话题,需要实现拥有者向量,因为每一个关键字都会有一个不同的拥有者。
class MySubscriber : public SubscriberListener
{
TestType tp;
GUID_t ownerGUID;
uint32_t ownerStrength = 0;
bool hasOwner = false;
Subscriber *sub;
void MySubscriber::onNewDataMessage(Subscriber *sub)
{
if (sub->readNextData((void *)&tp, &info))
{ //Read Data
if (info.sampleKind == ALIVE)
{
if (!hasOwner || info.ownershipStrength > ownerStrength ||
(info.ownershipStrength == ownerStrength &&
info.writerGUID < ownerGUID) //Change OWNER conditions
)
{
hasOwner = true;
ownerGUID = info.writerGUID;
ownerStrength = info.ownershipStrength;
sampleAccepted(tp);
}
else if (ownerGUID == writerGUID)
sampleAccepted(tp);
}
}
}
void MySubscriber::sampleAccepted(TestType &tp)
{
//DO SOMETHING WITH THE SAMPLE
}
void MySubscriber::onSubscriptionMatched(Subscriber *sub, MatchingInfo info)
{
if (info.status == MATCHED_MATCHING)
{
cout << "Subscriber MATCHES Pub: " << info.remoteEndpointGuid << endl;
}
else if (info.status == REMOVED_MATCHING)
{
cout << "Subscriber REMOVED Pub: " << info.remoteEndpointGuid << endl;
if (info.remoteEndpointGUID == ownerGUID)
{
hasOwner = false;
}
}
}
}