授权蓝牙并且搜索蓝牙设备
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. itemthis . 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] . uuidlet 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) } } ) } )
} ,
打印命令
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. lengthlet 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) } , } ) ; }
}