微信小程序连接标签打印机,打印标签

授权蓝牙并且搜索蓝牙设备

// 授权定位和蓝牙
authorizationBluetooth() {wx.getSetting({success: (res) => {if (res.authSetting.hasOwnProperty('scope.bluetooth')) {if (!res.authSetting['scope.bluetooth']) {this.setData({showManual: true})} else {this.bluetoothState()}} else {wx.authorize({scope: 'scope.bluetooth',success: () => {// 用户已经同意小程序使用手机蓝牙功能,后续调用 蓝牙 接口不会弹窗询问this.bluetoothState()},fail: () => {Toast('你已拒绝开启蓝牙功能')}})}}})
},
// 第一步,蓝牙初始化
bluetoothState() {wx.openBluetoothAdapter({mode: 'central',success: (res) => {console.log('第一步,蓝牙初始化成功', res)this.startBluetoothDevicesDiscovery()},fail: (err) => {console.log('蓝牙设备错误', err)if (err.errCode == 10001) {wx.onBluetoothAdapterStateChange((ress) => {if (ress.available) {this.startBluetoothDevicesDiscovery()} else {Toast('蓝牙设备不可用')}})} else {Toast('蓝牙设备不可用')}}})
},
// 第二步 开始搜索附近的蓝牙设备
startBluetoothDevicesDiscovery() {wx.startBluetoothDevicesDiscovery({allowDuplicatesKey: false,success: (res) => {this.onBluetoothDeviceFound()},})
},
// 第三步 监听发现附近的蓝牙设备
onBluetoothDeviceFound() {wx.showLoading({title: '重新搜索中',mask: true})wx.onBluetoothDeviceFound(() => {wx.getBluetoothDevices({success: res => {let deviceList = []if (res.devices.length > 0) {res.devices.forEach(v => {if (v.RSSI < 0 && v.name != '未知设备') {deviceList.push(v)}})}wx.hideLoading()this.setData({deviceList})}})})
},// 第四步、 建立连接
connectDevice(e) {const item = e.currentTarget.dataset.itemthis.setData({linkShow: true,activeItem: item}, () => {app.linkBluetooth(item.deviceId).then(res => {console.log('蓝牙连接成功', res)Toast('蓝牙连接成功')// 更新连接历史记录this.updateHisList(this.data.activeItem)this.setlinkDeviceId(this.data.activeItem.deviceId)this.setData({linkShow: false})}).catch(err => {console.log(err.message, err)Toast(err.message)this.closeBLEConnection(item.deviceId)this.setData({linkShow: false,})})})
},
// 断开蓝牙连接
closeBLEConnection(deviceId, tip) {app.closeBluetooth(deviceId).then(res => {this.setlinkDeviceId('')if (tip) {Toast(tip)}}).catch(err => {Toast('断开连接失败')})
},

连接断开方法

// 连接蓝牙
linkBluetooth(deviceId) {return new Promise((resolve, reject) => {wx.createBLEConnection({deviceId: deviceId,success: (res) => {setTimeout(() => {wx.getBLEDeviceServices({deviceId: deviceId,success: (res) => {for (let i = 0; i < res.services.length; i++) {if (res.services[i].isPrimary) {let serviceId = res.services[i].uuidlet Iswrite = falsewx.getBLEDeviceCharacteristics({deviceId,serviceId,success: (res) => {let characteristicId = ''for (let i = 0; i < res.characteristics.length; i++) {let item = res.characteristics[i]//支持写入就行了if (item.properties.write) {Iswrite = truecharacteristicId = item.uuid}}if (Iswrite) {wx.setStorageSync('linkDeviceId', deviceId)wx.setStorageSync('serviceId', serviceId)wx.setStorageSync('characteristicId', characteristicId)resolve({message: '蓝牙连接成功'})} else {reject({message: '蓝牙服务不支持此功能,已断开'})}},fail(err) {reject({message: '获取蓝牙低功耗设备某个服务中所有特征失败',err})}})return}}},fail(err) {reject({message: '获取蓝牙低功耗设备所有服务失败',err})}})}, 3000)},fail: (err) => {reject({message: '蓝牙连接失败',err})}})})
},
// 断开蓝牙连接
closeBluetooth(deviceId) {return new Promise((resolve, reject) => {wx.closeBLEConnection({deviceId: deviceId,success: res => {wx.removeStorageSync('linkDeviceId')wx.removeStorageSync('serviceId')wx.removeStorageSync('characteristicId')resolve(res)},fail: err => {wx.removeStorageSync('linkDeviceId')wx.removeStorageSync('serviceId')wx.removeStorageSync('characteristicId')reject(err)}})})
},

打印命令

// GBK的方法随便找一个就行
import GBK from './gbk.min.js';// 打印商品标签
export const printGoodsTag = (option) => {if (!wx.getStorageSync('linkDeviceId')) {wx.showToast({title: '请连接打印机',icon: 'none',mask: true})return}let data ='SIZE 40 mm,30 mm\n' +'GAP 2 mm,0 mm\n' +'DIRECTION 1\n' +'CLS\n' +`TEXT 20,30,"0",0,1,1,"商品名称:${option.goodsName}"\n` +`TEXT 20,80,"0",0,1,1,"规格:${option.skuName || ''}"\n` +`QRCODE 20,130,M,3,M,0,M1,S2,"${option.id}_1"\n` +`TEXT 120,140,"0",0,1,1,"零售价"\n` +`TEXT 120,180,"0",0,1.5,1.5,"¥${option.price || ''}"\n` +'PRINT 1,1'sendDataToDevice(new Uint8Array([...GBK.encode(data), ...[10]]).buffer);
}
// 打印维修单标签
export const printRepairTag = (option) => {if (!wx.getStorageSync('linkDeviceId')) {wx.showToast({title: '请连接打印机',icon: 'none',mask: true})return}let data ='SIZE 40 mm,30 mm\n' +'GAP 2 mm,0 mm\n' +'DIRECTION 1\n' +'CLS\n' +`QRCODE 20,30,M,3,M,0,M1,S2,"${option.id}_2"\n` +`TEXT 110,30,"0",0,1,1,"${option.equModel || ''}"\n` +`TEXT 110,60,"0",0,1,1,"${option.okey || ''}"\n` +`TEXT 110,90,"0",0,1,1,"${option.imei || ''}"\n`let str = option.reason || ''if (str) {let length = str.lengthlet maxNum = 12let top = 130for (let i = 0, len = length; i <= len; i += 12) {let text = str.slice(i, maxNum)data = data + `TEXT 20,${top},"0",0,1,1,"${text}"\n`maxNum += 12top += 30}}data = data + 'PRINT 1,1'sendDataToDevice(new Uint8Array([...GBK.encode(data), ...[10]]).buffer);
}const sendDataToDevice = value => {let byteLength = value.byteLength;const speed = 20;if (byteLength > 0) {wx.writeBLECharacteristicValue({deviceId: wx.getStorageSync('linkDeviceId'),characteristicId: wx.getStorageSync('characteristicId'),serviceId: wx.getStorageSync('serviceId'),value: value.slice(0, byteLength > speed ? speed : byteLength),success: res => {if (byteLength > speed) {sendDataToDevice(value.slice(speed, byteLength));} else {console.log('已完成打印   laster success', res);}},fail: err => {console.log(err)},});}
}

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

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

相关文章

UMA 2 - Unity Multipurpose Avatar☀️六.Advanced Occlusion高级遮挡功能解决皮肤服饰穿模

文章目录 🟥 本节功能效果展示🟧 基础项目配置🟨 本节项目配置🟩 配置MeshHideAsset1️⃣ 创建MeshHideAsset2️⃣ 配置SlotDataAsset3️⃣ 配置遮挡信息🟦 将 MeshHideAsset 配置到 Recipe🟥 本节功能效果展示 未遮挡前的穿模问题: 遮挡后效果:

vue3项目运行时解析文件的顺序

在 Vue 3 项目运行时&#xff0c;文件的解析顺序如下&#xff1a; 首先&#xff0c;Vue 3 会解析并执行 main.js 文件。这是整个应用程序的入口文件。通常&#xff0c;在 main.js 中创建 Vue 应用实例&#xff0c;并将根组件挂载到指定的 DOM 元素上。 在 main.js 中&#xff…

Flink中的批和流

批处理的特点是有界、持久、大量&#xff0c;非常适合需要访问全部记录才能完成的计算工作&#xff0c;一般用于离线统计。 流处理的特点是无界、实时, 无需针对整个数据集执行操作&#xff0c;而是对通过系统传输的每个数据项执行操作&#xff0c;一般用于实时统计。 而在Flin…

厂商征集 | 2023年中国RPA市场洞察研究报告正式启动

RPA中国基于在科技行业的资源积累&#xff0c;以及对各领域「技术领导者」、「技术应用者」、「产品服务商」的深度调研&#xff0c;2023年&#xff0c;我们重点推出MI报告 ( Market Insight )、CI Vendor报告&#xff08;Comprehensive Influence Vendor&#xff09;两个系列。…

【Jmeter】什么是BeanShell?

一、什么是BeanShell&#xff1f; BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器&#xff0c;JMeter性能测试工具也充分接纳了BeanShell解释器&#xff0c;封装成了可配置的BeanShell前置和后置处理器&#xff0c;分别是 BeanShell Pre…

NoSQL之Redis配置与优化(一)

关系数据库与非关系型数据库 &#xff1a; ●关系型数据库&#xff1a; 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 SQL 语句&#xff08;标准数据查询语言&#xff09;就是一种基于…

FP7122 具有平均模式恒定电流控制的LED驱动器芯片

FP7122 具有平均模式恒定电流控制的LED驱动器芯片 一般说明 FP7122是在恒定关闭时间模式下工作的平均电流模式控制LED驱动器IC。FP7122不产生峰值到平均的误差&#xff0c;因此大大提高了LED电流的精度、线路和负载调节&#xff0c;而不需要任何回路补偿或高侧电流传感。输出的…

VB:二分法查找

VB&#xff1a;二分法查找 二分查找算法 Private Sub Command1_Click()Dim i%, m%, n%Dim x(1 To 10) As SingleFor i 1 To 10x(i) Val(InputBox("请输入"))Next iCall bubbleSort(x)For i LBound(x) To UBound(x) LBound(x)和UBound(x)是用于获取数组x的下界和上…

运营技巧|如何在不同的平台上高效批量管理账户?

在当今全球化时代&#xff0c;中国出海企业和B2B外贸企业越来越重视海外社媒营销&#xff0c;这已成为企业抢占市场份额的关键。并且&#xff0c;为了获取到更多流量&#xff0c;跨境人们还会开通Facebook、Twitter、Google、TikTok、Instagram等平台账号&#xff0c;搭建自己的…

在SpringBoot项目加入冲突动态监测算法

一、什么是冲突动态监测算法 冲突动态监测算法是一种网络通信中的冲突检测方法&#xff0c;适用于无线网络或其他共享传输介质的环境。该算法通过监测网络中的冲突状况&#xff0c;以避免数据冲突导致的网络拥塞和性能下降等问题。 具体来说&#xff0c;冲突动态监测算法利用…

教你制作作业查询系统

嗨&#xff0c;各位老师们&#xff0c;今天我要给你们介绍一个超级方便的工具——易查分&#xff01;你知道吗&#xff0c;利用易查分&#xff0c;我们可以轻松制作一个便捷高效的作业查询系统哦&#xff01; 是不是想有个自己的分班or成绩查询页面&#xff1f;博主给老师们争取…

Go Tip02 指针类型 、值类型和引用类型 、标识符的命名规范

文章目录 一、指针类型二、值类型和引用类型三、标识符的命名规范 一、指针类型 package mainimport "fmt"func main() {saylocation()}func saylocation() {// 指针类型// 基本数据类型&#xff0c;变量存的是值// 用&获取变量的地址// 基本数据类型在内存的布…

提醒一个xampp启动mysql创建函数存在的坑

一直以来本地搭建的项目为了方便我都是使用xampp作为mysql的管理工具&#xff0c;比较简洁可视化比较好。但是最近程序的一个报错暴露了他与mysql之间的一些问题。 使用自增序列nextval函数时&#xff0c;突然抛出来一句&#xff1a; select nextval( SEQ_REGISTER_ID) > …

高性能数据JS网格 Bryntum Grid 5.5.2 Crack

高性能数据网格 Bryntum Grid 是一个高性能的网络表格组件。它是用纯 JavaScript 构建的&#xff0c;并且可以轻松地与所有主要 JS 框架集成。 功能丰富 Bryntum Grid 具有您期望从专业网格组件获得的所有功能&#xff0c;包括&#xff1a; 很好的表现;很好的绩效 没有人喜欢缓…

演讲实录:大模型时代,我们需要什么样的AI算力系统?

当前&#xff0c;“百模大战”带来了算力需求的爆发&#xff0c;AI芯片产业也迎来巨大机遇&#xff0c;“创新架构开源生态”正在激发多元AI算力产品百花齐放。面对新的产业机会&#xff0c;AI算力产业链亟需通过上下游协作共同把握机遇。 近日&#xff0c;浪潮信息AI&HPC…

异步FIFO设计的仿真与综合技术(1)

概述 本文主体翻译自C. E. Cummings and S. Design, “Simulation and Synthesis Techniques for Asynchronous FIFO Design 一文&#xff0c;添加了笔者的个人理解与注释&#xff0c;文中蓝色部分为笔者注或意译。 摘要&#xff08;ABSTRACT&#xff09; FIFO通常被用于将数据…

万物目标识别——Detic使用图像级别的监督信号来进行目标检测模型推理(C++/Python)

一、目标识别 1.1 传统目标识别算法 传统目标检测通常将分类&#xff08;确定物体属于哪个类别&#xff09;和定位&#xff08;确定物体的位置&#xff0c;通常使用边界框bbox表示&#xff09;任务耦合在一起。这要求训练数据集中包含每个物体的类别标签以及其对应的bbox位置…

【开发】视频监控平台EasyCVR分组批量绑定/取消通道功能的后端代码设计逻辑介绍

视频监控平台/视频存储/视频分析平台EasyCVR基于云边端一体化管理&#xff0c;可支持视频实时监控、云端录像、云存储、磁盘阵列存储、回放与检索、智能告警、平台级联等功能。安防监控平台在线下场景中应用广泛&#xff0c;包括智慧工地、智慧工厂、智慧校园、智慧社区等等。 …

qt exec 跟show的区别

1、要理清两个函数的区别&#xff0c;首先需要理解窗口模式&#xff1a; 模式窗口&#xff1a;窗口会原地阻塞&#xff0c;只能操作该窗口&#xff0c;其余窗口不能再操作&#xff1b;只有关闭该窗口后&#xff0c;代码处才会获得返回值&#xff0c;阻塞停止&#xff0c;就可以…

【Flink实战】玩转Flink里面核心的Sink Operator实战

&#x1f680; 作者 &#xff1a;“大数据小禅” &#x1f680; 文章简介 &#xff1a;玩转Flink里面核心的Sink Operator实战 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 目录导航 Flink Sink Operator简介Flink 核心知识 Sink Operator速览Fl…