最近在做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