我制作了一个简单的测试应用程序以进行快速调试。 我发送一些字节,打印我在电话屏幕上发送的内容,然后打印我收到的内容。
当我发送WRONG命令时,我在两个字节的SW1SW2中得到了相应的错误代码。 我也可以调用自己的命令,并使用自己的值覆盖SW1SW2,然后可以获取它们。
这是问题所在:当我发送CORRECT命令时,收发命令失败,提示信息为“ Transceive failed”。
如果我发送正确的命令,但将SW1SW2改写为90 00以外的值,那么我将获得我设置的SW值,但没有响应数据。 (可能是因为当SW1SW2 <> 90 00时卡未发送ODATA)
那么,如何确定发送了正确的命令呢? 除了搞乱我自己的测试命令外,我还调用了GetAppId命令-失败,因为我必须在卡中定义AppId。 所以我在卡中定义它,发送相同的命令,收发失败。
因此,我很确定问题是存在ODATA时收发失败,但是我不明白为什么还是要解决它。.请帮助!
编辑:我的卡是ZeitControl的7.5 D非接触式基本卡。
EDIT2:我已将超时设置为2000ms,而行为没有变化。 我正在尝试返回单个字节的数据,而我调用的系统命令听起来也不是很沉重。
然后,我下载并附加了Android源代码并进行了调试。 有一些段它仍然不会进入-但是卡似乎在有效命令上返回null,除非我返回一些手动设置的SW1SW2,在这种情况下,这是唯一收到的东西。
EDIT3:我尝试过的系统命令是:192 14 0 0 0(或C0 0E 00 00 00)(或CLA INS P1 P2 Lc)我不是100%确定我正确地执行了该操作,但是我尝试了Le的各种长度(最多22个)和没有Le的情况相同,只有这样,它不会给我6700(错误的Le / Lc)。当然,不是6700而是返回null,似乎...
我自己定义的另一个命令是20 0A(值以字节为单位),并且.BAS文件中未指定P1 / P2。 我称其为:32 10 1 0 1(或20 0A 01 00 01)(或CLA INS Lc IDATA Le)这应表示1字节数据输入,设置为0和1字节预期输出(+ SW1 / SW2为总是)。 (将P1 / P2设置为6700,因此,除非在命令声明中定义,否则我认为它们不应该存在)。这还将返回null。 我希望00 90 00将在这里返回。 (如果我将“值”设置为00的话)
我正在使用HTC OneX。
EDIT4:MinSdk版本= 14,目标18。
if(bitcoinCard != null){
try {
String sentmsg, receivedmsg;
byte[] send = getBytes(commandBytes.getText().toString());
byte[] data = null;
if(send != null){
bitcoinCard.setTimeout(2000);
data = bitcoinCard.transceive(send);
}
//bitcoinCard.close();
/*if(data != null && data.length == 2)
{
mainLabel.setText("SW1SW2: " + (data[0] < 0 ? -data[0] +
128 : data[0]) + " " + (data[1] < 0 ? -data[1] + 128 : data[1]));
}else */if (data != null && send != null)
{
sentmsg = "" + (send[0] < 0 ? send[0] + 256 : send[0]);
for(int i = 1; i < send.length; i++)
{
sentmsg = sentmsg + " " + (send[i] < 0 ? send[i] +
256 : send[i]);
}
receivedmsg = "" + (data[0] < 0 ? data[0] + 256 : data[0]);
for(int i = 1; i < data.length; i++)
{
receivedmsg = receivedmsg + " " + (data[i] < 0 ? data[i] + 256 : data[i]);
}
mainLabel.setText("Sent: " + sentmsg + "\n" +
"Response: " +
receivedmsg);
}else
{
mainLabel.setText("Sent or received null.");
}
} catch (IOException e) {
mainLabel.setText("Tried to talk to card, but had error: " +
e.getMessage());
}
}