2015-09-09 10 views
5

私はChromebookのWebアプリケーションを構築しようとしています提示されたイベントは、私はそれがACR122U NFCとRFIDカードのシリアル番号を読み取る必要があります。私はchrome-nfcを使用しています。火NFCカードが

私は喜んでカードを読んでいますが、私はカードを提示されたときにイベントを発生する方法がわかりません。

私はカードをリーダーに提示されたときを知るために使用できるクロム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

私はクロームNFCに慣れていないんだけど、あなたのような、wait_for_tagメソッドを使用したいと思うように逆sourceを操作することによって暗闇の中でショットを取って、それが見えます:

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

.. 。deviceがあなたの読者である場合は、3000が待機する最大時間(ms)で、// Do your magic here.を希望のロジックに置き換えます。タイムアウトすると、tag_typetag_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); 
    }); 
} 

これは、タグが提示されても待機し続けたいと仮定しています。タグを読み取った後に停止させたい場合はelsewaitAllDay(device);を入れてください。

UPDATE:意図したとおりwait_for_tag方法が動作しないようですので、私は第二の溶液を提案しています。 chrome-nfcの開発者がこのメソッドを修正する場合は、既存のソリューションをそのまま残しておきます。

もう1つの試みは、window.setIntervalの中のtimeoutオプションを使用して、chrome.nfc.readを使用することです。

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

ありがとうございます。私は問題を抱えていますが、実際に待っているわけではなく、いつもすぐに戻ります。私は出力の例で質問を更新しました。 – Hank

+0

@Hankリーダーにカードがないときに '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); 
}