使用 Web HID API 在浏览器中进行HID设备交互(纯前端)

文章目录

  • 目的
  • 基础说明
  • 示例工程(HID透传测试工具)
  • 总结

目的

最近再搞HID透传 《STM32 USB使用记录:HID类设备(后篇)》 。

市面上的各种测试工具都或多或少存在问题,所以就自己写一个工具进行测试。目前来说纯前端方案编写这个工具应该是最方便的,这里对 Web HID API 相关内容做个记录。

基础说明

Web HID API 相关内容参考如下:
https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API
https://developer.mozilla.org/en-US/docs/Web/API/HID
https://developer.mozilla.org/en-US/docs/Web/API/HIDDevice
https://developer.mozilla.org/en-US/docs/Web/API/HIDInputReportEvent
https://wicg.github.io/webhid/

需要特别注意的是从网页操作设备是比较容易产生安全风险的,所以这个API只支持本地调用或者是HTTPS方式调用。

使用下面方法可以侦测电脑上HID设备插入与拔出:

// 全局HID设备插入事件
navigator.hid.onconnect = (event) => {console.log("HID connected: ", event.device);
};// 全局HID设备拔出事件
navigator.hid.ondisconnect = (event) => {console.log("HID connected: ", event.device);
};

使用下面方法可以显示电脑上的HID设备选择授权,或者显示已授权的HID设备列表:

// requestDevice方法将显示一个包含已连接设备列表的对话框,用户选择可以并授予其中一个设备访问权限
const devices = await navigator.hid.requestDevice({ filters: [] });
// 注意这里返回的是一个数组// const devices = await navigator.hid.requestDevice({
//     filters: [{
//         vendorId: 0xabcd,  // 根据VID进行过滤
//         productId: 0x1234, // 根据PID进行过滤
//         usagePage: 0x0c,   // 根据usagePage进行过滤
//         usage: 0x01,       // 根据usage进行过滤
//     },],
// });// getDevices方法可以返回已连接的授权过的设备列表
// let devices = await navigator.hid.getDevices(); 

使用下面方法可以打开或关闭HID设备等:

if (!device.opened) { // 检查设备是否打开await device.open(); // 打开设备
}
// await device.close(); // 关闭设备
// await device.forget() // 遗忘设备

使用下面可以读写数据:
对于HID设备而言主要有 featureinputoutput 三项可以用来数据读写交互的当然前提是设备自身支持。

// 读取Feature
const dataView = await device.receiveFeatureReport(reportId);// 写Feature
await device.sendFeatureReport(reportId, data);// 向HID设备发送数据
await device.sendReport(reportId, data); // reportId写0表示不适用reportId// 监听来自HID设备的数据(input)
device.oninputreport = (event) => {console.log(event); // event中包含device、reportId、data等内容
};

示例工程(HID透传测试工具)

代码与说明:《基于 Web HID API 的HID透传测试工具(纯前端)》
项目地址:https://github.com/NaisuXu/HID_Passthrough_Tool
在这里插入图片描述

总结

使用 Web HID API 访问HID设备非常方便,目前来说唯一的问题是这还是实验性质的功能,可能之后接口还会变动,等根据实际情况进行调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/68516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java设计模式之原型模式

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接…

uni-app 客服按钮可上下拖动动

项目需求: 因为悬浮客服有时候会遮挡住界面内容,故需要对悬浮的气泡弹窗做可拖动操作 movable-area:可拖动区域 movable-view:可移动的视图容器,在页面中可以拖拽滑动或双指缩放。 属性说明 属性名类型默认值说…

四川玖璨电子商务有限公司:短视频有什么运营

根据短视频有什么运营,短视频的拍摄工具多种多样。无论是在手机上拍摄还是使用专业摄影设备,拍摄短视频的目的都是为了吸引观众的注意力和提升内容的质量。从小花费到高投入,在不断发展的短视频行业中,拍摄方法也得到了不断创新和…

QT的补充知识

一、文件 QFile QT提供了QFile类用于对文件进行读写操作,也提供了其他的两个类:文本流(QTextSream)和数据流(QDataStream) 文本流(QTextSream):用于对文本数据的处理&am…

Redis未授权访问漏洞复现

Redis 简单使用 Redis 未设置密码,客户端工具可以直接链接。 Redis 是非关系型数据库系统,没有库表列的逻辑结构,仅仅以键值对的方式存储数据。 先启动容器 Redis 未设置密码,客户端工具可以直接链接 https://github.com/xk11z/…

Redis的数据类型到底有什么奥秘

这里我们先只介绍五种常用的数据类型~ 目录 1、string 2、hash 3、list 4、set 5、zset 6、示例 1、string 数据类型:string内部编码:raw、int、embstr 说明: raw是最基本的字符串--底层是一个char数组(此处的char是一个字…

【Element】Vue+Element表单校验详解

Element表单校验 作为一个后端开发,总结一下实际工作中表单校验的场景和用法。 Element官网:https://element.eleme.cn/#/zh-CN/component/form 代码地址:https://gitee.com/kkmy/kw-microservices/tree/master/kw-ui/kwsphere 常用表单校验场…

Java 中数据结构HashSet的用法

Java HashSet HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的,即不会记录插入的顺序。 HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是…

MySql学习笔记02——MySql的简单介绍

MySQL 常用命令 注意在mysql中使用的命令需要用英文分号结尾(启动/关闭mysql服务不需要带分号) net start mysql 启动mysql服务(需要管理员启动cmd) net stop mysql关闭mysql服务(需要管理员启动cmd) m…

深度学习环境搭建笔记(二):mmdetection-CPU安装和训练

文章目录 第一步:安装anaconda第二步:安装虚拟环境第三步:安装torch和torchvision第四步: 安装mmcv-full第五步: 安装mmdetection第六步:测试环境第七步:训练-目标检测7.1 准备数据集7.2 检查数据集7.3 训练网络 第一步…

计算机毕业设计 社区买菜系统 Vue+SpringBoot+MySQL

作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲师,全栈领域优质创作者。 项目内容…

electron win系统通知修改通知标题栏

标题栏的 electron.app.Electron 如何修改: var package require("../package.json"); app.setAppUserModelId(package.description); app.setAppUserModelId 在主进程的app这里修改

R语言Meta分析核心技术

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…

使用ICMP协议来判断UDP端口的存活状态

我们使用了原始套接字(socket.SOCK_RAW)来发送和接收ICMP消息,也就是通过模拟ICMP协议来进行UDP端口的探测。我们构造了一个简单的ICMP数据包,并将其发送到目标主机的特定端口。然后,我们等待接收目标主机返回的ICMP消…

SpringBoot2.0(Spring读取配置文件常用方法,打war包在Tomcat中启动)

目录 一,SpringBoot中读取配置文件的常用方法1.1,使用Value读取1.2,使用ConfigurationProperties1.3,使用Environment1.4,自定义配置文件读取 二,SpringBoot部署war项目到tomcat9和启动原理 一,…

详解4种类型的爬虫技术

聚焦网络爬虫是“面向特定主题需求”的一种爬虫程序,而通用网络爬虫则是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分,主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。 增量抓取意…

fastjson2 打开 AutoType

1. 功能简介 FASTJSON支持AutoType功能,这个功能在序列化的JSON字符串中带上类型信息,在反序列化时,不需要传入类型,实现自动类型识别。 2. AutoType安全机制介绍 必须显式打开才能使用。和fastjson 1.x不一样,fast…

HTML <map> 标签的使用

map标签的用途&#xff1a;是与img标签绑定使用的&#xff0c;常被用来赋予给客户端图像某处区域特殊的含义&#xff0c;点击该区域可跳转到新的文档。 编写格式&#xff1a; <img src"图片" border"0" usemap"#planetmap" alt"Planets…

【vue】vuex持久化插件vuex-persistedstate:

文章目录 一、说明&#xff1a;二、手动利用HTML5的本地存储&#xff1a;三、利用vuex-persistedstate插件【1】安装【2】配置使用【3】存储sessionStorage的情况【4】存储cookie的情况【5】默认持久化所有state&#xff0c;指定需要持久化的state,配置如下【6】vuex引用多个插…

ElementUI浅尝辄止23:Loading 加载

Loading加载组件&#xff1a;加载数据时显示动效。 常见于加载数据量大的业务操作&#xff0c;附带动态效果。 1.如何使用&#xff1f;区域加载 在表格等容器中加载数据时显示。 /*Element 提供了两种调用 Loading 的方法&#xff1a;指令和服务。对于自定义指令v-loading&am…