本文章主要介绍低功耗蓝牙的状态机和状态切换机制,以及蓝牙的事件处理,是同学们理解后面内容的基础。
蓝牙链路层的状态机有五种状态,分别是就绪态,广播态,链接态,扫描态,发起链接态,各个状态间的转换路径如下图所示:

蓝牙状态机
以手机连接某个蓝牙模块为例,手机作为主机设备,蓝牙模块作为从机设备。上电之后二者都将处于就绪态,蓝牙模块设置广播数据并开始广播后将转换到广播态;手机扫描附近范围内的蓝牙设备时,手机将处于扫描态,手机尝试连接某个设备时,手机的蓝牙处于发起连接态,连接成功后,二者将都处于链接态。
断开连接之后,二者将都再回到就绪态!
下面是上一篇文章蓝牙广播的代码:
from machine import Pin
from time import sleep_ms
import ubluetooth #导入BLE功能模块
ble = ubluetooth.BLE() #创建BLE设备
ble.active(True) #打开BLE(此时设备将处于就绪态)
#设置BLE广播数据并开始广播(开始广播后设备将处于广播态)
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42') 蓝牙设备通常会有蓝牙连接,断开连接,收到数据等事件,在MicroPython中,通过中断程序来处理这些事件,代码如下:
from machine import Pin
from time import sleep_ms
import ubluetooth #导入BLE功能模块
ble = ubluetooth.BLE() #创建BLE设备
ble.active(True) #打开BLE(此时设备将处于就绪态)
#设置BLE广播数据并开始广播(开始广播后设备将处于广播态)
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42')
#定义一个函数,用作蓝牙事件中断
def ble_irq(event, data): # 蓝牙中断函数
if event == 1: #蓝牙已连接(此时蓝牙将处于连接态)
print("BLE 连接成功")
elif event == 2: #蓝牙断开连接(此时蓝牙将从链接态进入就绪态)
print("BLE 断开连接")
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42')#再次启动广播
elif event == 3: # 收到新write消息
print("BLE 收到新消息")
ble.irq(ble_irq) #注册蓝牙中断函数 上述代码实现了简单的蓝牙事件处理,定义了一个中断函数,用来处理中断事件。当蓝牙连接成功时,将触发事件ID为1的事件,此时蓝牙设备将从广播态转换成连接态。当主机设备主动断开,或者其他因素断开连接后,将处于事件ID为2的事件,此时设备将从连接态进入就绪态,要想设备能够继续广播被别的设别发现,需要在蓝牙断开事件中再次启动广播,使设备再次进入广播态。
当蓝牙设备收到数据后,将触发事件ID为3的事件,可在此事件中进行数据处理。
如果你觉得该文章对你有帮助,欢迎点赞收藏!
下一章节:蓝牙服务和特性的创建!