资讯详情

微信小程序连接蓝牙打印小票

001:格式

<script>  const LAST_CONNECTED_DEVICE = 'last_connected_device'  import PrinterJobs from '../../common/printer/printerjobs'  import printerUtil from '../../common/printer/printerutil'   function inArray(arr, key, val) {   for (let i = 0; i < arr.length; i  ) {    if (arr[i][key] === val) {     return i    }   }   return -1  }   // ArrayBuffer转16进度字符串示例  function ab2hex(buffer) {   const hexArr = Array.prototype.map.call(    new Uint8Array(buffer),    function(bit) {     return ('00'   bit.toString(16)).slice(-2)    }   )   return hexArr.join(',')  }   function str2ab(str) {   // Convert str to ArrayBuff and write to printer   let buffer = new ArrayBuffer(str.length)   let dataView = new DataView(buffer)   for (let i = 0; i < str.length; i  ) {    dataView.setUint8(i, str.charAt(i).charCodeAt(0))   }   return buffer;  }  export default {   data() {    return {                 devices: [],             }         },         onLoad(e) {    const lastDevice = uni.getStorageSync(LAST_CONNECTED_DEVICE);    this.lastDevice = lastDevice    // 初始化蓝牙    this.openBluetoothAdapter()   },     }  </script>

蓝牙的初始化

// 蓝牙模块的初始化    openBluetoothAdapter() {     if (!uni.openBluetoothAdapter) {      uni.showModal({       title: this.$t('wechat.w102'), /提示,       content: this.$t('wechat.w226') //目前微信版本太低,如果您不能使用此功能,请在升级到最新的微信版本后重试。'      })      return     }     uni.openBluetoothAdapter({      success: (res) => {       console.log('openBluetoothAdapter success', res)       // 搜索附近的蓝牙       this.startBluetoothDevicesDiscovery()      },      fail: (res) => {       console.log('openBluetoothAdapter fail', res)       if (res.errCode === 10001) {        uni.showModal({         title: this.$t('wechat.w227'), //错误         content: this.$t('wechat.w228'), 没有找到蓝牙设备, 打开蓝牙后请重试。',         showCancel: false        })        // 监控蓝牙适配器状态变化        uni.onBluetoothAdapterStateChange((res) => {         console.log('onBluetoothAdapterStateChange', res)         // available:蓝牙适配器是否可用         if (res.available) {          // 取消监听,否则stopBluetoothDevicesDiscovery之后还会继续触发onBluetoothAdapterStateChange,          // 导致再次调用startBluetoothDevicesDiscovery          uni.onBluetoothAdapterStateChange(() => {});          // 开始搜索附近的蓝牙外围设备          this.startBluetoothDevicesDiscovery()         }        })       }      }     })     uni.onBLEConnectionStateChange((res) => {      // 该方法可用于处理连接意外断开等异常情况      console.log('onBLEConnectionStateChange',       `device ${res.deviceId} state has changed, connected: ${res.connected}`)      this.connected = res.connected      if (!res.connected) {       uni.showModal({        title: this.$t('wechat.w227'), //错误        content: this.$t('wechat.w229'), //蓝牙连接已断开        showCancel: false       })      }     });    },

2.搜索附近的蓝牙设备

// 开始搜索附近的蓝牙外围设备    startBluetoothDevicesDiscovery() {     if (this._discoveryStarted) {      return     }     this._discoveryStarted = true     uni.startBluetoothDevicesDiscovery({      success: (res) => {       console.log('startBluetoothDevicesDiscovery success111', res)       // 监控寻找新设备的事件       this.onBluetoothDeviceFound()      },      fail: (res) => {       console.log('startBluetoothDevicesDiscovery fail', res)      }     })    },

3.监控寻找新设备的事件

// 监控寻找新设备的事件    onBluetoothDeviceFound() {     uni.onBluetoothDeviceFound((res) => {      console.log( res)      res.devices.forEach(device => {       if (!device.name && !device.localName) {        return       }       const foundDevices = this.devices       const idx = inArray(foundDevices, 'deviceId', device.deviceId)       const data = {}       if (idx === -1) {        this.$set(this.devices, `${foundDevices.length}`, device)       } else {        this.$set(this.devices, `${idx}`, device)       }       // console.log(this.devices)      })     })    },

点击连接蓝牙

// 点击链接蓝牙    createBLEConnection(e) {     console.log(点击连接蓝牙, e)     const deviceId = e.deviceId     const name = e.name     this._createBLEConnection(deviceId, name)    }, // 连接蓝牙设备    _createBLEConnection(deviceId, name) {     this.$myToast(this.$t('wechat.w224'), 'loading') ///连接设备     // 连接低功耗蓝牙设备     uni.createBLEConnection({      deviceId, // 用于区分设备 id      success: () => {       console.log('createBLEConnection success', this.devices);       this.devices.forEach((item, index) => {        this.$set(this.devices[index], 'isShowConnect', false)        if (item.deviceId == deviceId) {         this.$set(this.devices[index], 'isShowConnect', true)        }       })       this$myToast(this.$t('wechat.w225'), 'success') //设备连接成功
						this.connected = true
						this.isConnected = false
						this.name = name
						this.deviceId = deviceId

						//延迟1.5s获取设备的services
						setTimeout(() => {
							// 获取蓝牙设备所有服务(service)
							this.getBLEDeviceServices(deviceId)
						}, 3000);

						// 最后连接设备
						uni.setStorage({
							key: LAST_CONNECTED_DEVICE,
							data: name + ':' + deviceId
						})
					},
					complete() {
						uni.hideLoading()
					},
					fail: (res) => {
						// 连接蓝牙接口调用失败
						console.log('createBLEConnection fail', res)
					}
				})
				// 已经找到需要的蓝牙设备,停止搜寻附近的蓝牙外围设备
				this.stopBluetoothDevicesDiscovery()
			},
// 已经找到需要的蓝牙设备,停止搜寻附近的蓝牙外围设备
            stopBluetoothDevicesDiscovery() {
				    uni.stopBluetoothDevicesDiscovery({
					    complete: () => {
						    // console.log('stopBluetoothDevicesDiscovery')
						    this._discoveryStarted = false
					    }
				    })
			},

5.获取蓝牙设备所有服务

// 获取蓝牙设备所有服务(service)
			getBLEDeviceServices(deviceId) {
				uni.getBLEDeviceServices({
					deviceId,
					success: (res) => {
						console.log('获取蓝牙设备所有服务getBLEDeviceServices', res)
						for (let i = 0; i < res.services.length; i++) {

							// #ifdef MP-WEIXIN				
    						if (res.services[i].isPrimary) {                                       
                                this.getBLEDeviceCharacteristics(deviceId,res.services[i].uuid)
								return
							}
							// #endif
							// #ifdef APP-PLUS
							if (res.services[i].uuid === '0000FF00-0000-1000-8000-00805F9B34FB') {
								console.log('App的服务序号', res.services[i].uuid)
								this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid)
								return
							}
							// #endif

						}
					}
				})
			},

6.获取特征值

/*
				获取蓝牙设备某个服务中所有特征值(characteristic)
				characteristic:
					uuid:蓝牙设备特征值的 uuid
					properties:该特征值支持的操作类型
			*/
			getBLEDeviceCharacteristics(deviceId, serviceId) {
				uni.getBLEDeviceCharacteristics({
					// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
					deviceId,
					// 这里的 serviceId(蓝牙服务 uuid) 需要在 getBLEDeviceServices 接口中获取
					serviceId,
					success: (res) => {
						console.log('特征值getBLEDeviceCharacteristics success', deviceId, serviceId, res, res
							.characteristics)
						// 这里会存在特征值是支持write,写入成功但是没有任何反应的情况
						// 只能一个个去试
						// characteristics:设备服务列表
						for (let i = 0; i < res.characteristics.length; i++) {
							const item = res.characteristics[i]
							if (item.properties.write) {
								this.canWrite = true
								this._deviceId = deviceId
								this._serviceId = serviceId
								this._characteristicId = item.uuid
								break;
							}
						}
					},
					fail(res) {
						console.error('getBLEDeviceCharacteristics', res)
					}
				})
			},

7.点击打印写入数据

// 点击打印:写入数据
			writeBLECharacteristicValue() {
				this.isLoading = true
				setTimeout(() => {
					this.isDisabled = false
					this.isLoading = false
				}, 3000)
				let printerJobs = new PrinterJobs();
				const {
					channels,
					header,
					dataList
				} = this.printInfo
				console.log('通道数据', dataList)
				let title = ''
				header.forEach(item => {
					title = `${item.name}  `
				})
				// 要打印的头部信息
				printerJobs
					.setAlign('ct')
					.setSize(2, 2)
					.print(this.$t('wechat.w221')) //'记录报告'
					.setSize(0, 0)
					.print()
					.setAlign('lt')
					.setSize(1, 1)
					.print(`${this.$t('wechat.w51')}:${this.info.name}`) //设备名称
					.print(`${this.$t('wechat.w76')}:${this.info.modelName}`) //设备型号
					.print(`${this.$t('wechat.w46')}:${this.info.deviceSerial}`) //序列号
					.print(`${this.$t('wechat.w100')}:${this.userInfo.relName}`) //用户名
					.print(`${this.$t('wechat.w101')}:${this.remark}`) //备注
				if (this.isEn) {
					channels.forEach(item => {
						printerJobs.print(`${item.name}(Max):${item.max}${item.unitIcon}`)
							.print(`${this.$t('wechat.w148')}:${this.$timestampToTimeEn(item.maxDate)}`) //时间
							.print(`${item.name}(Min):${item.min}${item.unitIcon}`)
							.print(`${this.$t('wechat.w148')}:${this.$timestampToTimeEn(item.minDate)}`) //时间
					})
				} else {
					channels.forEach(item => {
						printerJobs.print(`${item.name}(Max):${item.max}${item.unitIcon}`)
							.print(`${this.$t('wechat.w148')}:${this.$timestampToTime2(item.maxDate)}`) //时间
							.print(`${item.name}(Min):${item.min}${item.unitIcon}`)
							.print(`${this.$t('wechat.w148')}:${this.$timestampToTime2(item.minDate)}`) //时间
					})
				}

				printerJobs.print(printerUtil.fillLine())
					.setSize(1, 1)
				let titleStr = ''
				header.forEach((item, index) => {
					titleStr = titleStr + `${index==0?'':'    '}` + `${item.name}`
				})
				printerJobs.print(printerUtil.inline(this.$t('wechat.w222'),
					`${titleStr}`)) //记录时间

				// 打印'----------------'
				printerJobs.print(printerUtil.fillLine())
				// 要打印的内容
				dataList.forEach(item => {
					let str = ''
					header.forEach((item2, index2) => {
						// 暂无
						str = str + `${index2==0?'':'  '}` +
							`${item[item2.columnName]?item[item2.columnName].toFixed(2):this.$t('wechat.w71empty')}`
					})
					if (this.isEn) {
						printerJobs.print(printerUtil.inline(`${this.$timestampToTimeEn2(item.dataTime)}`,
							`${str}`))
					} else {
						printerJobs.print(printerUtil.inline(`${this.$timestampToTime3(item.dataTime)}`,
							`${str}`))
					}
					// console.log(`${item.dataTime}`, str);
				})
				// 结尾
				printerJobs.println()
					.print(`${this.$t('wechat.w223')}:`) //'签名
					.println()
					.println()


				let buffer = printerJobs.buffer();
				// console.log('ArrayBuffer', 'length: ' + buffer.byteLength, ' hex: ' + ab2hex(buffer));
				// 1.并行调用多次会存在写失败的可能性
				// 2.建议每次写入不超过20字节
				// 分包处理,延时调用
				const maxChunk = 20;
				const delay = 40;
				for (let i = 0, j = 0, length = buffer.byteLength; i < length; i += maxChunk, j++) {
					let subPackage = buffer.slice(i, i + maxChunk <= length ? (i + maxChunk) : length);
					// subPackage:参数
					setTimeout(this._writeBLECharacteristicValue, j * delay, subPackage);
				}
			},
			// 向低功耗蓝牙设备特征值中写入二进制数据。注意:必须设备的特征值支持 write 才可以成功调用。
			_writeBLECharacteristicValue(buffer) {
				uni.writeBLECharacteristicValue({
					deviceId: this._deviceId, // 蓝牙设备 id
					serviceId: this._serviceId, // 蓝牙特征值对应服务的 uuid
					characteristicId: this._characteristicId, // 蓝牙特征值的 uuid
					value: buffer, // 蓝牙设备特征值对应的二进制值
					success(res) {
						console.log('writeBLECharacteristicValue success', res)
					},
					fail(res) {
						console.log('writeBLECharacteristicValue fail', res)
					}
				})
			},

8.离开关闭蓝牙

//关闭蓝牙
        onUnload() {
			this.closeBluetoothAdapter()
		},

        closeBluetoothAdapter() {
				uni.closeBluetoothAdapter()
				this._discoveryStarted = false
		},

标签: 二极管tv02w101b

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司