前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开发 | 手把手,教你调用小程序蓝牙接口

开发 | 手把手,教你调用小程序蓝牙接口

作者头像
知晓君
发布2018-07-30 15:26:07
2.2K0
发布2018-07-30 15:26:07
举报
文章被收录于专栏:知晓程序知晓程序

文 | 极乐叔

这两天,我试着在小程序中,调用蓝牙设备接口。

这个模块做了 2 周,找了很多资料文档,看示例看别人的 demo,最后发现还是得靠自己。

下面,我将在知晓程序(微信号 zxcx0101)为大家总结,我在研究小程序蓝牙接口的时候遇到的问题。

关注「知晓程序」微信公众号,回复「开发」,获取小程序开发全套经验。

小程序如何连接蓝牙设备?

我实现的小程序模块自动连接(根据需要,可改手动),是在小程序初始化完成时开始自动调用执行。

大致流程:

  1. 开启蓝牙适配;
  2. 获取蓝牙适配器状态,判断设备蓝牙是否可用;
  3. 判断蓝牙适配器可用时开启扫描蓝牙设备和开启获取已连接的蓝牙设备;
  4. 如果开启扫描蓝牙设备失败 5 s 后,自动再次开启扫描;
  5. 开启扫描蓝牙设备成功后,开启监听已扫描的设备;
  6. 如果已扫描到的新设备,包含特定名称规律,则开始连接该设备;
  7. 开启获取已连接蓝牙设备,成功后,连接包含特定名称规律的设备;
  8. 两者都无法搜索到相应设备,则等待 5 s,重新搜索;
  9. 开始连接某设备时停止扫描设备,停止循环获取已连接设备;
  10. 连接成功后停止扫描设备,停止循环获取已连接设备。

点击查看大图

下面,我们一步步来完成这个流程。

开始连接蓝牙设备

1. 开启连接

app.jsonLaunch() 方法里中,我们调用 this.startConnect(); 来开启连接,弹出提示框,进行配对。如果失败,则提示设备蓝牙不可用,同时开启蓝牙适配器状态监听。

2. 获取本机蓝牙状态

调用 this.getBluetoothAdapterState() 获取本机蓝牙适配器状态,判断是否可用。若 availablefalse,则为用户没有开启系统蓝牙。

同时,判断程序还没有开始搜索蓝牙设备,调用 this.startBluetoothDevicesDiscovery() 开始扫描附近的蓝牙设备,以及 this.getConnectedBluetoothDevices(),获取本机已配对的蓝牙设备。

3. 开始搜索新设备

开始搜索蓝牙设备 startBluetoothDevicesDiscovery(),提示蓝牙搜索。

4. 获取已配对的蓝牙设备

需要注意的是,参数 servicesArray)是必填的,但是官方示例中以及各种坑爹 demo 里从没见过有谁填写。不填写这个属性此方法,将无法获取到任何已配对设备。

如果要调用此方法,则代表需要连接特定设备,并且知道该设备的一个主服务 serviceId

如暂时不知道这个 ID,可以先手动连接一次想要连接的设备,然后获取 service 列表,记录属性 primarytrue 的值至少一个。

5. 处理搜索功能开启失败的情况

如果搜索功能启动失败,回到第 2 步,重新检查蓝牙适配器。如果可用,开启蓝牙搜索功能并开启发现附近蓝牙设备事件监听:this.onBluetoothDeviceFound()

此方法可自定义过滤一些无效的蓝牙设备,比如 name 为空的,或是产品开发中,需要过滤设备名称不含有特定规律字符串的设备。

6. 自动配对设备

在第 5 步中发现了某个想配对的设备,则获取到该设备的 deviceId,然后用 this.startConnectDevices() 接口,开始配对该设备。

开启连接后,为了避免出现冲突,一旦开启连接,则需要终止扫描附近蓝牙设备、终止读取本机已配对设备

7. 连接成功后握手

连接成功后,使用 this.getService(deviceId) 接口,获取设备的所有服务。

8. 读取服务的特征值

9. 意外处理

如果扫描到的设备中没有想要连接的设备,可以尝试使用系统蓝牙手动配对,然后再小程序中调用 getConnectedBluetoothDevices() 获取本机已配对的蓝牙设备,然后过滤设备(可能获取多个已配对的蓝牙设备)。

然后,将已获取的蓝牙设备 deviceId 列表放入到一个数组中,然后调用自定义方法 this.loopConnect();

思路:通过递归调用获取已配对蓝牙设备的 deviceId,如果获取到了就去连接,如果 devicesId[x] 为空,说明上传调用 getConnectedBluetoothDevices() 时,获取到的已配对设备全部连接失败了。

这时候,我们需要则开启重新获取已配对蓝牙设备,并开启扫描附近蓝牙设备。

10. 自动循环重试

startConnectDevices('loop', array) 方法,是当获取已配对蓝牙设备进行连接时调用。

其中的处理逻辑上文已经贴出,意思就是在连接失败后 fail 方法里累加一个全局变量,然后回调 loopConnect(array) 方法。

11. 手动连接

上文介绍的方法是为了直接自动连接,如果不需要自动连接,可使用方法 getBluetoothDevices(),获取已扫描到的蓝牙设备的列表。

开发者可以做个页面显示出设备名,用户点击某个设备后,才开始连接。

需要注意的事项

  • that.serviceId 是在初始化时设置的,由于对需要连接设备的主服务 serivceId 和各种特征值都是已知的,因此可以这样做。如果不可知,可以做一个扫描方法自己检查特征值的用途。
  • 连接成功后的 writeBLECharacteristicValueopenNotifyService 操作需要注意,如果同时开启这两项操作要先调用 wirte 再开启 notify(原因未知,个人心得)。
  • 3、经提醒,我发现还可以再完善一下在 onBlueToothAdapterStateChange() 监听蓝牙适配器状态,以此判断连接过程中、连接后用户开关了设备蓝牙。如果判断到关了蓝牙,发出开启蓝牙的提示;如果监听到开启了,就重新回到第 1 步。

最后本文属于个人开发者的一点总结,欢迎留言指导讨论。

原文地址:http://www.jianshu.com/p/0b41d9ff7abc

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 知晓程序 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档