我正在尝试通过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扩展的示例。