微信小程序之蓝牙的链接
微信小程序之蓝牙的链接
微信小程序蓝牙连接2.0说明:
1、本版本区分了android和ios系统下蓝牙连接的不同方式。
2、兼容了更多情况下的链接包括:
(1)未开启设备蓝牙,当监听到开启了蓝牙后自动开始连接。
(2)初始化蓝牙失败后每3000ms自动重新初始化蓝牙适配器。
(3)安卓端开启蓝牙适配器扫描失败,每3000ms自动重新开启。
(4)ios端获取已连接蓝牙设备为空,每3000ms自动重新获取。
(5)安卓端蓝牙开始链接后中断扫描,连接失败了,重新开始扫描。
(6)ios端开始连接设备后,停止获取已连接设备,连接失败自动重新开启获取。
(7)连接成功后,关闭系统蓝牙,蓝牙适配器重置。
(8)连接成功后,关闭系统蓝牙,再次打开蓝牙,自动重新开始连接。
(9)连接成功后,关闭目标蓝牙设备,自动重新开始扫描(获取)。
(10)连接成功后,最小化小程序(连接未中断),打开小程序显示已连接。
(11)连接成功后,杀掉小程序进程,连接关闭,自动重新开始扫描(获取)。
3、想起来了再来更新....。
4、流程图,明天或后天或...谁有空帮我画一下也行。
我的连接是在app.js中做的。
在app.js中的onlaunch触发是调用 init()方法。
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); } } }); }
说明:
1、此方法是用来判断是否正在扫描。
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(); } } } }) }
说明:
1、此处对已发现的蓝牙设备根据name属性进行了过滤。
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); }
说明:
1、该方法调用成功后返回的devices是一个数组包含多个已经系统配对的蓝牙设备。
2、如果devices列表获取到调用loopconnect()方法开始递归调用连接蓝牙设备。
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); } } }
说明:looconnect在创建连接的方法连接失败后会操作删除数组的第一个值,然后继续调用该方法,直到其中所有的设备都连接过。
差点漏了:在app.js的onshow里调用init()方法。
特别说明:
1、安卓和ios的蓝牙连接在当前版本中推荐采用不同方式。安卓设备直接使用小程序的蓝牙连接,取消系统配对。ios设备先系统配对在打开小程序可以时效秒连接成功。
2、此版本的连接仍然有待完善,连接不会自动终止(需要的可以自己加),会无限扫描重连,直到成功。
3、链接成功后的操作如果写入数据和开启notify需要同时进行,建议先写入,后开启notify。(原因未知,否则必然出现10008错误)。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
上一篇: 使用SVG基本操作API的实例讲解