Запустить событие, когда карта 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);
}