2015-09-09 12 views
5

Ich versuche eine Webanwendung auf einem Chromebook zu erstellen. Ich benötige sie, um die RFID-Kartenseriennummern mit einem ACR122U NFC zu lesen. Ich benutze chrome-nfc.Auslösen eines Ereignisses, wenn eine NFC-Karte angezeigt wird

Ich lese glücklich Karten, aber ich weiß nicht, wie ein Ereignis ausgelöst wird, wenn eine Karte präsentiert wird.

Gibt es in chrom-nfc irgendwelche Ereignisse, die ich verwenden kann, um zu wissen, wann eine Karte dem Leser präsentiert wurde?

EDIT: Ich habe versucht, chrome.nfc.wait_for_tag zu verwenden, aber es verhält sich nicht so, wie ich es erwarten würde.

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

Beide geben die Ergebnisse wie oben sofort, scheint es nicht, welche Zahl Materie ich für ein Timeout verwenden ...

Wenn ich die Funktion ohne Karte auf den Leser rufen, und dann sofort lege die Karte nach Funktionsaufruf auf den Reader, bekomme ich keine Ausgabe in der Konsole.

Antwort

2

Ich bin mit Chrom-nfc nicht vertraut, aber ein Schuss im Dunkeln nehmen durch reverse die source Engineering, sieht es aus wie Sie die wait_for_tag Methode verwenden wollen, wie:

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

.. .Woher device ist Ihr Leser, 3000 ist die maximale Wartezeit (in ms) und ersetzen // Do your magic here. mit Ihrer gewünschten Logik. Wenn das Zeitlimit überschritten wird, sind sowohl tag_type als auch tag_idnull.

Wenn Sie auf unbegrenzte Zeit warten möchten, können Sie einfach eine Funktion mit dem obigen Code rekursiv aufrufen. Beispiel:

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

Das geht davon aus, dass Sie weiter warten möchten, auch nachdem ein Tag angezeigt wurde. Wickeln Sie die waitAllDay(device); in eine else, wenn Sie möchten, dass es stoppt, sobald ein Tag gelesen wird.

UPDATE: Es scheint die wait_for_tag Methode funktioniert nicht wie vorgesehen, so dass ich eine zweite Lösung vorschlagen. Ich lasse die bestehende Lösung für den Fall, dass die Methode von den Entwicklern von Chrome-NFC behoben wird.

Eine andere Sache zu versuchen ist, chrome.nfc.read zu verwenden, innerhalb einer timeout Option, innerhalb einer 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); 

Seien Sie sicher und window.clearInterval(timer) rufen, wann immer Sie es für Tags beobachten stoppen möchten.

+0

Danke @Grinn für Ihren Vorschlag. Ich habe jedoch Probleme, dass es nicht wirklich wartet, es kommt immer sofort zurück. Ich habe die Frage mit einem Beispiel für die Ausgabe aktualisiert. – Hank

+0

@Hank Was ist der Wert von 'tag_id', wenn keine Karte im Leser ist? – Grinn

+0

es ist undefiniert ...es ist, als ob die Funktion abgebrochen wird und es nie zu meinem Callback kommt – Hank

0

Ich halte dies nicht für eine richtige Lösung; Hier ist eine Problemumgehung, die ich vorläufig verwende.

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