2015-09-09 35 views
5

Sto tentando di creare una webapp su un Chromebook, ho bisogno di leggere i numeri seriali della scheda RFID con un NFC ACR122U. Sto usando chrome-nfc.Attiva un evento quando viene presentata una scheda NFC

Sto leggendo le carte allegramente, ma non so come sparare un evento quando viene presentata una carta.

Ci sono eventi in chrome-nfc che posso usare per sapere quando una carta è stata presentata al lettore?

EDIT: Ho cercato di utilizzare chrome.nfc.wait_for_tag, ma non si comporta come mi aspetterei.

// 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 

Entrambi restituiscono i risultati come sopra immediatamente, non sembra importare che il numero che uso per un timeout ...

Se io chiamo la funzione con nessuna scheda sul lettore, e poi subito mettere la carta sul lettore dopo la chiamata di funzione, non ottengo alcun output nella console.

risposta

2

io non sono a conoscenza di cromo-NFC, ma prendendo un salto nel buio per il reverse engineering source, sembra che si desidera utilizzare il metodo wait_for_tag, come:

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

.. .Dove device è il tuo lettore, 3000 è il tempo massimo di attesa (in ms) e la sostituzione di // Do your magic here. con la logica desiderata. Se scade, sia tag_type sia tag_id sarà null.

Se si desidera attendere indefinitamente, è possibile chiamare ricorsivamente una funzione con il codice precedente. Esempio:

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

Questo presuppone che si desideri continuare ad attendere anche dopo che un tag è stato presentato. Avvolgi lo waitAllDay(device); in un else se vuoi che si fermi quando viene letto un tag.

UPDATE: Sembra che il metodo wait_for_tag non funzioni come previsto, quindi sto proponendo una seconda soluzione. Sto lasciando la soluzione esistente in atto nel caso in cui il metodo è stato risolto dagli sviluppatori di chrome-nfc.

Un'altra cosa da provare è utilizzare chrome.nfc.read, inserendo un'opzione timeout all'interno di uno 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); 

Essere sicuri e chiamare window.clearInterval(timer) ogni volta che si desidera interrompere la visione per i tag.

+0

Grazie a @Grinn per il vostro suggerimento. Tuttavia sto avendo problemi, che in realtà non sta facendo nessuna attesa, sempre ritorna immediatamente. Ho aggiornato la domanda con un esempio di output. – Hank

+0

@Hank qual è il valore di 'tag_id' quando non ci sono carte nel lettore? – Grinn

+0

non è definito ...è come se la funzione fosse cancellata e non riuscisse mai a richiamarla – Hank

0

Mentre io non considero questa una soluzione adeguata; ecco una soluzione che sto usando per il momento.

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