webHID初识 --派大星的开发日记
个人开发记录笔记,仅个人理解,有错误还请指出
概述
WebHID API是一个实验性的Web技术,它允许Web应用程序与人类接口设备(HID)进行双向通信。HID设备包括键盘、鼠标、游戏控制器等,它们通过USB、蓝牙等协议与计算机通信。WebHID API使得Web开发者能够创建能够直接与这些设备交互的应用,无需浏览器插件或扩展
核心接口
- HId:提供连接HID设备、列出已连接HID设备以及处理连接HID设备的事件处理器的方法。
- HIDDevice:代表一个HID设备。单个物理设备可能由多个
HIDDevice
对象表示。 - HIDInputReportEvent:当从任何关联的HID设备接收到输入报告时,会被传递给
HIDDevice
的inputreport
事件。 - HIDConnectionEvent:当设备连接或断开连接时,会被传递给
HID
的connect
和disconnect
事件。
HIDDevice实例属性
- vendorId:
- 类型:
number
- 描述:设备的供应商ID,这是一个16位的无符号整数,用于标识设备的制造商。
- 类型:
- productId:
- 类型:
number
- 描述:设备的产品ID,这也是一个16位的无符号整数,用于标识制造商特定的产品。
- 类型:
- productName:
- 类型:
string
- 描述:设备的名称,通常由制造商提供,用于描述设备。
- 类型:
- usage:
- 类型:
number
- 描述:设备的用途,是一个16位的无符号整数,遵循 HID Usage Tables 标准。
- 类型:
- usagePage:
- 类型:
number
- 描述:设备的用途页面,是一个16位的无符号整数,用于指定用途的类别(例如,键盘、游戏杆等)。
- 类型:
- collections:
- 类型:
HIDCollection[]
- 描述:一个包含
HIDCollection
对象的数组,每个对象代表设备报告的一个逻辑组。
- 类型:
- opend:
- 类型:
boolean
- 描述:表示设备是否已经打开并且准备好进行数据传输。
- 类型:
- featureReports:
- 类型:
HIDReportItem[]
- 描述:一个包含
HIDReportItem
对象的数组,这些对象代表特征报告中的各个字段。
- 类型:
- oninputReport:
- 类型:
EventHandler
- 描述:一个事件处理器,当从设备接收到输入报告时会被触发。
- 类型:
- ondisconnect:
- 类型:
EventHandler
- 描述:一个事件处理器,当设备断开连接时会被触发。
- 类型:
HIDDevice实例实例方法
- open( ):
- 描述:打开与 HID 设备的连接。
- 返回值:返回一个
Promise
,当连接成功建立时解析。 - 用途:在开始与 HID 设备通信之前,需要先打开连接。
- close( ):
- 描述:关闭与 HID 设备的连接。
- 返回值:返回一个
Promise
,当连接成功关闭时解析。 - 用途:在完成与 HID 设备的通信后,关闭连接以释放资源。
- forget( ):
- 描述:关闭与 HID 设备的连接,并重置访问权限。
- 返回值:返回一个
Promise
,当权限被重置后解析。 - 用途:在不再需要与 HID 设备通信时,使用此方法来清理连接和权限。
- sendReport(reportId,data):
- 描述:向 HID 设备发送一个输出报告。
- 参数:
reportId
:要发送的报告的 ID。data
:要发送的数据。
- 返回值:返回一个
Promise
,当报告被发送后解析。 - 用途:用于向 HID 设备发送数据,例如控制信号或命令。
- sendFeatureReport(reportId,data):
- 描述:向 HID 设备发送一个特征报告。
- 参数:
reportId
:要发送的特征报告的 ID。data
:要发送的数据。
- 返回值:返回一个
Promise
,当特征报告被发送后解析。 - 用途:用于发送设备特定的、非标准的控制信号或查询设备状态。
- receiveFeatureReport(reportId):
- 描述:从 HID 设备接收一个特征报告。
- 参数:
reportId
:要接收的特征报告的 ID。
- 返回值:返回一个
Promise
,解析为一个DataView
对象,允许对消息内容进行类型化访问。 - 用途:用于从 HID 设备接收设备特定的、非标准的数据或状态信息。
连接设备并打开
// 设备连接
let connectDevice = async () => {
if ("hid" in navigator) {
connectionState.value = 2;
try {
const res = await navigator.hid.requestDevice({
filters: [
// { productId: 0x01, vendorId: 0x02 }
],
});
if (!device.value.opened) {
await openDevice(device.value);
const deviceInfo = {
productId: device.value.productId,
vendorId: device.value.vendorId,
};
localStorage.setItem("deviceInfo", JSON.stringify(deviceInfo));
}
} catch (error) {
console.log(error)
}
}
};
//打开设备
let openDevice = async (device) => {
await device.open();
};
传输数据
//命令数据
let arr = [命令1,命令2,命令3,命令4,命令5];
//发送的报告id
let reportId = "你的reportId"
//数量根据实际情况定
let dataView = new DataView(new ArrayBuffer(64))
arr.forEach((item, index) => {
dataView.setUint8(index, parseInt(item, 16));
});
//传输数据
device.sendReport(reportId, dataView.buffer).then(res=>{});