Zephyr OS 使能和失能蓝牙协议栈的操作
目录
概述
1 重要的API接口介绍
1.1 bt_disable函数
1.1.1 功能介绍
1.1.2 使用示例
1.1.3 注意事项
1.2 bt_enable函数
1.2.1 功能介绍
1.2.2 使用示例
1.2.3 注意事项
1.3 bt_reset()函数
1.3.1 功能介绍
1.3.2 应用范例
1.3.3 注意事项
2 API函数的总结
2.1 bt_reset典型应用场景
2.2 bt_enable典型应用场景
概述
本文介绍了Zephyr RTOS中三个关键的蓝牙API接口:bt_disable
、bt_enable
和bt_reset
。bt_disable
用于禁用蓝牙协议栈,停止所有蓝牙活动并释放资源;bt_enable
用于启用和初始化蓝牙协议栈,配置默认设置并准备射频硬件;bt_reset
用于重置蓝牙协议栈,恢复到初始状态并重新初始化。每个函数的使用示例、注意事项和典型应用场景均有详细说明,帮助开发者更好地理解和使用这些API。
1 重要的API接口介绍
1.1 bt_disable函数
1.1.1 功能介绍
在 Zephyr RTOS 中,bt_disable()
函数用于禁用蓝牙协议栈。这个函数属于 Zephyr 的蓝牙主机子系统 (Bluetooth Host Subsystem) API。
函数原型:
int bt_disable(void);
功能说明
停止蓝牙协议栈:关闭所有蓝牙活动
释放资源:释放蓝牙协议栈占用的资源
断开连接:如果存在活跃连接,会先断开所有连接
停止广告/扫描:停止所有广告和扫描活动
返回值
返回值 | 说明 |
---|---|
0 | 成功禁用蓝牙 |
其他 | 错误码 (负数) |
1.1.2 使用示例
1) 基本用法
#include <zephyr/bluetooth/bluetooth.h>void disable_bluetooth(void)
{int err = bt_disable();if (err) {printk("禁用蓝牙失败 (错误 %d)\n", err);} else {printk("蓝牙已禁用\n");}
}
2) 完整生命周期示例
#include <zephyr/bluetooth/bluetooth.h>void bluetooth_lifecycle(void)
{// 初始化蓝牙int err = bt_enable(NULL);if (err) {printk("蓝牙初始化失败\n");return;}// ... 使用蓝牙功能 ...// 禁用蓝牙err = bt_disable();if (err) {printk("禁用蓝牙失败\n");}
}
1.1.3 注意事项
异步操作:禁用过程是异步的,函数返回时操作可能还未完成
回调通知:可以通过注册
bt_ready_cb
回调获取禁用完成通知重新启用:禁用后可以再次调用
bt_enable()
重新启用蓝牙资源清理:
会清理所有配对信息
会断开所有活跃连接
会停止所有广告和扫描
错误处理
常见错误码包括:
-EALREADY
: 蓝牙已经处于禁用状态
-EBUSY
: 蓝牙正在处理其他操作,无法立即禁用
-EFAULT
: 内部错误
1.2 bt_enable函数
1.2.1 功能介绍
bt_enable()
是 Zephyr RTOS 蓝牙协议栈的核心初始化函数,用于启用和初始化蓝牙协议栈。
主要功能如下:
1) 初始化蓝牙协议栈:
初始化HCI层
初始化L2CAP
初始化ATT/GATT
初始化SM(安全管理)
2) 配置默认设置:
设备名称
默认配对参数
默认连接参数
准备射频硬件:
初始化蓝牙射频控制器
设置默认发射功率
函数原型
int bt_enable(bt_ready_cb_t cb);
参数说明
参数 | 类型 | 说明 |
---|---|---|
cb | bt_ready_cb_t | 可选的就绪回调函数,当蓝牙协议栈初始化完成时调用 |
回调函数类型定义:
typedef void (*bt_ready_cb_t)(int err);
返回值
返回值 | 说明 |
---|---|
0 | 蓝牙初始化已成功启动 |
负数 | 错误码(初始化失败) |
错误代码
错误码 | 说明 |
---|---|
-EALREADY | 蓝牙已经启用 |
-ENOMEM | 内存不足 |
-EIO | 硬件初始化失败 |
-ENODEV | 蓝牙硬件不可用 |
1.2.2 使用示例
1) 基本用法
#include <zephyr/bluetooth/bluetooth.h>void main(void)
{int err = bt_enable(NULL); // 不使用回调if (err) {printk("蓝牙初始化失败 (错误 %d)\n", err);return;}printk("蓝牙初始化成功\n");
}
2) 使用回调函数
#include <zephyr/bluetooth/bluetooth.h>void bt_ready(int err)
{if (err) {printk("蓝牙初始化失败 (错误 %d)\n", err);return;}printk("蓝牙初始化成功\n");// 可以在这里开始蓝牙操作start_advertising();
}void main(void)
{int err = bt_enable(bt_ready);if (err) {printk("启动蓝牙初始化失败 (错误 %d)\n", err);return;}
}
1.2.3 注意事项
异步操作:初始化过程是异步的,函数返回时初始化可能还未完成
回调时机:回调函数在蓝牙协议栈完全初始化后调用
多次调用:如果蓝牙已经启用,再次调用会返回-EALREADY
依赖关系:需要在系统初始化完成后调用
典型使用流程
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/gap.h>static void start_advertising(void)
{struct bt_le_adv_param *adv_param = BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE,BT_GAP_ADV_FAST_INT_MIN_2,BT_GAP_ADV_FAST_INT_MAX_2,NULL);bt_le_adv_start(adv_param, NULL, 0, NULL, 0);
}void bt_ready(int err)
{if (err) {return;}start_advertising();
}void main(void)
{int err = bt_enable(bt_ready);if (err) {return;}// 其他应用初始化
}
1.3 bt_reset()函数
1.3.1 功能介绍
bt_reset()
是 Zephyr RTOS 蓝牙协议栈中的一个重要函数,用于重置蓝牙协议栈,将其恢复到初始状态。
函数原型
int bt_reset(void);
返回值
返回值 | 说明 |
---|---|
0 | 重置操作已成功启动 |
负数 | 错误码(重置失败) |
错误代码
错误码 | 说明 |
---|---|
-EBUSY | 蓝牙协议栈正忙,无法立即重置 |
-EAGAIN | 重置操作正在进行中 |
-EFAULT | 内部错误 |
功能说明
1)完全重置蓝牙协议栈:
断开所有活跃连接
停止所有广告和扫描活动
清除配对信息(取决于配置)
重置协议栈内部状态
2)重新初始化:
在重置完成后自动重新初始化蓝牙协议栈
恢复到初始就绪状态
3)资源管理:
释放并重新分配协议栈资源
重置硬件控制器状态
bt_reset
内部实现流程
停止所有活动(连接、广告、扫描)
释放协议栈资源
重置控制器状态
重新初始化协议栈
触发就绪回调
bt_reset()
是处理蓝牙异常情况和重新初始化协议栈的有效方法,比先调用bt_disable()
再调用bt_enable()
更简洁高效。
1.3.2 应用范例
1)基本用法
#include <zephyr/bluetooth/bluetooth.h>void reset_bluetooth(void)
{int err = bt_reset();if (err) {printk("蓝牙重置失败 (错误 %d)\n", err);} else {printk("蓝牙重置已启动\n");}
}
2) 完整生命周期示例
#include <zephyr/bluetooth/bluetooth.h>void bt_ready(int err)
{if (err) {printk("蓝牙初始化失败 (错误 %d)\n", err);return;}printk("蓝牙已就绪\n");
}void main(void)
{// 初始启用蓝牙bt_enable(bt_ready);// ... 运行一段时间后 ...// 重置蓝牙int err = bt_reset();if (err) {printk("重置失败\n");}
}
1.3.3 注意事项
异步操作:重置过程是异步的,函数返回时操作可能还未完成
状态恢复:重置完成后会触发
bt_ready_cb_t
回调(如果通过bt_enable()
设置了)连接中断:所有现有连接将被断开
配对信息:
默认情况下会保留配对信息
可通过
bt_unpair()
明确清除与
bt_disable()
的区别:
bt_disable()
完全关闭蓝牙
bt_reset()
关闭后立即重新初始化
2 API函数的总结
函数 | 功能 | 是否释放资源 |
---|---|---|
bt_enable() | 启用蓝牙 | 分配资源 |
bt_disable() | 禁用蓝牙 | 释放资源 |
bt_reset() | 重置蓝牙 | 释放并重新初始化 |
2.1 bt_reset
典型应用场景
1) 协议栈恢复:
void recover_from_error(void)
{if (bt_reset() == 0) {printk("正在恢复蓝牙协议栈...\n");}
}
2)配置变更后重置:
void update_bt_config(void)
{// 更改蓝牙配置update_configuration();// 重置使配置生效bt_reset();
}
3) 低功耗管理:
void enter_low_power_mode(void)
{// 重置以降低功耗bt_reset();set_low_power_state();
}
2.2 bt_enable
典型应用场景
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/gap.h>static void start_advertising(void)
{struct bt_le_adv_param *adv_param = BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE,BT_GAP_ADV_FAST_INT_MIN_2,BT_GAP_ADV_FAST_INT_MAX_2,NULL);bt_le_adv_start(adv_param, NULL, 0, NULL, 0);
}void bt_ready(int err)
{if (err) {return;}start_advertising();
}void main(void)
{int err = bt_enable(bt_ready);if (err) {return;}// 其他应用初始化
}