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)
},
});
}
}