2020年12月9日星期三

uni-app开发经验分享十五: uni-app 蓝牙打印功能

最近在做uni-app项目时,遇到了需要蓝牙打印文件的功能需要制作,在网上找到了一个教程,这里分享给大家。

引入tsc.js

简单得引入到自己所需要得页面中去,本次我们只要到了标签模式,他同时还有账单模式可以选择。

 // 蓝牙打印 指令和转码 var tsc = require('@components/gprint/tsc.js')

蓝牙适配前期工作

首先我们需要先初始化蓝牙模块,在进行搜索蓝牙。在监听到附近蓝牙设备时,记录他的名称和deviceId。

onBlue(e) { uni.openBluetoothAdapter({ success(res) {  //监听寻找到新设备的事件  that.findDevice()  //监听本机蓝牙适配器状态变化事件  that.onStatus() } })

findDevice(){ console.log("监听寻找到新设备的事件---------------") //监听寻找到新设备的事件 uni.onBluetoothDeviceFound(function(devices) { const {name,deviceId} = devices[0]; if(name == "未知设备")return; if(!name || !name.length){  that.devices.push({  name: name,  deviceId: deviceId,  services: []  }) } that.devices.forEach(e=>{  if(that.devicesList){  let b = true;  that.devicesList.forEach(e1=>{   if(e.name == e1.name){   b = false;   }  });  if(b)that.devicesList.push(e);  }else{  that.devicesList.push(e);  } }); }}

onStatus(){ uni.getBluetoothAdapterState({ success: function(res) {  //本机蓝牙开启时  if (res.available) {  //如在正在搜索设备,则停止搜索  if (res.discovering) {   uni.stopBluetoothDevicesDiscovery()  }  //搜索蓝牙  //开始搜寻附近的蓝牙外围设备  uni.startBluetoothDevicesDiscovery()  } else {  console.log('本机蓝牙不可用')  } }, })}

连接蓝牙

搜索出附近蓝牙设备后,获取蓝牙设备的deviceId传入createBLEConnection方法中。在连接蓝牙设备时,我们需要注意的是保证尽量成对的调用 createBLEConnection 和 closeBLEConnection 接口。安卓如果多次调用 createBLEConnection 创建连接,有可能导致系统持有同一设备多个连接的实例,导致调用 closeBLEConnection 的时候并不能真正的断开与设备的连接。
我们将连接成功的蓝牙信息存到currDev中,以便直接连接,无需进行搜索操作。

onLink(item){ const {deviceId} = item; console.log("连接蓝牙---------------" + deviceId); //连接低功耗蓝牙设备。 uni.createBLEConnection({ deviceId: deviceId, complete(res) {  if (res.errMsg != "createBLEConnection:ok") return  //连接设备时,需断开本机连接设备  uni.closeBLEConnection({  deviceId  })  that.connId = deviceId;  that.currDev = item  setTimeout(()=> {  //获取蓝牙设备所有服务(service)  that.getBLEServices(deviceId)  }, 2000) } //连接成功 关闭搜索 uni.stopBluetoothDevicesDiscovery() })}

getBLEServices(deviceId) { uni.getBLEDeviceServices({ // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 deviceId: deviceId, complete(res) {  const {services} = res;  services.forEach(item=>{  const {uuid} = item;  uni.getBLEDeviceCharacteristics({   // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接   deviceId: deviceId,   // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取   serviceId: uuid,   success(res) {    const {characteristics} = res;   for(let block of characteristics){    if(!block.properties.write)return    for (let index in that.devices) {    if (that.devices[index].deviceId == deviceId) {     that.devices[index].services.push({     serviceId: uuid,     characteristicId: block.uuid,     })     break    }    }   }   uni.setStorage({    key: 'currDev',    data: that.devices,   });   }  })  }) } })} 

打印

打印格式需要自己根据当前设备的格式来进行设置打印。本章用到的是tsc.js中的form格式。

onPrint(){ if(this.currDev.length == 0){ uni.showToast({  title: '请先连接蓝牙打印机',  duration: 2000 }); return } //标签模式 const {deviceId} = this.currDev; const {serviceId,characteristicId} = this.currDev.services[0]; var command = tsc.jpPrinter.createNew(); //DaYin这个字段存放我们需要打印的数据 let DaYin = JSON.parse(JSON.stringify(this.rowsList)); let Customer = JSON.stringify(this.Customer); //打印格式需要根据打印机的特定格式来。在tsc文件中修改格式。 DaYin.forEach(e=>{ command.form(e.ReceSheetNo,`客 户:${Customer}`,`匹 数:${e.Rolls}`,`坯布品名:${e.GrayID}`,`进仓编号:${e.LotNo}`,`坯布类型:${e.GrayTypeName}`) command.setPagePrint() }) //转码处理 this.senBlData(deviceId, serviceId, characteristicId,command.getData())}

senBlData(deviceId, serviceId, characteristicId,uint8Array) { let uint8Buf = Array.from(uint8Array); function split_array(datas,size){ let result = {}; let j = 0 for (var i = 0; i < datas.length; i += size) {  result[j] = datas.slice(i, i + size)  j++ } return result } let sendloop = split_array(uint8Buf, 20); function realWriteData(sendloop, i) { let data = sendloop[i] if(typeof(data) == "undefined"){  return } let buffer = new ArrayBuffer(data.length) let dataView = new DataView(buffer) uni.writeBLECharacteristicValue({  deviceId,  serviceId,  characteristicId,  value: buffer,  success(res) {  realWriteData(sendloop, i + 1);  } }) } let i = 0; realWriteData(sendloop, i);},

form条码格式

// 条形码和文字合成打印jpPrinter.form = function (content,text1,text2,text3,text4) { data = header + "LEFT" + "\r\n" + "GAR-SENSE" + "\r\n" + barcodeText + "BARCODE " + 128 + " " + 1 + " " + 1 + " " + 125 + " " + 125 + " " + 0 + " " +  content + "\r\n" +   "TEXT " + " " + 12 + " " + 0 + " " + 125 + " " + 180 + " " + text1 + "\r\n" +   "TEXT " + " " + 12 + " " + 2 + " " + 125 + " " + 210 + " " + text2 + "\r\n" +   "TEXT " + " " + 12 + " " + 2 + " " + 125 + " " + 240 + " " + text3 + "\r\n" +   "TEXT " + " " + 12 + " " + 2 + " " + 125 + " " + 270 + " " + text4 + "\r\n" +   "FORM" + "\r\n" ;   jpPrinter.addCommand(data)};

转载于:https://blog.csdn.net/zhanleibo/article/details/103035645









原文转载:http://www.shaoqun.com/a/497404.html

一淘网比价平台:https://www.ikjzd.com/w/1698

easybuy:https://www.ikjzd.com/w/2162

gtin:https://www.ikjzd.com/w/136


最近在做uni-app项目时,遇到了需要蓝牙打印文件的功能需要制作,在网上找到了一个教程,这里分享给大家。引入tsc.js简单得引入到自己所需要得页面中去,本次我们只要到了标签模式,他同时还有账单模式可以选择。//蓝牙打印指令和转码vartsc=require('@components/gprint/tsc.js')蓝牙适配前期工作首先我们需要先初始化蓝牙模块,在进行搜索蓝牙。在监
feedly:feedly
trax:trax
关于亚马逊沙特站不得不知的Q&A:关于亚马逊沙特站不得不知的Q&A
美国商务部对华为解禁!但提出了一个前提:美国商务部对华为解禁!但提出了一个前提
深度分析:东南亚跨境电商面临哪些机遇和挑战?:深度分析:东南亚跨境电商面临哪些机遇和挑战?

没有评论:

发表评论