Запустить событие, когда карта NFC представлена

Я пытаюсь создать веб-приложение на Chromebook, оно мне нужно для чтения серийных номеров RFID-карт с помощью ACR122U NFC. Я использую Chrome-NFC.

Я с удовольствием читаю карты, но не знаю, как вызвать событие, когда карта представлена.

Есть ли какие-либо события в chrome-nfc, которые я могу использовать, чтобы узнать, когда карта была представлена ​​читателю?

РЕДАКТИРОВАТЬ: я пытался использовать chrome.nfc.wait_for_tag, но он не ведет себя так, как я ожидал.

// With a card on the reader
chrome.nfc.wait_for_tag(device, 10000, function(tag_type, tag_id){
  var CSN = new Uint32Array(tag_id)[0];
  console.log ( "CSN: " + CSN );
});

[DEBUG] acr122_set_timeout(round up to 1275 secs)
DEBUG: InListPassiveTarget SENS_REQ(ATQA)=0x4, SEL_RES(SAK)=0x8
DEBUG: tag_id: B6CA9B6B
DEBUG: found Mifare Classic 1K (106k type A)
[DEBUG] nfc.wait_for_passive_target: mifare_classic with ID: B6CA9B6B
CSN: 1805372086



// with no card on the reader
chrome.nfc.wait_for_tag(device, 10000, function(tag_type, tag_id){
  var CSN = new Uint32Array(tag_id)[0];
  console.log ( "CSN: " + CSN );
});

[DEBUG] acr122_set_timeout(round up to 1275 secs)
DEBUG: found 0 target, tg=144

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

Если я вызываю функцию без карты на считывающем устройстве, а затем сразу же помещаю карту в считывающее устройство после вызова функции, я не получаю вывод в консоли.

2 ответа

Я не знаком с chrome-nfc, но сделав снимок в темноте путем обратного инжиниринга источника, похоже, что вы захотите использовать wait_for_tag метод, как:

chrome.nfc.wait_for_tag(device, 3000, function(tag_type, tag_id) {
    // Do your magic here.
});

...Куда device твой читатель, 3000 максимальное время ожидания (в мс) и замены // Do your magic here. с вашей желаемой логикой. Если время истекло, оба tag_type а также tag_id будет null,

Если вы хотите ждать неопределенно долго, вы можете просто рекурсивно вызвать функцию с приведенным выше кодом. Пример:

function waitAllDay(device) {
    chrome.nfc.wait_for_tag(device, 1000, function(tag_type, tag_id) {
        if(tag_type !== null && tag_id !== null)
        {
            // Do your magic here.
        }
        waitAllDay(device);
    });
}

Это предполагает, что вы хотите, чтобы он продолжал ждать даже после того, как тег был представлен. Обернуть waitAllDay(device); в else если вы хотите, чтобы он остановился после прочтения тега.

ОБНОВЛЕНИЕ: Кажется, wait_for_tag Метод не работает, как задумано, поэтому я предлагаю второе решение. Я оставляю существующее решение на месте, если метод исправлен разработчиками chrome-nfc.

Еще одна вещь, чтобы попробовать это использовать chrome.nfc.readпроходя в timeout вариант, внутри window.setInterval,

var timer = window.setInterval(function () {
        chrome.nfc.read(device, { timeout: 1000 }, function(type, ndef) {
            if(!!type && !!ndef) {
                // Do your magic here.
                // Uncomment the next line if you want it to stop once found.
                // window.clearInterval(timer);
            }
        });
    }, 1000);

Будь уверен и позвони window.clearInterval(timer) всякий раз, когда вы хотите, чтобы он прекратил наблюдать за тегами.

Пока я не считаю это правильным решением; вот обходной путь, который я использую в настоящее время.

function listen_for_tag(callback, listen_timeout){

  var poll_delay = 400; //ms
  var listen_loop = null;
  if(!listen_timeout){
    listen_timeout = 99999999;
  }

  function check_for_tag(){
    if(listen_timeout < 0) {
      clearInterval(listen_loop);
      console.log("we didnt find a tag. finished");
    }
    chrome.nfc.wait_for_tag(dev_manager.devs[0].clients[0], 10, function(tag_type, tag_id){
      console.log ( "FOUND A TAG!!" );
      clearInterval(listen_loop);

      // handle the callback (call it now)
      var C = callback;
      if (C) {
        callback = null;
        window.setTimeout(function() {
        C(tag_type, tag_id);
        }, 0);
      }
    });
    listen_timeout -= poll_delay;
  }
    listen_loop = setInterval(check_for_tag, poll_delay);
}
Другие вопросы по тегам