Читатель NF C не может прочитать сообщение в формате NDEF - PullRequest
0 голосов
/ 16 апреля 2020

Я занимаюсь разработкой приложения для писателя nf c. Сверхлегкие метки Mifare, считыватель ACR122. Читатель показывает мне стандарт "TAG_ISO_14443_3". node.js, nf c -pcs c lib. Мне нужно написать URL-ссылку на веб-сайт, поэтому моя функция записи тега выглядит следующим образом (я нашел пример структуры NDEF ссылка ):

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;
}

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

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

1 Ответ

0 голосов
/ 17 апреля 2020

В 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 на эти карты.

Краткий обзор: -

  • Read Capability Container для поиска начального и конечного блока области, в которую могут быть записаны сообщения NDEF
  • Запись данных начального TL
  • Запись сообщения NDEF
  • Запись данных конца T

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

...