H5 app 安卓应用 连接 蓝牙打印机 打印标签
项目需求:
商超类管理端APP(H5 )能够连接蓝牙打印机,打印促销价签。
个人说明:
1、前端水平为入门级。
2、第一次搞硬件对接。
所以写的内容可能很基础,或者有错误。欢迎各位大佬指正。
开发思路:
本人负责从该功能的设计,数据库、后端、前端的所有开发。
首先需要验证H5 项目是否能够链接驱动打印机。
验证成功后再进行其他开发。
本文主要介绍:H5 项目的蓝牙打印机验证。
项目研究及同类搜索:
客户发过来的蓝牙打印机是 芝柯便携式打印机 CC3 。
1、商家技术支持:商家拉了一个技术对接群。发了一个500M左右的技术支持包。
问有没有相关的demo。答:“里面您自己找下 ,有的话就有,没有就没有了”。
这个群最后一句话是“明天这边 反馈下厂家开发”。
所以商家基本上没有支持(没错,就是在吐槽)。
2、同类搜索:在mui 及其他网站搜索 “H5 蓝牙打印机”。找到了六七个项目下载后挨个测试使用。
发现有些是H5WEB项目,有些是vue项目。符合要求的有三个。
==CSDN 搜包小弟快递 (优点:在同一个页面进行蓝牙配对、)
==雨滴科技蓝牙打印Demo https://ask.dcloud.net.cn/article/38125 buleprintDemo.zip(优点:能够自动连接已保存蓝牙)
==CSDN 搜 html5-bluetooth-HBuilderX(优点:丰富的操作)
经测试后发现有些问题无法解决。
如:Uncaught java.lang.SecurityException: Need android.permission.BLUETOOTH_SCAN permission for android.content.AttributionSource@8a1bcf4c: Starting discovery.;at android.bluetooth.BluetoothAdapter.startDiscovery at printer.html:1
很多文章下也有这个提问,但是暂无回答 。后来解决后 我也尽量去相关问题下回答了。
相关知识:
打印机的相关文档 和 网上搜索的demo中,每个写法都不太一样。如:不同的打印指令,不同的链接蓝牙的方法。
看的多了更乱了。发现自己关于打印机开发的相关知识还不够。
这里梳理了一些相关知识,给跟我一样刚接触的人一些提示。
1、蓝牙打印机
不同品牌的蓝牙打印机样子都差不多,相关指令也一样,可能有一些字体和字号设置不同。其他都一样。
拿到新的打印机后,先打印一个自检页,相面有相关数据 。如:mac地址,支持的指令集,支持的字体等。
2、蓝牙的连接方式
蓝牙的连接方式有两种:传统连接、ble连接(低功耗链接)。
两种链接用的方法不一样,从搜索,连接,传送指令,断开连接 等都不一样。
简单来说,方法名中 带有ble 字样的就是ble连接。
用ble连接的场景:微信小程序只支持ble蓝牙连接。 所以如果你用vue后期要编译成小程序的 ,需要用ble。
打印机支持的链接模式:打印机会有说明 ,是否支持双模连接。支持双模连接的 会有两个mac地址,ble蓝牙名称比传统蓝牙名称多一个L。
===我用的是传统连接。
3、打印机指令
我这个打印机自检页中 说支持的指令集有很多种: TSPL,ZPL,EPL,CPCL。
网上搜索的指令集一般用两种:CPCL命令集、ESC命令集
一开始我用ESC命令集,传送命令没有报错,但是打印机没反应。后来发现,这个打印机不支持。
最后用的CPCL命令集,也建议大家用这个指令集。因为:
1、CPCL指令集 更通用。
2、ESC指令集用的十六进制的指令,阅读困难。CPCL指令集阅读友好。
===我用的是CPCL命令集。
4、在什么介质上打印
热敏打印机可以在两种介质上打印。
1、热敏小票纸。就是你去超市结账后给的小票
2、热敏标签。就是你在超市买菜时,电子秤上打印的标签。
这两种打印在指令上略有不同,如果只打印一种,只看相关指令就行。
===我用的是热敏标签打印。
根据我的需求和各个例子的功能,最后选择了在 雨滴科技蓝牙打印demo 上进行修改应用。
改进的地方
1、已经在manifast中添加了相关权限,但还是在搜索蓝牙时报错Need android.permission.
var permissions = [
"android.permission.BLUETOOTH",
"android.permission.BLUETOOTH_ADMIN",
"android.permission.BLUETOOTH_SCAN",
"android.permission.BLUETOOTH_CONNECT"
];
plus.android.requestPermissions(
permissions,
function(result) {
// 权限申请成功后的回调
console.log("权限申请成功");
},
function(error) {
console.error("权限申请失败:" error.message);
}
);
2、搜索蓝牙有大量重复,需要去重。
// 防止重复出现
if (JSON.stringify(BleDeviceObjAry).indexOf(JSON.stringify(BleDevice)) != -1) {
console.log("重复");
} else {
console.log("增加");
BleDeviceObjAry.push(BleDevice);
self.SetpairedListHtml(unpairedList, bleName, bleId);
}
3、页面没有蓝牙连接标志。
<script type="text/javascript" src="js/jquery.min.js"></script>
$('#J_printer_status').val('打印机已就绪');
$('#J_printer_status').css('color', 'green');
4、第一次链接失败后,在连接还是失败。Uncaught java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at index.html:1
if(!bluetoothSocket.isConnected()) {
try{
bluetoothSocket.connect();
}catch(e){
// $('#J_printer_status').val(data.value);
bluetoothSocket.close();
$('#J_printer_status').val('打印机未连接')
$('#J_printer_status').css('color', 'red');
localStorage.setItem("printer_status", "N");
console.log(e)
return;
}
}
5、增加按钮 ,能够手动进入打印机配对界面
6、修改label_set_page 方法,能够传入打印数量
欢迎指正并一起讨论学习