This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

NFC_T4T_EVENT_NDEF_READ event not working every time

Hello,

i am working on an app using Android to read and write an NDEF record using SDK 14 type 4 tag.

I start the process by reading the record with the following Android sequence:

Ndef ndef = Ndef.get(mTag);
ndef.connect();
NdefMessage ndefMessage = ndef.getNdefMessage();
ndef.close();

This produces an NFC_T4T_EVENT_NDEF_READ event on the Nordic side as expected.

After this, i write a record to the NRF52. The record is received. This produces an NFC_T4T_EVENT_NDEF_UPDATED event as expected.

After this, i update the record on the NRF52. Then i read the record with the exact same sequence as before. This time, no NFC_T4T_EVENT_NDEF_READ event is produced, even though my debugs in hal_nfc_t4t.c clearly show, that the record is read and sent properly to the Android device.

Is this some known feature or bug? It seems that only one NFC_T4T_EVENT_NDEF_READ event is produced per session when using Android Ndef library. After the NRF52 NFC interface has been reset, i can get one event. The record read works just fine, and the Android SW receives the correct data. Only the event is missing, which i need for my control flow.

Has anyone else encountered this problem, and found a solution or at least a workaround?

BR, tommi

Parents Reply Children
  • Thank you for your answer. This makes it clear that the event is not intended to work as the NFC_T4T_EVENT_NDEF_UPDATED event, which is produced every time the contents of a record is updated.

    Do you have any intention of making an event, that is produced when the record contents have been read, in future SDK releases? It would be helpful to know when the remote has updated the message, and i don't think it would be too hard to implement.

    I will proceed by trying to make a workaround on the smartphone for now.

    BR, tommi

  • Also, i am kind of curious what is meant by " last byte of NDEF message", if not the last byte that Ndef.getMessage() -function in Android SDK reads?

  • I am not that familiar with Android SDK, but this is probably the last byte that Ndef.getMessage() reads.

    You can take a look at the writable_ndef_msg example and its default NDEF message generation (copypasted code block):

    uint32_t size = sizeof(m_ndef_msg_buf);
    err_code = ndef_file_default_message(m_ndef_msg_buf, &size);
    APP_ERROR_CHECK(err_code);
    NRF_LOG_INFO("The last byte of NDEF message: 0x%02X", m_ndef_msg_buf[size-1]);
    

    I added the last line to clarify what is the last byte from the nordic NFC library perspective (so you can compare with Android output). Of course, the different NDEF message may change the position of the last byte.

  • Ok. Now i actually understood your earlier comment, even though i read it multiple times before. The once per session part did not hit me at first :)

    What is the cause of this implementation? Why is this only once per session?

    I will have to work out a way to cheat the NRF52 to think that the session has ended to be able to reproduce the event and get on with my application.

    BR tommi

  • Well, we did not see any valid use case for such implementation. However, the NFC_T4T_EVENT_NDEF_READ event generation will be changed in future SDK releases. This event will appear when the last byte of NDEF message is read (without once per session limitation).

    If you are interested in using NFC to exchange the data without the use of NDEF layer, you can use NFC T4T Library In Raw mode. The data is transfered in this case using just the ISO-DEP protocol. There is an nfc_uart example that shows how to exchange custom data over NFC. And Android SDK also provides API for ISO-DEP exchanges.

Related