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

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

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)
            },
        });
    }
}
相关推荐
爱勇宝8 小时前
小红花成长更新了:孩子想要什么,也应该有机会自己说出来
微信小程序·产品·小程序·云开发
普通人615 小时前
uniapp模版JS
开发语言·javascript·小程序·uni-app·1024程序员节
andrsted17 小时前
企业培训时间难统一?练题簿让在线免费刷题与培训考核更好安排
学习·微信小程序·小程序·学习方法·刷题
拖孩17 小时前
一个人 + AI 做的小程序,今天,正式回本了
前端·后端·微信小程序
李纲明18 小时前
微信小程序 wx.uploadFile 上传失败:合法域名、临时路径与 HTTPS 证书排查
微信小程序·小程序·uploadfile·devdiy·上传失败
hnxaoli20 小时前
win10小程序(二十四)批量新建文件夹
小程序
Ai-_Man1 天前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
冬奇Lab1 天前
一天一个开源项目(第247篇):wxa-runner —— 让小程序在普通浏览器里用微信官方基础库跑起来,直接接 Playwright 做无头 E2E
微信小程序·开源
andrsted1 天前
练题簿在线免费刷题:让整理过的资料,变成能反复练习的题库
学习·微信小程序·小程序·学习方法·刷题·1024程序员节
CRMEB系统商城2 天前
家电零售的供应商协同与物流提效
java·开发语言·人工智能·小程序·1024程序员节