当前位置: 首页 > news >正文

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_disablebt_enablebt_resetbt_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);

功能说明

  1. 停止蓝牙协议栈:关闭所有蓝牙活动

  2. 释放资源:释放蓝牙协议栈占用的资源

  3. 断开连接:如果存在活跃连接,会先断开所有连接

  4. 停止广告/扫描:停止所有广告和扫描活动

返回值

返回值说明
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 注意事项

  1. 异步操作:禁用过程是异步的,函数返回时操作可能还未完成

  2. 回调通知:可以通过注册 bt_ready_cb 回调获取禁用完成通知

  3. 重新启用:禁用后可以再次调用 bt_enable() 重新启用蓝牙

  4. 资源清理

    • 会清理所有配对信息

    • 会断开所有活跃连接

    • 会停止所有广告和扫描

错误处理

常见错误码包括:

  • -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);

参数说明

参数类型说明
cbbt_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 内部实现流程

  1. 停止所有活动(连接、广告、扫描)

  2. 释放协议栈资源

  3. 重置控制器状态

  4. 重新初始化协议栈

  5. 触发就绪回调

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 注意事项

  1. 异步操作:重置过程是异步的,函数返回时操作可能还未完成

  2. 状态恢复:重置完成后会触发 bt_ready_cb_t 回调(如果通过 bt_enable() 设置了)

  3. 连接中断:所有现有连接将被断开

  4. 配对信息

    • 默认情况下会保留配对信息

    • 可通过 bt_unpair() 明确清除

  5. 与 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;}// 其他应用初始化
}

http://www.xdnf.cn/news/611389.html

相关文章:

  • [linux] git强行拉取并覆盖
  • VR全景制作方法都有哪些?需要注意什么?
  • IT | 词汇科普手册Ⅱ
  • Leetcode 3313. 查找树中最后标记的节点
  • FreeGPT+内网穿透外网远程连接使用,搞定ChatGPT访问难题!
  • LPRNet实现车牌识别并完成ONNX和TensorRT推理
  • 怎么判断一个Android APP使用了Electron 这个跨端框架
  • 【动态规划】5 从一次函数出发推导斜率优化dp
  • VS Code-i18n Ally国际化插件 配置百度翻译
  • 【北京盈达科技】GEO优化中的多模态了解
  • 基于 Spring Boot + Vue 的墙绘产品展示交易平台设计与实现【含源码+文档】
  • MySQL备份工具:XtraBackup
  • Vue3 + Element Plus 中修改表格当前选中行的颜色
  • Linux——网络基础概念
  • multipart/form-data
  • 光伏电站及时巡检:守护清洁能源的“生命线”
  • 图解深度学习 - 深度学习的工作原理
  • PostgreSQL中的权限管理简介
  • 【49. 字母异位词分组】
  • 各类Agent技术的发展现状和核心痛点
  • 【实测案例】碳纤维复合材料成型过程温度及应变变化监测
  • Docker部署OpenSearch集群
  • git初始化及操作指南
  • 4408. 李白打酒加强版(dp)
  • Redis Scan代替Keys优化
  • 2025国内领先GEO服务商上海源易:AI赋能下的GEO内容创新与实践
  • Linux iSCSI存储共享实验指南
  • NFS服务小实验
  • SkyWalking启动失败:OpenSearch分片数量达到上限的完美解决方案
  • c语言字符串函数