带有FeliCa标记的TagLostException

时间:2014-02-28 19:27:16

标签: android nfc rfid

我有一个FeliCa Lite S标签,我试图从中读取信息。我的问题是,每当我执行trancieve命令时,我都会收到TagLostException。以下代码应根据“FeliCa Lite-S用户手册”(参考:http://www.sony.net/Products/felica/business/tech-support/data/fls_usmnl_1.2.pdf)读取标签中的第一个块,但它会抛出TagLostException:

NfcF tech = NfcF.get(tag);
byte[] id = tech.getManufacturer();
byte[] sc = tech.getSystemCode();
byte[] res;
try {
    tech.connect();
    res = tech.transceive(new byte[] {0x06,id[0],id[1],id[2],id[3],id[4],id[5],id[6],id[7],0x01,sc[0],sc[1],0x01,0x00});
} finally {
    tech.close();
}

我做错了什么?

我也尝试过poll命令,这也给出了TagLostException

byte[] pollRes = technology.transceive(new byte[] {
        0x00,       // poll command
        SC[0],      // system code B1 (FF -> any)
        SC[1],      // system code B2 (FF -> any)
        0x01,       // request code (0x00 == none)
        0x00       
        });

非常感谢任何帮助!

编辑1:

阅读此帖后:http://code.google.com/p/android/issues/detail?id=15389 我更改了poll命令,以包含一个包含包长度的字节,并对轮询进行了响应。

res = tech.transceive(new byte[] {0x06, 0x00, sc[0], sc[1], 0x01, 0x00});

我尝试对我的读取命令执行相同的操作(包括将块列表项更改为包含2个字节),但结果仍然相同:

tech.transceive(new byte[] {0x10, 0x06,id[0],id[1],id[2],id[3],id[4],id[5],id[6],id[7],0x01,sc[0],sc[1],0x01,0x80,0x00});

2 个答案:

答案 0 :(得分:2)

首先,已解决的FeliCa命令帧的格式为

+----------+----------+--------------------+--------------------+
|   LEN    |   CMD    |        IDm         |     Parameters     |
| (1 byte) | (1 byte) |     (8 bytes)      |  (LEN - 10 bytes)  |
+----------+----------+--------------------+--------------------+

所以你的命令缺少长度字节(LEN)。

其次,FeliCa轻服务代码通常为0x000B(只读)和0x0009(读写),而使用getSystemCode()方法获得的系统代码通常为0x88 0xB4。因此,在读命令中使用系统代码作为服务代码通常没有意义。

第三,块列表中的每个条目都是两个字节长(如果要编码255以上的块编号,则为三个字节长)。这些字节中的第一个包含访问模式位和指示符,如果阻止列表条目长度为两个或三个字节。

所以read命令看起来像这样:

+------+------+-----+------+-------------+------+-------------+
| LEN  | CMD  | IDm |  Ns  |  Service 0  |  Nb  |   Block 0   |
| 0x10 | 0x06 | ... | 0x01 | 0x0B | 0x00 | 0x01 | 0x80 | 0x00 |
+------+------+-----+------+-------------+------+-------------+

+------+------+-----+------+-------------+------+--------------------+
| LEN  | CMD  | IDm |  Ns  |  Service 0  |  Nb  |      Block 0       |
| 0x11 | 0x06 | ... | 0x01 | 0x0B | 0x00 | 0x01 | 0x00 | 0x00 | 0x00 |
+------+------+-----+------+-------------+------+--------------------+

答案 1 :(得分:0)

当我查看数据表时,我看到以下内容:

  • 服务代码列表 sc必须位于Little Endian
  • 阻止列表仅包含1个字节0x00,但应至少为2 bytes

也许有可能从例外中获取更多信息?