Zephyr 中的 bt_le_per_adv_set_data 函数的介绍和应用方法

目录

概述

1 函数接口介绍

1.1 函数原型

1.2 功能详解

2 使用方法

2.1 创建流程

2.1.1 创建扩展广播实例

2.1.2 设置周期性广播数据

2.1.3 配置周期性广播参数

2.1.4 启动广播

2.2 主流程函数

2.3 关键配置 (prj.conf)

3 高级用法

3.1 大数据分片传输

3.2 动态数据更新

3.3 多广播集数据同步

4 应用场景

4.1 LE Audio 广播

4.2 电子货架标签系统

4.3 工业传感器网络

5 性能优化技巧

5.1 数据压缩:

5.2 增量更新:

5.3 自适应间隔:

6 常见问题和解决方案


概述

bt_le_per_adv_set_data() 是 Zephyr RTOS 蓝牙协议栈中用于设置周期性广播数据的关键函数。它允许设备配置周期性广播的数据内容,这是蓝牙 5.0 及以上版本支持的高级特性。该函数是实现高效周期性广播系统的核心,通过合理设计数据结构和更新机制,可以构建从低功耗传感器网络到高质量音频广播等各种应用。

1 函数接口介绍

1.1 函数原型

int bt_le_per_adv_set_data(struct bt_le_ext_adv *adv, const uint8_t *data, uint8_t len);

参数说明

参数类型说明
advstruct bt_le_ext_adv*指向已创建的扩展广播实例的指针
dataconst uint8_t*周期性广播数据缓冲区
lenuint8_t数据长度(最大 252 字节)

返回值

返回值说明
0设置成功
-EINVAL无效参数
-ENOMEM内存不足
-EIO底层 HCI 错误

1.2 功能详解

1) 配置周期性广播内容

  • 定义周期性广播中传输的实际数据内容

  • 数据格式遵循标准蓝牙 AD 结构(长度-类型-值)

2) 与主广播分离

  • 周期性广播数据独立于主扩展广播数据

  • 允许传输更大、更频繁更新的数据集

3)  数据格式要求

  • 必须符合蓝牙 SIG 定义的 AD 数据结构

  • 典型结构:

    // 示例数据格式
    uint8_t per_adv_data[] = {0x02, BT_DATA_FLAGS, BT_LE_AD_NO_BREDR,           // 广播标志0x0A, BT_DATA_MANUFACTURER_DATA, 0xCD, 0x01, ...  // 厂商自定义数据0x10, BT_DATA_SVC_DATA16, 0xAA, 0xFE, ...         // 服务数据
    };

2 使用方法

2.1 创建流程

2.1.1 创建扩展广播实例

#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/gap.h>static struct bt_le_ext_adv *adv;// 创建扩展广播实例
int create_adv_instance(void)
{struct bt_le_adv_param adv_params = {.id = BT_ID_DEFAULT,.sid = 1,.secondary_max_skip = 0,.options = BT_LE_ADV_OPT_EXT_ADV | BT_LE_ADV_OPT_PERIODIC,.interval_min = BT_GAP_ADV_SLOW_INT_MIN,.interval_max = BT_GAP_ADV_SLOW_INT_MAX,};return bt_le_ext_adv_create(&adv_params, NULL, &adv);
}

2.1.2 设置周期性广播数据

// 设置周期性广播数据
int set_periodic_data(void)
{// 示例:温度传感器数据uint8_t temp_data[] = {0x02, BT_DATA_FLAGS, BT_LE_AD_NO_BREDR,          // 广播标志0x03, BT_DATA_TEMP_SERVICE, 0xAA, 0xBB,          // 温度服务标识0x05, BT_DATA_SENSOR_VALUE, 0x00, 0x00, 0x00, 0x00 // 4字节温度值};// 更新温度值(小端格式)float temperature = 23.5f;memcpy(&temp_data[8], &temperature, sizeof(float));return bt_le_per_adv_set_data(adv, temp_data, sizeof(temp_data));
}

2.1.3 配置周期性广播参数

// 配置周期性广播参数
int config_periodic_adv(void)
{struct bt_le_per_adv_param per_adv_params = {.interval_min = BT_GAP_PER_ADV_SLOW_INT_MIN, // 1.28秒.interval_max = BT_GAP_PER_ADV_SLOW_INT_MIN, // 固定间隔.options = BT_LE_PER_ADV_OPT_USE_TX_POWER,  // 包含发射功率};return bt_le_per_adv_set_param(adv, &per_adv_params);
}

2.1.4 启动广播

// 启动广播
int start_advertising(void)
{int err;// 启动扩展广播struct bt_le_ext_adv_start_param ext_adv_params = {0};if ((err = bt_le_ext_adv_start(adv, &ext_adv_params))) {return err;}// 启动周期性广播return bt_le_per_adv_start(adv);
}

2.2 主流程函数

void main(void)
{bt_enable(NULL); // 初始化蓝牙create_adv_instance();set_periodic_data();config_periodic_adv();start_advertising();while (1) {k_sleep(K_SECONDS(30));update_sensor_data(); // 定期更新广播数据}
}// 更新传感器数据
void update_sensor_data(void)
{// 1. 停止周期性广播bt_le_per_adv_stop(adv);// 2. 更新数据set_periodic_data();// 3. 重新启动bt_le_per_adv_start(adv);
}

2.3 关键配置 (prj.conf)

# 基础蓝牙配置
CONFIG_BT=y
CONFIG_BT_DEBUG_LOG=y# 扩展广播和周期性广播
CONFIG_BT_EXT_ADV=y
CONFIG_BT_PER_ADV=y# 增加缓冲区大小
CONFIG_BT_BUF_ACL_TX_SIZE=255
CONFIG_BT_BUF_ACL_RX_SIZE=255# 支持的最大广播集
CONFIG_BT_EXT_ADV_MAX_ADV_SET=2

3 高级用法

3.1 大数据分片传输

#define CHUNK_SIZE 200
uint8_t large_data[1000]; // >252字节的数据void send_large_data(void)
{for (int i = 0; i < sizeof(large_data); i += CHUNK_SIZE) {uint8_t chunk_len = MIN(CHUNK_SIZE, sizeof(large_data) - i);uint8_t adv_data[2 + CHUNK_SIZE] = {0x01, BT_DATA_SEQ_DATA, // 自定义分片标识(i / CHUNK_SIZE) & 0xFF // 分片序号};memcpy(&adv_data[2], &large_data[i], chunk_len);bt_le_per_adv_set_data(adv, adv_data, chunk_len + 2);k_sleep(K_MSEC(50)); // 等待传输完成}
}

3.2 动态数据更新

// 无中断更新数据
void update_data_seamlessly(void)
{// 1. 准备新数据uint8_t new_data[200] = {...};// 2. 设置新数据bt_le_per_adv_set_data(adv, new_data, sizeof(new_data));// 注意:无需停止/重启广播,数据会自动更新
}

3.3 多广播集数据同步

struct bt_le_ext_adv *adv1, *adv2;void sync_adv_data(void)
{uint8_t shared_data[] = {...};// 为多个广播集设置相同数据bt_le_per_adv_set_data(adv1, shared_data, sizeof(shared_data));bt_le_per_adv_set_data(adv2, shared_data, sizeof(shared_data)));
}

4 应用场景

4.1 LE Audio 广播

// 配置LE音频广播数据
int setup_le_audio_broadcast(void)
{uint8_t audio_data[] = {// 基础音频配置0x06, BT_DATA_LE_AUDIO_BROADCAST, 0x01, 0x00, // 广播ID0x02,       // 音频编码: LC30x02, 0x01, // 采样率48kHz// 附加信息0x05, BT_DATA_LE_AUDIO_METADATA,0x01, 0x02, 0x03, 0x04};return bt_le_per_adv_set_data(adv, audio_data, sizeof(audio_data));
}

4.2 电子货架标签系统

void update_esl_data(uint16_t product_id, uint32_t price)
{uint8_t esl_data[] = {0x01, 0x12, // 自定义ESL标识(product_id >> 8) & 0xFF, product_id & 0xFF,(price >> 24) & 0xFF, (price >> 16) & 0xFF,(price >> 8) & 0xFF, price & 0xFF};bt_le_per_adv_set_data(adv, esl_data, sizeof(esl_data));
}

4.3 工业传感器网络

void broadcast_sensor_readings(float temp, float humidity, uint32_t pressure)
{uint8_t sensor_data[15] = {0x02, BT_DATA_MANUFACTURER_DATA, 0xCD, 0x01, // 厂商ID};// 小端格式打包数据memcpy(&sensor_data[4], &temp, 4);memcpy(&sensor_data[8], &humidity, 4);memcpy(&sensor_data[12], &pressure, 4);bt_le_per_adv_set_data(adv, sensor_data, sizeof(sensor_data));
}

5 性能优化技巧

5.1 数据压缩

// 使用紧凑数据格式
uint8_t compressed_data[10] = {0x01, 0xAB, // 数据类型标识(int8_t)(temp * 2),   // 1字节温度 (-128~127°C, 0.5°C精度)(uint8_t)humidity,    // 1字节湿度 (0-100%)(pressure >> 16) & 0xFF, (pressure >> 8) & 0xFF, pressure & 0xFF // 3字节压力
};

5.2 增量更新

// 仅发送变化的数据
if (fabs(temp - last_temp) > 0.1f) {update_temp_in_adv_data(temp);bt_le_per_adv_set_data(adv, current_data, data_len);last_temp = temp;
}

5.3 自适应间隔

// 根据数据变化率调整广播间隔
void adjust_broadcast_interval(float change_rate)
{uint32_t new_interval = MAX(BT_GAP_PER_ADV_FAST_INT_MIN,MIN(BT_GAP_PER_ADV_SLOW_INT_MAX,1000 / change_rate // 基于变化率计算));struct bt_le_per_adv_param params = {.interval_min = new_interval,.interval_max = new_interval};bt_le_per_adv_set_param(adv, &params);
}

6 常见问题和解决方案

1) 数据设置失败 (错误 -22/EINVAL)

  • 检查数据长度:确保不超过 252 字节

  • 验证数据结构:确认 AD 结构格式正确(长度值匹配后续数据)

  • 确认广播实例状态:必须在启动周期性广播前设置数

2) 接收端无法解析数据

  • 包含必要标识:确保数据中包含广播标志 (0x01)

  • 添加设备名称:包含完整或简称设备名

  • 使用标准数据类型:优先使用 SIG 定义的 AD 类型

3) 数据更新延迟

  • 减少广播间隔:使用更短的间隔参数

  • 优化更新流程

    // 高效更新流程
    void efficient_update(uint8_t *new_data, uint8_t len)
    {// 无需停止广播即可更新数据bt_le_per_adv_set_data(adv, new_data, len);// 强制刷新(某些控制器需要)bt_le_per_adv_stop(adv);k_sleep(K_MSEC(5));bt_le_per_adv_start(adv);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93759.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ansible 角色管理指南

Ansible 角色管理指南 实验环境设置 以下命令用于准备实验环境&#xff0c;创建一个工作目录并配置基本的Ansible设置&#xff1a; # 创建web工作目录并进入 [azurewhiskycontroller ~]$ mkdir web && cd web# 创建Ansible配置文件 [azurewhiskycontroller web]$ cat &…

【补充】数据库中有关系统编码和校验规则的简述

一、字符集和校验规则&#xfeff;1.创建数据库案例数据库创建方法&#xff1a;使用CREATE DATABASE语句创建数据库字符集指定方式&#xff1a;通过CHARACTER SETutf8指定数据库编码格式默认配置说明&#xff1a;未指定字符集时默认使用utf8和utf8_general_ci配置文件位置&…

计算机网络 HTTP1.1、HTTP2、HTTP3 的核心对比及性能分析

以下是 HTTP/1.1、HTTP/2、HTTP/3 的核心对比及性能分析&#xff0c;重点关注 HTTP/3 的性能优势&#xff1a;&#x1f4ca; HTTP 协议演进对比表特性HTTP/1.1 (1997)HTTP/2 (2015)HTTP/3 (2022)传输层协议TCPTCPQUIC (基于 UDP)连接建立TCP 三次握手 TLS 握手 (高延迟)同 HTT…

【计算机视觉与深度学习实战】07基于Hough变换的答题卡识别技术:原理、实现与生物识别拓展(有完整代码)

1. 引言 在人工智能和计算机视觉快速发展的今天,自动化图像识别技术已经渗透到社会生活的各个角落。从工业质检到医学影像分析,从自动驾驶到教育评估,计算机视觉技术正在重塑我们与数字世界的交互方式。在这众多应用中,答题卡识别技术作为教育信息化的重要组成部分,承载着…

《WASM驱动本地PDF与Excel预览组件的深度实践》

WASM为何能成为本地文件解析的核心载体,首先需要跳出“前端只能处理轻量任务”的固有认知,从“性能与兼容性平衡”的角度切入。PDF与Excel这类文件格式的解析,本质是对复杂二进制数据的解码与重构——PDF包含嵌套的对象结构、字体渲染规则和矢量图形描述,Excel则涉及单元格…

Oracle Free 实例重装系统操作指南

之前申请了两台 x86 架构的 Oracle 机器&#xff0c;偶尔用来部署开源项目测试&#xff0c;有一台在测试 SSH 相关功能时 “变砖”&#xff0c;网上看重装系统发现很繁琐就没去打理&#xff0c;近期又想到这个机器&#xff0c;发现去年就有了官方重装方法&#xff0c;简单配置下…

Linux 基础指令与权限管理

一、Linux 操作系统概述1.1 操作系统的核心价值操作系统的本质是 "使计算机更好用"。它作为用户与硬件之间的中间层&#xff0c;负责内存管理、进程调度、文件系统管理和设备驱动管理等核心功能&#xff0c;让用户无需直接操作硬件即可完成复杂任务。在服务器领域&am…

深度学习-167-MCP技术之工具函数的设计及注册到MCP服务器的两种方式

文章目录 1 MCP协议概述 1.1 MCP的原理 1.2 两种主要的通信模式 2 工具函数的设计与实现 2.1 tools.py(工具函数) 2.2 工具函数的设计原则 2.3 工具函数的测试 3 MCP服务器的构建与配置 3.1 安装mcp库 3.2 main.py(MCP服务器) 3.2.1 方式一(add_tool方法) 3.2.2 方式二(@mcp.to…

哈希:两数之和

问题描述&#xff1a;在一个整数数组中&#xff0c;找到两数之和为target的两个值&#xff0c;返回找到的两个值的下标。 nums[3,3] target6 返回&#xff1a;[0,1] 说明&#xff1a;返回结果&#xff0c;索引无顺序要求&#xff1b;有唯一的答案&#xff1b;不能使用两次相…

PHP反序列化的CTF题目环境和做题复现第5集_POP链构造4

1 题目 下载yii2.0.37版本,https://github.com/yiisoft/yii2/releases/tag/2.0.37 放在phpstudy的www目录下或ubuntu的/var/www/html的目录下。 3 EXP <?php namespace PHPUnit\Framework\MockObject{class MockTrait {private $classCode = "system(whoami);php…

广东省省考备考(第八十一天8.19)——资料分析、数量(强化训练)

资料分析 错题解析解析解析解析解析今日题目正确率&#xff1a;67% 数量&#xff1a;数学运算解析解析解析标记题解析今日题目正确率&#xff1a;80%

决策树剪枝及数据处理

一、核心决策树算法&#xff08;3 类主流算法&#xff09;1. ID3 算法&#xff1a;用 “信息增益” 选属性ID3 是决策树的 “开山鼻祖” 之一&#xff0c;它的核心逻辑是 “选能让数据最‘纯’的属性”—— 这里的 “纯” 用 “信息增益” 衡量。简单说&#xff0c;“信息增益”…

Ansible 角色管理

环境准备# 创建一个叫web的文件夹并进入&#xff08;相当于新建一个工作目录&#xff09;[lykcontroller ~]$ mkdir web && cd web​# 创建Ansible的配置文件ansible.cfg[lykcontroller web]$ cat > ansible.cfg <<EOF[defaults]remote_user lykinventory .…

Java面试准备指南!

现在已经是8月中旬了&#xff0c;秋招马上就要开始了&#xff0c;不知道大家准备好了吗&#xff1f;现阶段找工作真的是千军万马过独木桥&#xff0c;没有真本事&#xff0c;真的会被淘汰掉&#xff0c;现实就是如此的残酷&#xff01; 为了能够帮助到大家在秋招Java面试中脱颖…

Encoder-Decoder Model编码器-解码器模型

Encoder-Decoder编码器-解码器是一种深度学习模型&#xff0c;应用于图像处理、语音识别、自然语言处理等领域。主要由编码器和解码器两部分组成&#xff0c;这种结构能够处理序列到序列的任务。编码器-解码器模型具备独特的双阶段处理&#xff0c;先对输入信息进行编码&#x…

Python函数总结

目录 一、普通函数 1.1 函数的定义与调用 1.2 函数的说明文档 1.3 函数的参数 1.4 函数的返回值 二、函数的作用域和关键字 2.1 局部作用域 2.2 全局作用域 2.4 global关键字和nonlocal关键字的使用 三、函数的递归与嵌套 3.1 嵌套函数 3.2递归函数 四、函数名的应…

sqlite-gui:一款开源免费、功能强大的SQLite开发工具

sqlite-gui 是一个轻量级的 SQLite 编辑器&#xff0c;基于 C/mingw64/WinAPI 开发&#xff0c;支持 Windows 平台。 sqlite-gui 是一个免费开源的项目&#xff0c;代码托管在 GitHub&#xff1a; https://github.com/little-brother/sqlite-gui 功能特性 支持 SQL 语法高亮…

Ethan独立开发新品速递 | 2025-08-19

每日精选Product Hunt上最值得关注的独立产品&#xff0c;发现全球创新灵感&#xff0c;助力你的产品成长。 下面挑选出对独立开发者最有参考价值的 10 个项目&#xff0c;侧重开发工具、AI 工具、SaaS 和创业支持类产品&#xff0c;去除娱乐、小众垂直和大公司产品。每条保留原…

从 Hive 数仓出发,全面剖析 StarRocks、MySQL、HBase 的使用场景与区别

以 Hive 数仓为底座,深入理解 StarRocks、MySQL 和 HBase 的区别与使用场景 一、前言 在现代大数据架构中,Hive 通常作为离线数仓的核心底座,负责批量数据的接入、清洗、计算与存储。然而,为了满足 实时计算、低延迟查询、业务交互型操作和高并发存储 等不同需求,我们往…

低延迟、跨平台与可控性:直播SDK的模块化价值解析

引言 音视频直播已经从单纯的娱乐应用&#xff0c;成长为产业级的实时交互基础设施。无论是安防监控的秒级告警联动、工业巡检的远程可视化操作&#xff0c;还是智慧教育中的多终端互动课堂、远程医疗里的超低延迟手术协作&#xff0c;都离不开一条低延迟、高稳定性、跨平台可…