3***@qq.com
3***@qq.com
  • 发布:2025-03-19 10:11
  • 更新:2025-03-19 10:11
  • 阅读:24

H5 app 安卓应用 连接 蓝牙打印机 打印标签

分类:HTML5+

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 方法,能够传入打印数量

欢迎指正并一起讨论学习

0 关注 分享

要回复文章请先登录注册