NFC 温度记录器命令
NFC Temperature Logger Commands
我正在编写 Android 应用程序。我有一个 SL13A 温度数据记录器,我正在尝试从记录器读取温度,但我真的不知道如何。
这是数据表:http://www.mouser.com/ds/2/588/AMS_SL13A_Datasheet_EN_v4-371531.pdf
我正在使用获取温度命令(命令代码 0xAD)。
我的代码是这样的:
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;
假设偏移校准代码为 32。数据表不是很清楚这是每个芯片的校准值还是该类型芯片的静态值。
我正在编写 Android 应用程序。我有一个 SL13A 温度数据记录器,我正在尝试从记录器读取温度,但我真的不知道如何。
这是数据表:http://www.mouser.com/ds/2/588/AMS_SL13A_Datasheet_EN_v4-371531.pdf
我正在使用获取温度命令(命令代码 0xAD)。
我的代码是这样的:
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;
假设偏移校准代码为 32。数据表不是很清楚这是每个芯片的校准值还是该类型芯片的静态值。