Web物理设备接口API
Posted by Mars . Modified at
目前的 Web 设备接口API:
为保证安全,这些API:
- 只在htttps或wss协议下才可获取;
- 单例模式:它们的接口类不能通过
new
实例化,方法也不能直接调用,在浏览器中需要通过navigator
下面的属性来获取对应接口实例。(navigator.usb
等)
一、Web物理设备接口API的使用场景
Web物理设备接口API的前景非常广阔。
它的优势主要是:利用Web的跨平台性,通过物理设备接口API,可以让开发者充分利用用户现有的设备(无需重新购买),为用户开发使用体验更好的各类Web应用(无需安装且跨平台)。
Google在2020年底的开发者大会上,专题讲解了这类Chrome新特性,并提供了多种新的Web应用场景:
- Web Serial: 为每个用户配备一个微型物理设备(与用户主机通过串口连接),使用Web Serial API与其进行通信,对用户进行识别和认证,用户无需安装任何软件,只需要打开一个网页,就可以打开IDE进行代码编写。同时,软件更新只需要在网页服务器统一进行,无需考虑用户平台,也无需用户手动更新。
- Web NFC: 艺术博物馆为每张画作配备一个NFC贴片,浏览者无需安装应用,打开网页即可贴近NFC查看具体画作信息。
- 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
获取。