微信小程序BLE---蓝牙连接

最近项目接触了微信小程序BLE开发,记录一下蓝牙连接流程以及一些坑。以下是一些常用api 查阅官方文档


wx.openBluetoothAdapter     // 开启蓝牙模块
wx.closeBluetoothAdapter // 关闭蓝牙模块

wx.getBluetoothAdapterState // 获取蓝牙模块状态
wx.startBluetoothDevicesDiscovery   // 开始搜索附近的蓝牙设备
wx.stopBluetoothDevicesDiscovery   // 停止蓝牙搜索

wx.onBluetoothDeviceFound   // 监听搜索到的新设备
wx.createBLEConnection     // 连接蓝牙设备
wx.closeBLEConnection     // 断开蓝牙连接
wx.onBLEConnectionStateChange  // 监听蓝牙低功耗连接状态改变事件。包括开发者主动连接或断开连接,设备丢失,连接异常断开等等
wx.offBluetoothDeviceFound    //  移除搜索到新设备的事件的全部监听函数
wx.getBLEDeviceServices     // 获取蓝牙低功耗设备所有服务 (service)
wx.getBLEDeviceCharacteristics    // 获取蓝牙低功耗设备某个服务中所有特征 (characteristic)
wx.notifyBLECharacteristicValueChange   // 启用蓝牙设备特征值变化时的 notify 功能
wx.onBLECharacteristicValueChange   // 监听低功耗蓝牙设备的特征值变化

wx.readBLECharacteristicValue    // 读取蓝牙设备的特征值的二进制数据


wx.getLocation   // 获取当前地理位置
wx.getSetting    //获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限
wx.openSetting   // 调起客户端小程序设置界面,返回用户设置的操作结果。设置界面只会出现小程序已经向用户请求过的权限。

注意:以上所有 api 都是有成功回调和失败回调方法,我们可以在一些方法内注册失败回调做一些操作

连接流程:先判断用户手机型号,因为 Android 手机可能存在搜不到蓝牙设备的问题,所以需要提前获取定位授权。

大概流程为: 获取蓝牙模块权限 —> 开启蓝牙模块(初始化) —> 开始搜索附近的蓝牙设备 —> 监听搜索到的新设备 —>连接蓝牙设备—> 监听蓝牙低功耗连接状态改变事件 —> 停止蓝牙搜索 —> 获取蓝牙低功耗设备所有服务 (service) —> 获取蓝牙低功耗设备某个服务中所有特征 (characteristic) —> 启用蓝牙设备特征值变化时的 notify 功能 —> 监听低功耗蓝牙设备的特征值变化 —> 读取蓝牙设备的特征值的二进制数据

流程图如下:

在这里插入图片描述

大致流程就这些,因为本次需求只涉及到读取设备数据。需要注意的是:

  1. 获取蓝牙模块权限
    • 提示用户授权:在请求蓝牙权限前,最好先提示用户为什么要使用蓝牙功能,增加透明度
    • 检查权限状态:确保在请求权限前检查当前权限状态,避免重复请求
  2. 开启蓝牙模块(初始化)
    • 提示用户开启蓝牙:如果用户的蓝牙没有打开,应该提示用户去开启蓝牙
    • 检查蓝牙是否可用:确保设备支持蓝牙,并且蓝牙功能已经开启
  3. 开始搜索附近的蓝牙设备
    • 设置搜索超时:为了避免无限期地搜索,可以设置一个合理的超时时间
    • 过滤无效设备:根据需要过滤掉不需要的设备(例如,只关心特定类型的设备)
  4. 监听搜索到的新设备
    • 记录设备信息:保存搜索到的设备信息,以便后续连接
    • 设备筛选:根据需要筛选出符合条件的设备
  5. 连接蓝牙设备
    • 连接超时处理:设置连接超时时间,防止连接失败时陷入死锁
    • 连接失败重试:在连接失败时尝试重新连接
  6. 监听蓝牙低功耗连接状态改变事件
    • 处理连接状态改变:根据连接状态的变化采取相应的行动(例如,连接成功后继续下一步操作 或者 设备异常断开后的自动重连操作, 又或者主动断开蓝牙后需要移除所有的监听函数 等等)
  7. 停止蓝牙搜索
    • 清理资源:连接到设备后,停止搜索及清理相关资源,释放内存
  8. 获取蓝牙低功耗设备所有服务 (service)
    • 验证服务:确保发现的服务是有效的
  9. 获取蓝牙低功耗设备某个服务中所有特征 (characteristic)
    • 验证特征:确保发现的特征是有效的
  10. 启用蓝牙设备特征值变化时的 notify 功能
    • 注册通知:注册特征值变化的通知,确保数据及时接收。
    • 错误处理:处理启用通知时可能出现的错误
  11. 监听低功耗蓝牙设备的特征值变化
    • 数据处理:接收到数据后进行相应的处理
    • 数据校验:对接收到的数据进行校验,确保数据完整性。
  12. 读取蓝牙设备的特征值的二进制数据
    • 错误处理:处理读取数据时可能出现的错误

总结开发过程中遇到的一些坑:

  • Android 设备连接到设备后,主动断开连接,此时应该是继续打开蓝牙搜索,但是搜不到刚才断开的设备 deviceId, IOS不存在这问题。解决办法:直接重启蓝牙,相当于重新走一遍初始化过程(重启能解决99%问题)。
  • Android 搜索不到设备。解决办法:查阅文档得知需要先打开位置功能,提高精度就能搜到了
  • 蓝牙连接成功后不触发 success 回调?不太记得了,反正就是一个 api,执行完之后,是成功了的,但是没有触发 success 回调,没有达到预期效果。给我整懵了,因为我的逻辑写在success回调中。 解决办法: 使用 complete 回调,在complete回调中重新获取一下刚才的操作结果,如果状态变了,则执行一些操作,这相当于一个兜底方案(比如连接成功后,虽然没有触发success回调,但是 complete 是肯定会触发的)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值