首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在浏览器上访问USB设备

在浏览器上访问USB设备

作者头像
云深无际
发布于 2020-08-11 09:00:32
发布于 2020-08-11 09:00:32
11K07
代码可运行
举报
文章被收录于专栏:云深之无迹云深之无迹
运行总次数:7
代码可运行
如果我说简单明了的“ USB”,您很有可能会立即想到键盘,鼠标,音频,视频和存储设备。没错,但是您会发现其他种类的通用串行总线(USB)设备。

这些非标准USB设备要求硬件供应商编写本机驱动程序和SDK,以便您(开发人员)能够利用它们。遗憾的是,此本地代码历来阻止了Web使用这些设备。这就是创建WebUSB API的原因之一:提供一种将USB设备服务公开到Web的方法。使用此API,硬件制造商将能够为其设备构建跨平台的JavaScript SDK。但是最重要的是,通过将USB引入网络,这将使USB更安全,更易于使用。

让我们看看您对WebUSB API的期望:

  1. 购买USB设备。
  2. 将其插入计算机。
  3. 随即会显示一条通知,并提供访问此设备的正确网站。
  4. 只需单击它。网站在那里,随时可以使用!
  5. 单击以连接,然后USB设备选择器将显示在Chrome中,您可以在其中选择设备。
  6. 多田!

如果没有WebUSB API,此过程将如何?

  • 阅读框,标签或在线搜索,可能最终会在错误的网站上看到。
  • 必须安装本机应用程序。
  • 我的操作系统支持吗?确保下载“正确”的东西。
  • 可怕的操作系统提示弹出窗口,并警告您有关从Internet安装驱动程序/应用程序的信息。
  • 错误的代码会损害整个计算机。该Web 包含故障网站。
  • 只能使用USB设备一次?在Web上,一旦关闭选项卡,该网站就会消失。在计算机上,代码始终存在。

开始之前

本文假定您具有USB工作原理的一些基本知识。如果没有,我建议您在NutShell中读取USB。有关USB的背景信息,请查看官方USB规格。

该WebUSB API在Chrome 61是可用的。

适用于原产地审判

为了从使用该领域的WebUSB API的开发人员那里获得尽可能多的反馈,我们先前已在Chrome 54和Chrome 57中将此功能添加为原始试用。

最新的审判已于2017年9月成功结束。

隐私权与安全性

仅HTTPS

由于此API是网络上新增的强大功能,因此Chrome旨在使其仅可用于安全上下文。这意味着您需要在构建时考虑TLS。

注意:我们非常关注安全性,因此您会注意到新的Web功能需要HTTPS。WebUSB API没什么不同,这也是在您的站点上启动并运行HTTPS的另一个很好的理由。

在开发过程中,您将能够http://localhost使用Chrome Dev Editor 或handy之类的工具与WebUSB进行交互 python -m SimpleHTTPServer,但是要在网站上部署它,则需要在服务器上设置HTTPS。我个人出于演示目的而喜欢GitHub Pages。

要将HTTPS添加到服务器,您需要获取TLS证书并进行设置。请务必查看“ 使用HTTPS 进行安全性”文章,以获取最佳实践。有关信息,您现在可以使用新的证书颁发机构Let's Encrypt获得免费的TLS证书。

需要用户手势

作为一项安全功能,navigator.usb.requestDevice必须通过诸如触摸或鼠标单击之类的用户手势来调用已连接的USB设备 。

功能政策

功能策略是一种机制,允许开发人员有选择地启用和禁用各种浏览器功能和API。可以通过HTTP标头和/或iframe“ allow”属性进行定义。

您可以定义一个功能来控制usb属性是否显示在Navigator对象上,或者如果允许WebUSB,则换句话说。

以下是不允许使用WebUSB的标头策略的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Feature-Policy: fullscreen "*"; usb "none"; payment "self" https://payment.example.com

下面是另一个允许USB的容器策略的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<iframe allowpaymentrequest allow=’usb fullscreen’></iframe>

让我们开始编码

WebUSB API严重依赖JavaScript Promises。如果您不熟悉它们,请查看此出色的 Promises教程。还有一件事,() => {}就是ECMAScript 2015 Arrow函数 -与函数表达式相比,它们的语法更短,并且用词法绑定了this。的值。

存取USB装置

您可以使用或提示用户选择单个连接的USB设备,也可以通过 navigator.usb.requestDevice调用navigator.usb.getDevices获取源可以访问的所有连接的USB设备的列表。

navigator.usb.requestDevice函数接受一个定义为的强制性JavaScript对象filters。这些过滤器用于将任何USB设备与给定的供应商(vendorId)和可选的产品(productId)标识符进行匹配。在 classCodeprotocolCodeserialNumber,和subclassCode键也可以在那里定义为好。

例如,以下是访问已配置为允许起点的已连接Arduino设备的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
navigator.usb.requestDevice({ filters: [{ vendorId: 0x2341 }] }).then(device => {
  console.log(device.productName);      // "Arduino Micro"
  console.log(device.manufacturerName); // "Arduino LLC"}).catch(error => { console.log(error); });

在您问之前,我没有神奇地得出这个0x2341十六进制数。我只是在此USB ID列表中搜索了“ Arduino”一词。

device以上已兑现承诺中返回的USB 具有有关设备的一些基本但重要的信息,例如受支持的USB版本,最大数据包大小,供应商和产品ID,设备可具有的可能配置数量-基本上, 设备USB描述符

有关信息,如果USB设备宣布支持WebUSB并定义了登录页面URL,则在插入USB设备时,Chrome会显示一个持久通知。单击此通知将打开登录页面。

从那里,您可以简单地调用navigator.usb.getDevices并访问Arduino设备,如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
navigator.usb.getDevices().then(devices => {
  devices.map(device => {
    console.log(device.productName);      // "Arduino Micro"
    console.log(device.manufacturerName); // "Arduino LLC"
  });})

与Arduino USB板交谈

好的,现在让我们看看通过USB端口与WebUSB兼容的Arduino板进行通信有多么容易。请查看https://github.com/webusb/arduino上的说明, 以使WebUSB启用草图。

不用担心,我将介绍本文下文中提到的所有WebUSB设备方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var device;

navigator.usb.requestDevice({ filters: [{ vendorId: 0x2341 }] }).then(selectedDevice => {
   device = selectedDevice;
   return device.open(); // Begin a session.
 }).then(() => device.selectConfiguration(1)) // Select configuration #1 for the device..then(() => device.claimInterface(2)) // Request exclusive control over interface #2..then(() => device.controlTransferOut({
    requestType: 'class',
    recipient: 'interface',
    request: 0x22,
    value: 0x01,
    index: 0x02})) // Ready to receive data.then(() => device.transferIn(5, 64)) // Waiting for 64 bytes of data from endpoint #5..then(result => {
  let decoder = new TextDecoder();
  console.log('Received: ' + decoder.decode(result.data));}).catch(error => { console.log(error); });

请记住,我们在这里使用的WebUSB库仅实现了一个示例协议(基于标准USB串行协议),制造商可以创建他们想要的任何端点集和类型。对于小型配置命令,控制传输特别好,因为它们具有总线优先级并具有明确定义的结构。

这是已上传到Arduino板的草图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Third-party WebUSB Arduino library#include <WebUSB.h>WebUSB WebUSBSerial(1 /* https:// */, "webusb.github.io/arduino/demos");#define Serial WebUSBSerialvoid setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // Wait for serial port to connect.
  }
  Serial.write("WebUSB FTW!");
  Serial.flush();}void loop() {
  // Nothing here for now.}

上面的示例代码中使用的第三方WebUSB Arduino库基本上完成了两件事:

  • 该设备充当WebUSB设备,使Chrome浏览器可以读取目标网页的网址。
  • 它公开了一个WebUSB串行API,您可以使用它重写默认的API。

让我们再次看一下JavaScript代码。一旦我们被device用户选择,device.open只需运行所有特定于平台的步骤即可开始与USB设备的会话。然后,我们必须使用选择一个可用的USB配置device.selectConfiguration。请记住,配置指定了设备的供电方式,最大功耗以及接口数量。在谈论接口时,我们还需要使用独占访问权限,device.claimInterface因为只有在声明接口所有权时,数据才能传输到接口或关联的端点。最后device.controlTransferOut需要调用 以使用适当的命令设置Arduino设备,以通过WebUSB串行API进行通信。

从那里device.transferIn执行批量传输到设备上,以通知主机主机已准备好接收批量数据。然后,使用result包含必须正确解析的DataView 的对象 来实现promise data

对于那些熟悉USB的人来说,所有这些看起来都应该很熟悉。

我想要更多

WebUSB API使您可以与所有USB传输/端点类型进行交互:

  • 通过controlTransferIn(setup, length)和来处理用于向USB设备发送或接收配置或命令参数的CONTROL传输controlTransferOut(setup, data)
  • 用于少量时间敏感数据的INTERRUPT传输的处理方法与transferIn(endpointNumber, length)和和进行BULK传输的处理方法相同 transferOut(endpointNumber, data)
  • 同步传输,用于类似的视频和声音数据的流与处理isochronousTransferIn(endpointNumber, packetLengths)isochronousTransferOut(endpointNumber, data, packetLengths)
  • 批量传输(用于以可靠的方式传输大量非时间敏感数据)由transferIn(endpointNumber, length)和 处理transferOut(endpointNumber, data)

您可能还想看看Mike Tsao的WebLight项目,该项目提供了一个构建示例的示例,该示例构建了一个为WebUSB API设计的USB控制的LED设备(此处不使用Arduino)。您会找到硬件,软件和固件。

提示

通过内部页面chrome://device-log ,可以更轻松地在Chrome中调试USB ,您可以在一个位置查看所有与USB设备相关的事件。

内部页面chrome://usb-internals也很方便,使您可以模拟虚拟WebUSB设备的连接连接和断开连接。这对于无需实际硬件即可进行UI测试非常有用。

在大多数Linux系统上,默认情况下USB设备被映射为只读权限。要允许Chrome打开USB设备,您需要添加新的udev规则。创建一个包含/etc/udev/rules.d/50-yourdevicename.rules以下内容的文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SUBSYSTEM=="usb", ATTR{idVendor}=="[yourdevicevendor]", MODE="0664", GROUP="plugdev"

这里[yourdevicevendor]2341如果你的设备是例如一个Arduino。 ATTR{idProduct}也可以添加更具体的规则。确保您 user是该plugdev组的成员。然后,只需重新连接设备即可。

下一步是什么

WebUSB API的第二次迭代将关注Shared Worker 和Service Worker 支持。例如,想象一下使用WebUSB API的安全密钥网站,该网站将安装服务工作者以充当中间人来认证用户。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Web开发未来会完全替代客户端开发吗?
首先问大家一个问题,现在有一项业务需求,这个需求使用客户端应用实现还是网页来实现你会考虑哪些因素呢?可以在评论区告诉我。
ConardLi
2023/01/09
2.9K0
Web开发未来会完全替代客户端开发吗?
HarmonyOS 设备管理开发:USB 服务开发指南
USB 服务是应用访问底层的一种设备抽象概念。开发者根据提供的 USB API,可以获取设备列表、控制设备访问权限、以及与连接的设备进行数据传输、控制命令传输等。
小帅聊鸿蒙
2024/07/01
1700
HarmonyOS 设备管理开发:USB 服务开发指南
HTML5中调用手机蓝牙功能方案讨论
使用Web Bluetooth API(适用于现代浏览器): 如果你的目标是在支持Web Bluetooth API的现代浏览器(如Chrome, Firefox等)上实现蓝牙通信,你可以使用navigator.bluetooth对象来请求访问并控制蓝牙设备。但是,请注意这要求用户明确授权你的网页访问蓝牙设备,并且只有支持该API的设备才能被访问。
china马斯克
2024/08/02
1.1K0
增强你的移动网页体验:掌握这12个必备JavaScript API
文章列举了 12 个常用的 JavaScript API,包括 Geolocation、DeviceOrientation、Battery Status、Vibration 等等。对于每个 API,文章提供了详细的解释、示例代码和用法说明。这些 API 可以帮助开发人员在移动网页中实现诸如获取用户位置、访问设备传感器、监测电池状态、触发设备振动等功能。
前端小智@大迁世界
2023/08/16
3220
增强你的移动网页体验:掌握这12个必备JavaScript API
摆脱客户端?网页发起直播势在必行!
近几年直播行业飞速发展,但是由于Web端这方面功能的长时间缺失,使得直播端以客户端为主;WebRTC 的出现使得网页也可以成为直播端。那么究竟WebRTC是什么呢?
保利威视频云
2020/05/07
3.2K0
摆脱客户端?网页发起直播势在必行!
WebUSB:一个网页是如何从你的手机中盗窃数据的(含PoC)
介绍 今年9月15日,Chrome61发布,它启用了WebUSB作为其默认功能。而WebUSB是一个Javascript API,可以允许网页访问已连接的USB设备。这里的USB设备是指系统和工业的USB设备,所以不支持常见的USB设备(比如网络摄像头,HID或大容量储存设备)。然而通过WebUSB API,很多其他的USB设备可以被访问,且当用户授权给网页时,自己可能根本不了解网页获取的访问权限级别。 这篇文章探寻WebUSB的功能,以深入了解其工作原理,攻击方法及隐私问题。我们会解释访问设备所需的过程,
FB客服
2018/02/27
4.3K0
WebUSB:一个网页是如何从你的手机中盗窃数据的(含PoC)
Webrtc及WEB端音视频设备获取及流处理
注意本文和之前Electron获取设备的文章有重合,但是也不是一样的,因为在Electron中我们不但能用HTML的API,也能使用Electron的API,但是WEB中就有局限了,在WEB中就实现不了直接分享主屏幕,必须用户选择。
码客说
2022/09/23
2.8K0
Webrtc及WEB端音视频设备获取及流处理
在线串口工具(R-WebEmbedded)
对于嵌入式工程师来说,串口工具在开发和调试过程中必不可少的利器。工具能帮助我们发送和接收串行数据,进行设备通信和调试。通过串口工具,工程师可以实时监控串口数据,查看设备是否正常工作,同时也可以通过发送特定的命令来测试设备的反应。
Rice加饭
2023/11/22
1.9K0
在线串口工具(R-WebEmbedded)
10个你可能没用过,但很强大的Web API
在本文中,我将介绍 10 个不那么流行的 Web API。不那么流行并不意味着它们没有用处。你可以在项目的各种用例中使用它们。
@超人
2021/05/24
7400
10个你可能没用过,但很强大的Web API
WebSerial API 完整介绍
Web Serial API是一种新的范式,通过JavaScript将数据直接从USB或串行接口获取到网站/网络应用程序中!
泽霖
2023/11/11
2.4K1
10个不那么知名但很实用的Web API
在本文中,我将介绍 10 个不那么流行的 Web API。不那么流行并不意味着它们没有用处。你可以在项目的各种用例中使用它们。
深度学习与Python
2020/09/23
6680
10个不那么知名但很实用的Web API
Chrome 61 Beta版已支持JavaScript模块,Web支付API,Web Share API和WebUSB
Chrome 61 Beta版:JavaScript模块,桌面支付请求API,Web Share API,以及WebUSB 除非另有说明,否则下述更改适用于Android,Chrome OS,Linux,Mac和Windows的Chrome Beta最新版本。 JavaScript模块 模块允许开发人员声明脚本的依赖关系,并且在第三方构建工具中模块已经很受欢迎,它们主要用模块来按需打包脚本。在本次发布的版本中通过<script type=module>元素添加了对JavaScript 模块的原生支持。 原生
前朝楚水
2018/04/04
1.9K0
Chrome 61 Beta版已支持JavaScript模块,Web支付API,Web Share API和WebUSB
《探秘浏览器Web Bluetooth API设备发现流程》
网页若需与蓝牙设备通信,往往需依赖本地客户端或专用驱动程序作为中介,不仅增加了用户操作成本,也限制了Web应用在跨设备场景中的拓展。而Web Bluetooth API的出现,直接赋予了网页与低功耗蓝牙(BLE)设备对话的能力,从智能手环的健康数据同步,到智能家居设备的远程控制,再到工业场景中的传感器数据采集,其应用边界正不断拓宽。设备发现作为Web Bluetooth API交互流程的起点,是决定后续连接稳定性、数据传输效率的核心环节。深入拆解这一流程的技术细节,不仅能帮助开发者规避实践中的常见陷阱,更能为复杂场景下的应用优化提供底层逻辑支撑。
程序员阿伟
2025/08/15
820
《探秘浏览器Web Bluetooth API设备发现流程》
浏览器指纹追踪技术,如何完整修改浏览器指纹?
来源 | http://www.fly63.com/article/detial/10479
winty
2021/07/27
3.4K0
JS浏览器环境下各种实用API记录
Clipboard API 是下一代的剪贴板操作方法,比传统的document.execCommand()方法更强大、更合理。
房东的狗丶
2023/02/17
9420
Chrome 86 重要更新解读
Chrome 86 在2020年10月推出了稳定版,现已全面应用于Android、Chrome OS、Linux、macOS 和 Windows等平台,我们一起来看下这次的重要更新。若要看全部更新,请移步(https://www.chromestatus.com/features#milestone=86)。
童欧巴
2020/11/11
1.9K0
Chrome 86 重要更新解读
浏览器隐身模式下的你,仍然没有任何隐私
你以为你浏览器开了隐身模式,你就真的"隐身"了吗?No!No!No!今天带你从前端的视角来看了解浏览器的隐身模式。
程序员鱼皮
2021/08/23
3.8K0
浏览器隐身模式下的你,仍然没有任何隐私
Chrome 86 新功能解读
在之前,我们可以使用 <input type="file"> 元素去磁盘读取文件,如果要保存更改,需要给<a>标签增加一个download属性,它会打开文件选择器,然后保存文件,但是我们没有办法写回刚刚保存的那个文件,这个流程复杂又繁琐。
ConardLi
2020/10/30
9410
Chrome 86 新功能解读
通过 Web 控制蓝牙设备:WebBluetooth入门 [每日前端夜话0x27]
摘要:通过渐进式 Web 应用(Progressive Web Apps)技术,你可以开发成熟的 Web 应用。 得益于大量新规范和新功能,以前需要在本机执行的应用,现在可以基于 Web 实现。 不过迄今为止,与硬件设备的交互仍然是遥不可及。 感谢 WebBluetooth 的出现,现在我们可以开发能够控制灯光、驾驶汽车甚至是无人机的 PWA。
疯狂的技术宅
2019/03/27
3.9K0
通过 Web 控制蓝牙设备:WebBluetooth入门 [每日前端夜话0x27]
RK平台 USB转RS485
RS-232是美国电子工业联盟(EIA)制定的串行数据通信的接口标准,原始编号全称是EIA-RS-232(简称232,RS232)。它被广泛用于计算机串行接口外设连接。 RS-232C标准,其中EIA(Electronic Industry Association)代表美国电子工业联盟,RS(Recommended standard)代表推荐标准,232是标识号,C代表RS232的第三次修改(1969年),在这之前,还有RS232B、RS232A. 在RS-232标准中,字符是以一串行的比特串来一个接一个的串列(serial)方式传输,优点是传输线少,配线简单,发送距离可以较远。 最常用的编码格式是异步起停(asynchronous start-stop)格式,它使用一个起始比特后面紧跟7或8个数据比特(bit),然后是可选的奇偶校验比特,最后是一或两个停止比特。所以发送一个字符至少需要10比特,带来的一个好的效果是使全部的传输速率,发送信号的速率以10划分。
全栈程序员站长
2022/08/15
1.4K0
推荐阅读
相关推荐
Web开发未来会完全替代客户端开发吗?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验