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

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

// 授权定位和蓝牙
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('断开连接失败')
    })
},

连接断开方法

// 连接蓝牙
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)
            }
        })
    })
},

打印命令

// 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
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值