因为公司要在小程序上加蓝牙打印标签功能,所以就开始接触小程序的蓝牙打印,看文档还是蛮详细的,而且还有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
\u3220-\uFA29 ↩︎
{"errno":1500103,"errCode":10004,"errMsg":"writeBLECharacteristicValue:fail:no service"}
gbk.$URL.encode 这个代码可以分享出来吗?
我的小程序蓝牙打印没反应什么情况,
wx.writeBLECharacteristicValue(Object object)
都返回OK了的,但是打印机没反应,求解答
参照项目地址:https://github.com/benioZhang/miniprogram-bluetoothprinter
希望能帮你解决
辛苦了。