c - 使用 Arduino 发送 APDU 命令时出错。更改模块上下文
问题描述
我尝试使用 Arduino Uno 和 PN532 发送 APDU 命令。PN532 找到了 EMV 卡,但是当我尝试发送命令时,我得到:
状态码表示错误
响应转储显示此结果(前 8 个字节):
0x00 0x00 0xFF 0x03 0xFD 0xD5 0x41 0x27
我发送的命令(SELECT PPSE):
00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00
根据文档,代码0x27
(8字节)意味着:
由于 PN532 的当前上下文,此命令是不可接受的(发起者与目标,未知目标编号,目标未处于良好状态,...)
如何将上下文更改为发送命令所需的上下文?
我的代码:
void loop(void) {
uint8_t success;
uint8_t uid[] = {0, 0, 0, 0, 0, 0, 0};
uint8_t uidLength;
// EMV card
bool apdusuccess;
uint8_t apdu[255];
uint8_t berBuffer[255];
uint8_t berLength = 255;
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, & uidLength);
if (success && uid && (uidLength == 4)) {
uint8_t apdu[] = {0x00, 0xA4, 0x04, 0x00, 0x0e, 0x32, 0x50, 0x41, 0x59, 0x2e, 0x53, 0x59, 0x53, 0x2e, 0x44, 0x44, 0x46, 0x30, 0x31, 0x00};
apdusuccess = nfc.inDataExchange(apdu, sizeof(apdu), berBuffer, &berLength);
Serial.print("APDU Success: ");
Serial.println(apdusuccess);
}
}
解决方案
我找到了一个解决方案,它适用于inListPassiveTarget
:
void loop(void) {
uint8_t success;
uint8_t uid[] = {0, 0, 0, 0, 0, 0, 0};
uint8_t uidLength;
// EMV card
bool apdusuccess;
uint8_t apdu[255];
uint8_t berBuffer[255];
uint8_t berLength = 255;
success = nfc.inListPassiveTarget();
if (success) {
uint8_t apdu[] = {0x00, 0xA4, 0x04, 0x00, 0x0e, 0x32, 0x50, 0x41, 0x59, 0x2e, 0x53, 0x59, 0x53, 0x2e, 0x44, 0x44, 0x46, 0x30, 0x31, 0x00};
apdusuccess = nfc.inDataExchange(apdu, sizeof(apdu), berBuffer, &berLength);
Serial.print("APDU Success: ");
Serial.println(apdusuccess);
}
}
推荐阅读
- javascript - 我有 2 个数组,如何将它们合并为相同长度但不同的索引
- api - 如何从 Api 根据 vue Js 中的索引号获取数据?
- amazon-redshift - 错误:无法匹配 UNION 类型整数和字符变化 [SQL 状态 = 42804]
- jmeter - Blazemeter 为 Jmeter 记录的信号器标签的响应错误 (403)
- php - 我在替换 PHP 中的 \117 时遇到问题
- laravel - 如何在没有本地存储的情况下将 JWT 令牌存储在 VueX 中
- powershell - 将变量值放在 Powershell 中的“”内
- javascript - 查找匹配的模板并在数组中获取与其对应的值
- kubernetes - Cert-manager 在升级到 AKS 1.20.7 后停止更新 Let'S Encrypt 证书
- python - 使用 groupby 时不显示 Pandas 列