Считыватель NFC не может прочитать сообщение в формате NDEF

Я разрабатываю приложение для записи nfc. Метки Mifare Ultralight, считыватель ACR122. Ридер показывает мне стандарт "TAG_ISO_14443_3". node.js, библиотека nfc-pcsc. Мне нужно написать URL-ссылку на веб-сайт, поэтому моя функция тега записи выглядит так (здесь я нашел пример структуры NDEF link):

async function writeUrl (reader, url, block = 4) {
//   +-------------------------+----------------------------------------------------------------
//   | D1                      | Header flags 11010001 (MB = ME = 1, CF = 0, SR = 1, IL = 0, TNF = 0x1) TNF = 0x1 is "well known NFC format"
//   +-------------------------+----------------------------------------------------------------
//   | 01                      | Type Length (1 byte)
//   +-------------------------+----------------------------------------------------------------
//   | N                       | Payload Length (N bytes)
//   +-------------------------+----------------------------------------------------------------
//   | 55                      | Type Name ("U")
//   +-------------------------+----------------------------------------------------------------
//   | 04 ...                  | Payload: Identifier code = 4 (prefix "https://"),
//   |                         |          truncated URI = url
//   +-------------------------+----------------------------------------------------------------

  let flagsByte = parseInt('D1', 16)
  let typeLength = 1
  let payloadLength = 1 + url.length // identifierByte + url
  let typeName = parseInt('55', 16) // 'U', Url
  let header = Buffer.from([flagsByte, typeLength, payloadLength, typeName]) // 4 bytes
  let identifier = Buffer.from([parseInt('04', 16)]) // prefix https://, 1 byte
  let urlBuffer = Buffer.from(url, 'utf8')
  let payload = Buffer.concat([identifier, urlBuffer])
  let length = header.length + payload.length
  let remains = length % 4
  length += (4 - remains) // we can write only by blocks (4 bytes)
  if (length > 144) {
    length = 144 // maximum bytes possible
  }

  let data = Buffer.concat([header, payload], length)

  reader.write(block, data);
  console.log(`data written`, reader, data) // data has 30+ not-zero bytes, all ok
  return true;
}

В чем проблема? После того, как я написал сообщение, мое приложение для чтения NFC (приложение GoToTags для Windows) показывает, что мой тег пуст. 'пустой' тег

Пожалуйста помоги. Кажется, я пропустил что-то маленькое, но важное...


person Victor Gorban    schedule 16.04.2020    source источник


Ответы (1)


В NDEF есть нечто большее, чем запись данных для одной записи NDEF, которую вы, кажется, создали.

Сообщение NDEF может иметь несколько записей.

Возможно, вы захотите использовать другую библиотеку, например https://www.npmjs.com/package/ndef легко правильно создать полное сообщение NDEF

Получив сообщение Full NDEF, вы можете записать его на карту.

Я предлагаю вам прочитать http://apps4android.org/nfc-specifications/NFCForum-TS-Type-2-Tag_1.1.pdf, так как вы используете NTAG213, которая является картой типа 2, так как это дает подробную информацию о том, как читать и записывать сообщения NDEF на эти карты.

Краткий синопсис: -

  • Прочтите Capability Container, чтобы найти начальный и конечный блоки области, в которую могут быть записаны сообщения NDEF.
  • Запишите данные Start T L
  • Напишите сообщение NDEF
  • Запишите данные End T

Мы надеемся, что это должно дать вам понимание того, что требуется для записи данных NDEF с использованием низкоуровневых команд. (В качестве примечания я не использую NFC с JS, поэтому не могу помочь более подробно)

person Andrew    schedule 16.04.2020
comment
Я надеюсь, что у меня достаточно информации на данный момент - person Victor Gorban; 17.04.2020