Android NFC温度记录器命令
我正在编写一个Android应用程序。我有一个SL13A温度数据记录器,我试图从记录器读取温度,但我真的不知道如何读取 以下是数据表: 我正在使用获取温度命令(命令代码0xAD) 我的代码是这样的:Android NFC温度记录器命令,android,tags,nfc,rfid,iso-15693,Android,Tags,Nfc,Rfid,Iso 15693,我正在编写一个Android应用程序。我有一个SL13A温度数据记录器,我试图从记录器读取温度,但我真的不知道如何读取 以下是数据表: 我正在使用获取温度命令(命令代码0xAD) 我的代码是这样的: NfcV nfcvTag = NfcV.get(tag); try { nfcvTag.connect(); } catch (IOException e) {
NfcV nfcvTag = NfcV.get(tag);
try {
nfcvTag.connect();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "Could not open connection!", Toast.LENGTH_SHORT).show();
return;
}
try {
byte[] comReadTemp = new byte[]{
(byte) 0x00, // Flags
(byte) 0xAD, // Command: Get Temperature
(byte) 0xE0,(byte) 0x36,(byte) 0x04,(byte) 0xCA,(byte) 0x01,(byte) 0x3E,(byte) 0x12,(byte) 0x01, // UID - is this OK?
};
byte[] userdata = nfcvTag.transceive(comReadTemp);
tvText.setText("DATA: " + userdata.length);
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "An error occurred while reading!", Toast.LENGTH_SHORT).show();
return;
}
我不确定要设置什么标志,以及是否在命令中正确地放置了UID参数
我的问题是,如何从命令回复中获取温度位?在数据表中显示,命令应答的前8位是标志,下16位是温度,最后16位是CRC。但我似乎只得到了3个字节的回复(userdata.length
等于3)
任何帮助都将不胜感激。首先(尽管您似乎得到了正确的响应),当您想要使用命令的寻址版本(即包含可选UID字段的版本)时,您需要在标志字节中设置寻址位。所以标志应该是0x20
通常,您会创建如下命令:
byte[] comReadTemp = new byte[]{
(byte) 0x20, // Flags
(byte) 0xAD, // Command: Get Temperature
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, // placeholder for tag UID
};
System.arraycopy(tag.getId(), 0, comReadTemp, 2, 8);
通过transceive()
方法得到的响应将仅为ISO 15693帧的有效负载。因此,您将获得标志字节(1字节)和温度值(2字节)。SOF、CRC和EOF由NFC堆栈自动剥离(就像它们在发送数据时自动添加一样)
因此,userdata
的字节1..2包含温度值:
int tempCode = ((0x003 & userdata[2]) << 8) |
((0x0FF & userdata[1]) << 0);
double tempValue = 0.169 * tempCode - 92.7 - 0.169 * 32;
int tempCode=((0x003&userdata[2])感谢您的回答。我尝试了您的解决方案,但温度(tempValue)不正确。我每次都得到不同的结果(如:-97.7620、-11.234、32.02999和其他一些)。我也不太明白您为什么在((0x003&userdata[1])中使用0x003我认为正确的方法是:int tempCode=((0x003&userdata[2])@user1926550您是对的。userdata[2]必须是MSB,userdata[1]必须是LSB。@user1926550为什么0x03:请参阅数据表的数据日志格式部分。温度值有10位(b9..b0)。因此,您必须使用整个LSB和MSB的下两位(用0x03屏蔽)。是的,我已经弄明白了。起初我以为温度值都是16位。这就是为什么我感到困惑。无论如何,谢谢你的帮助。我会接受你的答案。