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

zephyr RTOS 中 bt_le_adv_start函数的功能应用

目录

概述

1 功能

1.1 功能介绍

1.2 函数原型

2 参数说明

2.1 广播参数(bt_le_adv_param)

2.2 常用广播选项(options)

2.3 广播数据(bt_data)

3 示例代码

3.1 启动可连接广播(带设备名称)

 3.2 启动不可连接广播(iBeacon 示例)

4 常见问题

4.1 广播无法启动?

4.2  如何停止广播?

4.3 如何动态修改广播数据?

总结


概述

bt_le_adv_start 是一个函数名称,通常出现在蓝牙低功耗(Bluetooth Low Energy, BLE)相关的开发中,特别是在嵌入式系统或蓝牙协议栈的实现中。它的功能是启动蓝牙低功耗(BLE)设备的广播(Advertising)

Advertising的功能说明:


  1. 启动广播

    • 使BLE设备开始发送广播数据包,以便其他设备(如智能手机、扫描器)可以发现它。

    • 广播是BLE设备向外宣告自身存在的主要方式。

  2. 参数配置

    • 通常需要传入广播参数(如广播间隔、广播类型、广播数据等)。

    • 例如:

      • 广播类型:可连接广播(Connectable)、非可连接广播(Non-connectable)、定向广播(Directed)等。

      • 广播数据:设备名称、服务UUID、制造商数据等。

  3. 返回值

    • 通常返回一个错误码(如 0 表示成功,非零值表示失败)。

典型使用场景:

  • 在BLE设备初始化后调用此函数,开始被其他设备扫描或连接。

  • 例如:智能手环、信标(Beacon)、传感器设备等

1 功能

1.1 功能介绍

bt_le_adv_start() 用于:

  1. 启动 BLE 广播,使设备可被其他 BLE 设备(如手机、扫描器)发现。

  2. 配置广播参数,如广播类型、间隔、广播数据等。

  3. 支持多种广播模式,如可连接广播、非可连接广播、定向广播等。

  • 通常需要传入广播参数(如广播间隔、广播类型、广播数据等)。

  • 例如:

    • 广播类型:可连接广播(Connectable)、非可连接广播(Non-connectable)、定向广播(Directed)等。

    • 广播数据:设备名称、服务UUID、制造商数据等。

典型使用场景:

  • 在BLE设备初始化后调用此函数,开始被其他设备扫描或连接。

  • 例如:智能手环、信标(Beacon)、传感器设备等。

1.2 函数原型

int bt_le_adv_start(const struct bt_le_adv_param *param,
                    const struct bt_data *ad, size_t ad_len,
                    const struct bt_data *sd, size_t sd_len);

参数说明

参数类型说明
paramconst struct bt_le_adv_param *广播参数(类型、间隔等)
adconst struct bt_data *广播数据(Advertising Data)
ad_lensize_t广播数据长度
sdconst struct bt_data *扫描响应数据(Scan Response Data,可选)
sd_lensize_t扫描响应数据长度

返回值

  • 0:广播启动成功。

  • 负值:错误码(如 -EINVAL 参数无效,-ENOMEM 内存不足等)。

2 参数说明

2.1 广播参数(bt_le_adv_param

struct bt_le_adv_param {
    uint8_t  id;            // 广播标识(通常为 0)
    uint32_t options;       // 广播选项(如 `BT_LE_ADV_OPT_CONNECTABLE`)
    uint16_t interval_min;  // 最小广播间隔(单位:0.625ms)
    uint16_t interval_max;  // 最大广播间隔(单位:0.625ms)
    uint8_t  peer[6];       // 定向广播的目标地址(可选)
};

2.2 常用广播选项(options

选项说明
BT_LE_ADV_OPT_CONNECTABLE可连接广播(允许设备连接)
BT_LE_ADV_OPT_USE_NAME自动包含设备名称在广播数据中
BT_LE_ADV_OPT_SCANNABLE允许扫描请求(Scan Request)
BT_LE_ADV_OPT_DIR_MODE_LOW_DUTY低占空比定向广播

 

2.3 广播数据(bt_data

广播数据采用 Advertising Data (AD) 格式,通常包括:

  • 设备名称

  • 服务 UUID

  • 制造商特定数据(如 Beacon 数据)

struct bt_data {
    uint8_t type;   // 数据类型(如 `BT_DATA_NAME_COMPLETE`)
    uint8_t data_len;
    const uint8_t *data;
};

常用广播数据类型(type

类型说明
BT_DATA_FLAGSBLE 广播标志(如 BT_LE_AD_GENERAL
BT_DATA_NAME_COMPLETE完整设备名称
BT_DATA_UUID16_ALL16-bit UUID 列表
BT_DATA_MANUFACTURER_DATA自定义厂商数据

 

3 示例代码

3.1 启动可连接广播(带设备名称)

#include <bluetooth/bluetooth.h>
#include <bluetooth/gap.h>

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, DEVICE_NAME, sizeof(DEVICE_NAME) - 1),
};

int start_advertising(void) {
    struct bt_le_adv_param *adv_param = BT_LE_ADV_PARAM(
        BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_USE_NAME,
        BT_GAP_ADV_FAST_INT_MIN_2,  // 100ms (min)
        BT_GAP_ADV_FAST_INT_MAX_2,   // 150ms (max)
        NULL                         // 无目标设备
    );

    int err = bt_le_adv_start(adv_param, ad, ARRAY_SIZE(ad), NULL, 0);
    if (err) {
        printk("Advertising failed (err %d)\n", err);
        return err;
    }

    printk("Advertising started\n");
    return 0;
}

 3.2 启动不可连接广播(iBeacon 示例)

static const struct bt_data ad[] = {
    BT_DATA_BYTES(BT_DATA_MANUFACTURER_DATA, 
        0x4C, 0x00, // Apple Company ID
        0x02, 0x15, // iBeacon type
        // UUID, Major, Minor, TX Power
        0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
        0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
        0x00, 0x01, // Major
        0x00, 0x02, // Minor
        0xC8        // TX Power (-56 dBm)
    ),
};

int start_beacon(void) {
    struct bt_le_adv_param *adv_param = BT_LE_ADV_PARAM(
        0, // 非可连接
        BT_GAP_ADV_FAST_INT_MIN_2,
        BT_GAP_ADV_FAST_INT_MAX_2,
        NULL
    );

    int err = bt_le_adv_start(adv_param, ad, ARRAY_SIZE(ad), NULL, 0);
    if (err) {
        printk("Beacon failed (err %d)\n", err);
        return err;
    }

    printk("iBeacon advertising started\n");
    return 0;
}

4 常见问题

4.1 广播无法启动?

  • 检查 bt_enable() 是否已成功调用。

  • 确保广播参数合法(如 interval_min <= interval_max)。

  • 检查广播数据是否超过 31 字节限制。

4.2  如何停止广播?

int bt_le_adv_stop(void);

4.3 如何动态修改广播数据?

先停止广播,修改数据后再重新启动:

bt_le_adv_stop();
// 修改 ad[] 数据
bt_le_adv_start(new_param, new_ad, new_len, NULL, 0);

总结

功能API
启动广播bt_le_adv_start()
停止广播bt_le_adv_stop()
广播参数struct bt_le_adv_param
广播数据struct bt_data

在 Zephyr 中,bt_le_adv_start() 是 BLE 开发的核心 API,用于控制设备的可发现性和广播内容。

相关文章:

  • 基础知识:离线安装docker、docker compose
  • Docker 代理配置全攻略:从入门到企业级实践
  • iOS设备文件管理实践
  • 【数据分享】1981-2024年全国各城市逐日、逐月、逐年平均气温(Shp格式)
  • 高性能内存kv数据库Redis
  • 个人博客系统
  • 【转载翻译】Open3D和PCL的一些比较
  • 如何协调跨部门资源争夺
  • 【KWDB 创作者计划】_产品技术解读_1
  • 谈谈 typescript 中 namespace 的理解
  • AQchat
  • Vite配置postcss-px-to-viewport
  • 代理模式简述
  • 贪心算法(19)(java)重构字符串
  • 银河麒麟系统添加开机自启动
  • 【AI】使用Huggingface模型实现文本内容摘要器
  • DeepSeek 接入 Word 完整教程
  • shell 编程之循环语句
  • UNet深度学习实战遥感图像语义分割
  • 孟加拉slot游戏出海代投FB脸书广告策略
  • 特写|为何这么多人喜欢上海半马,答案藏在他们的笑容里
  • 菲律宾群岛地区发生5.6级地震,震源深度20千米
  • 云南昆明市副市长戴惠明已任市委常委、秘书长
  • 经济日报:从三个变化看外贸破局之道
  • 行拘!如此引流诱导违法犯罪不该被纵容
  • 云南:近两千亩拍得土地因规划变更不得开发,政府要求转型、企业无力为继