Web物理设备接口API

Posted by Mars . Modified at

目前的 Web 设备接口API:

  1. Web USB API; (USB通信)
  2. Web Serial API; (串口通信)
  3. Web NFC API; (NFC通信)
  4. Web Bluetooth API; (蓝牙通信)
  5. Web HID API; (人机接口设备通信)

为保证安全,这些API:

  • 只在htttps或wss协议下才可获取;
  • 单例模式:它们的接口类不能通过new实例化,方法也不能直接调用,在浏览器中需要通过navigator下面的属性来获取对应接口实例。(navigator.usb等)

一、Web物理设备接口API的使用场景

Web物理设备接口API的前景非常广阔。

它的优势主要是:利用Web的跨平台性,通过物理设备接口API,可以让开发者充分利用用户现有的设备(无需重新购买),为用户开发使用体验更好的各类Web应用(无需安装且跨平台)。

Google在2020年底的开发者大会上,专题讲解了这类Chrome新特性,并提供了多种新的Web应用场景

  1. Web Serial: 为每个用户配备一个微型物理设备(与用户主机通过串口连接),使用Web Serial API与其进行通信,对用户进行识别和认证,用户无需安装任何软件,只需要打开一个网页,就可以打开IDE进行代码编写。同时,软件更新只需要在网页服务器统一进行,无需考虑用户平台,也无需用户手动更新。
  2. Web NFC: 艺术博物馆为每张画作配备一个NFC贴片,浏览者无需安装应用,打开网页即可贴近NFC查看具体画作信息。
  3. Web HID: 键盘鼠标厂商通过Web网页直接控制、更新自家设备的固件,无需另配设备驱动;

二、Web各类物理设备接口API的特性及使用

2.1 Web USB API

2.1.1 USB 类

2.1.1.1 事件

2.1.1.1.1 USB.onconnect

每当连接到先前配对的USB设备时,调用此事件处理器。

2.1.1.1.2 USB.ondisconnect

每当配对USB设备断开连接时,调用此事件处理器。

2.1.1.2 方法

2.1.1.2.1 USB.getDevices()

返回Promise,Resolve为当前源下,先前配对过的USB设备组成的数组。

2.1.1.2.2 USB.requestDevice(<filters>)

请求获取USB设备。(弹出用户选择窗口,返回promise对象)

传入一个filters对象,其中有filters属性,值为一个数组,代表选择的USB设备类型过滤器。过滤器中属性取值范围:

  • vendorId
  • productId
  • classCode
  • subclassCode
  • protocolCode
  • serialNumber

2.2 Web Serial API

Web Serial API: Web 串口通信

Web Serial API 提供了一种途径,让网页可以通过javascript读写串口设备。

这个API将通过允许网页文档与微型控制器、3D打印机等物理设备进行串口通信的方式,桥接web和物理现实世界。

2.2.1 Serial 类

Serial类,提供了Web串口通信的属性和方法。

Serial类无法手动实例化,其原型上的方法也不能手动调用,只能通过Chrome内置实例navigator.serial调用。

2.2.1.1 Serial 方法

2.2.1.1.1 navigator.serial.requestPort([options])

这个方法必须由用户主动操作来调用(比如点击按钮)

第一次访问网页,如果想要使用串口通信,必须先调用这个方法,来让用户选择暴露哪个串口给网页,之后才能获取到串口。

返回一个Promise:

  • 当用户完成选择后,resolve为一个SerialPort对象,也就是用户选择的串口;
  • 当用户取消选择,reject。

options为一个对象,可包含以下属性:

  • filters: 过滤串口,值为一个数组,里面包含一系列过滤信息对象filterIObj,每个过滤信息对象filterObj可以包含:
    • usbVendorId: 一个无符号整数,识别USB设备的制造商;
    • usbProductId: 一个无符号整数,识别USB设备。
2.2.1.1.2 navigator.serial.getPorts()

返回一个Promise对象:

  • resolve为一个数组arr;
  • arr中包含了一系列SerialPort实例对象,表示当前源下已被允许访问的串口集合(通过之前的requestPort)。

2.2.1.2 Serial 事件

2.2.1.2.1 connect事件

当串口与设备连接时触发。

2.2.1.2.2 disconnect事件

当串口与设备断开连接时触发。

2.2.1.3 Serial 使用示例

navigator.serial.addEventListener('connect', (e) => {
  // Connect to `e.target` or add it to a list of available ports.
});

navigator.serial.addEventListener('disconnect', (e) => {
  // Remove `e.target` from the list of available ports.
});

navigator.serial.getPorts().then((ports) => {
  // Initialize the list of available ports with `ports` on page load.
});

button.addEventListener('click', () => {
  const usbVendorId = ...;
  navigator.serial.requestPort({ filters: [{ usbVendorId }]}).then((port) => {
    // Connect to `port` or add it to the list of available ports.
  }).catch((e) => {
    // The user didn't select a port.
  });
});

2.2.2 SerialPort 类

2.3 Web NFC API

仅在移动端浏览器可获取。

2.4 Web Bluetooth API

2.4.1 Bluetooth 类

2.4.1.1 Bluetooth.getAvailability()

返回Promise,resolve为一个布尔值。该值指示用户代理是否支持蓝牙。

2.4.1.2 Bluetooth.getDevices()

返回一个解析为BluetoothDevices数组的Promise,该数组的源端已经通过调用Bluetooth.requestDevice()获得了允许。

2.4.1.3 Bluetooth.requestDevice([options])

通过传入一个指定的选项,请求蓝牙设备。当配对成功,返回resolve为配对的BluetoothDevice对象的Promise。

2.5 Web HID API

类似于USB API,通过navigator.hid获取。

Keywords: Web Web API
previousPost nextPost
已经有 1000000 个小伙伴看完了这篇推文。