WebUSB的常用API及案例
WebUSB API 允许网页与 USB 设备进行交互,但出于安全考虑,浏览器要求在调用 requestDevice 方法(用于请求用户选择一个 USB 设备并授予网页访问权限)时,必须是在处理用户手势(例如点击按钮)的过程中进行。这是为了防止网页在用户不知情的情况下擅自请求访问 USB 设备,从而保护用户的隐私和安全。
代码演示
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebUSB Correct Example</title>
</head><body><button id="connectButton">Connect to USB Device</button><script>const connectButton = document.getElementById('connectButton');connectButton.addEventListener('click', async () => {try {const device = await navigator.usb.requestDevice({ filters: [] });console.log('Selected device:', device);} catch (error) {console.error('Error:', error);}});</script>
</body></html>
WebUSB 是一项 Web API 技术,它允许网页直接与 USB 设备进行通信,打破了以往网页在访问本地设备方面的限制,为网页开发者提供了更强大的功能和更丰富的交互场景。以下是关于 WebUSB 的详细介绍:
基本概念
WebUSB 是由万维网联盟(W3C)制定的标准,它使得基于浏览器的网页应用能够发现、连接和与 USB 设备进行数据传输。在没有 WebUSB 之前,网页与本地设备的交互通常需要借助插件或本地应用程序,而 WebUSB 让这一过程可以直接在网页中实现,提高了开发的便利性和用户体验。
主要特点
简化开发流程:开发者无需编写复杂的本地应用程序,只需使用 JavaScript 就可以在网页中实现与 USB 设备的通信,降低了开发门槛和成本。
跨平台兼容性:只要浏览器支持 WebUSB 标准,无论在桌面端还是移动端,都可以实现网页与 USB 设备的交互,具有良好的跨平台性。
增强用户体验:用户无需安装额外的软件,直接通过浏览器就能使用网页应用与 USB 设备进行交互,操作更加便捷。
安全可靠:为了保护用户的隐私和安全,WebUSB 有严格的权限管理机制。例如,在请求访问 USB 设备时,必须在用户的明确手势(如点击按钮)触发下进行,并且设备的选择和授权过程都需要用户手动确认。
工作原理
设备发现:网页通过调用 navigator.usb.requestDevice() 方法,弹出设备选择对话框,让用户选择要连接的 USB 设备。该方法可以接受一个过滤器参数,用于筛选符合特定条件的设备。
设备连接:用户选择设备并授权后,网页可以调用 device.open() 方法打开设备连接,建立与设备的通信通道。
数据传输:连接建立后,网页可以使用 device.transferIn() 和 device.transferOut() 方法进行数据的读取和写入操作,实现与 USB 设备的数据交互。
设备断开:当不再需要与设备通信时,网页可以调用 device.close() 方法关闭设备连接,释放资源。
应用场景
硬件控制:可以用于控制各种 USB 接口的硬件设备,如 3D 打印机、机器人、传感器等。通过网页应用,用户可以方便地对这些设备进行参数设置、数据采集和控制操作。
数据采集:与 USB 数据采集设备(如数据记录仪、万用表等)进行通信,实时获取设备采集的数据,并在网页中进行显示和分析。
教育领域:在教学过程中,学生可以通过网页应用直接与 USB 实验设备进行交互,进行实验操作和数据采集,提高学习的趣味性和效果。
物联网应用:作为物联网的一种接入方式,WebUSB 可以让网页应用与各种物联网设备进行通信,实现设备的远程监控和管理。
WebUSB 提供了一系列 API 用于实现网页与 USB 设备的交互,下面为你介绍一些常用的 API。
1. navigator.usb
这是 WebUSB API 的入口点,它是 USB 对象的实例,通过它可以访问 WebUSB 的各种功能。
示例代码
if ('usb' in navigator) {// 浏览器支持 WebUSBconsole.log('WebUSB is supported.');
} else {console.log('WebUSB is not supported.');
}
- 2. navigator.usb.requestDevice()
该方法用于请求用户选择一个 USB 设备,并授予网页访问该设备的权限。它返回一个 Promise,当用户选择设备并授权后,Promise 会被解析为选中的 USBDevice 对象。
参数
options:一个对象,包含 filters 属性,用于筛选符合特定条件的设备。filters 是一个数组,每个元素是一个包含设备信息的对象,如 vendorId、productId 等。
示例代码
const filters = [{ vendorId: 0x1234, productId: 0x5678 }
];navigator.usb.requestDevice({ filters }).then(device => {console.log('Selected device:', device);}).catch(error => {console.error('Error:', error);});
3. USBDevice 对象
当用户选择并授权一个 USB 设备后,会得到一个 USBDevice 对象,通过该对象可以对设备进行各种操作。
3.1 USBDevice.open()
用于打开与 USB 设备的连接。返回一个 Promise,当连接成功打开时,Promise 会被解析。
示例代码
navigator.usb.requestDevice({ filters: [] }).then(device => {return device.open();}).then(() => {console.log('Device opened successfully.');}).catch(error => {console.error('Error:', error);});
3.2 USBDevice.selectConfiguration()
用于选择 USB 设备的配置。USB 设备可能有多种配置,需要选择合适的配置才能进行通信。返回一个 Promise,当配置选择成功时,Promise 会被解析。
参数
configurationValue:一个整数,表示要选择的配置值。
示例代码
navigator.usb.requestDevice({ filters: [] }).then(device => {return device.open();}).then(device => {return device.selectConfiguration(1);}).then(() => {console.log('Configuration selected successfully.');}).catch(error => {console.error('Error:', error);});
3.3 USBDevice.claimInterface()
用于声明对 USB 设备某个接口的使用权限。在进行数据传输之前,需要先声明使用的接口。返回一个 Promise,当接口声明成功时,Promise 会被解析。
参数
interfaceNumber:一个整数,表示要声明的接口编号。
示例代码
navigator.usb.requestDevice({ filters: [] }).then(device => {return device.open();}).then(device => {return device.selectConfiguration(1);}).then(device => {return device.claimInterface(0);}).then(() => {console.log('Interface claimed successfully.');}).catch(error => {console.error('Error:', error);});
3.4 USBDevice.transferIn()
用于从 USB 设备读取数据。返回一个 Promise,当数据读取成功时,Promise 会被解析为一个包含读取数据的对象。
参数
endpointNumber:一个整数,表示要读取数据的端点编号。
length:一个整数,表示要读取的数据长度。
示例代码
navigator.usb.requestDevice({ filters: [] }).then(device => {return device.open();}).then(device => {return device.selectConfiguration(1);}).then(device => {return device.claimInterface(0);}).then(device => {return device.transferIn(1, 64);}).then(result => {const data = new DataView(result.data.buffer);console.log('Received data:', data);}).catch(error => {console.error('Error:', error);});
3.5 USBDevice.transferOut()
用于向 USB 设备写入数据。返回一个 Promise,当数据写入成功时,Promise 会被解析。
参数
endpointNumber:一个整数,表示要写入数据的端点编号。
data:要写入的数据,可以是 ArrayBuffer、TypedArray 或 DataView 类型。
示例代码
const data = new Uint8Array([0x01, 0x02, 0x03]);navigator.usb.requestDevice({ filters: [] }).then(device => {return device.open();}).then(device => {return device.selectConfiguration(1);}).then(device => {return device.claimInterface(0);}).then(device => {return device.transferOut(2, data);}).then(() => {console.log('Data sent successfully.');}).catch(error => {console.error('Error:', error);});
3.6 USBDevice.close()
用于关闭与 USB 设备的连接。返回一个 Promise,当连接成功关闭时,Promise 会被解析。
示例代码
navigator.usb.requestDevice({ filters: [] }).then(device => {return device.open();}).then(device => {// 进行一些操作return device.close();}).then(() => {console.log('Device closed successfully.');}).catch(error => {console.error('Error:', error);});
这些 API 是 WebUSB 中比较常用的部分,通过它们可以实现网页与 USB 设备的基本通信功能。
相关文章:
WebUSB的常用API及案例
WebUSB API 允许网页与 USB 设备进行交互,但出于安全考虑,浏览器要求在调用 requestDevice 方法(用于请求用户选择一个 USB 设备并授予网页访问权限)时,必须是在处理用户手势(例如点击按钮)的过…...
在线研讨会 | 加速游戏和AI应用,全面认识Imagination DXTP GPU
近日,Imagination宣布推出 Imagination DXTP GPU IP,该产品重新定义了智能手机和其他功耗受限设备的图形和计算加速。它专为高效的效率而设计,能够提供运行AI、游戏和用户界面体验所需的性能,确保这些体验可以全天候流畅且持续地运…...
The Rust Programming Language 学习 (三)
所有权 所有权(系统)是 Rust 最为与众不同的特性,它让 Rust 无需垃圾回收器(garbage collector)即可保证内存安全。因此,理解 Rust 中所有权的运作方式非常重要。 这里是非常重非常重的一个知识点,这里一…...
【一个月备战蓝桥算法】递归与递推
字典序 在刷题和计算机科学领域,字典序(Lexicographical order)也称为词典序、字典顺序、字母序,是一种对序列元素进行排序的方式,它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序: …...
【零基础到精通Java合集】第二十九集:SQL常用优化手段
课程标题:SQL常用优化手段——15分钟快速提升数据库性能 目标:掌握10+核心SQL优化技巧,解决慢查询、高负载等生产问题 0-1分钟:优化核心原则——减少数据扫描量 本质逻辑:通过索引、分页、过滤条件等手段,最小化磁盘I/O和内存计算。 反例:SELECT * FROM orders(全表扫…...
ArcGIS操作:07 绘制矢量shp面
1、点击目录 2、右侧显示目录 3、选择要存储的文件夹,新建shp 4、定义名称、要素类型、坐标系 5、点击开始编辑 6、点击创建要素 7、右侧选择图层、创建面 8、开始绘制,双击任意位置结束绘制...
如何远程访问svn中的URL
简介: 主要opencascade相关知识学习 格言: 万丈高楼平地起 要远程访问 SVN(Subversion)仓库中的 URL,通常需要以下步骤和注意事项: 1. 确认远程 SVN 服务器的访问协议 SVN 支持多种协议访问远程仓库&…...
归并排序:分治哲学的完美演绎与时空平衡的艺术
引言:跨越世纪的算法明珠 在计算机科学的璀璨星河中,归并排序犹如一颗恒久闪耀的明星。1945年,现代计算机之父冯诺伊曼在EDVAC计算机的研发过程中首次系统性地提出了这一算法,其精妙的分治思想不仅奠定了现代排序算法的理论基础&…...
【电控笔记z69】电机选型-机械特性
转矩特性 启动转矩 定义:指电机在启动瞬间所能提供的转矩。对于一些需要快速启动负载的设备,如起重机起升机构、电动汽车起步等,较大的启动转矩至关重要。影响因素:电机的类型、绕组参数、电源电压等都会影响启动转矩。例如,直流电机通过调节电枢电压和励磁电流可以在较大…...
Axure原型模板与元件库APP交互设计素材(附资料)
为了高效地进行APP和小程序的设计与开发,原型设计工具Axure凭借其强大的功能和灵活性,成为了众多产品经理和设计师的首选。本文将详细介绍Axure原型模板APP常用界面组件元件库、交互设计素材,以及多套涵盖电商、社区服务、娱乐休闲、农业农村…...
<网络> TCP协议
目录 TCP协议 与系统相关联 文件与套接字的关系 C语言的多态 谈谈可靠性 TCP协议格式 目的端口号 4位首部长度 16位窗口大小 序号与确认序号 32位序号 32位确认序号 标志位 TCP连接 三次握手 四次挥手 三次握手状态变化 四次挥手状态变化 流量控制 滑动窗口 拥塞控制 延迟应…...
自学微信小程序的第十三天
DAY13 1、使用map组件在页面中创建地图后,若想在JS文件中对地图进行控制,需要通过地图API来完成。先通过wx.createMapContext()方法创建MapContext(Map上下文)实例,然后通过该实例的相关方法来操作map组件。 const m…...
JAVA编程【jvm垃圾回收的差异】
jvm垃圾回收的差异 JVM(Java Virtual Machine)的垃圾回收(GC)机制是自动管理内存的一种方式,能够帮助开发者释放不再使用的内存,避免内存泄漏和溢出等问题。不同的垃圾回收器(GC)有…...
VBA信息获取与处理第五节:如何在单个工作表中查找某个给定值
《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…...
linux一些使用技巧
linux一些使用技巧 文件名称和路径的提取切换用户执行当前脚本一行演示单引号与双引号的使用curl命令仅输出响应头信息,不输出body体文件名称和路径的提取 文件路径为 /tmp/tkgup/test.sh 方式获取文件名获取文件路径获取文件全路径方式一basename ${file}dirname ${file}real…...
ubuntu20.04 安装离线版docker-20.10.0
1. 安装步骤 步骤一:官网下载 docker 安装包 wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.0.tgz步骤二:解压安装包; tar -zxvf docker-20.10.0.tgz 步骤三:将解压之后的docker文件移到 /usr/bin目录下; c…...
K8s 1.27.1 实战系列(一)准备工作
一、准备服务器 主机IP 操作系统计算资源 说明 192.168.202.23 CentOS74核8G内存50G硬盘 k8s-master 192.168.202.24 CentOS74核8G内存50G硬盘 k8s-node1 192.168.202.25 CentOS74核8G内存50G硬盘 k8s-node2 二、准备环境(所有节点) 1、关闭防火墙&…...
【推荐算法】python游戏数据分析可视化推荐系统(完整系统源码+数据库+开发笔记+详细部署教程)✅
目录 一、项目背景 二、项目拟解决问题 (1)数据价值断层 (2)用户画像模糊 (3)推荐策略单一 (4)决策可视化缺失 三、研究目的 (1)轻量化服务架构验证 …...
一文读懂深度学习中的损失函数quantifying loss —— 作用、分类和示例代码
在深度学习中,quantifying loss(量化损失)是指通过数学方法计算模型预测值与真实值之间的差异,以衡量模型的性能。损失函数(Loss Function)是量化损失的核心工具,它定义了模型预测值与真实值之间…...
Vue 3 整合 WangEditor 富文本编辑器:从基础到高级实践
本文将详细介绍如何在 Vue 3 项目中集成 WangEditor 富文本编辑器,实现图文混排、自定义扩展等高阶功能。 一、为什么选择 WangEditor? 作为国内流行的开源富文本编辑器,WangEditor 具有以下优势: 轻量高效:压缩后仅…...
筑牢网络安全防线:守护您的数据安全
在数字化时代,数据安全已成为企业和个人不容忽视的重要议题。近日印尼国家数据中心遭黑客袭击的事件,不仅扰乱了机场的移民检查,还影响了众多机构的服务运行。黑客利用恶意软件对数据中心进行攻击,索要巨额赎金,给印尼…...
基于Asp.net的农产品销售管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
android11使用gpio口控制led状态灯
目录 一、简介 二、解决方法 A、底层驱动 B、上层调用 C、验证 一、简介 1、需求:这里是用2个gpio口来控制LED灯,开机时默认亮蓝灯,按开机键,休眠亮红灯,唤醒亮蓝灯。 原理图: 这里由于主板上电阻R63…...
解决最长无重复子串问题
在编程面试中,字符串处理常常是考察算法能力的重要部分。今天,我们将探讨一个经典问题——最长无重复子串问题,并给出 Python 代码实现。 问题描述 给定一个字符串 s,你需要找到其中最长的无重复字符的子串,并返回它…...
ASP .NET Core 学习(.NET9)Serilog日志整合
Serilog 是一个功能强大的 .NET 日志库,以其简洁的配置和灵活的输出方式而受到开发者喜爱。支持多种日志输出目标(如控制台、文件、数据库等),并且可以通过结构化日志的方式记录丰富的上下文信息,便于后续的日志分析和…...
基于python+flask+mysql的川渝地区天气数据分析系统
系统首页 天气数据分析 历史天气数据查询 python爬虫代码展示 import requests import re import time as delay from bs4 import BeautifulSoup import pandas as pd import pymysql import json# 定义一个函数,用于获取网页的源代码 def get_page(url, headers)…...
一个结合创意与技术的Python数据可视化案例,展示动态3D粒子轨迹图与热力图的融合效果,代码包含注释与关键技术点解析
以下是一个结合创意与技术的Python数据可视化案例,展示动态3D粒子轨迹图与热力图的融合效果,代码包含注释与关键技术点解析: import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib.animation import Fu…...
【Linux———信号精讲】
你是怎么做到的,给了她想要的爱............................................................................................ 文章目录 前言 一、【信号入门】 1.1、【生活角度的信号】 1.2、【ctrl c与z】 1.3、【信号的发送与记录】 1.4、【信号处理常见方式…...
scBaseCamp:一个AI代理的可持续扩充的单细胞数据存储库
scBaseCamp是Tahoe-100M:最大规模的单细胞扰动数据集的后续 构建虚拟细胞是人工智能与生物学交叉领域的新兴前沿方向,单细胞RNA测序数据的快速增长为这一领域提供了助力。通过整合数百项研究中数百万个细胞的基因表达谱,单细胞图谱为训练由 …...
GPTs+RPA赋能智慧校园:构建下一代教育智能体的技术实践
文章目录 一、核心应用场景与技术融合1. 教务流程自动化(RPAGPTs双引擎驱动)2. 智能问答中枢(NLP流程自动化) 二、关键技术实现方案1. 多模态数据处理架构2. 智能文档处理流水线 三、典型系统架构设计智慧校园AI中台架构ÿ…...
