随着智能设备数量的增加,控制这些设备的需求也在增加。对于多种使用情况,期望设备在需要进行控制的同时连接到互联网会受到很大限制,因此是不可行的。在这些情况下,使用低功耗蓝牙(也称为 Bluetooth LE 或 BLE)似乎是最佳选择,因为它功耗低,在我们的手机中无处不在,而且无需连接到更广泛的网络。因此,蓝牙应用程序的需求也在不断增长。
通过阅读本文,您将了解如何开始在 Flutter 中开发蓝牙低功耗应用程序。
低功耗蓝牙与蓝牙有何不同?
一般来说,蓝牙是一种跳频无线技术,可在 2.4 GHz 频段内传输数据包以互连附近的设备。低功耗蓝牙是蓝牙的一种变体,也在 2.4 GHz 频段运行,但与标准蓝牙不同的是,它的最高速度仅为 1 Mbps,功耗仅为 0.01 至 0.5 瓦。它是标准蓝牙速度的三分之一。因此,它的功耗要低得多。
为蓝牙低功耗选择库
在编写任何蓝牙相关代码之前,选择并了解底层库是必要的。
目前,pub 上存在三个乍一看可能很有前途的 BLE 库:flutter_blue
、flutter_ble_lib
和flutter_reactive_ble
。
它们都具有几乎相同的功能集,但在实际可用性方面差异很大。
1.Flutter_blue
GitHub 上最近一次提交是 9 个月前(截至 2021 年 12 月),有 500 个开放问题和多个重大错误。该库似乎没有得到维护,因此选择该库将极大地阻碍您的应用程序的开发。
2.Flutter_BLE_lib
该库已基本完成,并具有可选的设备模拟器,这对测试有很大帮助。几乎所有功能都可以完美运行,但与所有软件一样,也存在一些小错误。遗憾的是,虽然该库仍在维护中,但其开发进展却非常缓慢,并且该库仍然不是空安全的。除非您确实需要在开发过程中进行全自动蓝牙测试,否则选择此库并不是最佳选择。
3.Flutter_reactive_BLE
这个库似乎是最好的选择,因为它支持其他库所做的一切,无需模拟器,并且得到积极维护。它在不久的将来被放弃的风险很低,因为它是由 Philips Hue 团队开发的。
了解低功耗蓝牙
现在我们已经选择了一个库,了解底层协议是必要的。 BLE 标准有详细记录,但也非常复杂。以下解释试图尽可能抽象地让您充分理解,以便能够与您的设备进行通信,而无需了解所有细节。
正确的 BLE 思维模型
在几乎所有情况下,您的手机都将充当 BLE 主设备,而您连接手机的外设将成为 BLE 从设备。一个主机可以连接多个外设,而外设只能连接一个主机。
连接 BLE
要使用外围设备执行任何操作,您必须首先连接到它。大多数时候,您需要开始扫描 BLE 设备,然后自动连接到按标准选择的设备,或者让用户连接到他们想要的设备。
当您扫描外围设备时,您将收到它们的 ID、名称以及它们提供的服务列表。
请注意,在连接过程中,您可以选择与设备协商 MTU,这会更改您可以发送和接收的数据的最大大小。
低功耗蓝牙和 GATT
低功耗蓝牙外设必须具有 GATT(通用属性配置文件)客户端,它定义了两个低功耗蓝牙设备来回传输数据并提供对服务和特性的访问的方式。
服务是一组特征,可通过 GUID 进行识别,而特征是我们作为应用程序开发人员将关心的节点。请注意,特征始终分组在服务中。
低功耗蓝牙的特性
特性是您读取、写入或监听(使用通知或指示)的对象。
它们可通过 GUID 进行识别,并始终拥有至少一个描述符。描述符用于存储有关特性的元数据。如果描述符中与 “读取 ”相对应的位被设置为 “1”,则该特性是可读的。写入“、”通知 "等也是如此。大多数库都会公开类似 characteristic.isReadable()
这样的方法,以抽象出使用描述符位域的必要性。
BLE 的写入和读取特性
如果某个特性可与响应一起写入(其中响应仅限于确认响应),则调用与 characteristic.writeWithResponse(value)
等价的操作将更改从属设备上的相应值,并给出成功状态。无响应读取和写入的操作类似。
聆听通知和指示
如果您需要对应用程序中的特征值变化做出反应,则需要使用与 characteristic.subscribe()
相同的方法订阅特征。这将告诉外设,它应该向您发送特征值变化的数据。
要对值变化做出反应,请监听相关的 dart:Stream
。
蓝牙低功耗提供了监听通知和指示的能力,其唯一区别在于通知未被确认,而指示则被确认。这些在特征描述符中也有相应的isNotABLE
/isIndicatable
标志。
与BLE通信
一旦你了解了可能的操作,你就可以做任何其他数据源所能做的事情,只不过你是在操作字节数据。您可能想编写一个存储库类,将字节数据转换为类型良好的数据模型,以便于使用。
低功耗蓝牙的常见故障模式
这些知识,再加上阅读您选择的库的文档,应该足以在完美的世界中与蓝牙低功耗外设进行所有通信。遗憾的是,错误时有发生,底层设备 BLE 模块可能无法像我们希望的那样顺利工作。一旦问题出现,应该从哪里开始寻找根源呢?
连接不稳定就是一个很好的开始。由于蓝牙低功耗天线的功率较低,因此连接很容易随时中断。在编写逻辑代码时,请记住任何一次 BLE 操作都很容易随时失败。
常见的原因可能是外设固件提供商之间的误解。使用单独的蓝牙低功耗应用程序来验证是否存在操作所需的所有标记,并检查所有 GUID 是否匹配。
库本身也可能是问题的根源。例如,flutter_BLE_lib
在快速并发写入时经常失败,并且过早地完成了未来负责连接设备的工作。在调试时,您可能需要在蓝牙操作前后增加一些延迟。
总结
希望本文能对您编写蓝牙低功耗 Flutter 应用程序有所帮助。蓝牙低功耗技术成本低、易于部署,而且可与基于互联网的应用程序连接,对延长消费电子产品的电池寿命有积极影响,因此绝对值得使用。