1. 连接蓝牙设备,需要使用微信的wx.createBLEConnection接口,参数为蓝牙设备的deviceId(这个参数在搜索的设备信息里面可以直接拿到)。

2. 在ble.js里面新增connect、disconnect、getDevConStatus三个接口,用以统一管理设备连接和设备断开,因为在安卓平台上,重复去连接会导致设备没有办法断开连接。所以在ble.js里面还维护了一个连接/正在连接的设备数组,方便统一管理设备。当调用connect的时候,会先去这个数组里面查找是否有该设备,如果有就不再去调用连接了。当调用disconnect或者设备被动断开,会把该设备从这个数组里面删除。

3. Init函数中添加设备连接状态监听回调:wx.onBLEConnectionStateChange,并且在DeInit中关闭该回调。

4. 在DeInit函数中,会先去检查的设备数组是否为空,如果还有设备处于连接状态或者正在连接状态,就会依次主动断开这些设备,防止退出的时候,忘记关闭,导致蓝牙一直保存该连接。

5. 设备连接成功,并不是在createBLEConnection回调里面去置的状态,而是在设备连接状态回调里面去更新的该设备的状态,然后再调用的回调函数通知上层应用,因为有时候发现createBLEConnection回调比状态通知回调要早来,而且要等到状态回调回来了,才能拿到服务。

6. 其实这里还需要做一个连接设备的限制,当超过最大连接设备个数后,就直接返回失败。很多安卓平台当同时连接的设备个数超过了一定数量(3~5)个的样子,就会出问题。

7. connect实现

/**
* 连接指定的设备
* @param {string} deviceId 蓝牙设备ID
* @param {function} cb 连接状态回调,参数1为设备id,参数2连接状态
*/
function connect(deviceId, timeout, cb) {if (!bleInitFlag || bleConDevArr.length>BLE_CON_MAX_NUM) {if (typeof cb == "function") {cb(deviceId, BLE_CON_FAIL);}}// 在连接数组里面查找该设备是否已经处理正在连接或者连接成功的状态var index = findDevIndexInArrByDevId(deviceId);if (index >= 0) {  // 如果在列表中存在,判断该设备状态if (bleConDevArr[index].devStatus == BLE_CON_SUCCESS) { // 连接成功状态if (typeof cb == "function") {cb(deviceId, BLE_CON_SUCCESS);}} else {    // 正在连接状态,直接返回重复连接console.log("重复连接", deviceId);if (typeof cb == "function") {cb(deviceId, BLE_CON_ING);}}} else { // 创建一个新连接bleConDevArr.push({devId: deviceId,devStatus: BLE_CON_ING,devCb: cb});wx.createBLEConnection({deviceId, // 搜索到设备的 deviceIdtimeout: timeout,success: () => {// 不在这里处理连接成功回调事件,在状态改变里面处理,等状态回调回来才算真正连接成功// if (typeof cb == "function") {//     cb(deviceId, BLE_CON_SUCCESS);// }},fail: () => {if (typeof cb == "function") {cb(deviceId, BLE_CON_FAIL);debug.Debug(BLE_MODULE_NAME, debug.DEBUG_DEBUG,"连接失败", deviceId);// 连接失败删除设备// 在连接数组里面查找该设备是否已经处理正在连接或者连接成功的状态var index1 = findDevIndexInArrByDevId(deviceId);if (index1 >= 0) {debug.Debug(BLE_MODULE_NAME, debug.DEBUG_DEBUG,"连接失败,删除设备", bleConDevArr[index1].devId);bleConDevArr.splice(index1, 1);}}}});}
}

8. disconnect实现

/**
* 主动断开某个设备的连接
*/
function disconnect(deviceId, cb) {// 在连接数组里面查找该设备是否已经处于正在连接或者连接成功的状态var index = findDevIndexInArrByDevId(deviceId);if (index >= 0) {// 不在这里做设备删除操作,在状态回调里面去做,防止断开连接失败,但是有提前把设备删除了,那么这个资源就没有办法释放了// bleConDevArr.splice(index, 1); // 从数组中删除debug.Debug(BLE_MODULE_NAME, debug.DEBUG_DEBUG,"断开设备", deviceId);if (typeof cb == "function") {wx.closeBLEConnection({deviceId,success: (res) => { // 成功回调cb(true);},fail: (res) => { // 失败回调cb(false);}});} else {wx.closeBLEConnection({deviceId});}} else {if (typeof cb == "function") {cb(false);}}
}

9. BLE连接状态回调

      // 设备连接状态监听回调wx.onBLEConnectionStateChange(function(res) {debug.Debug(BLE_MODULE_NAME, debug.DEBUG_DEBUG, `device ${res.deviceId} state has changed, connected: ${res.connected}`)// 在连接数组里面查找该设备是否已经处理正在连接或者连接成功的状态var index = findDevIndexInArrByDevId(res.deviceId);if (index >= 0) {if (res.connected) {bleConDevArr[index].devStatus = BLE_CON_SUCCESS; // 连接成功,更改设备状态if (typeof bleConDevArr[index].devCb == "function") {bleConDevArr[index].devCb(bleConDevArr[index].devId, BLE_CON_SUCCESS);}} else {if (typeof bleConDevArr[index].devCb == "function") {bleConDevArr[index].devCb(bleConDevArr[index].devId, BLE_CON_FAIL);}debug.Debug(BLE_MODULE_NAME, debug.DEBUG_DEBUG,"设备断开,删除设备", bleConDevArr[index].devId);bleConDevArr.splice(index, 1); // 断开连接,直接从数组中删除}}});

10. 然后在设备列表元素点击事件中,添加跳转到设备操作界面的代码,页面参数为当前设备的ID

    // “保留当前页面,跳转到应用内的某个页面”,并且带一个返回按键,可传递参数wx.navigateTo({url: '../blectr/blectr?devId='+e.currentTarget.id});

11. 然在blectr.js的onLoad函数中,解析出该设备ID,并去执行连接操作

    /*** 生命周期函数--监听页面加载*/onLoad: function (options) {debug.Debug(BLECTR_MODUAL_NAME,debug.DEBUG_DEBUG,"page onLoad", options);this.userData.currDevId = options.devId;// 根据devId去连接设备this.conDev();},

这里新增了一个conDev函数和disConDev函数,该函数回去执行连接/断开操作,并把连接状态和设备操作按键的状态给关联起来。按键会有未连接、连接中、断开三种状态。

conDev: function() {debug.Debug(BLECTR_MODUAL_NAME, debug.DEBUG_DEBUG, "开始连接设备", this.userData.currDevId);this.data.bleCtrButtonObj.loadingFlag = true;this.data.bleCtrButtonObj.text = "连接中";this.setData({["bleCtrButtonObj"]: this.data.bleCtrButtonObj});ble.connect(this.userData.currDevId, BLECTR_BLE_CON_TIMEOUT,(deviceId, status) => {if (deviceId != this.userData.currDevId) {return;}if (status == ble.BLE_CON_ING) {// this.data.bleCtrButtonObj.loadingFlag = true;// this.data.bleCtrButtonObj.text = "连接中";// this.setData({["bleCtrButtonObj"]: this.data.bleCtrButtonObj});} else if (status == ble.BLE_CON_SUCCESS) {this.data.bleCtrButtonObj.loadingFlag = false;this.data.bleCtrButtonObj.text = "断开";this.setData({["bleCtrButtonObj"]: this.data.bleCtrButtonObj});} else {this.data.bleCtrButtonObj.loadingFlag = false;this.data.bleCtrButtonObj.text = "未连接";this.setData({["bleCtrButtonObj"]: this.data.bleCtrButtonObj});}})},disConDev: function() {debug.Debug(BLECTR_MODUAL_NAME, debug.DEBUG_DEBUG, "断开设备", this.userData.currDevId);ble.disconnect(this.userData.currDevId,(res) => {if (res) {this.data.bleCtrButtonObj.loadingFlag = false;this.data.bleCtrButtonObj.text = "未连接";this.setData({["bleCtrButtonObj"]: this.data.bleCtrButtonObj});}});},

12. 当然在onUnload函数中需要去判断当前设备是否处于连接状态,如果是,就断开,防止页面退出了,设备还保持连接

    /*** 生命周期函数--监听页面卸载*/onUnload: function () {debug.Debug(BLECTR_MODUAL_NAME,debug.DEBUG_DEBUG,"page onUnload");// 如果当前设备处于连接状态,退出该页面的时候,要去处理// 断开连接var status = ble.getDevConStaus(this.userData.currDevId);if (status == ble.BLE_CON_SUCCESS || status == ble.BLE_CON_ING) {ble.disconnect(this.userData.currDevId);}},

13. 到此设备连接相关操作就完成了,后面就是获取服务列表和特征值列表,并且进行读写操作了。

10_微信小程序-BLE低功耗蓝牙开发-连接设备相关推荐

  1. 01_微信小程序-BLE低功耗蓝牙开发-注册和工具安装

    1. 访问微信公众号平台,注册小程序 注意:一个邮箱只能注册一个微信小程序 2. 下载安装开发工具 这里有个重要的东西AppID,注册申请的时候生成的.我们这里只做学习用,所以可以点击后面的测试号,会 ...

  2. 20_微信小程序-BLE低功耗蓝牙开发-发布小程序

    所有功能测试OK了,就剩下最后一步了,那就是把开发好的微信小程序发布出去. 1. 填写小程序信息,登录小程序管理平台,在设置->填写信息,里面填写小程序相关信息(后面我直接把小程序名称改为&qu ...

  3. 08_微信小程序-BLE低功耗蓝牙开发-设备搜索

    遇到的一些问题 BLE相关的好多函数都是异步的,但是BLE的操作又必须按照顺序流程来,否则就会出现问题,所以这里得嵌套大量的回调函数. 普通回调函数中this拿不到data数据的问题 原因:小程序在回 ...

  4. 微信小程序与低功耗蓝牙通信-接受硬件端发送来的数据(四)

    接受数据只要 wx.notifyBLECharacteristicValueChange监听器打开, wx.onBLECharacteristicValueChange是接受数据的函数. 数据接收到后 ...

  5. 微信小程序与低功耗蓝牙通信-往硬件端发送数据(三)

    准备工作: 软件:微信小程序 硬件: 蓝牙设备:hc-09 单片机:stm32 微信小程序往硬件端发送数据,对应的函数是wx.writeBLECharacteristicValue,他的参数是:(对应 ...

  6. 【微信小程序控制硬件15 】 开源一个微信小程序,支持蓝牙快速配网+WiFi双控制ESP32-C3应用示范;(附带Demo)

    文章目录 一.前言 二. Blufi乐鑫自研的蓝牙配网协议 ESP32 配网流程 流程图 三.相关代码 3.1 蓝牙快速配网 3.2 蓝牙本地控制 2.3 外设驱动 3.1 蓝牙搜索 3.2 蓝牙服务 ...

  7. 微信小程序直连蓝牙实现控制继电器及串口调试功能--全系统开源工程

    微信小程序直连蓝牙硬件设备,设备控制继电器,灯等设备,同时实现蓝牙串口调试助手等功能,设备能够输出微信小程序发出的蓝牙数据,可为工程师在手机上实现设备串口调试功能,当工程师去现场调试设备,没有带电脑, ...

  8. 微信小程序通过低功耗蓝牙设备进行定位及测距(二)

    定位及测距的原理 微信小程序搜索附近蓝牙设备,通过指定蓝牙名称获取信号轻度rssi,再通过信号强度转化为距离,进而实现定位和测距.(具体实现看代码) 信号响度转距离的公式 代码实现 var point ...

  9. ble 低功耗蓝牙开发学习 嵌入式交流学习

    ble 低功耗蓝牙开发学习 嵌入式交流学习 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 这篇文章教你学会低功耗蓝牙开发,从0到深入,适合自学的学生.初级工程师 前言 随着疫情爆发 ...

  10. Android 8.0 BLE 低功耗蓝牙开发记录

    Android 8.0 BLE 低功耗蓝牙开发记录(1-3)--------------(权限申请篇未完待续) 目的:开源博客,希望大家一起修改博客错误地方,共同完善并会鸣谢提供意见的朋友.为大家提供 ...

最新文章

  1. 一站式了解多模态、金融、事理知识图谱构建指南 | AI ProCon 2020
  2. java 面试指南_Java面试参考指南–第1部分
  3. python socket 大文件_python之socket运用之传输大文件
  4. C++子对象和堆对象
  5. c语言结构体实验张三丰,如何成为公务员考试结构化面试里的张三丰
  6. Fastify 系列教程三 (验证、序列化和生命周期)
  7. android电源管理白名单,{更新}k29去除白名单支持原生电源管理的bios(1.10;1.66)...
  8. html幻灯片图片切换效果代码,jquery的幻灯片图片切换效果代码分享
  9. 【知识学习】最大公因数gcd
  10. s5p4418摄像头程序使用教程
  11. HTML与CSS中的文本个人分享
  12. 2020 年全球程序员收入报告出炉,字节跳动工程师收入中国最高
  13. 百度地图开发之实现运动轨迹 二
  14. mysql----where 1=1是什么意思
  15. Tita OKR分享:如何进行OKR的复盘?
  16. 深度学习入门书籍和资源
  17. [转载]推荐:互联网思维必读十本书
  18. 1.通过PADS Logic创建原件类型和逻辑封装
  19. SUST 2019暑期集训题解(差分约束+生成树+传递闭包)
  20. 3Dmax 三弟单面建模和实体建模的优缺点

热门文章

  1. 立体栅格地图_具有立体效果的地图制作
  2. google Play 应用被下架暂停
  3. SPSS应用多元逻辑回归解决无序多分类问题
  4. Ubuntu设置Adsl上网
  5. 花花公子 243线SLOT
  6. 37 岁老码农找工作,现身说法...
  7. magicbookpro做php开发,荣耀MagicBook Pro锐龙版,一款为大学生量身打造的笔记本
  8. 摄像头黑屏等问题及解决方案汇总
  9. Layui 后台管理模板 【Y-Admin】
  10. 简单通用文章系统后台管理模板