从 NFC 阅读器直接读取到桌面 Web 应用程序?

问题描述

我在 Linux 终端上使用 Libnfc 识别我的 ACR122U 阅读器,我想知道是否有一种方法可以在 Linux 桌面上通过 Chrome 工作,因为它与 Android 支持非常相似,具有所有 NFC 设备处理由 libnfc 完成,浏览器只需要知道这个库,而不是每种类型的 USB 或其他设备,而不是可以执行 NFC 的设备。

我尝试使用 Webnfc API 连接它:

document.getElementById("scanButton").addEventListener("click",async () => {
    log.innerHTML = "NFC Register started...";

    try {
      const ndef = new NDEFReader();
      await ndef.scan();
      log.innerHTML = ("> Scan started");
  
      ndef.addEventListener("readingerror",() => {
        log.innerHTML = ("Argh! Cannot read data from the NFC tag. Try another one?");
      });
  
      ndef.addEventListener("reading",({ message,serialNumber }) => {
        log.innerHTML = ("ID  ${serialNumber} logged @" + dt.toLocaleTimeString());   });
    } catch (error) {
      log.innerHTML = (error);
    }
  });

  document.getElementById("stopButton").onclick = function(){
    log.innerHTML = "NFC Register stopped @ " + new Date().toLocaleTimeString();
    }; 

但我遇到了Error: NFC Permission Request denied

和用于连接它的 WebUSB API:

var usbd = {};
let device;
let deviceEndpoint = 0x02;

let powerUpDevice = new Uint8Array([0x62,0x00,0x01,0x00]).buffer;
let getCardUID = new Uint8Array([0xff,0xca,0x04]).buffer;

(function() {
    'use strict';

    usbd.authorize = function(){
        navigator.usb.requestDevice({ filters: [{ vendorId: 0x072f }] })
            .then(selectedDevice => {
                device = selectedDevice;
                console.log(device.configuration.interfaces[0].interfaceNumber);
                console.log(device.manufacturerName);
                console.log(device.productName);
                console.log(device);
                return device.open()
                    .then(() => {
                        if (device.configuration === null) {
                            return device.selectConfiguration(1);
                        }
                    });
            })
            .then(() => device.claimInterface(0))

但我遇到了 Error: ...blocked because it implements a protected interface class,即不支持,所以不行。

有没有办法合并 libusb/libnfc 库或任何其他方法来直接连接 NFC 阅读器以读取网络浏览器/应用程序?

解决方法

Web NFC 仅在 2021 年 2 月支持 Android。请参阅 https://web.dev/nfc/

WebUSB 错误表明您正在请求一个实现受保护类的接口(包括以下类):

  // USB Class Codes are defined by the USB-IF:
  // https://www.usb.org/defined-class-codes
  const uint8_t kProtectedClasses[] = {
      0x01,// Audio
      0x03,// HID
      0x08,// Mass Storage
      0x0B,// Smart Card
      0x0E,// Video
      0x10,// Audio/Video
      0xE0,// Wireless Controller (Bluetooth and Wireless USB)
  };

我想知道这是否是 linux 的事情,因为我能够通过 WebUSB 与 ACR122U 和 SCL3711 NFC 读取器 USB 设备进行通信。见https://github.com/beaufortfrancois/chrome-nfc

您有没有先尝试WebHID?见https://web.dev/hid

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...