问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

uniapp实现蓝牙小票打印功能

发布网友 发布时间:2022-11-05 19:27

我来回答

1个回答

热心网友 时间:2023-01-26 01:39

最近的一个项目增加了小票蓝牙打印的功能,由于之前对蓝牙打印机了解不多,所以遇到的坑比较多,花了点时间把蓝牙连接、打印模块封装成通用组件,并写了个打印的例子,这里做个记录,以防忘记。

组件: 组件例子

项目需要实现的是App端连接蓝牙打印机,打印的内容包括:

1、公司logo(本地图片)

2、指定格式与排版的文本数据(直线、中英文)

3、签名的图片数据(接口传回的网络图片地址)

首先要想能打印,蓝牙肯定要连接上,开发前了解一下低功耗蓝牙连接操作流程:

按照api来走一遍从连接到打印的流程:

这里我将蓝牙连接和打印的流程封装在组件使用,父组件中只需在onPrint方法中拼接指令,通过bufferData属性将拼接好的指令数据传入组件内部即可进行打印操作,onPrintSuccess和onPrintFail分别为打印成功与失败的回调:

组件内部的实现如下:

1、点击打印按钮,打开蓝牙适配器(openBluetoothAdapter),并获取已连接的设备(getConnectedBluetoothDevices),如果没有已连接的设备则打开搜索设备弹框进行设备搜索(第2步),若设备已连接,则执行打印方法(第4步)

这里的blesdk是为了方便使用,把uniapp蓝牙相关的api统一放到一个文件中,并将方法转为异步,其中还包括添加CPCL指令的字符拼接方法。gbk是一个用于将数据转码为打印机能够接受的数据格式的模块

2、打开搜索设备弹框(isShowSearch控制弹框显示隐藏)

点击开始搜索(startBluetoothDevicesDiscovery),并监听搜索到的新设备(onfindBlueDevices),蓝牙搜索的操作比较耗费系统资源,所以建议在连接上设备、页面销毁时关闭搜索(stopBlueDevicesDiscovery),这里,我加了两个按钮控制搜索的开关

由于加了筛选条件(rssi和设备名、设备ID)因此需要对onfindBlueDevices监听到的设备列表进行筛选

3、设备列表点击选择连接设备

①设备列表中的每一项都可以获取到设备的name、deviceId等信息,连接时我们需要的就是deviceId,创建蓝牙连接(createBLEConnection),在这之前可以通过onBLEConnectionStateChange监听连接状态的变化

②连接成功后顺便把搜索设备开关关掉。连接成功后需要通过deviceId获取设备服务(getBLEDeviceServices),这里获取时需要给方法设个延时,否则获取出来的serviceId会是空的

③获取设备服务成功后会返回servicesId数组,接着我们需要用deviceId和serviceId来获取特征值(getDeviceCharacteristics)

④获取到特征值之后需要找个变量将特征值暂存,因为后续向打印机发送数据时需要用到特征值。关闭搜索弹框

4、在连接上设备后,点击打印按钮,这时就可以开始拼接打印数据了。在第1步中做过判断如果有已连接设备,则开始拼接数据并打印,这里将拼接的任务交给父页面(onPrint),拼接完成后通过bufferData传入,在bufferData数据更新后开始将数据发送给设备,所需的参数即opt中的参数,deviceId为设备id;serviceId为服务id;characteristicId为特征码;value为写入的数据,需转成GBK格式;lasterSuccess为数据全部发送成功的回调;onceLength为分包发送的每个数据包长度,因为安卓和iOS有不同,所以加个判断。sendDataToDevice中封装了分包发送的方法。

5、父页面的onPrint中拼接bufferData数据,添加CPCL指令的方法放在bluetoolth.js中(@/components/kk-printer/utils/bluetoolth.js),以下为组件示例展示的一部分常用的指令拼接方法,可查看项目中的@/components/kk-printer/utils/bluetoolth.js文件了解指令封装方法的具体实现

6、实际项目中使用:

①页面引入并使用components文件夹中的kk-printer组件

②使用组件

拼接数据时将不同的打印需求分不同方法拼接

打印logo图片、打印签名图片,在canvasGetImageData前需要注意加个延时或等待draw()完成后执行,不然获取到的图像像素点数据会全是0。使用addCPCLImageCmd时注意调整灰度值threshold,灰度值过高或过低会导致低于灰度值的图像像素点在方法中被筛掉,变成0

addBaseInfo:打印基本信息

addTicketsInfo:打印提单信息

这两个都是打印文本与排版的,没有什么难点

最后讲一下数据(bufferData)拼接的注意点:

①向蓝牙打印机发送数据打印,发送的任何内容都应该要转成二进制数据,而且蓝牙打印的文本编码是GBK的,发送中文需转成GBK编码再转成二进制数据发送,包括发送打印机指令也要转成二进制数据发送

②蓝牙打印机一次接收的二级制数据有*,不同的系统不同的蓝牙设备*可能不同,建议一次20个字节,做递归分包发送

③发送完要打印的内容后,一定要发送一个打印的指令才能顺利打印 (部分指令不需要)

④在分包发送的时候,由于设备连接不稳定,经常会出现10007,找不到特征值的情况,需要在失败回调中记录断点,继续发送后续的包
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
天将雄师观后感600字 为什么喝酒会降血糖 牛栏山 52度浓香型白酒-购买最佳价格 全兴大曲 52度浓香型白酒-购买最佳价格 笔记本电脑怎么接音箱电脑如何连接外置音箱 笔记本电脑有音箱插孔吗笔记本电脑如何连接喇叭 冰箱压缩机过热启动5秒就停了 周长相等的正方形和圆,其面积比是多少 周长相等的正方形和圆面积比是多少 周长相等的正方形与圆形,边长与半径的比是( ),面积之比是( )。 要有... uniapp中调用微信jssdk 一个月准备结婚够吗 为您带来黑膜沼气池的具体施工步骤 用交行信用卡淘宝,通过快捷支付或者网银支付,有没有积分的 2022壬寅年五月初一当天的日子怎么样 2022壬寅年五月初一适合理发吗 2013年凌晨2点18分出生的男孩取名叫邓姝玥这个名字好不好 姓曾梦的男孩子取什么名字好? 97农历11月12日晚上出生取什么名字好 女孩,生于阴历2012年4月初三,11:36分,父亲姓张。请大师帮忙取名字。4个字的名字也可以。 女孩叫 张瑾熙 好听吗??? 张瑾熙这个名字怎么样 职场新人,感觉同事对我不友善,应该怎么改善? 科目三多少学时 科三的学时是多长时间 科目三要多少学时 贾三灌汤包子的介绍 属鼠缺火取名姓戴求各位大哥大姐给取个好名感谢 双鱼 乒乓球胶皮套胶 反胶涩性内能套胶 猎影213 红色怎么样 猎影233胶皮怎么样 世界上最大的风 vivo手机竖屏变横屏怎么弄 谁有PR教程-SpiceMaster2.5的使用教程? premiere2.0 pro用DebugMode FrameServer 2.5(帧服务器)搭桥小日本的问题 手机手电筒不亮了是为什么? 水果皂好不好 男人说注意身体的意思 炸怎么写 9月或者10云南什么气候 需要带什么衣服 这些豪车竟然是大众旗下的!!! 大众旗下有哪些豪车 请看图,这是什么风格的插画? 座充上有USB 5.2V d.c 5800mA(Max)的字样,是什么意思? 请问苹果手机怎么清理微信内存? 图形想象画大班教案 微信转账我已经确认收钱了,可是钱没到账怎么回事?对方设置了延时收款,我已经点收款了对方还能收回吗? 物业委托管理协议书含保洁最新版 签订物业服务合同注意哪些事项_法师兄 比亚迪g5的电瓶型号 兴业银行日日新2号A怎么样 一早醒来脸上好多油怎么办