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

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

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)
            },
        });
    }
}
相关推荐
说私域1 小时前
开源AI智能客服、AI智能名片与S2B2C商城小程序在营销运营中的应用与重要性研究
人工智能·小程序·开源
说私域1 小时前
开源AI智能名片链动2+1模式S2B2C商城小程序商业化路径优化研究
人工智能·小程序·开源
Y_3_77 小时前
微信小程序动态二维码外部实时展示系统
微信小程序·小程序·notepad++
weixin_1772972206921 小时前
旧物二手回收小程序:引领绿色消费,开启时尚生活新方式
小程序·盲盒
2501_916007471 天前
Fastlane 结合 开心上架(Appuploader)命令行实现跨平台上传发布 iOS App 的完整方案
android·ios·小程序·https·uni-app·iphone·webview
韩立学长1 天前
【开题答辩实录分享】以《植物病虫害在线答疑小程序的设计与实现》为例进行答辩实录分享
spring boot·小程序·vue
好想早点睡.1 天前
vue2+UniApp微信小程序集成高德地图
微信小程序·小程序·uni-app
李慕婉学姐1 天前
【开题答辩过程】以《基于微信小程序的线上讲座管理系统》为例,不会开题答辩的可以进来看看
javascript·mysql·微信小程序
2501_915918411 天前
iOS 上架应用市场全流程指南,App Store 审核机制、证书管理与跨平台免 Mac 上传发布方案(含开心上架实战)
android·macos·ios·小程序·uni-app·cocoa·iphone
Mr.Aholic1 天前
分享几个开源的系统,包括小程序、商城系统、二手交易等常见的系统、很容易进行二次开发 【可以参考学习】
微信小程序·小程序·毕业设计·课程设计