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。数据表不是很清楚这是每个芯片的校准值还是该类型芯片的静态值。