ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

uniapp 小程序连接蓝牙打印机打印条码

2021-06-17 09:32:28  阅读:562  来源: 互联网

标签:uniapp 打印机 code title list 蓝牙 let BLEInformation uni


搜索蓝牙 连接蓝牙 获取特征 存储特征

	import {
		mapState
	} from 'vuex';
	export default {
		data() {
			return {
				isSearching: false, //是否正在搜索中
				list: [],
				services: [],
				detail:"", // 货品详情
				serviceId: 0,
				writeCharacter: false,
				readCharacter: false,
				notifyCharacter: false
			};
		},
		computed: {...mapState(['sysinfo', 'Bluetooth'])},
		onLoad(option) {
			this.detail = option.data
		},
		onUnload() {
			//停止搜索蓝牙设备
			if (this.isSearching) {
				uni.stopBluetoothDevicesDiscovery();
			}
		},
		methods:{ 
			//错误码提示
			errorCodeTip(code) {
				if (code == 0) {
					//正常
				} else if (code == 10000) {
					uni.showToast({
						title: '未初始化蓝牙适配器',
						icon: 'none'
					})
				} else if (code == 10001) {
					uni.showToast({
						title: '当前蓝牙适配器不可用',
						icon: 'none'
					})
				} else if (code == 10002) {
					uni.showToast({
						title: '没有找到指定设备',
						icon: 'none'
					})
				} else if (code == 10003) {
					uni.showToast({
						title: '连接失败',
						icon: 'none'
					})
				} else if (code == 10004) {
					uni.showToast({
						title: '没有找到指定服务',
						icon: 'none'
					})
				} else if (code == 10005) {
					uni.showToast({
						title: '没有找到指定特征值',
						icon: 'none'
					})
				} else if (code == 10006) {
					uni.showToast({
						title: '当前连接已断开',
						icon: 'none'
					})
				} else if (code == 10007) {
					uni.showToast({
						title: '当前特征值不支持此操作',
						icon: 'none'
					})
				} else if (code == 10008) {
					uni.showToast({
						title: '其余所有系统上报的异常',
						icon: 'none'
					})
				} else if (code == 10009) {
					uni.showToast({
						title: 'Android 系统特有,系统版本低于 4.3 不支持 BLE',
						icon: 'none'
					})
				}
			},
			//开始搜索蓝牙
			handleStartSearch() {
				let that = this
				uni.openBluetoothAdapter({
					success(res) {
						uni.getBluetoothAdapterState({
							success(res2) {
								if (res2.available) {
									that.isSearching = true;
									if (res2.discovering) {
										uni.showToast({
											title: '正在搜索附近打印机设备',
											icon: "none"
										})
										return;
									}
			
									//获取蓝牙设备信息
									that.getBluetoothDevices()
			
									// that.checkPemission()
								} else {
									uni.showModal({
										title: '提示',
										content: '本机蓝牙不可用',
									})
								}
							}
						});
					},
					fail() {
						uni.showModal({
							title: '提示',
							content: '蓝牙初始化失败,请打开蓝牙',
						})
					}
				})
			},
			// 停止搜索
			handleStopSearch() {
				uni.stopBluetoothDevicesDiscovery({
					success: (res) => {
						this.isSearching = false;
					},
					fail: (e) => {
						this.errorCodeTip(e.errCode);
					}
				})
			},
			//获取蓝牙设备信息
			getBluetoothDevices() {
				let that = this
				that.list = [];
				uni.startBluetoothDevicesDiscovery({
					success(res) {
						//蓝牙设备监听 uni.onBluetoothDeviceFound
						uni.onBluetoothDeviceFound((result) => {
							let arr = that.list;
							let devices = [];
							let list = result.devices;
							for (let i = 0; i < list.length; ++i) {
								if (list[i].name && list[i].name != "未知设备") {
									let arrNew = arr.filter((item) => {
										return item.deviceId == list[i].deviceId;
									});
									if (arrNew.length == 0) {
										devices.push(list[i]);
									}
								}
							}
			
							that.list = arr.concat(devices);
						});
						that.time = setTimeout(() => {
							// uni.getBluetoothDevices
							uni.getBluetoothDevices({
								success(res2) {
									let devices = [];
									let list = res2.devices;
									for (let i = 0; i < list.length; ++i) {
										if (list[i].name && list[i].name != "未知设备") {
											devices.push(list[i]);
										}
									}
			
									that.list = devices;
								},
							})
							clearTimeout(that.time);
						}, 3000);
					}
				});
			},
			//绑定蓝牙
			bindViewTap(e) {
				let that = this;
				let {
					title
				} = e.currentTarget.dataset;
				let {
					BLEInformation
				} = that.Bluetooth;
				this.handleStopSearch();
				that.serviceId = 0;
				that.writeCharacter = false;
				that.readCharacter = false;
				that.notifyCharacter = false;
				uni.showLoading({
					title: '正在连接',
				})
				uni.createBLEConnection({
					deviceId: title,
					success(res) {
						BLEInformation.deviceId = title;
						that.$store.commit('BLEInformationSet', BLEInformation);
						uni.hideLoading()
						that.getSeviceId()
					},
					fail(e) {
						if (e.errCode === -1) {
							BLEInformation.deviceId = title;
							that.$store.commit('BLEInformationSet', BLEInformation);
							that.getSeviceId()
						}
						that.errorCodeTip(e.errCode);
						uni.hideLoading()
					}
				})
			},
			//获取蓝牙设备所有服务(service)。
			getSeviceId() {
				let that = this;
				let {
					BLEInformation
				} = that.Bluetooth;
				// uni.getBLEDeviceServices
				let t=setTimeout(()=>{
					uni.getBLEDeviceServices({
						deviceId: BLEInformation.deviceId,
						success(res) {
							that.services = res.services;
							that.getCharacteristics()
						},
						fail: function(e) {
							that.errorCodeTip(e.code);	
						}
					})
					clearTimeout(t);
				},1500)
			},
			getCharacteristics() {
				var that = this
				let {
					services: list,
					serviceId: num,
					writeCharacter: write,
					readCharacter: read,
					notifyCharacter: notify
				} = that;
				let {
					BLEInformation
				} = that.Bluetooth;
				// uni.getBLEDeviceCharacteristics
				uni.getBLEDeviceCharacteristics({
					deviceId: BLEInformation.deviceId,
					serviceId: list[num].uuid,
					success(res) {
						for (var i = 0; i < res.characteristics.length; ++i) {
							var properties = res.characteristics[i].properties
							var item = res.characteristics[i].uuid
							if (!notify) {
								if (properties.notify) {
									BLEInformation.notifyCharaterId = item;
									BLEInformation.notifyServiceId = list[num].uuid;
									that.$store.commit('BLEInformationSet', BLEInformation);
									notify = true
								}
							}
							if (!write) {
								if (properties.write) {
									BLEInformation.writeCharaterId = item;
									BLEInformation.writeServiceId = list[num].uuid;
									that.$store.commit('BLEInformationSet', BLEInformation);
									write = true
								}
							}
							if (!read) {
								if (properties.read) {
									BLEInformation.readCharaterId = item;
									BLEInformation.readServiceId = list[num].uuid;
									that.$store.commit('BLEInformationSet', BLEInformation);
									read = true
								}
							}
						}
						if (!write || !notify || !read) {
							num++
							that.writeCharacter = write;
							that.readCharacter = read;
							that.notifyCharacter = notify;
							that.serviceId = num;
							if (num == list.length) {
								uni.showModal({
									title: '提示',
									content: '找不到该读写的特征值',
								})
							} else {
								that.getCharacteristics()
							}
						} else {
							that.openControl()
						}
					},
					fail: function(e) {
						that.errorCodeTip(e.errCode);	
					}
				})
			},
			openControl: function() {
				uni.navigateTo({
					url: '../code-print/code-print?data='+this.detail,
				})
			},
		}
	}

打印

	var tsc = require("../../../utils/ble/tsc.js");
	import {
		mapState
	} from 'vuex';
	export default {
		data() {
			return {
				canvasWidth: 400,
				canvasHeight: 400,
				looptime: 0,
				currentTime: 1,
				lastData: 0,
				oneTimeData: 0,
				printerNum: 1,
				currentPrint: 1,
				detail:"",// 货品详情
				buffSize: [],
				printNum: [],
				isReceiptSend: false,
				isLabelSend: false
			};
		},
		onReady(){
			let list = []
			let numList = []
			let j = 0
			for (let i = 20; i < 200; i += 10) {
			  list[j] = i;
			  j++
			}
			for (let i = 1; i < 10; i++) {
			  numList[i - 1] = i
			}
			this.buffSize = list;
			this.oneTimeData = list[0];
			this.printNum = numList;
			this.printerNum = numList[0];
		},
		onLoad(option) {
			this.detail = JSON.parse(option.data)
		},
		computed: {...mapState(['sysinfo', 'Bluetooth'])},
		onShow(){
			let that = this;
			const ctx = uni.createCanvasContext("edit_area_canvas", this);
			ctx.font = 'normal bold 20px sans-serif';
			ctx.setFillStyle('#171717'); // 文字颜色
			ctx.translate(0,0)
			ctx.rotate(90*Math.PI/180)
			ctx.fillText(that.detail.name, 20,-15); // 绘制文字
			ctx.draw();
		},
		methods:{
			// 返回
			handleBack(){
				uni.navigateBack({
					delta:3
				})
			},
			//标签测试
			labelTest(){
				let that = this;
				let canvasWidth = that.canvasWidth
				let canvasHeight = that.canvasHeight
				let command = tsc.jpPrinter.createNew()
				command.setSize(14, 40)
				command.setGap(0)
				command.setCls()
				command.setDensity(7)
				// command.setText(80, 40, "TSS24.BF2", 1, 1, "名称:驰腾贴贴乐")
				command.setBarCode(60, 20, "EAN128", 50, 0, 2, 2, that.detail.code)
				uni.canvasGetImageData({
				  canvasId: 'edit_area_canvas',
				  x: 0,
				  y: 0,
				  width: canvasHeight,
				  height: canvasWidth,
				  success: function(res) {
					command.setBitmap(60, 0, 1, res)
				  },
				  complete: function() {
					command.setPagePrint()
					that.isLabelSend = true;
					that.prepareSend(command.getData())
				  }
				})
			},
			//准备发送,根据每次发送字节数来处理分包数量
			prepareSend(buff){
				let that = this
				let time = that.oneTimeData
				let looptime = parseInt(buff.length / time);
				let lastData = parseInt(buff.length % time);
				this.looptime = looptime + 1;
				this.lastData = lastData;
				this.currentTime = 1;
				that.Send(buff)
			},
			//分包发送
			Send(buff){
				let that = this
				let {currentTime,looptime:loopTime,lastData,oneTimeData:onTimeData,printerNum:printerNum,currentPrint}=that;
				let buf;
				let dataView;
				if (currentTime < loopTime) {
				  buf = new ArrayBuffer(onTimeData)
				  dataView = new DataView(buf)
				  for (var i = 0; i < onTimeData; ++i) {
					dataView.setUint8(i, buff[(currentTime - 1) * onTimeData + i])
				  }
				} else {
				  buf = new ArrayBuffer(lastData)
				  dataView = new DataView(buf)
				  for (var i = 0; i < lastData; ++i) {
					dataView.setUint8(i, buff[(currentTime - 1) * onTimeData + i])
				  }
				}
				let {
					BLEInformation
				} = that.Bluetooth;
				uni.writeBLECharacteristicValue({
				  deviceId: BLEInformation.deviceId,
				  serviceId: BLEInformation.writeServiceId,
				  characteristicId: BLEInformation.writeCharaterId,
				  value: buf,
				  complete: function() {
					currentTime++
					if (currentTime <= loopTime) {
					  that.currentTime = currentTime;
					  that.Send(buff)
					} else {
					  if (currentPrint > printerNum) {
						that.looptime = 0;
						that.lastData = 0;
						that.currentTime = 1;
						that.isReceiptSend = false;
						that.isLabelSend = false;
						that.currentPrint = 1;
					  } else {
						uni.showToast({
						  	title: '已打印第' + currentPrint + '张',
						})
						currentPrint++;
						that.currentPrint = currentPrint;
						that.currentTime = 1;
						that.Send(buff)
					  }
					}
				  }
				})
			},
		},
		onUnload() {
			let that = this;
			let {
				BLEInformation
			} = that.Bluetooth;	
		},
	}

标签:uniapp,打印机,code,title,list,蓝牙,let,BLEInformation,uni
来源: https://blog.csdn.net/weixin_45474673/article/details/117980930

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有