import PrinterJobs from '@/static/js/print/printerjobs.js' import $config from '@/config/index.js' export default { print($store,context,pW,pH){ const _myBlue = $store.getters['print/getBlueInfo']; if (_myBlue) { return this.sendBlueToothData($store,context,_myBlue,pW,pH) } else { return new Promise((resolve)=>{ uni.navigateTo({ url: $config.path.bluetooth }); resolve() }) } }, sendBlueToothData($store,context,blueInfo,pW=570,pH=400){ return new Promise((resolve,reject)=>{ uni.showLoading({ title: '蓝牙数据传输中', mask:true }); /* 尺寸换算:1mm=8单位 label_set_page 参数:宽(最大576)、高 drawLine 参数:线宽、起始点x、起始点y、结束点x、结束点y drawText 参数:起始点x、起始点y、文字、字体大小、旋转角度、粗体(0否1是)、下划线、反白 字体大小:可选值 20/1/2/3/4/5/6/7 ,其他的时候默认为2 旋转角度:0-不选择/1-90度/2-180度/3-270度 drawQrCode 二维码,参数:起始点x、起始点y、二维码内容、旋转参数恒定为0、二维码宽度(2-15)、二维码纠错等级(0-20) drawBarCode 条形码,参数:起始点x、起始点y、条形码内容、条形码类型、旋转参数恒定为0、条码宽度(2~6)、条码高度(1~255) 条形码类型: 0:CODE39;1:CODE128;2:CODE93;3:CODEBAR;4:EAN8;5:EAN13;6:UPCA; 7:UPC-E; 8:ITF */ let printerJobs = new PrinterJobs(); printerJobs.label_set_page(pW, pH); context.forEach((contextItem)=>{ switch(contextItem.type) { case 'line': printerJobs.drawLine(contextItem.width,contextItem.x1,contextItem.y1,contextItem.x2,contextItem.y2); break; case 'text': printerJobs.drawText(contextItem.x,contextItem.y,contextItem.text,contextItem.size,contextItem.rotate,contextItem.bold,contextItem.underline,contextItem.reverse); break; case 'qr': printerJobs.drawQrCode(contextItem.x,contextItem.y,contextItem.text,0,contextItem.width,contextItem.level); break; case 'bar': printerJobs.drawBarCode(contextItem.x,contextItem.y,contextItem.text,contextItem.barType,0,contextItem.width,contextItem.height); break; default: break; } }) printerJobs.label_print(0, 1); let buffer = printerJobs.buffer(); this.bufferTransmission(buffer,$store,blueInfo).then((res)=>{ resolve(res) }).catch((err)=>{ reject(err) }) }) }, bufferTransmission(buffer,$store,blueInfo){ return new Promise((resolve,reject)=>{ if (blueInfo===undefined) blueInfo = $store.getters['print/getBlueInfo']; let deviceId = blueInfo.deviceId let serviceId = blueInfo.serviceId let characteristicId = blueInfo.characteristicId const maxChunk = 20; const delay = 15; let length = buffer.byteLength; let pakageLen = Math.trunc(length/maxChunk); if (length%maxChunk!==0) pakageLen=pakageLen+1; console.log(`共${length}字节,分${pakageLen}包`) //超时设置 const _timeOutNum = 30 * 1000; const _sendTimeOut = setTimeout(()=>{ let tMsg = `蓝牙数据传输超时,${_sendTimeOut/1000}秒内无响应!` uni.hideLoading(); this.researchConfirm(tMsg) reject(tMsg) },_timeOutNum) //判断传输顺序是否正确 const isRightTransferOrder = function(arr){ let __res = true; for (let _i=0;_i<(arr.length-1);_i++) { if (arr[_i]>=arr[_i+1]) { __res = false; break; } } return __res } let successArr = []; for (let i = 0, j = 0; i < length; i += maxChunk, j++) { let subPackage = buffer.slice(i, i + maxChunk <= length ? (i + maxChunk) : length); //_count = j; setTimeout(() => { console.log(`第${j+1}分包发送,开始字节${i}`) this._writeBLECharacteristicValue(deviceId, serviceId, characteristicId, subPackage,(f)=>{ console.log(`第${j+1}返回${f}`) if (f) { successArr.push(j+1) } // 最后1个包返回,则: if (j===pakageLen-1) { uni.hideLoading(); let successLen = successArr.length; let modalMsg = `蓝牙传输分${pakageLen}包,成功传输${successLen}个包` if (successLen) { modalMsg += `,依次为:${successArr.join(",")}。` } else { modalMsg += '。' } clearTimeout(_sendTimeOut) //成功发送的包数量与拆分包数量相等,且成功发送包的顺序正确,认为蓝牙传输正确 if (pakageLen !==0 && successLen===pakageLen && isRightTransferOrder(successArr)) { uni.hideLoading(); this.alert(modalMsg) resolve() } else { uni.hideLoading(); this.researchConfirm(modalMsg) reject(modalMsg) } } }) }, j * delay); } /* promise end */ }) }, _writeBLECharacteristicValue(deviceId, serviceId, characteristicId, buffer,callback){ uni.writeBLECharacteristicValue({ deviceId: deviceId, serviceId: serviceId, characteristicId: characteristicId, value: buffer, success(res) { callback && callback(true) }, fail(res) { callback && callback(false) } }) }, alert(msg){ uni.showModal({ title:'系统提示', content:msg, showCancel:false, confirmText:'确 定' }) }, researchConfirm(msg){ uni.showModal({ title:'系统提示', content:msg, cancelText:'取 消', confirmText:'重置蓝牙', success:(res)=>{ if (res.confirm) { uni.navigateTo({ url: $config.path.bluetooth + '?again=1' }); } } }) }, getBlueToothes(){ return new Promise((resolve,reject)=>{ uni.showLoading({ title: '启动蓝牙功能', mask:true }); uni.getSystemInfo({ success:function(resfirst){ if (resfirst.uniPlatform!=='web') { try{ uni.openBluetoothAdapter({ success:function(){ uni.showLoading({ title: '开始搜索蓝牙', mask:true }); uni.startBluetoothDevicesDiscovery({ success:function(){ uni.showLoading({ title: '搜索中...', mask:true }); let result = []; uni.onBluetoothDeviceFound(function(res){ if (res && res.devices && res.devices.length>0) { res.devices.forEach(function(item){ if (item.name) { let addFlag = true; for (let i=0;i{ uni.closeBluetoothAdapter({ complete:()=>{ this.getBlueToothes().then(res => { resolve(res) }).catch(err=>{ reject(err) }) } }) }) }, connect($store,id){ return new Promise(function(resolve,reject){ uni.showLoading({ title: '连接中...', mask:true }); uni.closeBLEConnection({ deviceId:id, complete:()=>{ uni.createBLEConnection({ deviceId:id, success:function(){ $store.commit('print/setDeviceId',id) uni.showLoading({ title: '获取蓝牙服务', mask:true }); setTimeout(function(){ uni.getBLEDeviceServices({ deviceId:id, success:function(res1){ let serviceId = ''; for (let i=0;i