当前位置: 首页 > article >正文

记录第一次使用H5的WebBluetooth完成蓝牙标签打印机的(踩坑)过程

第1步

首先第一步,调试环境必须是https的,由于浏览器的强制安全策略,本地可以采用localhost

第2步

然后,如果打印需要服务UUID(Service UUID)特征UUID(Characteristic UUID),否则无法通信,这里可以咨询厂家或者找官网或技术人员拿去,我是通过浏览器chrome://bluetooth-internals/#devices查询可用的UUID
在这里插入图片描述

第3步

然后查询所有蓝牙设备的配对 navigator.bluetooth.requestDevice

	const sppUuid = `xxxx-xxx-xx`// 打印机型号的uuidconst device = await navigator.bluetooth.requestDevice({acceptAllDevices: true, // 不过滤蓝牙设备,接受所有蓝牙设备optionalServices: [sppUuid] // 打印机服务UUID});// 验证GATT可用性if (!device.gatt) {throw new Error('设备不支持GATT协议');}console.log('配对打印机名称:', device.name)const server = await device.gatt.connect();// console.log('server对象:', server)

第4步

获取服务server.getPrimaryService

	const service = await server.getPrimaryService(sppUuid);console.log('获取服务:',service)if (!service || service.length === 0) {throw new Error('未发现可用服务');}

第5步

获取特征对象service.getCharacteristics,同时需要保证其properties需要的权限(官方标注writeValue后续版本将会删除,必须用writeWithoutResponse

	// 保存特征对象供后续使用const characteristics = await service.getCharacteristics();if (!characteristics || characteristics.length === 0) {throw new Error('未发现可用特征对象');}characteristics.forEach(characteristic => {// console.log('特征:', characteristic.properties);// 需要配对一个有读写权限的特征对象if( characteristic.properties.writeWithoutResponse){this.characteristic = characteristic;}});console.log(this.characteristic)// 打印结果如下:

在这里插入图片描述

第6步

打印的字符串如果含有简体中文,必须使用GBK或者GB2312编码格式,同时使用 Uint8Array类型的数据,否则会报错

// TextEncoder默认且唯一支持的编码为 UTF-8,无法指定其他字符集, 打印机无法识别导致乱码const encoder = new TextEncoder();const textData = encoder.encode(str);
// 依赖第三方库iconv-lite,将字符串转换为GBK编码let textData = iconv.encode(printValue, 'GBK');

第7步

最后打印使用characteristic.writeValue,characteristic.writeValue 必须 返回 Uint8Array 类型数据

	// 分片发送数据(部分蓝牙设备限制单次发送长度)const chunkSize = 512;for (let i = 0; i < textData.length; i += chunkSize) {const chunk = textData.subarray(i, i + chunkSize);await characteristic.writeValue(chunk).then(()=>{console.log("写入成功,等待设备响应...")});}

相关文章:

记录第一次使用H5的WebBluetooth完成蓝牙标签打印机的(踩坑)过程

第1步 首先第一步&#xff0c;调试环境必须是https的&#xff0c;由于浏览器的强制安全策略&#xff0c;本地可以采用localhost 第2步 然后&#xff0c;如果打印需要服务UUID&#xff08;Service UUID&#xff09; 和 特征UUID&#xff08;Characteristic UUID&#xff09;&…...

2025 年“认证杯”数学中国数学建模网络挑战赛 A题 小行星轨迹预测

近地小行星&#xff08; Near Earth Asteroids, NEAs &#xff09;是轨道相对接近地球的小行 星&#xff0c;它的正式定义为椭圆轨道的近日距不大于 1.3 天文单位&#xff08; AU &#xff09;的小行星。 其中轨道与地球轨道最近距离小于 0.05A 且直径大于 140 米的小行星被…...

【WRF理论第十七期】单向/双向嵌套机制(含namelist.input详细介绍)

WRF运行的单向/双向嵌套机制 准备工作&#xff1a;WRF运行的基本流程namelist.input的详细设置&time_control 设置&domain 嵌套结构&bdy_control 配置部分 namelist 其他注意事项Registry.EM 运行 ARW 嵌套双向嵌套&#xff08;two-way nesting&#xff09;Moving …...

Spring Boot 3.4.3 和 Spring Security 6.4.2 结合 JWT 实现用户登录

在现代 Web 应用中&#xff0c;用户认证和授权是保障系统安全的核心环节。传统的 Session 认证方式在分布式系统或前后端分离场景下存在局限&#xff0c;而 JWT&#xff08;JSON Web Token&#xff09;作为一种无状态的认证机制&#xff0c;凭借其轻量、可扩展和跨服务的特性&a…...

Python 实现的运筹优化系统数学建模详解(0-1规划指派问题)

一、引言 在数学建模的广阔领域中&#xff0c;指派问题作为一类经典且重要的组合优化问题&#xff0c;频繁出现在各类实际场景里。例如&#xff0c;在人力资源管理中&#xff0c;如何将不同技能水平的员工高效地分配到各个项目&#xff0c;以实现项目成本最小化或收益最大化&am…...

TCP转发隧道

✅ 功能特性&#xff1a; 1. 高并发支持&#xff1a;采用 threading.Thread socket&#xff0c;可承载多并发连接 2. 异常处理完善&#xff1a;确保线程内异常不会崩溃整个程序 3. 可持续运行&#xff1a;守护线程 主线程监控机制 4. 运行状态监控&#xff1a; • 当前活跃连…...

React 学习 JSX

APP根组件被index.js渲染到public下的index.html下 JS中写 HTML 代码 渲染列表 条件渲染 复杂条件渲染 事件绑定 传递自定义参数 button标签中写箭头函数引用的格式 自定义参数和事件本身对象都想要的情况...

大模型论文:Language Models are Few-Shot Learners(GPT3)

大模型论文&#xff1a;Language Models are Few-Shot Learners(GPT3) 文章地址&#xff1a;https://proceedings.neurips.cc/paper_files/paper/2020/file/1457c0d6bfcb4967418bfb8ac142f64a-Paper.pdf 一、摘要 我们证明了&#xff0c;扩大语言模型的规模在任务无关的 few…...

一周学会Pandas2 Python数据处理与分析-Pandas2数据导出

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 任何原始格式的数据载入DataFrame后&#xff0c;都可以使用类似 DataFrame.to_csv()的方法输出到相应格式的文件或者…...

深入解析栈式虚拟机与反向波兰表示法

1.1 什么是虚拟机&#xff1f; 虚拟机&#xff08;Virtual Machine, VM&#xff09;是一种软件实现的计算机系统&#xff0c;提供与物理计算机相类似的环境&#xff0c;但在软件层面运行。虚拟机的存在简化了跨平台兼容性、资源管理以及安全隔离等问题。 1.2 栈式虚拟机的架构…...

python中的数据模型-pydantic浅讲

数据模型-pydantic 1. 基本用法 通过继承 BaseModel&#xff0c;你可以定义一个数据模型类。类的属性使用类型注解来声明字段的类型 from pydantic import BaseModelclass User(BaseModel):name: strage: intis_active: bool True # 默认值字段类型​&#xff1a;每个字段…...

15.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--如何拆分单体

单体应用&#xff08;Monolithic Application&#xff09;是指将所有功能模块集中在一个代码库中构建的应用程序。它通常是一个完整的、不可分割的整体&#xff0c;所有模块共享相同的运行环境和数据库。这种架构开发初期较为简单&#xff0c;部署也较为方便&#xff0c;但随着…...

华为数字芯片机考2025合集4已校正

单选 1. 题目内容 影响芯片成本的主要因素是 Die Size 和封装&#xff0c;但电源、时钟等因素&#xff0c;特别是功耗对解决方案的成本影响较大&#xff0c;因此低成本设计需要兼顾低功耗设计&#xff1a;&#xff08;&#xff09; 1. 解题步骤 1.1 分析题目 Die Size&…...

Java面试黄金宝典47

1. 如何设计一个秒杀系统 定义 秒杀系统是一种应对短时间内大量用户并发请求的系统,其核心目标是在高并发场景下保证系统的稳定性、数据的一致性,避免超卖等问题,同时快速响应用户请求。 秒杀系统设计需从多个层面考虑,以应对高并发场景: 前端优化: 页面静态化:将商品详…...

学习MySQL的第八天

海到无边天作岸 山登绝顶我为峰 一、数据库的创建、修改与删除 1.1 引言 在经过前面七天对于MySQL基本知识的学习之后&#xff0c;现在我们从基本的语句命令开始进入综合性的语句的编写来实现特定的需求&#xff0c;从这里开始需要我们有一个宏观的思想&…...

AI识别与雾炮联动:工地尘雾治理新途径

利用视觉分析的AI识别用于设备联动雾炮方案 背景 在建筑工地场景中&#xff0c;人工操作、机械作业以及环境因素常常导致局部出现大量尘雾。传统监管方式存在诸多弊端&#xff0c;如效率低、资源分散、监控功能单一、人力效率低等&#xff0c;难以完美适配现代工程需求。例如…...

GD32F303-IAP的过程和实验

使用的芯片为GD32F303VC 什么是IAP呢&#xff1f;有个博主写的很清楚&#xff1b;就是远程升级&#xff1b; 【单片机开发】单片机的烧录方式详解&#xff08;ICP、IAP、ISP&#xff09;_isp烧录-CSDN博客 我们需要写一个boot 和APP 通过 boot对APP的程序进行更新&#xf…...

众趣科技助力商家“以真示人”,让消费场景更真实透明

在当今的消费环境中&#xff0c;消费者权益保护问题日益凸显。无论是网购商品与实物不符、预定酒店民宿与图文描述差异大&#xff0c;还是游览景区遭遇“照骗”&#xff0c;这些问题不仅让消费者在消费和决策过程中倍感困扰&#xff0c;也让商家面临信任危机。 消费者在享受便…...

spark core编程之行动算子、累加器、广播变量

一、RDD 行动算子 reduce&#xff1a;聚集 RDD 所有元素&#xff0c;先聚合分区内数据&#xff0c;再聚合分区间数据。 collect&#xff1a;在驱动程序中以数组形式返回数据集所有元素。 foreach&#xff1a;分布式遍历 RDD 元素并调用指定函数。 count&#xff1a;返回 RDD…...

提高课:数据结构之树状数组

1&#xff0c;楼兰图腾 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm>using namespace std;typedef long long LL;const int N 200010;int n; int a[N]; int tr[N]; int Greater[N], lower[N];int lowbit(int x) {ret…...

基于javaweb的SpringBoot新闻视频发布推荐评论系统(源码+部署文档)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

使用Go语言实现自动清理应用系统日志

在服务器上部署业务应用系统&#xff0c;每天都会产生大量的日志&#xff0c;随着时间的推移&#xff0c;日志越积累越多&#xff0c;占用了大量的磁盘空间&#xff0c;除了可以手动清理日志外&#xff0c;还可以通过程序实现自动清理日志。 之所以选择Go语言&#xff0c;是因…...

机器学习之PCA主成分分析详解

文章目录 引言一、PCA的概念二、PCA的基本数学原理2.1 内积与投影2.2 基2.3 基变换2.4 关键问题及优化目标2.5 方差2.6 协方差2.7 协方差矩阵2.8 协方差矩阵对角化 三、PCA执行步骤总结四、PCA计算实例五、PCA参数解释六、代码实现七、PCA的优缺点八、总结 引言 在机器学习领域…...

回溯——固定套路 | 面试算法12道

目录 输出二叉树所有路径 路径总和问题 组合总和问题 分割回文串 子集问题 排列问题 字母大小写全排列 单词搜索 复原IP地址 电话号码问题 括号生成问题 给我一种感觉是回溯需要画图思考是否需要剪枝。 元素个数n相当于树的宽度&#xff08;横向&#xff09;&#x…...

【11】Strongswan processor 详解1

processor_t结构体&#xff0c;声明了一些公用方法&#xff1a; get_total_threads获取总的线程数量&#xff1b; get_idle_threads获取空闲线程数量&#xff1b; get_working_threads按指定的优先级获取处理该优先级的job的线程数量&#xff1b; get_job_load 或取指定优先级j…...

Maven和MyBatis学习总结

目录 Maven 1.Maven的概念&#xff1a; 2.在具体的使用中意义&#xff1a; 3.与传统项目引入jar包做对比&#xff1a; 传统方式&#xff1a; 在maven项目当中&#xff1a; 4.在创建maven项目后&#xff0c;想要自定义一些maven配置 5.maven项目的结构 6.maven指令的生…...

普通通话CSFB方式(2g/3g)

一、CSFB的触发条件 当模块&#xff08;或手机&#xff09;驻留在 4G LTE网络 时&#xff0c;若发生以下事件&#xff0c;会触发CSFB流程&#xff1a; 主叫场景&#xff1a;用户主动拨打电话。被叫场景&#xff1a;接收到来电&#xff08;MT Call&#xff09;。紧急呼叫&…...

揭开人工智能与机器学习的神秘面纱:开发者的视角

李升伟 编译 人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;早已不再是空洞的流行语——它们正在彻底改变我们构建软件、做出决策以及与技术互动的方式。无论是自动化重复性任务&#xff0c;还是驱动自动驾驶汽车&#xff0c;AI/ML都是现代创新的核…...

AndroidTV 当贝播放器-v1.5.2-官方简洁无广告版

AndroidTV 当贝播放器 链接&#xff1a;https://pan.xunlei.com/s/VONXRf0g3cT0ECVt6GEsoODFA1?pwds4qv# AndroidTV 当贝播放器-v1.5.2-官方简洁无广告版...

BERT - MLM 和 NSP

本节代码将实现BERT模型的两个主要预训练任务&#xff1a;掩码语言模型&#xff08;Masked Language Model, MLM&#xff09; 和 下一句预测&#xff08;Next Sentence Prediction, NSP&#xff09;。 1. create_nsp_dataset 函数 这个函数用于生成NSP任务的数据集。 def cr…...