5

我正在尝试在 Chromebook 上构建一个 webapp,我需要它使用 ACR122U NFC 读取 RFID 卡序列号。我正在使用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

两者都立即返回上面的结果,我用什么数字来超时似乎并不重要......

如果我在读卡器上没有卡的情况下调用函数,然后在函数调用后立即将卡放在读卡器上,我在控制台中没有输出。

4

2 回答 2

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_typetag_idnull.

如果你想无限期地等待,你可以用上面的代码递归调用一个函数。例子:

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在.timeoutwindow.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)在您希望它停止查看标签时拨打电话。

于 2015-09-09T15:25:27.030 回答
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);
}
于 2015-09-10T14:14:33.730 回答