微信小程序之蓝牙链接实例教程

互联网 18-2-6
本文主要和大家介绍微信小程序之蓝牙的链接的相关资料,希望通过本文大家能够掌握小程序蓝牙的开发方法,需要的朋友可以参考下,希望能帮助到大家。

微信小程序之蓝牙的链接

微信小程序蓝牙连接2.0说明:

2、兼容了更多情况下的链接包括:

(1)未开启设备蓝牙,当监听到开启了蓝牙后自动开始连接。 (2)初始化蓝牙失败后每3000ms自动重新初始化蓝牙适配器。 (3)安卓端开启蓝牙适配器扫描失败,每3000ms自动重新开启。 (4)IOS端获取已连接蓝牙设备为空,每3000ms自动重新获取。 (5)安卓端蓝牙开始链接后中断扫描,连接失败了,重新开始扫描。 (6)IOS端开始连接设备后,停止获取已连接设备,连接失败自动重新开启获取。 (7)连接成功后,关闭系统蓝牙,蓝牙适配器重置。 (8)连接成功后,关闭系统蓝牙,再次打开蓝牙,自动重新开始连接。 (9)连接成功后,关闭目标蓝牙设备,自动重新开始扫描(获取)。 (10)连接成功后,最小化小程序(连接未中断),打开小程序显示已连接。 (11)连接成功后,杀掉小程序进程,连接关闭,自动重新开始扫描(获取)。

4、流程图,明天或后天或...谁有空帮我画一下也行。

init代码:

init: function (n) {    this.list = [];    this.serviceId = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E";    this.serviceId_2 = "00001803-0000-1000-8000-00805F9B34FB";    this.serviceId_3 = "00001814-0000-1000-8000-00805F9B34FB";    this.serviceId_4 = "00001802-0000-1000-8000-00805F9B34FB";    this.serviceId_5 = "00001804-0000-1000-8000-00805F9B34FB";    this.serviceId_6 = "00001535-1212-EFDE-1523-785FEABCD123";    this.characterId_write = "6E400042-B5A3-F393-E0A9-E50E24DCCA9E";    this.characterId_read = "6E400012-B5A3-F393-E0A9-E50E24DCCA9E";    this.connectDeviceIndex = 0;    this.isGettingConnected = false;    this.isDiscovering = false;    this.isConnecting = false;    this.connectedDevice = {};    console.log('init state', this.connectedDevice.state);    if (!this.connectedDevice.state || n == 200) {     this.connectedDevice.state = false;     this.connectedDevice.deviceId = '';     this.adapterHasInit = false    }    this.startConnect();   }

说明:

1、 serviceId_2~6 是我已知的想要连接的蓝牙设备的serviceId可以只写一个。 2、characterId_write 是我已知的想要连接的蓝牙设备写入数据的特征值。 3、characterId_read是我已知的想要连接的蓝牙设备读取数据的特征值。 (以上3个都是为了做比对,真实的操作按照获取到的sericeid, characterid为准)。 4、connectedDevice 是已连接了的设备信息对象。

init完成后开始调用连接 startConnect();

startConnect代码:

startConnect: function () {    var that = this;    if (that.connectedDevice.state) return;    that.connectedDevice.deviceId = "";    that.connectedDevice.state = false;    // 如果适配器已经初始化不在调用初始化(重复初始化会报错)    if (this.adapterHasInit == undefined || this.adapterHasInit) return;    wx.showLoading({     title: '初始化蓝牙',     duration: 2000    });    // 开启蓝牙适配器状态监听    this.listenAdapterStateChange();    // 初始化蓝牙适配器状态(必须步骤,否则无法进行后续的任何操作)    wx.openBluetoothAdapter({     success: function (res) {      console.log("初始化蓝牙适配器成功");      that.getBluetoothAdapterState();      that.adapterHasInit = true;     },     fail: function (err) {      console.log(err);      wx.showLoading({       title: '请开蓝牙',       icon: 'loading',       duration: 2000      })     }    });   }

说明:这段有注释,就不多说了,比较简单。

在初始化蓝牙适配器状态成功后调用getBluetoothAdapterState()方法。

getBluetoothAdapterState代码:

getBluetoothAdapterState: function () {    var that = this;    wx.getBluetoothAdapterState({     success: function (res) {      console.log(res);      var available = res.available;      that.isDiscovering = res.discovering;      if (!available) {       wx.showLoading({        title: '请开蓝牙',        icon: 'loading',        duration: 2000       })      } else {       if (!that.connectedDevice['state']) {        that.judegIfDiscovering(res.discovering);       }      }     },     fail: function (err) {      console.log(err);     }    })   }

说明:此方法是用来获取当前蓝牙状态。

当检测到蓝牙可用时调用judegIfDiscovering方法。

judegIfDiscovering代码

judegIfDiscovering: function (discovering) {    var that = this;    if (this.isConnectinng) return;    wx.getConnectedBluetoothDevices({     services: [that.serviceId],     success: function (res) {      console.log("获取处于连接状态的设备", res);      var devices = res['devices'];      if (devices[0]) {       if (that.isAndroidPlatform) {        wx.showToast({         title: '蓝牙连接成功',         icon: 'success',         duration: 2000        });       } else {        that.getConnectedBluetoothDevices(256);       }      } else {       if (discovering) {        wx.showLoading({         title: '蓝牙搜索中'        })       } else {        if (that.isAndroidPlatform) {         that.startBluetoothDevicesDiscovery();        } else {         that.getConnectedBluetoothDevices(267);        }       }      }     },     fail: function (err) {      console.log('getConnectedBluetoothDevices err 264', err);      if (that.isAndroidPlatform) {       that.startBluetoothDevicesDiscovery();      } else {       that.getConnectedBluetoothDevices(277);      }     }    });   }

2、isAndroidPlatform 是通过小程序的getSystemInfo获取到的判断是安卓设备还是IOS设备。

如果是安卓设备调用startBluetoothDevicesDiscovery()开启扫描,如果是IOS设备调用getConnectedBluetoothDevices() 开启获取已配对的蓝牙设备。

startBluetoothDevicesDiscovery代码:

startBluetoothDevicesDiscovery: function () {    var that = this;    if (!this.isAndroidPlatform) return;    if (!this.connectedDevice['state']) {     wx.getBluetoothAdapterState({      success: function (res) {       console.log(res);       var available = res.available;       that.isDiscovering = res.discovering;       if (!available) {        wx.showLoading({         title: '请开蓝牙',         icon: 'loading',         duration: 2000        })       } else {        if (res.discovering) {         wx.showLoading({          title: '蓝牙搜索中'         })        } else {         wx.startBluetoothDevicesDiscovery({          services: [],          allowDuplicatesKey: true,          success: function (res) {           that.onBluetoothDeviceFound();           wx.showLoading({            title: '蓝牙搜索中'           })          },          fail: function (err) {           if (err.isDiscovering) {            wx.showLoading({             title: '蓝牙搜索中'            })           } else {            that.startDiscoveryTimer = setTimeout(function () {             if (!that.connectedDevice.state) {              that.startBluetoothDevicesDiscovery();             }            }, 5000)           }          }         });        }       }      },      fail: function (err) {       console.log(err);      }     })    }

说明:

1、仅在安卓端设备上开启扫描附近蓝牙设备。

2、在开启成功的回调中开启发现新蓝牙设备的事件监听onBluetoothDeviceFound()。

onBluetoothDeviceFound代码:

[mw_shl_code=javascript,true]onBluetoothDeviceFound: function () {    var that = this;    wx.onBluetoothDeviceFound(function (res) {     console.log('new device list has founded');     if (res.devices[0]) {      var name = res.devices[0]['name'];      if (name.indexOf('FeiZhi') != -1) {       var deviceId = res.devices[0]['deviceId'];       console.log(deviceId);       that.deviceId = deviceId;       if (!that.isConnecting) {        that.startConnectDevices();       }      }     }    })   }

2、当筛选出含有需要连接的设备的name属性的设备是获取到deviceId,开始连接调用startConnectDevices()方法。

startConnectDevices代码:

startConnectDevices: function (ltype, array) {    var that = this;    clearTimeout(this.getConnectedTimer);    clearTimeout(this.startDiscoveryTimer);    this.getConnectedTimer = null;    this.startDiscoveryTimer = null;    this.isConnectinng = true;    wx.showLoading({     title: '正在连接'    });    that.stopBluetoothDevicesDiscovery();    wx.createBLEConnection({     deviceId: that.deviceId,     success: function (res) {      console.log('连接成功', res);      wx.showLoading({       title: '正在连接'      });      that.connectedDevice.state = true;      that.connectedDevice.deviceId = that.deviceId;      if (res.errCode == 0) {       setTimeout(function () {        that.getService(that.deviceId);       }, 5000)      }      wx.onBLEConnectionStateChange(function (res) {       console.log('连接变化', res);       that.connectedDevice.state = res.connected;       that.connectedDevice.deviceId = res.deviceId;       if (!res.connected) {        that.init('200');       }      });     },     fail: function (err) {      console.log('连接失败:', err);      wx.hideLoading();      if (ltype == 'loop') {       array = array.splice(0, 1);       console.log(array);       that.loopConnect(array);      } else {       if (that.isAndroidPlatform) {        that.startBluetoothDevicesDiscovery();       } else {        that.getConnectedBluetoothDevices(488);       }      }     },     complete: function () {      that.isConnectinng = false;     }    });   }

1、开启连接后终止扫描(获取已配对)方法。 2、根据deviceId创建低功耗蓝牙连接。如果连接成功,就继续做后续读写操作。 3、如果连接失败根据设备系统分别调用startBluetoothDevicesDiscovery() 或 getConnectedBluetoothDevices();

getConnectedBluetoothDevices代码:

getConnectedBluetoothDevices: function (n) {    var that = this;    that.isGettingConnected = true;    wx.showLoading({     title: '蓝牙搜索中'    });    wx.getConnectedBluetoothDevices({     services: [that.serviceId],     success: function (res) {      console.log("获取处于连接状态的设备", res);      var devices = res['devices'],       flag = false,       index = 0,       conDevList = [];      devices.forEach(function (value, index, array) {       if (value['name'].indexOf('FeiZhi') != -1) {        // 如果存在包含FeiZhi字段的设备        flag = true;        index += 1;        conDevList.push(value['deviceId']);        that.deviceId = value['deviceId'];       }      });      if (flag) {       that.connectDeviceIndex = 0;       that.loopConnect(conDevList);      } else {       that.failToGetConnected();      }     },     fail: function (err) {      that.failToGetConnected();     },     complete: function () {      that.isGettingConnected = false;     }    });   }

说明:如果获取蓝牙已配对的蓝牙设备失败了,或获取到的列表为空调用failToGetConnected();

failToGetConnected代码:

failToGetConnected: function () {    var that = this;    if (!that.getConnectedTimer) {     clearTimeout(that.getConnectedTimer);     that.getConnectedTimer = null;    }    that.getConnectedTimer = setTimeout(function () {     wx.getBluetoothAdapterState({      success: function (res) {       console.log(res);       var available = res.available;       if (!available) {        wx.showLoading({         title: '请开蓝牙',         icon: 'loading',         duration: 2000        })       } else {        if (!that.connectedDevice['state']) {         that.getConnectedBluetoothDevices();        }       }      },      fail: function (err) {       console.log(err);      }     })    }, 5000);   }

loopConnect代码:

loopConnect: function (array) {    var that = this;    var listLen = array.length;    if (array[0]) {     that.deviceId = array[0];     if (!that.isConnecting) {      that.startConnectDevices('loop', array);     }    } else {     console.log('已配对的设备小程序蓝牙连接失败');     if (!that.isAndroidPlatform) {      that.getConnectedBluetoothDevices(431);     }    }   }

差点漏了:在app.js的onShow里调用init()方法。

特别说明:

3、链接成功后的操作如果写入数据和开启notify需要同时进行,建议先写入,后开启notify。(原因未知,否则必然出现10008错误)。

微信小程序蓝牙设备代码与错误整理

微信小程序如何实现蓝牙的实例分享

微信小程序--Ble蓝牙

以上就是微信小程序之蓝牙链接实例教程的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 实例
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:实例详解微信小程序如何使用Socket

相关资讯