2015-09-09 6 views
5

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

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

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

EDIT: Я пытаюсь использовать 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

Я не знаком с хромированными НКА, но, принимая выстрел в темноте обратного проектирования в source, это выглядит, как вы хотели бы использовать wait_for_tag метод, как:

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

.. .Where 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, если вы хотите, чтобы он остановился после чтения тега.

UPDATE: Похоже, что метод 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) всякий раз, когда вы хотите, чтобы прекратить просмотр тегов.

+0

Спасибо @Grinn за ваше предложение. У меня возникают проблемы, однако, что он на самом деле не ждет, он всегда возвращается сразу. Я обновил вопрос на примере вывода. – Hank

+0

@Что такое значение 'tag_id', когда в считывателе нет карты? – Grinn

+0

не определено ...его как будто функция отменена, и она никогда не доходит до моего обратного вызова. – Hank

0

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

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); 
} 
Смежные вопросы