微信小程序连接标签打印机,打印标签

授权蓝牙并且搜索蓝牙设备

javascript 复制代码
// 授权定位和蓝牙
authorizationBluetooth() {
    wx.getSetting({
        success: (res) => {
            if (res.authSetting.hasOwnProperty('scope.bluetooth')) {
                if (!res.authSetting['scope.bluetooth']) {
                    this.setData({
                        showManual: true
                    })
                } else {
                    this.bluetoothState()
                }
            } else {
                wx.authorize({
                    scope: 'scope.bluetooth',
                    success: () => {
                        // 用户已经同意小程序使用手机蓝牙功能,后续调用 蓝牙 接口不会弹窗询问
                        this.bluetoothState()
                    },
                    fail: () => {
                        Toast('你已拒绝开启蓝牙功能')
                    }
                })
            }
        }
    })
},
// 第一步,蓝牙初始化
bluetoothState() {
    wx.openBluetoothAdapter({
        mode: 'central',
        success: (res) => {
            console.log('第一步,蓝牙初始化成功', res)
            this.startBluetoothDevicesDiscovery()
        },
        fail: (err) => {
            console.log('蓝牙设备错误', err)
            if (err.errCode == 10001) {
                wx.onBluetoothAdapterStateChange((ress) => {
                    if (ress.available) {
                        this.startBluetoothDevicesDiscovery()
                    } else {
                        Toast('蓝牙设备不可用')
                    }
                })
            } else {
                Toast('蓝牙设备不可用')
            }
        }
    })
},
// 第二步 开始搜索附近的蓝牙设备
startBluetoothDevicesDiscovery() {
    wx.startBluetoothDevicesDiscovery({
        allowDuplicatesKey: false,
        success: (res) => {
            this.onBluetoothDeviceFound()
        },
    })
},
// 第三步 监听发现附近的蓝牙设备
onBluetoothDeviceFound() {
    wx.showLoading({
        title: '重新搜索中',
        mask: true
    })
    wx.onBluetoothDeviceFound(() => {
        wx.getBluetoothDevices({
            success: res => {
                let deviceList = []
                if (res.devices.length > 0) {
                    res.devices.forEach(v => {
                        if (v.RSSI < 0 && v.name != '未知设备') {
                            deviceList.push(v)
                        }
                    })
                }
                wx.hideLoading()
                this.setData({
                    deviceList
                })
            }
        })
    })
},


// 第四步、 建立连接
connectDevice(e) {
    const item = e.currentTarget.dataset.item
    this.setData({
        linkShow: true,
        activeItem: item
    }, () => {
        app.linkBluetooth(item.deviceId).then(res => {
            console.log('蓝牙连接成功', res)
            Toast('蓝牙连接成功')
            // 更新连接历史记录
            this.updateHisList(this.data.activeItem)
            this.setlinkDeviceId(this.data.activeItem.deviceId)
            this.setData({
                linkShow: false
            })
        }).catch(err => {
            console.log(err.message, err)
            Toast(err.message)
            this.closeBLEConnection(item.deviceId)
            this.setData({
                linkShow: false,
            })
        })
    })
},
// 断开蓝牙连接
closeBLEConnection(deviceId, tip) {
    app.closeBluetooth(deviceId).then(res => {
        this.setlinkDeviceId('')
        if (tip) {
            Toast(tip)
        }
    }).catch(err => {
        Toast('断开连接失败')
    })
},

连接断开方法

javascript 复制代码
// 连接蓝牙
linkBluetooth(deviceId) {
    return new Promise((resolve, reject) => {
        wx.createBLEConnection({
            deviceId: deviceId,
            success: (res) => {
                setTimeout(() => {
                    wx.getBLEDeviceServices({
                        deviceId: deviceId,
                        success: (res) => {
                            for (let i = 0; i < res.services.length; i++) {
                            if (res.services[i].isPrimary) {
                                    let serviceId = res.services[i].uuid
                                    let Iswrite = false
                                    wx.getBLEDeviceCharacteristics({
                                        deviceId,
                                        serviceId,
                                        success: (res) => {
                                            let characteristicId = ''
                                            for (let i = 0; i < res.characteristics.length; i++) {
                                                let item = res.characteristics[i]
                                                //支持写入就行了
                                                if (item.properties.write) {
                                                    Iswrite = true
                                                    characteristicId = item.uuid
                                                }
                                            }
                                            if (Iswrite) {
                                                wx.setStorageSync('linkDeviceId', deviceId)
                                                wx.setStorageSync('serviceId', serviceId)
                                                wx.setStorageSync('characteristicId', characteristicId)
                                                resolve({
                                                    message: '蓝牙连接成功'
                                                })
                                            } else {
                                                reject({
                                                    message: '蓝牙服务不支持此功能,已断开'
                                                })
                                            }
                                        },
                                        fail(err) {
                                            reject({
                                                message: '获取蓝牙低功耗设备某个服务中所有特征失败',
                                                err
                                            })
                                        }
                                    })
                                    return
                                }
                            }
                        },
                        fail(err) {
                            reject({
                                message: '获取蓝牙低功耗设备所有服务失败',
                                err
                            })
                        }
                    })
                }, 3000)
            },
            fail: (err) => {
                reject({
                    message: '蓝牙连接失败',
                    err
                })
            }
        })
    })
},
// 断开蓝牙连接
closeBluetooth(deviceId) {
    return new Promise((resolve, reject) => {
        wx.closeBLEConnection({
            deviceId: deviceId,
            success: res => {
                wx.removeStorageSync('linkDeviceId')
                wx.removeStorageSync('serviceId')
                wx.removeStorageSync('characteristicId')
                resolve(res)
            },
            fail: err => {
                wx.removeStorageSync('linkDeviceId')
                wx.removeStorageSync('serviceId')
                wx.removeStorageSync('characteristicId')
                reject(err)
            }
        })
    })
},

打印命令

javascript 复制代码
// GBK的方法随便找一个就行
import GBK from './gbk.min.js';

// 打印商品标签
export const printGoodsTag = (option) => {
    if (!wx.getStorageSync('linkDeviceId')) {
        wx.showToast({
            title: '请连接打印机',
            icon: 'none',
            mask: true
        })
        return
    }
    let data =
        'SIZE 40 mm,30 mm\n' +
        'GAP 2 mm,0 mm\n' +
        'DIRECTION 1\n' +
        'CLS\n' +
        `TEXT 20,30,"0",0,1,1,"商品名称:${option.goodsName}"\n` +
        `TEXT 20,80,"0",0,1,1,"规格:${option.skuName || ''}"\n` +
        `QRCODE 20,130,M,3,M,0,M1,S2,"${option.id}_1"\n` +
        `TEXT 120,140,"0",0,1,1,"零售价"\n` +
        `TEXT 120,180,"0",0,1.5,1.5,"¥${option.price || ''}"\n` +
        'PRINT 1,1'
    sendDataToDevice(new Uint8Array([...GBK.encode(data), ...[10]]).buffer);
}
// 打印维修单标签
export const printRepairTag = (option) => {
    if (!wx.getStorageSync('linkDeviceId')) {
        wx.showToast({
            title: '请连接打印机',
            icon: 'none',
            mask: true
        })
        return
    }
    let data =
        'SIZE 40 mm,30 mm\n' +
        'GAP 2 mm,0 mm\n' +
        'DIRECTION 1\n' +
        'CLS\n' +
        `QRCODE 20,30,M,3,M,0,M1,S2,"${option.id}_2"\n` +
        `TEXT 110,30,"0",0,1,1,"${option.equModel || ''}"\n` +
        `TEXT 110,60,"0",0,1,1,"${option.okey || ''}"\n` +
        `TEXT 110,90,"0",0,1,1,"${option.imei || ''}"\n`
    let str = option.reason || ''
    if (str) {
        let length = str.length
        let maxNum = 12
        let top = 130
        for (let i = 0, len = length; i <= len; i += 12) {
            let text = str.slice(i, maxNum)
            data = data + `TEXT 20,${top},"0",0,1,1,"${text}"\n`
            maxNum += 12
            top += 30
        }
    }
    data = data + 'PRINT 1,1'
    sendDataToDevice(new Uint8Array([...GBK.encode(data), ...[10]]).buffer);
}

const sendDataToDevice = value => {
    let byteLength = value.byteLength;
    const speed = 20;
    if (byteLength > 0) {
        wx.writeBLECharacteristicValue({
            deviceId: wx.getStorageSync('linkDeviceId'),
            characteristicId: wx.getStorageSync('characteristicId'),
            serviceId: wx.getStorageSync('serviceId'),
            value: value.slice(0, byteLength > speed ? speed : byteLength),
            success: res => {
                if (byteLength > speed) {
                    sendDataToDevice(value.slice(speed, byteLength));
                } else {
                    console.log('已完成打印   laster success', res);
                }
            },
            fail: err => {
                console.log(err)
            },
        });
    }
}
相关推荐
低代码布道师2 小时前
互联网医院18:前端进阶——CSS“父相子绝”打造专业级卡片交互
前端·css·低代码·小程序·云开发
说私域3 小时前
开源活动报名AI智能客服AI智能名片预约服务小程序在精神服务中的应用场景研究
人工智能·小程序
计算机毕设指导66 小时前
基于微信小程序的家政服务与互助平台【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·tomcat·maven
说私域8 小时前
开源悬赏活动报名AI智能名片链动2+1模式商城小程序的应用与价值
人工智能·微信·小程序·开源
计算机毕设指导69 小时前
基于微信小程序的个性化漫画阅读推荐系统【源码文末联系】
java·python·微信小程序·小程序·tomcat·maven·intellij-idea
百锦再9 小时前
开发抖音小程序组件大全概述
人工智能·python·ai·小程序·aigc·notepad++·自然语言
Lucky小黄人21 小时前
微信小程序开发常见报错
微信小程序·小程序
Stanford_11061 天前
【2026新年启程】学习之路,探索之路,技术之路,成长之路……都与你同行!!!
前端·c++·学习·微信小程序·排序算法·微信开放平台
初学者52131 天前
微信小程序调用录音没反应,本地开发测试却没问题,operateRecorderfail appid privacy api banned
微信小程序·小程序
微爱帮监所写信寄信1 天前
微爱帮监狱寄信写信小程序信件内容实时保存技术方案
java·服务器·开发语言·前端·小程序