ToB企服应用市场:ToB评测及商务社交产业平台

标题: webUsb初识 [打印本页]

作者: 何小豆儿在此    时间: 2025-1-6 19:22
标题: webUsb初识
webUSB初识 --派大星的开发日记

个人开发纪录笔记,仅个人明白,有错误还请指出
概述

WebUSB API 提供了一种将非标准化通用串行总线(USB)兼容设备服务暴露到Web的方法,使USB设备更安全、更易于使用。这项技术目前是实验性的,而且仅在支持的欣赏器的安全上下文中(HTTPS)可用。
概念和用法


接口


设备获取 --需要用户授权

连接设备

  1. let fetchDevices = async () => {
  2.     let devices = await navigator.usb.requestDevice({
  3.         filters: [
  4.             //可以添加`在这里插入代码片`显示条件
  5.         ]
  6.     })
  7.     console.log(devices);
  8. };
  9. let btn = document.getElementById('btn');
  10. btn.onclick = fetchDevices;
复制代码
查找已连接的设备

  1. navigator.usb.getDevices().then((devices) => {
  2.   devices.forEach((device) => {
  3.     console.log(device.productName);
  4.     console.log(device.manufacturerName);
  5.   });
  6. });
复制代码
返回的数据均是USBdevice实例

实例属性


实例方法,在次只先容常用的几个


大致流程

  1. /**
  2. * 请求用户选择USB设备
  3. * @returns {Promise<USBDevice>} 选中的USB设备对象
  4. */
  5. let fetchDevices = async () => {
  6.     try {
  7.         // 根据条件过滤设备
  8.         // filters: [
  9.         //   { vendorId: 0x2341 }, // 供应商ID,用于匹配特定供应商的设备
  10.         //   { productId: 0x1234 }, // 产品ID,用于匹配特定产品的设备
  11.         //   { classCode: 0x02 }, // 设备类代码,用于匹配特定类别的设备
  12.         //   { subclass: 0x01 }, // 子类代码,用于匹配特定子类的设备
  13.         //   { protocolCode: 0x01 } // 协议代码,用于匹配特定协议的设备
  14.         // ]
  15.         let device = await navigator.usb.requestDevice({
  16.             filters: [
  17.                 { vendorId: 0x2341 } // 示例vendorId,需要替换成实际值
  18.             ]
  19.         });
  20.         console.log('选中的设备:', device);
  21.         return device;
  22.     } catch (error) {
  23.         console.error('选择设备失败:', error);
  24.     }
  25. };
  26. /**
  27. * 打开USB设备会话
  28. * @param {USBDevice} device - USB设备对象
  29. * @returns {Promise<void>}
  30. */
  31. let openDevice = async (device) => {
  32.     try {
  33.         await device.open();
  34.         console.log('设备会话已打开');
  35.     } catch (error) {
  36.         console.error('打开设备会话失败:', error);
  37.     }
  38. };
  39. /**
  40. * 声明USB设备的接口
  41. * @param {USBDevice} device - USB设备对象
  42. * @param {number} interfaceNumber - 接口编号
  43. * @returns {Promise<void>}
  44. */
  45. let claimInterface = async (device, interfaceNumber) => {
  46.     try {
  47.         await device.claimInterface(interfaceNumber);
  48.         console.log('接口已声明');
  49.     } catch (error) {
  50.         console.error('声明接口失败:', error);
  51.     }
  52. };
  53. /**
  54. * 向USB设备发送控制传输数据
  55. * @param {USBDevice} device - USB设备对象
  56. * @param {number} endpointNumber - 端点编号
  57. * @param {Uint8Array} data - 要发送的数据
  58. * @returns {Promise<void>}
  59. */
  60. let sendControlTransferOut = async (device, endpointNumber, data) => {
  61.     try {
  62.         // controlTransferOut参数说明:
  63.         // requestType: 'standard' | 'class' | 'vendor' - 控制传输的类型
  64.         //   - 'standard': 标准请求,用于基本控制操作
  65.         //   - 'class': 类请求,针对特定USB设备类
  66.         //   - 'vendor': 供应商请求,供应商自定义的请求
  67.         // recipient: 'device' | 'interface' | 'endpoint' | 'other' - 控制传输的接收者
  68.         //   - 'device': 接收者为USB设备
  69.         //   - 'interface': 接收者为USB设备的特定接口
  70.         //   - 'endpoint': 接收者为USB设备的特定端点
  71.         //   - 'other': 其他类型的接收者
  72.         const result = await device.controlTransferOut({
  73.             requestType: 'vendor', // 供应商定义的控制传输
  74.             recipient: 'device', // 控制传输的接收者为设备
  75.             request: 0x01, // 请求码,供应商定义
  76.             value: 0x00, // 值,供应商定义
  77.             index: 0x00, // 索引,供应商定义
  78.             length: data.byteLength
  79.         }, data);
  80.         console.log('控制传输输出成功', result);
  81.     } catch (error) {
  82.         console.error('控制传输输出失败:', error);
  83.     }
  84. };
  85. /**
  86. * 关闭USB设备会话
  87. * @param {USBDevice} device - USB设备对象
  88. * @returns {Promise<void>}
  89. */
  90. let closeDevice = async (device) => {
  91.     try {
  92.         await device.close();
  93.         console.log('设备会话已关闭');
  94.     } catch (error) {
  95.         console.error('关闭设备会话失败:', error);
  96.     }
  97. };
  98. // 主函数:执行发送数据的整体流程
  99. let sendDataToDevice = async () => {
  100.     const device = await fetchDevices(); // 请求设备
  101.     if (device) {
  102.         await openDevice(device); // 打开设备会话
  103.         await claimInterface(device, 0); // 声明接口,这里以接口编号0为例
  104.         const dataToSend = new Uint8Array([0x01, 0x02, 0x03, 0x04]); // 要发送的数据
  105.         await sendControlTransferOut(device, 0x01, dataToSend); // 发送数据
  106.         await closeDevice(device); // 关闭设备会话
  107.     }
  108. };
  109. // 执行主函数
  110. sendDataToDevice();
复制代码
往interface写入数据的时间,记得要有out权限哦,in/out一样是不可以的。如果遇到了无法办理的问题,记得试一下webHid

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4