低功耗蓝牙的相关概念和及用法
1. 蓝牙广播(advertising)
1.1 包含40个信道,频段从2402MHz到2480MHz,每2MHz一个信道,其中37、38、39是广播信道,剩余的是数据信道

1.2 广播数据包最大37个字节,其中有6个字节作为蓝牙设备的mac地址,故剩下的31个字节是给用户进行使用的,所以我们也只用关注这一部分。这剩下的31个字节又被分为若干个蓝牙数据结构体(AD Structure),每个数据结构体又由3部分构成,分别是长度、类型和内容,其中长度占用1个字节,类型占用1个字节,内容占用n个字节,长度所占用的字节数 = 类型占用的字节数 + 内容占据的字节数

- 举个例子

如上图,第一个数据结构体一共是占用了5个字节,第二个数据结构体一共是占用了4个字节。前面我们说过一个广播数据包最大是37个字节,其中31个字节给用户使用,所以对于上图中的广播数据包还剩下22个字节未使用,在该数据包发送之前,系统会自动为我们在该数据包的结尾补上22个0,即占满31个字节。
1.3 常见的广播数据类型,即数据结构体中类型字段的值所表达的含义。

- 举个例子

例如上图中第一个数据结构体中,类型字段的值为0x09,通过查表可以得知该结构体传输的是完整设备名称;第二个数据结构体中,类型字段的值为0x0A,故该结构体传输的是发射功率;依次类推。
1.4 四种广播类型

- 流程

前面说到一个蓝牙广播数据包最大37个字节,如果要发送的广播数据包大于了37个字节怎么办呢?可以把多余的数据放在扫描响应里面的数据包发送。扫描响应的数据包格式跟蓝牙广播数据包的格式是一样的。
- 总结

1.5.Micropython中的广播函数

2. 蓝牙的五种状态

当蓝牙设备打开蓝牙后,蓝牙进入就绪态,发起广播进入广播态,此时被别的设备连接,进入连接态,断开连接后进入就绪态;蓝牙设备可以在就绪态发起扫描进入扫描态,此时如果发现了想要连接的设备,可以发起连接,进入发起态,如果对方接受了连接,那么双方都会进入连接态。
- MicroPython中,如果蓝牙状态切换,会产生中断,我们可以在对应的中断函数中进行相应的操作,如下图红框中。

3. 蓝牙的服务和特性
3.1 蓝牙的整体架构

物理层:实现无线波信号的收发;协议栈:的蓝牙的协议栈,例如网络模型中TCP/IP协议;应用层:根据业务需求实现不同的应用程序
3.2 蓝牙服务和特性的关系,其中每个服务和特性都要有一个UUID。

-
UUID

-
UUID基地址

由于UUID为128bit,数据太长,不方便使用。于是蓝牙联盟规定用户可以使用16bit的UUID,可以与UUID基地址拼接从而形成一个128bit的UUID。
- MicroPython代码的编写

上图实现了一个UUID为9011的服务,且服务里面包含9012和9013两个特性。然后将该服务注册到GTAA协议栈,返回的是每个特性的句柄。
4. 数据的收发

低功耗蓝牙中,数据的收发依赖于服务中的特性,可以将每个特性看作成一个个的数据点,且可以对每个特性(数据点 )赋予相应的权限,例如图中的五种权限。
1.Read:读权限
2.Write:写权限,需要写入数据的设备的回应,可以不回应。
3.Write With No Response:不需要回应的写入权限。
Notify:通知操作,需要设备打开订阅功能或者监听功能。
5. 16bitUUID与服务名称的关系
蓝牙联盟组织以及定义好服务名称与其相对应的16bitUUID的关系,具体可以去官网查表。

本文来自博客园,作者:seonwee,转载请注明原文链接:https://www.cnblogs.com/seonwee/p/18767229

浙公网安备 33010602011771号