我正在使用 NFC 标记类型 2。在调用运行 Broadcom NFC Android 堆栈的 transceive() 函数时,我遇到了 1 字节 ACK/NACK 响应的问题。NXP NFC Android 堆栈不会发生此问题。例如,写入命令的 ACK 响应定义为 0xAh(根据 NFC Forum Tag Type 2 协议)。如果 NFC 标签回复其他内容而不是 0xAh,Broadcom NFC 堆栈会将其视为 NACK。NXP NFC 堆栈中不会出现此问题。
Broadcom NFC 堆栈
在 /platform/packages/apps/Nfc/nci/jni/NativeNfcTag.cpp
在函数“nativeNfcTag_doTransceive()”第 890 行
static jbyteArray nativeNfcTag_doTransceive (JNIEnv* e, jobject, jbyteArray data, jboolean raw, jintArray statusTargetLost)
{
..
..
if ((natTag.getProtocol () == NFA_PROTOCOL_T2T) &&
natTag.isT2tNackResponse (sTransceiveData, sTransceiveDataLen))
{
isNack = true;
}
if (sTransceiveDataLen)
{
if (!isNack) {
// marshall data to java for return
result.reset(e->NewByteArray(sTransceiveDataLen));
if (result.get() != NULL) {
e->SetByteArrayRegion(result.get(), 0, sTransceiveDataLen, (jbyte *) sTransceiveData);
}
else
ALOGE ("%s: Failed to allocate java byte array", __FUNCTION__);
} // else a nack is treated as a transceive failure to the upper layers
free (sTransceiveData);
sTransceiveData = NULL;
sTransceiveDataLen = 0;
}
..
..
}
当我们查看 /platform/packages/apps/Nfc/nci/jni/NfcTag.cpp 第 1212 行中的函数 isT2tNackResponse()
bool NfcTag::isT2tNackResponse (const UINT8* response, UINT32 responseLen)
{
static const char fn [] = "NfcTag::isT2tNackResponse";
bool isNack = false;
if (responseLen == 1)
{
if (response[0] == 0xA) // line 1212: T2tNackResponse always returns NACK if the first byte is NOT 0xA
isNack = false; //an ACK response, so definitely not a NACK
else
isNack = true; //assume every value is a NACK
}
ALOGD ("%s: return %u", fn, isNack);
return isNack;
}
恩智浦 NFC 堆栈
NXP NFC 堆栈中的相同函数在 /platform/packages/apps/Nfc/nxp/jni/com_android_nfc_NativeNfcTag.cpp
函数“com_android_nfc_NativeNfcTag_doTransceive()”第 853 行
static jbyteArray com_android_nfc_NativeNfcTag_doTransceive(JNIEnv *e,
jobject o, jbyteArray data, jboolean raw, jintArray statusTargetLost)
{
..
..
/* Copy results back to Java *
* In case of NfcA and raw, also check the CRC in the response
* and cut it off in the returned data.
*/
if ((nfc_jni_transceive_buffer->length > 2) && checkResponseCrc) { // line 853
if (crc_valid(nfc_jni_transceive_buffer->buffer, nfc_jni_transceive_buffer->length)) {
result = e->NewByteArray(nfc_jni_transceive_buffer->length - 2);
if (result != NULL) {
e->SetByteArrayRegion(result, 0,
nfc_jni_transceive_buffer->length - 2,
(jbyte *)nfc_jni_transceive_buffer->buffer);
}
}
} else {
result = e->NewByteArray(nfc_jni_transceive_buffer->length);
if (result != NULL) {
e->SetByteArrayRegion(result, 0,
nfc_jni_transceive_buffer->length,
(jbyte *)nfc_jni_transceive_buffer->buffer);
}
}
..
..
}
在 NXP NFC 堆栈中,所有内容都被转发到 Java 并返回到 transceive() 函数。
任何帮助/评论将不胜感激。谢谢你。