我有一个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});
答案 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
0x00
,但应至少为2 bytes
也许有可能从例外中获取更多信息?