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
英文地址,請注明出處:http://en.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;都離不開一條低延遲、高穩定性、跨平臺可…