小程序蓝牙打印

做小程序连接蓝牙打印机一块,最后打印这块网上找了很多都没碰到我遇到的问题。可能是大家都没遇到过吧hhh,主要遇到以下几个问题。

  1. 蓝牙打印中文乱码
  2. 不能一次传输完所有包,比如说一行“123456789” 部分机型能够全部传输完成,而有的机型传到“7”就不会传,打印出来的结果就是“1234567”,不能完全打印完整
  3. 蓝牙不能打印,调用API成功无报错

第一个问题的答案,经过我查找相关资料,以及询问蓝牙厂商那边主要是由于编码问题。我这边蓝牙打印机仅支持GB2312编码,以下上代码。

//混杂
function hexStringToBuff(str){ //str='中国:WXHSH'
  const buffer = new ArrayBuffer((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 (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)
    }
  }
  return buffer;
}


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

//js正则验证中文
function isCN(str){
  if (/^[\u3220-\uFA29]+$/.test(str)) {
    return true;
  } else {
    return false;
  }
}

//汉字转码
function hexStringToArrayBuffer(str){
  const buffer = new ArrayBuffer((str.length / 2) + 1)
  const dataView = new DataView(buffer)
  for (var i = 0; i < str.length / 2; i++) {
    var temp = parseInt(str[i * 2] + str[i * 2 + 1], 16)
    dataView.setUint8(i, temp)
  }
  dataView.setUint8((str.length / 2), 0x0a)
  return buffer;
}

//返回八位数组
function subString(str) {
  var arr = [];
  if (str.length > 8) { //大于8
    for (var i = 0; (i * 8) < str.length; i++) {
      var temp = str.substring(i * 8, 8 * i + 8);
      arr.push(temp)
    }
    return arr;
  }else{
    return str
  }
}

//不带有汉字
function hexStringToArrayBufferstr(str){
  let val = ""
  for (let i = 0; i < str.length; i++) {
    if (val === '') {
      val = str.charCodeAt(i).toString(16)
    } else {
      val += ',' + str.charCodeAt(i).toString(16)
    }
  }
  val += "," + "0x0a";
  console.log(val)
  // 将16进制转化为ArrayBuffer
  return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) {
    return parseInt(h, 16)
  })).buffer
}

第一个方法混杂解决问题,有个主意的地方冒号为英文状态下的冒号。否则将会解析成中文状态就不在某个编码的行列,会造成乱码。第一个方法主要的构造是逐字符解析,中文就调用GBK方法,转成GBK然后转十六进制放进arraybuffer,否则不进行处理直接转十六进制然后放进arraybuffer。第二个第三个都是我中途实验的方法也采用了网上的一些,对于某些打印机可以直接调用第三个方法。

 

第二个问题是在解决第一个问题后,测试的时候不同的机型出现的。按照我们嵌入式开发工程师这边说的,机型传输包的长度不一致,就回导致传输不完整造成。

//开始打印数据  data  需要打印的数据
function send(data,callback){
  var arr = subString(data);
  for(var j=0;j<arr.length;j++){
    wx.writeBLECharacteristicValue({
      deviceId: deviceid,
      serviceId: services[1].uuid,
      characteristicId: characteristics[3].uuid,
      value: hexStringToBuff(arr[j]),
      success: function (res) {
        console.log('发送成功')
        console.log(res)
        callback && callback.call(this, true);
      },
      fail: function (res) {
        console.log("发送失败");
        console.log(res)
        callback && callback.call(this, false);
      }
    })
    if (j == arr.length-1){
      //发送0x0a
      wx.writeBLECharacteristicValue({
        deviceId: deviceid,
        serviceId: services[1].uuid,
        characteristicId: characteristics[3].uuid,
        value: send0X0A(),
        success: function (res) {
          console.log('发送成功')
          console.log(res)
          callback && callback.call(this, true);
        },
        fail: function (res) {
          console.log("发送失败");
          console.log(res)
          callback && callback.call(this, false);
        }
      })
    }
  }
}

function send0X0A(){
  const buffer = new ArrayBuffer(1)
  const dataView = new DataView(buffer)
  dataView.setUint8(0,0x0a)
  return buffer;
}

在发送数据的时候,八个字符为一次发送。发送完成之后,最后调用了一次发送“0X0A”的方法。

第三个问题在最开始就遇到了,小程序给我的回调是成功了的,但是蓝牙打印机没有任何打印。最后询问嵌入式开发同事,告诉我加上0x0a就会打印。实际上数据已经发送出去,只是没有打印。0x0a换行,具体缘由不了解 略过略过略过...会用就行

 

以上特别感谢我公司嵌入式开发同事的帮助。

如果有其他朋友正好碰到以上问题,希望能够帮到你们。

蓝牙连接打印机等以上代码就不上了,网上有很多例子~

gbk转码文件附上,但是有个问题就是必须要分。这个我控制不了~我想免费的没办法

https://download.csdn.net/download/qq_36479244/11146541

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页