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

BT_LE_ADV_CONN_ONE_TIME 参数详解

目录

概述

1 参数介绍

1.1 参数本质

1.2 核心特性

1.3 使用场景

2 应用方法

2.1 广播功能(Zephyr)

2.2 超时控制

2.3  典型工作流程

3  注意事项


概述

在蓝牙低功耗(BLE)协议栈中(如Zephyr RTOS),BT_LE_ADV_CONN_ONE_TIME 是一个组合广播选项,用于配置一次性可连接广播的行为。此参数是BLE设备实现按需广播节能优化的关键机制,特别适合物联网设备场景。

1 参数介绍

1.1 参数本质

#define BT_LE_ADV_CONN_ONE_TIME (BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME)
  • 由两个核心选项组合而成:

    • BT_LE_ADV_OPT_CONNECTABLE:允许其他设备连接

    • BT_LE_ADV_OPT_ONE_TIME:广播仅执行一次(超时或连接后自动停止)


    注意:

    在Zephyr的蓝牙API中,广播选项定义在`zephyr/include/bluetooth/bluetooth.h`中:

    ### 在Zephyr中的广播选项宏定义在Zephyr的蓝牙API中,广播选项定义在`zephyr/include/bluetooth/bluetooth.h`中:

    enum {

    BT_LE_ADV_OPT_CONNECTABLE = BIT(0),

    BT_LE_ADV_OPT_USE_IDENTITY = BIT(1),

    BT_LE_ADV_OPT_ONE_TIME = BIT(2), BT_LE_ADV_OPT_DIR_MODE_LOW_DUTY = BIT(3), BT_LE_ADV_OPT_DIR_ADDR_RPA = BIT(4), BT_LE_ADV_OPT_FILTER_SCAN_REQ = BIT(5),

    BT_LE_ADV_OPT_FILTER_CONN = BIT(6), BT_LE_ADV_OPT_NOTIFY_SCAN_REQ = BIT(7),

    BT_LE_ADV_OPT_USE_NAME = BIT(8), BT_LE_ADV_OPT_DIR_MODE_HIGH_DUTY = BIT(9),

    BT_LE_ADV_OPT_EXT_ADV = BIT(10),

    BT_LE_ADV_OPT_NO_2M = BIT(11),

    BT_LE_ADV_OPT_CODED = BIT(12),

    BT_LE_ADV_OPT_ANONYMOUS = BIT(13),

    BT_LE_ADV_OPT_DISABLE_CHAN_37 = BIT(14), BT_LE_ADV_OPT_DISABLE_CHAN_38 = BIT(15), BT_LE_ADV_OPT_DISABLE_CHAN_39 = BIT(16),

    };

1.2 核心特性

特性说明
广播行为设备以可连接方式广播,但仅广播一次
自动停止条件满足任一条件即停止:
- 达到预设超时时间
- 被其他设备成功连接
资源占用避免长期占用广播信道,节省功耗
不可重启停止后需重新调用bt_le_adv_start()才能再次广播

1.3 使用场景

  • 快速配对:设备上电后广播30秒等待连接,超时后休眠

  • 安全敏感操作:固件升级时临时开放连接窗口,完成后自动关闭

  • 事件触发广播:按键按下后广播10秒,无连接则自动停止

  • 低功耗设备:电池供电设备需严格限制广播时间

2 应用方法

2.1 广播功能(Zephyr)

#include <bluetooth/bluetooth.h>// 广播参数配置
static const struct bt_le_adv_param *adv_param = BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME, // 关键组合BT_GAP_ADV_FAST_INT_MIN_1,  // 最小广播间隔:30msBT_GAP_ADV_FAST_INT_MAX_1,  // 最大广播间隔:50msNULL                        // 使用公共地址);// 广播数据(设备名称+标志位)
static const struct bt_data ad[] = {BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR),BT_DATA(BT_DATA_NAME_COMPLETE, "MY_DEVICE", 9),
};void start_adv(void) {int err = bt_le_adv_start(adv_param, ad, ARRAY_SIZE(ad), NULL, 0);if (err) {printk("Advertising failed (err %d)\n", err);} else {printk("One-time connectable advertising started\n");}
}

2.2 超时控制

通过 timeout 参数控制广播持续时间(单位:10ms):

// 设置广播超时为5秒 (500 * 10ms = 5000ms)
BT_LE_ADV_PARAM(BT_LE_ADV_CONN_ONE_TIME, BT_GAP_ADV_FAST_INT_MIN_1,BT_GAP_ADV_FAST_INT_MAX_1,500);  // 超时参数
  • 超时=0:使用默认超时(通常30秒)

  • 超时>0:自定义持续时间(例:100 = 1秒)

2.3  典型工作流程

 注意事项

1) 与普通广播区别

  • 常规可连接广播:需手动调用 bt_le_adv_stop() 停止

  • ONE_TIME模式:满足条件自动停止,无需手动干预

2) 状态监听

// 注册广告状态回调
bt_le_adv_cb_register(&adv_cb);static struct bt_le_adv_cb adv_cb = {.sent = on_adv_sent, // 广播停止时触发
};void on_adv_sent(void) {printk("Advertising stopped automatically\n");
}

3) 错误处理

  • 若广播未启动成功,返回错误码(如-EALREADY表示已在广播)

  • 停止后再次广播需重新初始化参数

http://www.dtcms.com/a/336682.html

相关文章:

  • Spring 创建 Bean 的 8 种主要方式
  • [创业之路-556]:创新的本质是赚不确定性带来的潜在价值,把不确定性逐步转化确定性,周而复始。
  • 产品设计.Ai产品经理
  • 48.Seata认识、部署TC服务、微服务集成
  • 网络中的一些基本概念
  • Conda 环境 在AI 私有化部署 有怎么用?
  • 微信小程序 小白gps工具v0.01 使用说明
  • react echarts图表监听窗口变化window.addEventListener(‘resize’)与ResizeObserver()
  • python -基础(5)组合数据类型
  • 每日两道算法题:DAY3
  • java常见的数据加密
  • 当 AI 开始 “理解” 情感:情感计算技术正在改写人机交互规则
  • Linux 服务:iSCSI 存储服务配置全流程指南
  • 廖雪峰-Java教程-Part02
  • C#高级语法_委托
  • 力扣第463场周赛
  • 17-线程
  • uC/OS - III 系统DEBUG时内核对象统计信息
  • 模拟实现 useEffect 功能
  • 配置 NVIDIA RTX 5090 + sm_120 + flashattention,已跑通一个大模型 ~~
  • clion 如何调试 redis(在 mac 上)
  • AMBA-AXI and ACE协议详解(三)
  • 期望分位数回归模型
  • 利用pypy加速pyxlsbwriter生成xlsb文件
  • 五、redis入门 之 客户端连接redis
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(3):21-30语法
  • 雷卯针对香橙派Orange Pi Kunpeng Pro开发板防雷防静电方案
  • CloudBeaver:基于浏览器的DBeaver
  • 机器学习案例——对好评和差评进行预测
  • 当AI替我“搬砖”,我的价值是什么?