一、前言
前两年给我哥的小破厂写的生产管理,设计蓝牙实现生产打印。今天朋友问到,觉得有必要写出来,怕有一天自己要用到的时候想不起了。
二、产品选型
我这里不是在介绍产品,确实当时就是选的这一款,【汉印D35BT】,蓝牙wifi双无线,没得说
话说,两年了,一分钱都没降啊,京东你是好样的。
三、找驱动和二开代码
汉印官网:https://www.hprt.com.cn/
然后咱们就搜出了这么多,话说,咋有uniapp的,你要早点写出来,前两年,我也不会改得那么痛苦的说。
算了不鸟他,咱就喜欢安卓的,任性~。
下载完了,解压。嗯~~ 有说明,咱看看先,进步了,我记得当年还是PDF来着,我很清晰的记得我用edge翻这玩意好几天,这都升级md了。
四 、读文档很重要
打开说明文档
1 **SDK加载及使用**
1.1 在Android studio 中加载我们打印机的SDK jar包和SO库。
- 将jar包和so库都拷贝到app/libs文件夹下
- 在app中的build.gradle加入下面的代码
```java
android{
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
implementation files('libs/CPCL_SDK_V1.01.jar')
1.2 我们所用的接口都在PrinterHelper这个类中所有的接口都是静态方法,可以直接调用。
2 **SDK 连接方法**
2.1 **蓝牙连接接口**
- 描述
```java
int portOpenBT(Context context,String portSetting)
- 参数
| 参数 | 描述 |
| ----------- | ---------------- |
| context | 上下文对象 |
| portSetting | 蓝牙地址(大写) |
- 返回
| 值 | 描述 |
| :--- | :------------------------------ |
| 0 | 连接成功 |
| -1 | 连接超时 |
| -2 | 蓝牙地址格式错误 |
| -3 | 打印机与SDK不匹配(握手不通过) |
好了,读了1.1、1.2,其他不重要。
第一咱得下载Android studio、第二咱得改portOpenBT()。行了,我懂了。
至于,为啥要改portOpenBT,我的想法很简单,我也不知道以后用啥纸啊、打印机坏了得换MAC对吧。总得吧长和宽作为参数写进去吧。
这款是支持WIFI的,我就说说蓝牙的配置,WIFI的一个逻辑,看看文档就会改。
五、android studio
下载: https://developer.android.google.cn/studio?hl=zh-cn
还有点大,等一哈儿。出去买跟冰棍嗦一哈,广东还是嘿热。
装起来,安卓这图标越来越丑了,不要方,我都嘿多年没碰JAVA了
说他慢,是真的慢啊,太耽误老子睡大觉了。
六、打开打印程序
这改的什么玩意儿,俺不会了啊。
万事不决看文档,先把下面这段复制过去先,再找找这个炸包在哪
目录里有 ,只是版本变了,改成1.22的。OK ,找咱们要改的了
七、修改打印函数
咱们的目的是啥,连蓝牙,对,上面说的改portOpenBT,ctrl+F查询一下portOpenBT
你看,人家写好demo了,然后咱们还要打印内容对吧,找找文档
嗯 有模版就好弄,管理Ctrl+F看看他是咋读的
嗯,我会了。
private void gotoTxtBT(String mac,String contentTxt,String nowHeight) //MAC 打印内容 标签高度
{
try {
int i = PrinterHelper.portOpenBT(mac);
if(i==0){
PrinterHelper.printAreaSize("0","200","200",nowHeight,"1");//
PrinterHelper.printText(contentTxt);
PrinterHelper.Print();
PrinterHelper.PortClose();
}
} catch (Exception e) {
Log.d("Print", e.getMessage().toString());
}
}
太晚了,明天再调试 打包,
八、uniapp配置
打印机设置,你爱写哪儿写哪儿,能读出来就行,这改起来不是so easy
doprint() {
//console.log(this.logs);
this.zshow = true;
const hs = [460, 405, 350, 295,240];
for (let i = 0; i < this.logs.length; i++) {
let mcut = 0;
let txt = "";
const log = this.logs[i];
//this.Zheight=1120;
txt += "! 0 200 200 " + this.Zheight + " 1";
txt += "\r\n";
txt += "PAGE-WIDTH " + this.Zwidth;
txt += "\r\n";
txt += "BOX 20 20 " + (this.Zwidth - 40) + " " + (this.Zheight - 40) + " 2";
txt += "\r\n";
//标题
txt += "SETBOLD 1 \r\n";
txt += "SETMAG 3 3 \r\n";
if (this.g8 == "1"){
txt += "TEXT 3 0 50 40 " + this.titname.substring(0,10) + "\r\n";
if(this.titname.length>10)
txt += "TEXT 3 0 200 90 " + this.titname.substring(10,this.titname.length) + "\r\n";
}
else txt += "TEXT 3 0 150 100 " + this.titname + "\r\n";
txt += "SETMAG 1 1\r\n";
txt += "SETBOLD 0 \r\n";
//电话
txt += "SETMAG 2 2\r\n";
txt += "TEXT 3 0 100 150 " + this.phone + "\r\n";
//地址
txt += "TEXT 3 0 100 190 " + this.addr;
txt += "\r\n";
let _qrcode="http://113.125.42.176:6060/data/tags.html?no="+log.codes+"&co="+this.sortname;
//二维码
if (this.g8 == "1") {
txt += "BARCODE QR 370 230 M 2 U 5\r\n";
txt += "MA," + _qrcode + "\r\n";
txt += "ENDQR\r\n";
}
//内容
if (this.g1 == "1") {
txt += "TEXT 3 0 50 " + hs[mcut] + " 材质: " + log.tname + "\r\n";
mcut += 1;
}
if (this.showb == "1") {
txt += "TEXT 3 0 50 " + hs[mcut] + " 数量: " + Number(log.counts) + log.units +
//txt += "TEXT 3 0 50 " + hs[mcut] + " 数量: " + Number(log.counts) + "/" + this.acounts + log.units +
"\r\n";
mcut += 1;
}
if (this.showa == "1") {
txt += "TEXT 3 0 50 " + hs[mcut] + " 重量: " + (Number(log.weight)+Number(log.bweight)) + " KG" +
//txt += "TEXT 3 0 50 " + hs[mcut] + " 重量: " + Number(log.weight)+Number(log.bweight) + "/" + this.aweight + " KG" +
"\r\n";
mcut += 1;
}
if (log.cusordernum != "") {
txt += "TEXT 3 0 50 " + hs[mcut] + " 订单: " + log.cusordernum +
"\r\n";
mcut += 1;
}
txt += "TEXT 3 0 50 " + hs[mcut] + " \r\n";
//txt += "TEXT 3 0 50 " + hs[mcut] + " 件数: 1/" + this.bagcount + "包" + "\r\n";
txt += "TEXT 3 0 50 515 品名: " + log.proname;
txt += "\r\n";
txt += "TEXT 3 0 50 570 料号: " + this.code2;
txt += "\r\n";
txt += "BARCODE 128 1 1 50 130 615 " + this.code1; //料号
txt += "\r\n";
txt += "TEXT 3 0 50 690 规格: " + log.mysize;
txt += "\r\n";
txt += "TEXT 3 0 50 745 生产日期: " + new Date(log.timedo).Format("yyyy年MM月dd日");
txt += "\r\n";
txt += "TEXT 3 0 50 800 存储: 避光 低温 少尘 防潮 通风";
txt += "\r\n";
txt += "SETMAG 1 1 \r\n";
//条码
txt += "BARCODE 128 1 2 80 100 880 " + log.codes; //包号
txt += "\r\n";
txt += "TEXT 2 0 200 980 " + log.codes; //包号
txt += "\r\n";
//txt += "PRINT\r\n";
this.txtdata.push(txt);
}
console.log(this.txtdata);
this.toprint();
},
toprint() {
const pmac = this.MAC; //MAC
let rst = 2;
rst = printModule.gotoTxtBT(pmac, this.txtdata, this.Zheight); //传入打印插件
//console.log("pmac:"+pmac+" txtdata:"+this.txtdata+' height:'+this.Zheight)
if (rst > 0) //异常
{
this.zshow = false;
this.yshow = true;
this.pshow = false;
this.$mHelper.toast('打印失败,请重试');
}
if (rst == 0 & this.instoretype == 1) //打印成功
{
//修改任务状态
this.$mHelper.toast('打印成功!');
setTimeout(() => {
uni.switchTab({
url: '/pages/works/task/index'
})
}, 2000);
}
if (rst == 0 & this.instoretype != 1) {
this.$mHelper.toast('打印成功!');
setTimeout(() => {
uni.switchTab({
url: '/pages/application/index'
})
}, 2000);
}
},
画打印,详细配置参考
九、执行结果
来个特写
! 0 200 200 1060 1
PAGE-WIDTH 600
BOX 20 20 560 1020 2
SETBOLD 1
SETMAG 3 3
TEXT 3 0 50 40 XXX市XXXXX有
TEXT 3 0 200 90 限公司
SETMAG 1 1
SETBOLD 0
SETMAG 2 2
TEXT 3 0 100 150 电话:
TEXT 3 0 100 190 地址:
BARCODE QR 370 230 M 2 U 5
MA,http://XXX.XXX.XX.XXX:6060/data/tags.html?no=A00032136240905C001&co=ly
ENDQR
TEXT 3 0 50 460 材质: PE
TEXT 3 0 50 405 数量: 400KG
TEXT 3 0 50 350
TEXT 3 0 50 515 品名: 平口袋
TEXT 3 0 50 570 料号: A000331239
BARCODE 128 1 1 50 130 615 A000331239
TEXT 3 0 50 690 规格: 130(W) X 90(L)
TEXT 3 0 50 745 生产日期: 2024年09月05日
TEXT 3 0 50 800 存储: 避光 低温 少尘 防潮 通风
SETMAG 1 1
BARCODE 128 1 2 80 100 880 A00032136240905C001
TEXT 2 0 200 980 A00032136240905C001