如何通过LLRP接收来自Impinj阅读器的温度消息?



我正在尝试通过LLRP连接监控读取器的温度。在out_impinj_ltkcpp.h中,我看到一个名为CImpinjReaderTemperature的类,它看起来大多是样板文件:

class CImpinjReaderTemperature : public CParameter
{
public:
CImpinjReaderTemperature (void);
~CImpinjReaderTemperature (void);
static const CFieldDescriptor * const
s_apFieldDescriptorTable[];
static const CTypeDescriptor
s_typeDescriptor;
//... clipped for brevity
}

有一个看起来很有用的枚举:

enum EImpinjRequestedDataType {
ImpinjRequestedDataType_All_Configuration = 2000,  /**< All_Configuration */
ImpinjRequestedDataType_Impinj_Sub_Regulatory_Region = 2001,  /**< Impinj_Sub_Regulatory_Region */
ImpinjRequestedDataType_Impinj_GPI_Debounce_Configuration = 2003,  /**< Impinj_GPI_Debounce_Configuration */
ImpinjRequestedDataType_Impinj_Reader_Temperature = 2004,  /**< Impinj_Reader_Temperature */
//...clipped for brevity
}

首先,如何通过LLRP接收温度信息,即是否需要请求报告?温度需要轮询吗?其次,这些参数如何适用于LLRP?哪个消息是正确的发送(CGET_READER_CONFIG,CUSTOM_MESSAGE,其他的)?

关于LLRP协议(尤其是Impinj扩展)的文档在某种程度上缺乏,或者被锁在多年前丢失钥匙的门后面。也就是说,我能够找到一个引用Impinj:Temperature消息的文档,并从那里把东西拼凑起来。

首先,温度响应是CGET_READER_CONFIG_RESPONSE消息的自定义部分。这意味着我们需要发送一个CGET_READER_CONFIG消息,请求自定义温度扩展:

CGET_READER_CONFIG *pCmd;
CMessage *pRspMsg;
CGET_READER_CONFIG_RESPONSE *pRsp;
// Compose the command message
pCmd = new CGET_READER_CONFIG();
pCmd->setRequestedData(GetReaderConfigRequestedData_Identification); // This is cheaper than the default of "all"

CImpinjRequestedData * req = new CImpinjRequestedData();
req->setRequestedData(ImpinjRequestedDataType_Impinj_Reader_Temperature);
pCmd->addCustom(req);

附加到配置请求消息是一个CImpinjRequestData对象,它编码单个整数2004。这就是我上面问题中列举的意义所在。发送此消息后,阅读器将使用包含我们请求的标识符的响应进行响应。在不要求读者识别的情况下,所请求的data的值将为0,对应于"所有信息"。并成为相当大的信息。

与标识符一起的是一个<Impinj:Temperature>元素,其中包含以摄氏度为单位的读取器内部温度。可以通过枚举自定义字段响应(只有一个)并在检查其类型之后读取其温度字段来访问:

std::list<CParameter *>::iterator it;
for (it = pRsp->beginCustom(); it != pRsp->endCustom(); it++ )
{
if ((*it)->m_pType == &CImpinjReaderTemperature::s_typeDescriptor)
{
CImpinjReaderTemperature* temp = (CImpinjReaderTemperature*) *it;
if (NULL != temperature_out)
*temperature_out = temp->getTemperature();
}
}

虽然这可能不是获取此信息的最方便的接口,但它工作可靠。它还可以作为其他获取其他LLRP扩展的示例。

最新更新