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

  • A+
所属分类:Web前端
摘要

最近在做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" + "rn" + "GAR-SENSE" + "rn" + barcodeText +     "BARCODE " + 128 + " " + 1 + " " + 1 + " " + 125 + " " + 125 + " " + 0 + " " +      content + "rn" +          "TEXT " + " " + 12 + " " + 0 + " " + 125 + " " + 180 + " " + text1 + "rn" +          "TEXT " + " " + 12 + " " + 2 + " " + 125 + " " + 210 + " " + text2 + "rn" +          "TEXT " + " " + 12 + " " + 2 + " " + 125 + " " + 240 + " " + text3 + "rn" +          "TEXT " + " " + 12 + " " + 2 + " " + 125 + " " + 270 + " " + text4 + "rn" +          "FORM" + "rn" ;          jpPrinter.addCommand(data) };

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