【低功耗蓝牙】② 状态切换和事件处理
我是鹏老师
2022年01月28日 22:33
收录于文集
共6篇

摘要

本文章主要介绍低功耗蓝牙的状态机和状态切换机制,以及蓝牙的事件处理,是同学们理解后面内容的基础。

蓝牙状态机

蓝牙链路层的状态机有五种状态,分别是就绪态广播态链接态扫描态发起链接态,各个状态间的转换路径如下图所示:

蓝牙状态机

以手机连接某个蓝牙模块为例,手机作为主机设备,蓝牙模块作为从机设备。上电之后二者都将处于就绪态,蓝牙模块设置广播数据并开始广播后将转换到广播态手机扫描附近范围内的蓝牙设备时,手机将处于扫描态,手机尝试连接某个设备时,手机的蓝牙处于发起连接态,连接成功后,二者将都处于链接态

断开连接之后,二者将都再回到就绪态

状态切换示例代码

下面是上一篇文章蓝牙广播的代码:

代码块
Python
自动换行
复制代码
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中,通过中断程序来处理这些事件,代码如下:

代码块
Python
自动换行
复制代码
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的事件,可在此事件中进行数据处理。

如果你觉得该文章对你有帮助,欢迎点赞收藏!

下一章节:蓝牙服务和特性的创建!