微信小程序获取蓝牙并实现内容打印

通过微信小程序如何实现获取蓝牙打印机并实现打印能力,之前做过一个测试Dome,能够获取附近的蓝牙打印机设备并实现打印,今天开放出来供大家参考。

wxml

<!--右下角搜索-->
<view class="ly-cass-box"><view class="ly-cass" bindtap="openBluetoothAdapter"><image src="/images/search.png" style="width: 70rpx;height: 70rpx;" /></view><text class="ly-text">{{ly_text}}</text>
</view><view style="margin: 80rpx 20rpx 30rpx 20rpx;"><view class="has-devices-list-container"><view class="tip-search">搜索到的设备</view><view class="devices-list"><view wx:for="{{devices}}" wx:key="index" class="devices-item"><view style="flex:2">{{item.name? item.name:item.localName}}</view><button  style="flex:1;" id="{{index}}"  bindtap="_createBLEConnection">连接</button></view></view></view>
</view>

wxss

  • /* 搜索 */
    .ly-cass-box{width: 150rpx;height: auto;display: flex;align-items: center;justify-content: center;flex-direction: column;position: fixed;bottom:70rpx;right: 50rpx;z-index: 500;
    }
    .ly-cass{width: 120rpx;height: 120rpx;background-color: #f4f4f5;border-radius: 50%;display: flex;align-items: center;justify-content: center;
    }
    .ly-text{margin-top: 20rpx;background-color: #eee;padding: 2rpx 8rpx 2rpx 8rpx;border-radius: 6rpx;font-size: 25rpx;
    }.no-open-gps-tip {width: 100%;display: flex;flex-direction: row;align-items: center;color: #fa3534;font-weight: 400;font-size: 30rpx;background: rgba(235, 207, 48, 0.8);padding: 30rpx;
    }
    .devices-item {width: 100%;display: flex;justify-content: space-between;margin-top: 20rpx;align-items: flex-end;padding-bottom: 5rpx;border-bottom: 1px solid #f4f4f5;
    }.devices-list {width: 100%;padding: 0 20rpx;display: flex;flex-direction: column;}.tip-search {width: 100%;margin: 20rpx 0;text-align: left;font-size: 16px;color: #2979ff;
    }.has-devices-list-container {width: 100%;display: flex;flex-direction: column;margin: 30rpx 0;
    }

    这是我刚开发上线的的两个小游戏,欢迎大家扫码体验!

 以上两个《蛇王传说》《番茄花园》已上线微信/抖音平台运营。

《番茄花园》游戏源码已上架Cocos Store 商店,欢迎围观!Cocos StoreCocos商城 Creator扩展icon-default.png?t=N7T8https://store.cocos.com/app/detail/6122

js

const LAST_CONNECTED_DEVICE = 'last_connected_device';
const PrinterJobs = require('../../printer/printerjobs');
const printerUtil = require('../../printer/printerutil');
Page({data: {ly_text: "点击搜索",connected_ly: false, //蓝牙按钮是否显示blue_list_ly: false, //蓝牙连接列表显示discoveryStarted: false,devices: [], //已发现的蓝牙设备列表name: '', //已连接的设备名称deviceId: '', //已连接的设备deviceIdchs: [],canWrite: false,},/*** 第一步 判断初始化蓝牙模块是否可用*/openBluetoothAdapter() {if (!wx.openBluetoothAdapter) {wx.showModal({title: '提示',content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'})return}this.openBluetoothAdapters()},/*** 第二步 初始化蓝牙模块*/openBluetoothAdapters() {this.setData({ly_text: '搜索设备中'})wx.openBluetoothAdapter({ //请求打开蓝牙情况success: res => {//console.log('初始化蓝牙模块->res:', res)this.startBluetoothDevicesDiscovery(); //打开蓝牙后 开始搜索},fail: err => {console.log('初始化蓝牙模块->err:', err)// 错误码	错误信息	说明// 0	ok	正常// -1	already connect	已连接// 10000	not init	未初始化蓝牙适配器// 10001	not available	当前蓝牙适配器不可用// 10002	no device	没有找到指定设备// 10003	connection fail	连接失败// 10004	no service	没有找到指定服务// 10005	no characteristic	没有找到指定特征// 10006	no connection	当前连接已断开// 10007	property not support	当前特征不支持此操作// 10008	system error	其余所有系统上报的异常// 10009	system not support	Android 系统特有,系统版本低于 4.3 不支持 BLE// 10012	operate time out	连接超时// 10013	invalid_data	连接 deviceId 为空或者是格式不正确// object.fail 回调函数返回的 state 参数(仅 iOS)// 状态码	说明// 0	未知// 1	重置中// 2	不支持// 3	未授权// 4	未开启if (err.errCode === 10001) { //10001 当前蓝牙适配器不可用wx.showModal({title: '错误',content: '当前蓝牙适配器不可用,请打开手机蓝牙后重试!',showCancel: false});//监听蓝牙适配器状态变化事件wx.onBluetoothAdapterStateChange(res => {console.log('蓝牙适配器是否可用->res:', res);if (res.available) { //available=true 蓝牙适配器可用wx.onBluetoothAdapterStateChange(() => {});this.startBluetoothDevicesDiscovery();}})} else {wx.showModal({title: '错误',content: `错误码:[${err.errCode}] 错误信息:[${err.errMsg}]`,showCancel: false});}}});},/** * 第三步 开始搜寻附近的蓝牙外围设备*/startBluetoothDevicesDiscovery() {this.data.discoveryStarted = truewx.startBluetoothDevicesDiscovery({success: res => {console.log('开始搜寻附近的蓝牙外围设备->res', res)this.onBluetoothDeviceFound(); //蓝牙搜索成功后监听搜索},fail: (err) => {console.log('开始搜寻附近的蓝牙外围设备->err', err)}})},/*** 第四步 监听搜索到新设备的事件*/onBluetoothDeviceFound() {wx.onBluetoothDeviceFound(res => {res.devices.forEach(device => {if (!device.name && !device.localName) {return}let foundDevices = this.data.devices || []let idx = this.inArray(foundDevices, 'deviceId', device.deviceId);if (idx === -1) {this.data.devices.push(device);console.log('发现新设备:', device); //添加新设备} else {this.data.devices[idx] = device; //更新设备数据}})if (this.data.devices.length >= 1) {this.setData({blue_list_ly: true,ly_text: '发现设备'})} else {this.setData({ly_text: '未发现设备'})}this.setData({devices: this.data.devices})})},/*** 第五步 连接蓝牙低功耗设备* @param {手动点击连接蓝牙事件}* @param {创建连接蓝牙}* @param {如果已经连接过可直接连接}*/_createBLEConnection(e) {let idx = e.currentTarget.idlet name = this.data.devices[idx].namelet deviceId = this.data.devices[idx].deviceIdthis.setData({name,deviceId})console.log(name)//连接蓝牙低功耗设备。// 若小程序在之前已有搜索过某个蓝牙设备,并成功建立连接,可直接传入之前搜索获取的 deviceId 直接尝试连接该设备,无需再次进行搜索操作wx.createBLEConnection({deviceId,success: (res) => {console.log('连接蓝牙低功耗设备->res:', res);this.setData({blue_list_ly: false,connected_ly: true,ly_text: '已连接'})//获取蓝牙->保存到缓存this.getBLEDeviceServices(deviceId);wx.setStorage({key: LAST_CONNECTED_DEVICE,data: {name,deviceId}})},fail: (err) => {console.log('连接蓝牙低功耗设备->err', err.errno);this.setData({connected_ly: false,ly_text: '连接失败'})}})this.stopBluetoothDevicesDiscovery();},/*** 第六步 停止搜寻附近的蓝牙外围设备* @param {蓝牙连接成功关闭监听搜索}* @param {蓝牙搜索比较消耗资源}*/stopBluetoothDevicesDiscovery() {wx.stopBluetoothDevicesDiscovery({complete: () => {console.log('停')this.data.discoveryStarted = false}})},/*** 第七步 断开与蓝牙低功耗设备的连接* @param {蓝牙连接成功关闭搜索}* @param {功能}*/closeBLEConnection(e) {wx.closeBLEConnection({deviceId: e.deviceId})this.connected_ly = false;},/*** 第八步  获取蓝牙低功耗设备所有服务* @param {蓝牙功能查询}* @param {蓝牙连接成功后}* @param {找到主要服务功能}*/getBLEDeviceServices(deviceId) {wx.getBLEDeviceServices({deviceId,success: (res) => {for (let i = 0; i < res.services?.length; i++) {//该服务是否为主服务if (res.services[i].isPrimary) {this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid);return}}}})},/*** 第九步 获取蓝牙低功耗设备某个服务中所有特征 * @param {蓝牙功能特征查询}* @param {主要功能的特性}* @param {找到主要服务功能的特征}* @param {到此步骤连接结束}*/getBLEDeviceCharacteristics(deviceId, serviceId) {//获取蓝牙低功耗设备某个服务中所有特征 (characteristic)// read	boolean	该特征是否支持 read 操作// write	boolean	该特征是否支持 write 操作// notify	boolean	该特征是否支持 notify 操作// indicate	boolean	该特征是否支持 indicate 操作// writeNoResponse	boolean	该特征是否支持无回复写操作// writeDefault	boolean	该特征是否支持有回复写操作let name = this.data.namewx.getBLEDeviceCharacteristics({deviceId,serviceId,success: res => {console.log('获取蓝牙低功耗设备某个服务中所有特征 (characteristic)->res:', res)for (let i = 0; i < res.characteristics?.length; i++) {const item = res.characteristics[i]if (item.properties.write) {this.setData({canWrite: true})console.log('可以连接')this._deviceId = deviceIdthis._serviceId = serviceIdthis._characteristicId = item.uuidwx.setStorage({key: "BlueKey",data: {_close: true,_name: name,_deviceId: deviceId,_serviceId: serviceId,_characteristicId: item.uuid,}})//pringthis.writeBLECharacteristicValue()break;}}setTimeout(() => {if (this.data.canWrite) {this.setData({connected_ly: true,ly_text: '已连接'})} else {wx.showToast({icon: 'error',title: '您当前选择的设备不支持打印功能,请重新选择!',duration: 3000})}}, 1000)},fail: (res) => {console.error('获取蓝牙特征失败', res)}})},/*** 第十步 编写蓝牙需要打印的内容* @param {编写蓝牙需要打印的内容}* @param {打印按钮的事件}* @param {打印功能前准备}*/writeBLECharacteristicValue() {let pd = {client: '测试',name: '张三',sex: '男',iPhone: '18888888888',idcard: '888888888888888888',}var that = thissetTimeout(() => {let printerJobs = new PrinterJobs();let dayun1 = '打印机自检' + pd?.contactinfo?.client + '\r\n' +'姓名:' + pd?.name + '\r\n' +'性别:' + pd?.sex + '\r\n' +'联系方式:' + pd?.iPhone + '\r\n' +'身份证号码:' + pd?.idcard + '\r\n'printerJobs.setSize(2, 2).setAlign('CT').print('! 0 100 203 100 1\r\n法决定书\r\nPRINT\r\n').setSize(1, 1).setAlign('LT').print(dayun1)let buffer = printerJobs.buffer();// console.log('ArrayBuffer', 'length: ' + buffer.byteLength, ' hex: ' + this.ab2hex(// 	buffer));// 1.并行调用多次会存在写失败的可能性// 2.建议每次写入不超过20字节// 分包处理,延时调用const maxChunk = 20;const delay = 20;for (let i = 0, j = 0, length = buffer.byteLength; i < length; i += maxChunk, j++) {let subPackage = buffer.slice(i, i + maxChunk <= length ? (i + maxChunk) : length);setTimeout(this._writeBLECharacteristicValue, j * delay, subPackage);}// this.lanyardShow = false;// this.$refs.uUpload.clear();// this.clearFormData();wx.showToast({title: '打印成功',icon: 'success'})}, 5000)},/*** 第十一步* @param {最终的打印}* @param {由第十步骤调用}* @param {轮询打印}* @param {打印机输出}* @param {打印结束}*/_writeBLECharacteristicValue(buffer) {wx.writeBLECharacteristicValue({deviceId: this._deviceId,serviceId: this._serviceId,characteristicId: this._characteristicId,value: buffer,success(res) {console.log('打印成功->res:', res)},fail(res) {console.log('打印失败', res)}})},/*** 第十二步* @param {蓝牙相关事件}* @param {和以上打印不衔接}* @param {关闭蓝牙}*/closeBluetoothAdapter() {wx.closeBluetoothAdapter()this.data.discoveryStarted = false},/*** 第十三步* @param {判断蓝牙是否已经连接}* @param {只支持wx. 不支持wx.}* @param {只支持安卓, 不支持苹果}*/isBluetoothDevicePaired() {var that = thiswx.isBluetoothDevicePaired({deviceId: wx.getStorageSync("BlueKey")?._deviceId,success(res) {console.log(res, "判断连接成功")that.setData({connected_ly: true,ly_text: '连接成功'})},fail(err) {console.log(err, "判断连接失败");that.setData({ly_text: '点击搜索'})}})},/*** 第十四步* @param {蓝牙相关资源事件}* @param {搜索 资源 打印}* @param {转换}*/inArray(arr, key, val) {for (let i = 0; i < arr.length; i++) {if (arr[i][key] === val) {return i}}return -1},ab2hex(buffer) { // ArrayBuffer转16进度字符串示例const hexArr = Array.prototype.map.call(new Uint8Array(buffer),function (bit) {return ('00' + bit.toString(16)).slice(-2)})return hexArr.join(',')},str2ab(str) {let buffer = new ArrayBuffer(str?.length)let dataView = new DataView(buffer)for (let i = 0; i < str?.length; i++) {dataView.setUint8(i, str?.charAt(i).charCodeAt(0))}return buffer;},/*** 第十五步* @param {进入页面就自动连接}* @param {该方法存在BUG}* @param {目前该方法先不投放使用}*/createBLEConnectionWithDeviceId(e) {//创建蓝牙链接wx.openBluetoothAdapter({success: (res) => {let ly_data = {name: wx.getStorageSync("BlueKey")?._deviceId,deviceId: wx.getStorageSync("BlueKey")?._name}this._createBLEConnection(ly_data);},fail: (res) => {if (res.errCode === 10001) {wx.showModal({title: '错误',content: '未找到蓝牙设备, 请打开蓝牙后重试。',showCancel: false});this.connected_ly = false} else if (res.errCode === -1 || res.errCode === 10010) { //已连接this.data.connected_ly = true;}}})},/*** 第十六步* @param {获取蓝牙适配状态}* @param {在蓝牙连接成功后调用查看}* @param {判断连接用}*/getBluetoothAdapterState() {wx.getBluetoothAdapterState({success: (res) => {console.log(res)if (res.available) {this.data.connected_ly = truethis.data.ly_text = "已连接"console.log("蓝牙已经连接", res)} else {this.connected_ly = false;this.data.ly_text = "点击连接"console.log("蓝牙已经断开")}}})},})

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

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

相关文章

Hadoop、HDFS、MapReduce 大数据解决方案

本心、输入输出、结果 文章目录 Hadoop、HDFS、MapReduce 大数据解决方案前言HadoopHadoop 主要组件的Web UI端口和一些基本信息MapReduceMapReduce的核心思想MapReduce的工作流程MapReduce的优缺点Hadoop、HDFS、MapReduce 大数据解决方案 编辑 | 简简单单 Online zuozuo 地址…

广义线性模型(1)广义线性模型详解

一 GLM概述 广义线性模型&#xff08;Generalized Linear Models&#xff0c;GLM&#xff09;由 Nelder 和 Wedderburn 于 1972年提出和发表 &#xff0c;旨在解决普通线性回归模型无法处理因变量离散&#xff0c;并发展能够解决非正态因变量的回归建模任务的建模方法。 在广…

数据结构:二叉搜索树(简单C++代码实现)

目录 前言 1. 二叉搜索树的概念 2. 二叉搜索树的实现 2.1 二叉树的结构 2.2 二叉树查找 2.3 二叉树的插入和中序遍历 2.4 二叉树的删除 3. 二叉搜索树的应用 3.1 KV模型实现 3.2 应用 4. 二叉搜索树分析 总结 前言 本文将深入探讨二叉搜索树这一重要的数据结构。二…

【PyTorch】单目标检测项目

对象检测是在图像中查找特定对象位置的过程,用于处理单对象或多对象检测问题。单对象检测在给定图像中仅定位一个对象。对象的位置可以通过边界框定义。单对象检测使用四个数字预测边界框。对于正方形物体&#xff0c;可以固定宽度和高度&#xff0c;并简化问题以仅预测两个数字…

Unity:PC包直接查看Log日志

PC端会输出Log日志&#xff0c;位置在&#xff1a; C:\Users\用户名\AppData\LocalLow\公司名\项目名 在这里可以找到类似的文件&#xff1a; 打开便可以看到打印。

解决 elementUI 组件在 WebStorm 中显示为未知标签的问题

解决 elementUI 组件在 WebStorm 中显示为未知标签的问题 一、问题 自从转到 ts 之后&#xff0c;编辑器就一直提示用到的 elementUI 标签未知&#xff0c;一直显示一溜黄色警示&#xff0c;很烦&#xff1a; 二、解决 把它改成大写就可以了。 如下&#xff1a; 把整个项目…

springboot实战(十二)之通过注解的方式记录接口出入参log入库

前言 生产过程中&#xff0c;为了更好的辅助线上问题排查避免不了对接口出入参进行日志输出的时候&#xff0c;并且为了分析接口数据效果需要将每次请求接口的出入参进行落库方便后续的数据分析&#xff0c;这时总不能每个接口入参之后、出参之前都打印一遍日志吧&#xff1f;如…

51单片机嵌入式开发:16、STC89C52RC 嵌入式之 步进电机28BYJ48、四拍八拍操作

STC89C52RC 嵌入式之 步进电机28BYJ48、四拍八拍操作 STC89C52RC 之 步进电机28BYJ48操作1 概述1.1 步进电机概述1.2 28BYJ48概述 2 步进电机工作原理2.1 基本原理2.2 28BYJ48工作原理2.3 28BYJ48控制原理 3 电路及软件代码实现4 步进电机市场价值 STC89C52RC 之 步进电机28BYJ…

使用约束布局该如何设置哪个视图(UILabel)的内容优先被压缩?

引言 在实际项目开发中&#xff0c;约束布局给我们带来了很大的便利&#xff0c;可以帮助我们创建灵活且响应迅速的用户界面。通常情况下&#xff0c;它都能很好地工作&#xff0c;但在一些包含许多UILabel的场景中&#xff0c;比如会话列表的UI&#xff0c;哪个视图会被优先压…

《0基础》学习Python——第二十讲__网络爬虫/<3>

一、用post请求爬取网页 同样与上一节课的get强求的内容差不多&#xff0c;即将requests.get(url,headershead)代码更换成requests.post(url,headershead),其余的即打印获取的内容&#xff0c;如果content-typejson类型的&#xff0c;打印上述代码的请求&#xff0c;则用一个命…

2024论文精读:利用大语言模型(GPT)增强上下文学习去做关系抽取任务

文章目录 1. 前置知识2. 文章通过什么来引出他要解决的问题3. 作者通过什么提出RE任务存在上面所提出的那几个问题3.1 问题一&#xff1a;ICL检索到的**示范**中实体个关系的相关性很低。3.2 问题二&#xff1a;示范中缺乏解释输入-标签映射导致ICL效果不佳。 4. 作者为了解决上…

【Git】(基础篇七)—— IntelliJIDEA集成Git

InteliJ IDEA集成Git 现在有很多的集成工具帮助我们写代码&#xff0c;使用这些工具可以帮助我们加速写代码&#xff0c;很多工具也可以集成git&#xff0c;使用图形工具管理git&#xff0c;相信了解了底层运行逻辑的你能够很快地上手使用这些工具&#xff0c;本文以InteliJ I…

7 Vue3

相比 Vue2 1. 优点 vue3支持vue2的大多数特性&#xff0c;实现对vue2的兼容vue3对比vue2具有明显的性能提升 打包大小减少41%初次渲染快55%&#xff0c;更新快133%内存使用减少54% 更好的支持TypeScript使用Proxy代替defineProperty实现响应式数据 2. 性能提升的原因 静态标…

jmeter-beanshell学习11-从文件获取指定数据

参数文件里的参数可能过段时间就不能用了&#xff0c;需要用新的参数。如果有多个交易&#xff0c;读不同的参数文件&#xff0c;但是数据还是一套&#xff0c;就要改多个参数文件。或者只想执行参数文件的某一行数据&#xff0c;又不想调整参数文件顺序。 第一个问题目前想到…

Ant Design Vue中日期选择器快捷选择 presets 用法

ant写文档的纯懒狗 返回的是一个day.js对象 范围选择时可接受一个数组 具体参考 操作 Day.js 话不多说 直接上代码 <a-range-pickerv-model:value"formData.datePick"valueFormat"YYYY-MM-DD HH:mm:ss"showTime:presets"presets"change&quo…

(前缀和) LeetCode 238. 除自身以外数组的乘积

一. 题目描述 原题链接 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&…

WebRTC通话原理(SDP、STUN、 TURN、 信令服务器)

文章目录 1.媒体协商SDP简介 2.网络协商STUN的工作原理TURN工作原理 3.信令服务器信令服务器的主要功能信令服务器的实现方式 1.媒体协商 比如下面这个例子 A端与B端要想通信 A端视频采用VP8做解码&#xff0c;然后发送给B端&#xff0c;B端怎么解码&#xff1f; B端视频采用…

【论文共读】【翻译】ShuffleNet v1:一种用于移动设备的极其高效的卷积神经网络

[原文地址] https://arxiv.org/pdf/1707.01083 [翻译] 0. 摘要 我们介绍了一种计算效率极高的CNN架构&#xff0c;称为ShuffleNet&#xff0c;该架构专为计算能力非常有限的移动设备&#xff08;例如&#xff0c;10-150 MFLOPs&#xff09;而设计。新架构利用了两个新操作&am…

Ubuntu 22.04.4 LTS (linux) Tomcat 下载 安装配置详细教程

1 官网下载 下载链接 2 ubuntu 服务器安装 #下载 wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.91/bin/apache-tomcat-9.0.91.tar.gz #解压 tar zxvf apache-tomcat-9.0.91.tar.gz sudo mv apache-tomcat-9.0.91/ /data/tomcat #配置环境变量 sudo vi /etc/profil…

WebGoC题解(13) 狐猬编程:GoC L4 结业测试 第4题 找木柴

题目描述 小明今天找了n跟木柴&#xff0c;但是木柴太多了&#xff0c;小明只能拿走m根木柴&#xff0c;小明希望拿走的木柴都是剩下的木柴中最长的&#xff0c;小明还画出以下图形 例如 输入 5 3 10 20 30 40 50 小明要拿走30 40 50 这3根木柴 从大到小画出以下图形 矩形的宽…