banner
阿珏酱

阿珏酱

乘上与平常相反的电车,去看看那未曾见过的风景
twitter
github
facebook
bilibili
zhihu
steam_profiles
youtube

热敏蓝牙打印机开发

Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`

热敏蓝牙打印机开发

日期:2019-11-5 阿珏 折腾代码 浏览:2359 次 评论:14 条

最近在做小票打印这块,项目需求是IOS和安卓两种都要实现,开始做的时候也是一脸懵,然后网上找了不少资料,踩了一堆坑,看了好多文章,结果还好成了
蓝牙打印机一般分为两种打印模式,票据打印、标签打印

公司买的渣渣打印机连开发文档都没有,害我走了不少坑,让我开发买的时候也不咨询咨询我
目前微信小程序连接蓝牙打印机 wx.createBLEConnection 测试在IOS设备上没有问题,在部分安卓手机上会出现异常(表现为,连接是会弹出系统配对框,不管点取消还是输入配对码后点确定,都会立马断开连接。如果不输入也不取消则会在30秒以内自动断开蓝牙打印机)

现在采用的方式是各给安卓和IOS写一套蓝牙打印的命令
IOS



Android




就相对简单方便,采用 Native.js 直接调用 Native Java 接口通道,通过 plus.android 调用安卓原生系统 API。


原生安卓文档

https://developer.android.google.cn/reference/android/bluetooth/BluetoothAdapter?hl=en





打印指令


(更多打印指令参考 https://www.jianshu.com/p/dd6ca0054298)






关于二维码的打印




通过上面的文章我们可以知道




我们需要读取生成后的二维码的像素点的 rgba,再将图片数据先 4 合 1 判断 0 还是 1 (0 代表打印 1 代表不打印),紧接着八合 1,因为一个字节有 8 位。最后使用打印机的位图指令逐行扫描打印





4 合 1



本想着二维码不是黑就是白,肯定不是 255 就是 0,其实还是会有一小部分是其他数值的,这个要注意哦,每 4 位是一个像素点的 rgba,然后黑白色的 rgb 就是 (0,0,0) 和 (255,255,255),所以每四位只把第一位黑白化,然后将每四位的第一位取出来作为新的数组,当 rule>200 的时候,值取 0,表示不打印,否则取 1,表示打印;





8 合 1



假如我们取出来的 8 位数是 [0,0,0,0,0,0,0,1],这个时候 8 合 1,我们需要进行进制转换,从右往左是 2 的零次方,2 的一次方,等等,依次上加,实际是 0 * 27 + 0 * 26 + 0 * 25 + 0 * 24 + 0 * 23 + 0 * 22 + 0 * 21 + 1 * 20, 这个数就是我们要的最终数据的其中之一。




将数据转换成 ArrayBuffer,其次打印必须要有指令!参考网址以及标准的 ESC-POS 指令集,下面代码中的数字都是指令,另外,由于我这边的打印机支持的是 gb2312 格式,所以在转成 ArrayBuffer 的同时,还需要把编码格式转成正确的格式。




不过有一点我是要说下的,要注意 ios 和安卓的不同,安卓一次只能写入不超过 20 字节(ios 具体不清楚,目测 120 字节),建议是直接截取数据 data.slice (20, byteLength),打印成功再次回调,循环打印。


1、toArrayBuffer , 是个组件,要安装的,https://www.npmjs.com/package/to-array-buffer 或者你用这种写法也可以 const buffer = new Uint8Array (Buffer.from (cmds, 'gb2312')).buffer;




2、注意查看自己的数据是否正确,画图的数据有问题的话,也可能打印出黑块;




3、数据要算!!!要算!!要算!! ,比如我画图是 160*160 ,然后我打印数据拼接的指令 [29, 118, 48, 0, 20, 0, 160, 0] 这个里面的 20 和 160 这个就是算的,参考上方文章看下原因,大概就是 1:8,然后画图和读图的数据一致






相关函数




(经过反复测试得出,打印纸一行最大字节数是 32 字节,这里指的是普通的票据打印机)


打印三列或者两列,是需要自己计算空格进行填充,没有现成的指令噢


总宽度 - 左侧文字长度 - 右侧文字长度 就是空格的长度。




image


image



代码大多是直接从项目中 copy 过来的,没有整理过,并不能直接运行,仅供参考


不是我那一卷打印失败的打印纸丢了,不然就让你们看看什么叫做 第一次做打印机开发的程序员

这次是真大干货,篇幅也很长,辛苦了我


网友评论:

image 深圳自考 7 个月前 (2020-10-08)
厉害了  简直一模一样  以后可以开一家不饿了么公司了 [#aru_1]

image 一朵时光红 1 年前 (2020-03-21)
腾云奇袭技能释放时,神明将跳到筋斗云上,并留下一个完美的分身

image 李鱼儿啊 1 年前 (2019-12-27)
楼主,向打印机发送给 buffer 的地方的代码可以详细一点嘛?我目前卡在这一步  很迷惑  可以加我 QQ  2930962607

image 阿珏 1 年前 (2019-12-28)
@李鱼儿啊:你得说清楚你的问题

image 李鱼儿啊 1 年前 (2019-12-29)
@阿珏:我是 uniApp 的自定义组件模式开发  我是使用的 native.js 连接的 Android 手机的蓝牙   页面使用的是 web-view 的子窗口加载的本地 html 文件  因为需要使用 html2canvas.js 插件来截取页面生成图片  在插件的回调方法中可以获取到 canvas 的 dom 对象 因此可以获取到 imageData 的像素点信息   然后我使用你写得 4 合 1 以及  8 合 1  生成数据   然后在发送到打印机的 write 方法时 我写了 try  catch  来捕获发送时的异常  发现问题出现在生成的数据上面   有时候 catch 会报错讲试图获取一个 null Array 的长度  有时候会直接报错一个空 {} json 对象 比较重要的点是  你在 buffer 数据的转换上面使用到了  node.js  的 Buffer 对象  但是我这边并不能使用  希望楼主可以帮忙解答一下   方便的话加一下 QQ  2930962607

image 阿珏 1 年前 (2019-12-30)
@李鱼儿啊:很抱歉,关于这个 Android 打印图片数据的问题,我这边也没有完全解决掉,没办法给你更好的解决方案。Android 打印这块可以参考一下 GoogleAndroid 官方的文档,发送数据处理这块应该是有问题的。

image 『乐 易』 2 年前 (2019-11-16)
这,不是类似于喵喵机的吗,正好我买个了喵喵机 P1 [#aru_1]

image 阿珏 2 年前 (2019-11-17)
@『乐 易』:这,貌似不是很一样,而且那不是叫咕咕机吗 [#aru_2]

image 『乐 易』 2 年前 (2019-11-17)
@阿珏:功能一样,只不过喵喵机小一点而已,而且是喵喵机不是咕咕鸡 [#aru_38]

image 阿珏 2 年前 (2019-11-18)
@『乐 易』:好吧好吧,原来还有一个叫喵喵机的玩意 [#aru_16]

image mengkun 2 年前 (2019-11-05)
很强!有饿了么订单条内味儿了 [#aru_53]

image 阿珏 2 年前 (2019-11-05)
@mengkun:我们是不饿了么 [#aru_42]

image repostone 2 年前 (2019-11-05)
非技术的路过。

image 阿珏 2 年前 (2019-11-05)
@repostone:牛逼就完事了 [#aru_43]

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。