评论

小程序蓝牙打印爬坑之旅

小程序蓝牙打印乱码问题解决办法

因为公司要在小程序上加蓝牙打印标签功能,所以就开始接触小程序的蓝牙打印,看文档还是蛮详细的,而且还有demo,顺着demo,一步一步下来还是蛮顺畅的,原以为很快就能完成。没想到坑来了,由于demo中writeBLECharacteristicValue只是写入了一个16进制的数据,而现实中是需要发送字符串的,而且小程序必须要是arrayBuffer,就必须将字符串转arrayBuffer了,好,网上搜下,准备打印了吱吱吱咦,怎么有乱码啊,怎么中文都乱码了。。这下可糟了!于是就去各种找答案。最后知道问题了:原来是因为我们公司用的打印机是智能支持GB2312编码格式的二进制的,但是字符串是utf-8,诶,又得爬坑。经过一天的努力,终于找到解决方法啦,感谢csdn的大大们。实现的代码如下

//计算arraybuffer的长度
sumStrLength(str) {
var length = 0;
var data = str.toString();
for (var i = 0; i < data.length; i++) {
if (this.isCN(data[i])) { //是中文
length += 2;
} else {
length += 1;
}
}
return length;
},

//混杂
hexStringToBuff(str) { //str=‘中国:WXHSH’
const buffer = new ArrayBuffer((this.sumStrLength(str)) + 1);
const dataView = new DataView(buffer)
var data = str.toString();
var p = 0; //ArrayBuffer 偏移量
for (var i = 0; i < data.length; i++) {
if (this.isCN(data[i])) { //是中文
//调用GBK 转码
var t = gbk.$URL.encode(data[i]);
for (var j = 0; j < 2; j++) {
var temp = parseInt(t[j * 2] + t[j * 2 + 1], 16)
dataView.setUint8(p++, temp)
}
} else {
var temp = parseInt(data.charCodeAt(i).toString(16), 16)
dataView.setUint8(p++, temp)
}
}
console.log(String.fromCharCode.apply(null, new Uint8Array(buffer)));
return buffer;
},

//js正则验证中文
isCN(str) {
if (/[1]+$/.test(str)) {
return true;
} else {
return false;
}
},
将中文转化为GB2312编码格式再转成arrayBuffer就大功告成啦,把这个文章记录下来,希望可以帮助到其他小程程们。如有需要,加我Q:786914253


  1. \u3220-\uFA29 ↩︎

点赞 8
收藏
评论

4 个评论

  • 明天
    明天
    2023-05-31

    {"errno":1500103,"errCode":10004,"errMsg":"writeBLECharacteristicValue:fail:no service"}

    2023-05-31
    赞同
    回复
  • 明天
    明天
    2023-05-31

    gbk.$URL.encode 这个代码可以分享出来吗?

    2023-05-31
    赞同
    回复
  • 飞鸿先森          ༽
    飞鸿先森 ༽
    2019-09-18

    我的小程序蓝牙打印没反应什么情况,

    wx.writeBLECharacteristicValue(Object object)

    都返回OK了的,但是打印机没反应,求解答

    2019-09-18
    赞同
    回复 11
    • 陈
      2019-10-18
      你好,我目前的问题和你一样,请问你解决了吗?可以分享一下心得吗?
      2019-10-18
      回复
    • 飞鸿先森          ༽
      飞鸿先森 ༽
      2019-10-19回复
      我的目前已解决,根本原因是,发送的数据包问题,我之前就发送的几个数字,这样是不行的,打印机有自己的打印代码,比如换行是什么编码,字体加粗是什么编码,执行打印是什么编码,我用的打印机是ESC/POS指令,所以找了对应的指令集,完成了打印功能,最大的成功,是参照了下面这个项目,完美执行(我用的打印机是佳博打印机)
      参照项目地址:https://github.com/benioZhang/miniprogram-bluetoothprinter
      希望能帮你解决
      2019-10-19
      1
      回复
    • 陈
      2019-10-21回复飞鸿先森 ༽
      非常感谢,我去试一下看看行不行
      2019-10-21
      回复
    • 笑剑钝
      笑剑钝
      2020-05-25回复
      问下你好了吗,我现在还是写出返回ok,但是打印机没反应...
      2020-05-25
      回复
    • 陈
      2020-05-25回复笑剑钝
      没有,我找了客服要代码
      2020-05-25
      回复
    查看更多(6)
  • 岳云科技-马旭东,小程序服务商
    岳云科技-马旭东,小程序服务商
    2019-03-21

    辛苦了。

    2019-03-21
    赞同
    回复
登录 后发表内容