Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MifareUltralight:扇区选择导致标记异常_Java_Android_Nfc_Rfid_Mifare - Fatal编程技术网

Java MifareUltralight:扇区选择导致标记异常

Java MifareUltralight:扇区选择导致标记异常,java,android,nfc,rfid,mifare,Java,Android,Nfc,Rfid,Mifare,我试图使用扇区\u SELECT读取和写入指定扇区,但通过MifareUltralight.transceive()发送命令的第二部分时,会出现TagLostException。如何选择和操作扇区 我使用安卓Nexus6(6.0.1)向NXP NTAG(NT3H1201)发送命令并从中获取数据。我能够通过收发器(通过NfcA和MifareUltralight)使用GET_VERSION命令(60h) 我用于选择扇区的方法: public void selectSector(byte sector

我试图使用扇区\u SELECT读取和写入指定扇区,但通过
MifareUltralight.transceive()
发送命令的第二部分时,会出现
TagLostException
。如何选择和操作扇区

我使用安卓Nexus6(6.0.1)向NXP NTAG(NT3H1201)发送命令并从中获取数据。我能够通过收发器(通过
NfcA
MifareUltralight
)使用GET_VERSION命令(60h)

我用于选择扇区的方法:

public void selectSector(byte sector, MifareUltralight mifareUltralight) throws IOException {
    if (mifareUltralight.isConnected()) {
        mifareUltralight.close();
    }

    // SECTOR_SELECT command (see nxp p. 46)
    byte[] sectorSelectCmdPacket1 = new byte[2];
    byte[] sectorSelectCmdPacket2 = new byte[4];

    sectorSelectCmdPacket1[0] = (byte) 0xc2; // Sector select command
    sectorSelectCmdPacket1[1] = (byte) 0xff;

    sectorSelectCmdPacket2[0] = sector; // Memory sector to be selected; 1 for I2C 2k version
    sectorSelectCmdPacket2[1] = (byte) 0x00;
    sectorSelectCmdPacket2[2] = (byte) 0x00;
    sectorSelectCmdPacket2[3] = (byte) 0x00;

    mifareUltralight.connect();

    try {
        // ACK = 0A
        byte[] sectorSelectResp1 = mifareUltralight.transceive(sectorSelectCmdPacket1);
        Log.w(TAG, bytesToHex(sectorSelectResp1));
    } catch (IOException e) {
        Log.w(TAG, "selectSector: there was an exception while sending first sector select command");
        e.printStackTrace();
    }

    try {
        mifareUltralight.transceive(sectorSelectCmdPacket2);
        Log.w(TAG, "Second sector select command sent");
    } catch (IOException e) {
        Log.w(TAG, "selectSector: there was an exception while sending second sector select command");
        e.printStackTrace();
    }

    mifareUltralight.close();
}
当我调用selectSector方法时,第一个收发器完成,但第二个没有完成,从而导致错误

android.nfc.TagLostException:标记丢失


如何选择和操作扇区而不获得
TagLostException

扇区选择命令的第二阶段导致
TagLostException
是正常的。这在许多Android设备上都会发生,这是由于扇区选择命令的第二阶段被确认(被动确认)的方式造成的。在收到特定命令的异常后,您可以安全地继续与标记通信。只有当您收到一个命令的
TagLostException
,而您希望得到一个明确的ACK/响应数据时,通信才有问题

另外请注意,选择扇区后不应关闭连接,因为这将重置某些Android设备上的标记。因此,以后重新连接标记时,可能不再选择扇区

典型的扇区选择方法如下所示:

public boolean selectSector(int sector) throws IOException {
    byte[] cmd_sel1 = { (byte)0xC2, (byte)0xFF };
    byte[] cmd_sel2 = { (byte)sector, (byte)0x00, (byte)0x00, (byte)0x00 };

    byte[] result1 = transceive(cmd_sel1);
    if (result1 == null) {
        throw new TagLostException();
    } else if ((result1.length == 1) && ((result1[0] & 0x00A) == 0x000)) {
        // NACK response according to DigitalProtocol
        return false;
    } else {
        try {
            byte[] result2 = transceive(cmd_sel2);
            if (result2 == null) {
                throw new TagLostException();
            } else if ((result2.length == 1) && ((result2[0] & 0x00A) == 0x000)) {
                // NACK response according to DigitalProtocol
                return false;
            } else {
                return true;
            }
        } catch (Exception e) {
            // passive ACK
            return true;
        }
    }
}

@fipoceilz7我不知道有任何有用的公共资源(除了尝试和错误以及自己深入研究Android NFC堆栈)。但我们确实提供培训;-)多少钱?在哪里可以找到更多信息?