Android NFC温度记录器命令

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) {

我正在编写一个Android应用程序。我有一个SL13A温度数据记录器,我试图从记录器读取温度,但我真的不知道如何读取

以下是数据表:

我正在使用获取温度命令(命令代码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;

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位。这就是为什么我感到困惑。无论如何,谢谢你的帮助。我会接受你的答案。