主要流程:
1.初始化蓝牙适配器openBluetoothAdapter,如果不成功就onBluetoothAdapterStateChange监听蓝牙适配器状态变化事件
2.startBluetoothDevicesDiscovery开始搜寻附近的蓝牙外围设备
3.onBluetoothDeviceFound监听寻找到新设备的事件,在这里你可以用代码匹配设备
4.createBLEConnection创建蓝牙连接,顺便在stopBluetoothDevicesDiscovery关闭搜寻附近的蓝牙外围设备
5.getBLEDeviceServices获取蓝牙设备所有服务
6.getBLEDeviceCharacteristics获取蓝牙设备某个服务中所有特征值
7.onBLECharacteristicValueChange监听蓝牙设备发送给你的数据
8.writeBLECharacteristicValue向蓝牙设备发送一个0x00的16进制数据
1 // **************************************************************************************************
2
3 /**
4 * 第一步 在页面显示的时候判断是否已经初始化完成蓝牙适配器若成功,则开始查找设备
5 */
6 OpenBluetoothAdapter() {
7 uni.openBluetoothAdapter({
8 success:(res) => {
9 console.log('第一步初始化蓝牙成功:' + res.errMsg);
10 // 初始化完毕开始搜索
11 this.StartBluetoothDeviceDiscovery()
12 },
13 fail:(res) => {
14 console.log('初始化蓝牙失败: '+JSON.stringify(res));
15 if (res.errCode == 10001) {
16 uni.showToast({
17 title: '蓝牙未打开',
18 duration: 2000,
19 })
20 } else {
21 uni.showToast({
22 title: res.errMsg,
23 duration: 2000,
24 })
25 }
26 }
27 });
28 },
29 /**
30 * 第二步 在页面显示的时候判断是都已经初始化完成蓝牙适配器若成功,则开始查找设备
31 */
32 StartBluetoothDeviceDiscovery() {
33 uni.startBluetoothDevicesDiscovery({
34 // services: ['0000FFE0'],
35 success: res => {
36 console.log('第二步 开始搜寻附近的蓝牙外围设备:startBluetoothDevicesDiscovery success', res)
37 this.OnBluetoothDeviceFound();
38 },
39 fail: res => {
40 uni.showToast({
41 icon: "none",
42 title: "查找设备失败!",
43 duration: 3000
44 })
45 }
46 });
47 },
48 /**
49 * 第三步 发现外围设备
50 */
51 OnBluetoothDeviceFound() {
52 console.log("监听寻找新设备");
53 uni.onBluetoothDeviceFound(res => {
54 console.log("第三步 监听寻找到新设备的事件:",JSON.stringify(res))
55 console.log("第三步 监听寻找到新设备列表:",res.devices)
56
57 res.devices.forEach(device => {//这一步就是去筛选找到的蓝牙中,有没有你匹配的名称
58 console.log("这一步就是去筛选找到的蓝牙中,有没有你匹配的名称:",JSON.stringify(device))
59 if (device.name == 'XT453_9101L') {//匹配蓝牙名称
60 uni.setStorageSync("DeviceID",device.deviceId)//把已经连接的蓝牙设备信息放入缓存
61 this.DeviceID = device.deviceId
62 let DeviceID = device.deviceId//这里是拿到的uuid
63
64 this.StopBluetoothDevicesDiscovery()//当找到匹配的蓝牙后就关掉蓝牙搜寻,因为蓝牙搜寻很耗性能
65
66 console.log("匹配到的蓝牙this.DeviceID:",this.DeviceID)
67 this.CreateBLEConnection(DeviceID)//创建蓝牙连接,连接低功耗蓝牙设备
68
69 }
70 })
71 });
72 },
73 /**
74 * 第四步 停止搜索蓝牙设备
75 */
76 StopBluetoothDevicesDiscovery() {
77 uni.stopBluetoothDevicesDiscovery({
78 success: res => {
79 console.log("第四步 找到匹配的蓝牙后就关掉蓝牙搜寻:",JSON.stringify(res))
80 },
81 fail: res => {
82 console.log('第四步 停止搜索蓝牙设备失败,错误码:' + res.errCode);
83 }
84 });
85 },
86 // 第五步 创建蓝牙连接,连接低功耗蓝牙设备
87 CreateBLEConnection(DeviceID,index){
88 let doc = this
89 uni.createBLEConnection({//创建蓝牙连接,连接低功耗蓝牙设备
90 deviceId: DeviceID,//传入刚刚获取的uuid
91 success(res) {
92 console.log("第五步 创建蓝牙连接成功:",JSON.stringify(res))
93 doc.GetBLEDeviceServices(DeviceID) //获取蓝牙设备所有服务(service)。
94
95 },
96 fail(res) {
97 console.log(res)
98 }
99 })
100 },
101
102 //第六步 获取蓝牙设备所有服务(service)。
103 GetBLEDeviceServices(DeviceID,index){
104 let doc = this
105 setTimeout(function () {//这里为什么要用setTimeout呢,等等下面会解释
106 uni.getBLEDeviceServices({//获取蓝牙设备所有服务
107 deviceId: DeviceID,
108 success(res) {//为什么要用延时,因为不用延时就拿不到所有的服务,在上一步,连接低功耗蓝牙
109 //设备的时候,需要一个600-1000毫秒的时间后,再去获取设备所有服务,不给延时就会一直返回错误码10004
110
111 console.log("第六步 获取蓝牙设备所有服务:",JSON.stringify(res))
112 uni.setStorageSync("ServiceUUID",res.services[2].uuid)//把已经连接的蓝牙设备信息放入缓存
113 uni.setStorageSync("ServiceUUIDNew",res.services[2].uuid)//把已经连接的蓝牙设备信息放入缓存
114 let ServiceUUIDNew = res.services[2].uuid
115 this.ServiceUUID = res.services[2].uuid
116
117 console.log("this.ServiceUUID:",this.ServiceUUID);
118 doc.GetBLEDeviceCharacteristics(DeviceID)//获取蓝牙设备某个服务中所有特征值
119
120 },
121 fail(res) {
122 console.log(JSON.stringify(res))
123 }
124 })
125 }, 1000)
126
127 },
128
129 // 第七步 获取蓝牙特征值
130 GetBLEDeviceCharacteristics(DeviceID){
131 console.log("第七步 获取蓝牙特征值DeviceID:",DeviceID,"serviceId:",uni.getStorageSync('ServiceUUIDNew'));
132 setTimeout(()=>{
133 uni.getBLEDeviceCharacteristics({//获取蓝牙设备某个服务中所有特征值
134 deviceId: DeviceID,
135 serviceId: uni.getStorageSync('ServiceUUIDNew'),//这个serviceId可以在上一步获取中拿到,也可以在
136 //蓝牙文档中(硬件的蓝牙文档)拿到,我这里是通过文档直接赋值上去的,一般有两个,一个是收的uuid,一个是发的uuid,我们这边是发
137 success(res) {
138 console.log("第七步 获取蓝牙设备某个服务中所有特征值成功:",JSON.stringify(res))
139 uni.showToast({
140 title: '开启蓝牙连接',
141 duration: 2000
142 });
143 uni.setStorageSync("CharacteristicId",res.characteristics[1].uuid)//把某个服务中所有特征值信息放入缓存
144 this.characteristicId = res.characteristics[1].uuid
145 },
146 fail(res) {
147 console.log("获取蓝牙设备某个服务中所有特征值失败:",JSON.stringify(res))
148 }
149 })
150 },2000)
151 },
152 // 第八步 发送二进制数据
153 WriteBLECharacteristicValue(){
154 let doc = this
155 /* 数据格式如下:
156 doc.defaultVal = [
157 ["0x21", "0x20", "0x30", "0x4E", "0x54", "0x0A"],//第一张出纸数据
158 ["0x21", "0x20", "0x30", "0x4E", "0x54", "0x0A"]//第二张出纸数据
159 。。。。。。。
160 ] */
161 for (let i = 0; i < doc.defaultVal.length; i++) {
162
163 plus.bluetooth.writeBLECharacteristicValue({
164 // 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
165 deviceId: uni.getStorageSync('DeviceID'),
166 // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
167 serviceId: uni.getStorageSync('ServiceUUIDNew'),
168 // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
169 characteristicId: uni.getStorageSync('CharacteristicId'),
170 // 这里的value是ArrayBuffer类型
171 value: doc.defaultVal[i],
172
173 success(res) {
174 console.log('writeBLECharacteristicValue success', res)
175 console.log("开始打印第" + (i + 1) + "张:",doc.defaultVal[i]);
176 if (doc.defaultVal.length != 0) {
177 uni.showToast({
178 title: "正在打印第" + (i + 1) + "张",
179 // duration: 2000
180 mask: true
181 });
182
183 }else{
184 uni.hideLoading()
185
186 }
187 },
188 fail(res) {
189 console.log(JSON.stringify(res))
190 doc.errorCodeTip(res.code);
191
192 // console.log(JSON.stringify(buffer))
193 }
194 })
195 }
196 },
197
198 //错误码提示
199 errorCodeTip(code) {
200 let doc = this
201 if (code == 0) {
202 //正常
203 } else if (code == 10000) {
204 uni.showToast({
205 title: '未初始化蓝牙适配器',
206 icon: 'none'
207 })
208 } else if (code == 10001) {
209 uni.showToast({
210 title: '当前蓝牙适配器不可用',
211 icon: 'none'
212 })
213 } else if (code == 10002) {
214 uni.showToast({
215 title: '没有找到指定设备',
216 icon: 'none'
217 })
218 } else if (code == 10003) {
219 uni.showToast({
220 title: '连接失败',
221 icon: 'none'
222 })
223 } else if (code == 10004) {
224 uni.showToast({
225 title: '没有找到指定服务',
226 icon: 'none'
227 })
228 } else if (code == 10005) {
229 uni.showToast({
230 title: '没有找到指定特征值',
231 icon: 'none'
232 })
233 } else if (code == 10006) {
234 uni.showToast({
235 title: '当前连接已断开',
236 icon: 'none'
237 })
238 } else if (code == 10007) {
239 uni.showToast({
240 title: '当前特征值不支持此操作',
241 icon: 'none'
242 })
243 } else if (code == 10008) {
244 uni.showToast({
245 title: '其余所有系统上报的异常',
246 icon: 'none'
247 })
248 } else if (code == 10009) {
249 uni.showToast({
250 title: 'Android 系统特有,系统版本低于 4.3 不支持 BLE',
251 icon: 'none'
252 })
253 }
254 if (code != 0) {
255 //正常
256 //在页面加载时候初始化蓝牙适配器
257 doc.OpenBluetoothAdapter()
258 }
259 },
260 // *********************暂时未用 start 根据情况调用吧************************************************************
261 /**
262 * 获取在蓝牙模块生效期间所有已发现的蓝牙设备。包括已经和本机处于连接状态的设备。
263 */
264 getBluetoothDevices() {
265 console.log("获取蓝牙设备");
266 uni.getBluetoothDevices({
267 success: res => {
268 console.log('获取蓝牙设备成功:' + res);
269 this.bluetooth = res.devices;
270 console.log('获取蓝牙设备成功this.bluetooth:' + this.bluetooth);
271 this.bluetooth.forEach((item)=>{
272 this.isLink.push(0)
273 })
274
275 }
276 });
277 },
278 //断开蓝牙连接
279 closeBLEConnection(deviceId,index){
280 uni.closeBLEConnection({
281 deviceId:deviceId,
282 success:res=> {
283 this.isLink.splice(index,1,4)
284 console.log(res)
285 }
286 })
287 },
288
289
290
291
292 // 启用 notify 功能
293 notifyBLECharacteristicValueChange(deviceId){
294 uni.notifyBLECharacteristicValueChange({
295 state: true, // 启用 notify 功能
296 // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
297 deviceId:deviceId,
298 // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
299 serviceId:this.serviceId,
300 // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
301 characteristicId:this.characteristicId,
302 success:(res)=> {
303 console.log('notifyBLECharacteristicValueChange success', res.errMsg)
304 // this.onBLECharacteristicValueChange(this.deviceId);
305 },
306 fail:(res)=> {
307 console.log('notifyBLECharacteristicValueChange success', res.errMsg)
308 }
309 })
310 },
311 ab2hex(buffer) {
312 const hexArr = Array.prototype.map.call(
313 new Uint8Array(buffer),
314 function (bit) {
315 return ('00' + bit.toString(16)).slice(-2)
316 }
317 )
318 return hexArr.join('')
319 },
320 // 监听低功耗蓝牙设备的特征值变化
321 onBLECharacteristicValueChange(deviceId){
322 uni.onBLECharacteristicValueChange((res)=> {
323 console.log(`characteristic ${res.characteristicId} has changed, now is ${res.value}`)
324 console.log(this.ab2hex(res.value))
325 this.macAddress = res.deviceId;
326 this.macValue = this.ab2hex(res.value);
327 // this.readBLECharacteristicValue(this.deviceId)
328 })
329 },
330 // 读取设备二进制数据
331 readBLECharacteristicValue(){
332 // console.log('进入读取');
333 // setTimeout(()=>{
334 uni.readBLECharacteristicValue({
335 // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
336 deviceId:this.deviceId,
337 // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
338 serviceId:this.serviceId,
339 // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
340 characteristicId:this.characteristicId,
341 success:(res)=> {
342 console.log('readBLECharacteristicValue:', res)
343 this.readCode = res.errCode;
344 this.readCodeMsg = res.errMsg;
345 this.onBLECharacteristicValueChange(this.deviceId);
346 },
347 fail:(res)=> {
348 console.log('readBLECharacteristicValue:', res)
349 this.readCode = res.errCode;
350 this.readCodeMsg = res.errMsg;
351 this.onBLECharacteristicValueChange(this.deviceId);
352 }
353 })
354 // },200)
355
356 },
357
358 // **********************************暂时未用 end************************************************************
359
开始操作:
1 // 添加-保存 操作
2 barClick(e) {
3 var doc = this;
4 if(e.name=="打印"){
5 doc.getInvstr().then(res => {//请求接口拿到需要数据后开始请求打印
6 this.WriteBLECharacteristicValue()//请求成功后会出纸
7
8 })
9 }
10 },
记得在页面加载时候初始化蓝牙适配器
研究了三天的成果希望可以帮助到大家
将以上步骤直接考过去,缺少定义的字段自己改一下就ok了