【低功耗蓝牙】② 蓝牙状态切换和事件处理

摘要

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

蓝牙状态机

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

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

状态切换示例代码

基于ESP32芯片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') 

蓝牙事件处理

蓝牙设备通常会有蓝牙连接,断开连接,收到数据等事件,在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的事件,可在此事件中进行数据处理。

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

上一章节:【低功耗蓝牙】① 蓝牙广播数据格式分析

下一章节:【低功耗蓝牙】③ 蓝牙服务和特性的创建

作者:我是鹏老师

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值