zephyr架構下Bluetooth advertising接口

目錄

概述

1 函數接口

2 主要函數介紹

2.1 bt_le_adv_start函數

2.1.1 函數功能介紹

2.1.2?典型使用示例

2.1.3 廣播間隔

2.1.4?注意事項

2.2?bt_le_adv_stop 函數

2.2.1??函數功能

?2.2.2 使用方法介紹

2.2.3?實際應用示例

2.2.4?關鍵注意事項

?2.2.5?常見問題解決

2.2.6?應用總結?

2.3?bt_enable

2.3.1 函數功能

?2.3.2?典型使用模式

2.3.3?關鍵處理流程

?2.3.4?注意事項

?2.3.5?初始化失敗常見原因

2.3.6??實際應用示例

2.3.7 應用總結

2.4?bt_le_adv_update_data函數

2.4.1 函數功能

?2.4.2?典型使用場景

2.4.3?關鍵特性

?2.4.4?實現原理

2.4.5?注意事項

?2.4.6?錯誤處理最佳實踐

2.4.7?典型應用案例

2.4.8 應用總結


概述

本文主要介紹zephyr架構下Bluetooth advertising一些接口函數的功能和使用方法,這些函數是bluetooth的最重要的一些接口,掌握這些函數的用法是進行藍牙功能開發的基礎。

1 函數接口

基于zephyr OS架構下實現Bluetooth advertising功能其使用的函數接口有如下這些

函數名稱功能說明

bt_le_adv_start

實現廣播功能BLE模塊被使能后,啟用該函數進行廣播,可通過設置不同的參數,實現不同的廣播方式

bt_enable

使能BLE使能BLE的功能,該函數

bt_le_adv_stop

停止廣播關閉廣播功能,下次要重新廣播時,需要調用bt_le_adv_start

bt_le_adv_update_data

更新廣播數據

2 主要函數介紹

2.1 bt_le_adv_start函數

2.1.1 函數功能介紹

bt_le_adv_start?是藍牙低功耗 (BLE) 協議棧中的一個關鍵 API 函數,用于啟動設備的廣播(Advertising)功能。這個函數允許 BLE 設備(Peripheral 角色)向周圍設備廣播自己的存在,并攜帶相關信息。bt_le_adv_start?是 BLE 設備廣播功能的核心 API,合理配置廣播參數和數據可以優化設備發現性、連接速度和功耗表現。開發者需要根據具體應用場景(如 Beacon、可連接外設等)選擇合適的廣播模式和數據結構。

1)功能概述

  • 作用:啟動 BLE 設備的廣播功能

  • 適用角色:Peripheral(外設)或 Broadcaster(廣播者)

  • 廣播模式:可配置為可連接廣播、不可連接廣播、可掃描廣播等

  • 廣播數據:可攜帶設備名稱、服務 UUID、廠商數據等

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

3)參數說明

參數類型說明
parambt_le_adv_param*廣播參數配置(廣播類型、間隔等)
adbt_data*廣播數據(Advertising Data)
ad_lensize_t廣播數據項數量
sdbt_data*掃描響應數據(Scan Response Data)
sd_lensize_t掃描響應數據項數量

4)廣播參數配置(bt_le_adv_param)

struct bt_le_adv_param {uint8_t  id;        // 廣播集 IDuint32_t options;   // 廣播選項(如 BT_LE_ADV_OPT_CONNECTABLE)uint16_t interval_min; // 最小廣播間隔(單位:0.625ms)uint16_t interval_max; // 最大廣播間隔(單位:0.625ms)uint8_t  peer[6];   // 定向廣播的目標地址(可選)
};

常用廣播選項(options)

  • BT_LE_ADV_OPT_CONNECTABLE?- 可連接廣播

  • BT_LE_ADV_OPT_USE_NAME?- 在廣播中包含設備名稱

  • BT_LE_ADV_OPT_SCANNABLE?- 允許掃描響應

  • BT_LE_ADV_OPT_ONE_TIME?- 僅廣播一次

?5)廣播數據類型(bt_data)

struct bt_data {uint8_t type;  // 數據類型(如 BT_DATA_NAME_COMPLETE)uint8_t data_len;const uint8_t *data;
};

2.1.2?典型使用示例

1)1. 基本可連接廣播

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, DEVICE_NAME_LEN),
};static const 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_1,BT_GAP_ADV_FAST_INT_MAX_1,NULL
);bt_le_adv_start(adv_param, ad, ARRAY_SIZE(ad), NULL, 0);

2)不可連接廣播(Beacon 模式)

static const uint8_t beacon_data[] = {0x01, 0x02, 0x03, 0x04, // 廠商特定數據
};static const struct bt_data ad[] = {BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_NONCONN_IND),BT_DATA(BT_DATA_MANUFACTURER_DATA, beacon_data, sizeof(beacon_data)),
};bt_le_adv_start(BT_LE_ADV_NCONN, ad, ARRAY_SIZE(ad), NULL, 0);

2.1.3 廣播間隔

BLE 廣播間隔以?0.625ms?為單位:

  • 快速廣播:20ms - 60ms(BT_GAP_ADV_FAST_INT_MIN_1?= 32 = 20ms)

  • 慢速廣播:100ms - 150ms(BT_GAP_ADV_SLOW_INT_MIN?= 160 = 100ms)

返回值

  • 0:廣播啟動成功

  • 負值:錯誤碼(如?-EINVAL?參數錯誤,-ENOMEM?內存不足)

2.1.4?注意事項

  1. 廣播數據總長度不能超過?31 字節

  2. 掃描響應數據也受 31 字節限制

  3. 廣播間隔影響功耗和可發現性

  4. 某些廣播模式(如定向廣播)有額外限制

2.2?bt_le_adv_stop 函數

2.2.1??函數功能

bt_le_adv_stop?是藍牙低功耗 (BLE) 協議棧中的一個關鍵 API 函數,用于停止正在進行的廣播。它通常與?bt_le_adv_start?配對使用,用于控制 BLE 設備的廣播生命周期。

1)核心功能

  • 停止廣播:立即終止當前正在進行的 BLE 廣播

  • 釋放資源:釋放與廣播相關的協議棧資源

  • 配合廣播控制:通常用于動態廣播管理場景

?2)函數原型(基于 Zephyr BLE 協議棧)

int bt_le_adv_stop(void);

參數

  • 無參數:直接停止當前活躍的廣播

返回值

返回值說明
0停止廣播成功
-EALREADY當前沒有活躍的廣播
其他負值其他錯誤(如協議棧錯誤)

?2.2.2 使用方法介紹

1)?基本啟停控制

// 啟動廣播
bt_le_adv_start(...);// 一段時間后停止廣播
bt_le_adv_stop();

2)條件性停止廣播

if (need_to_stop_advertising) {int err = bt_le_adv_stop();if (err) {printk("Stop failed (err %d)\n", err);}
}

3)?廣播模式切換

// 先停止當前廣播
bt_le_adv_stop();// 更換參數后重新啟動
bt_le_adv_start(new_params, ...);

2.2.3?實際應用示例

場景:溫度傳感器按需廣播

void start_temp_advertising(void) {bt_le_adv_start(..., temp_ad_data, ...);
}void stop_advertising_when_connected(void) {// 當連接建立時自動停止廣播// 或手動調用:bt_le_adv_stop();
}void on_button_press(void) {// 按鈕按下時重新廣播bt_le_adv_stop();  // 先確保停止start_temp_advertising();
}

2.2.4?關鍵注意事項

  1. 無廣播時的調用

    如果沒有活躍的廣播,調用會返回?-EALREADY(非致命錯誤)
  2. 線程安全性

    建議在協議棧線程(如 Zephyr 的 Bluetooth 線程)上下文中調用
  3. 與連接的交互

    如果設備已通過廣播建立連接,廣播會自動停止,此時調用會返回?-EALREADY
  4. 低功耗場景

    停止廣播會顯著降低功耗(廣播是功耗主要來源之一)
  5. 廣播集支持

    在支持多廣播集的協議棧中(如 Zephyr 2.7+),可能需要指定廣播集 ID

?2.2.5?常見問題解決

Q1:停止廣播后為什么設備仍可被掃描到?
A1:可能是其他廣播實例仍在運行,或廣播停止有延遲(檢查返回值)

Q2:如何確保廣播完全停止?
A2:

do {err = bt_le_adv_stop();
} while (err == 0); // 直到返回-EALREADY

Q3:停止廣播會影響已建立的連接嗎?
A3:不會,只影響廣播行為,不影響現有連接

2.2.6?應用總結?

bt_le_adv_stop?是 BLE 設備廣播管理的核心控制點,合理使用可以實現:

  • 精確的廣播生命周期控制

  • 動態廣播策略切換

  • 有效的功耗管理

在需要頻繁切換廣播模式或優化功耗的場景中,正確使用該API至關重要。

2.3?bt_enable

2.3.1 函數功能

bt_enable?是藍牙協議棧中的核心初始化函數,用于啟用和初始化藍牙控制器及協議棧。它是任何藍牙應用程序的第一個關鍵調用,為后續所有藍牙操作建立基礎環境。

函數原型(基于Zephyr等常見協議棧)

int bt_enable(bt_ready_cb_t cb);

參數說明

參數類型說明
cbbt_ready_cb_t藍牙初始化完成后的回調函數(可設為NULL)

?回調函數類型定義:

typedef void (*bt_ready_cb_t)(int err);

核心功能

  1. 硬件初始化

    • 初始化藍牙射頻控制器(Radio)

    • 配置底層硬件(如時鐘、電源等)

  2. 協議棧加載

    • 加載HCI層、L2CAP、ATT/GATT等協議棧組件

    • 初始化安全管理器(SM)

  3. 默認配置應用

    • 設置默認藍牙MAC地址

    • 應用編譯時配置的默認參數

  4. 狀態切換

    • 將藍牙控制器從OFF狀態切換到READY狀態

返回值

返回值說明
0初始化流程成功啟動(注意:實際結果通過回調返回)
-EALREADY藍牙協議棧已啟用
-ENOMEM內存不足
-EIO硬件初始化失敗

?2.3.2?典型使用模式

1)?同步初始化(無回調)

int err = bt_enable(NULL);
if (err) {printk("Bluetooth init failed (err %d)\n", err);return;
}
// 繼續其他藍牙操作

2)異步初始化(帶回調)

void bt_ready(int err) {if (err) {printk("Bluetooth init failed (err %d)\n", err);return;}printk("Bluetooth initialized\n");// 在這里啟動廣播/掃描等操作
}void main(void) {int err = bt_enable(bt_ready);if (err) {printk("Bluetooth enable failed (err %d)\n", err);}
}

2.3.3?關鍵處理流程

?2.3.4?注意事項

  1. 單次調用限制

    • 多數實現要求全局只調用一次

    • 重復調用需先調用bt_disable()

  2. 回調上下文

    • 回調函數通常在藍牙線程執行

    • 避免在回調中進行阻塞操作

  3. 依賴關系

    • 必須在所有其他藍牙API前調用

    • 通常應在系統初始化完成后調用

  4. 調試支持

    • 可通過CONFIG_BT_DEBUG等選項啟用調試日志

?2.3.5?初始化失敗常見原因

  1. 硬件問題

    • 藍牙芯片未正確供電

    • 射頻電路故障

  2. 配置沖突

    • 與其他無線服務(如WiFi)共用資源

    • 錯誤的時鐘配置

  3. 資源不足

    • 內存池大小不足(檢查CONFIG_BT_*_TX_COUNT等配置)

    • 中斷沖突

2.3.6??實際應用示例

1)?簡單外設初始化

void main(void) 
{bt_enable(NULL); // 同步初始化bt_le_adv_start(...); // 立即開始廣播
}

2)帶錯誤恢復的初始化

void bt_retry_init(int err)
{if (err) {k_sleep(K_SECONDS(1));bt_enable(bt_retry_init); // 重試初始化}
}void main(void) 
{bt_enable(bt_retry_init);
}

2.3.7 應用總結

bt_enable?是藍牙開發的第一個關鍵調用,其核心價值在于:

  • 建立藍牙操作的基礎環境

  • 提供同步/異步兩種初始化模式

  • 協調硬件和協議棧的啟動

正確使用該API需要注意:

  1. 調用時機(早于其他藍牙操作)

  2. 錯誤處理機制

  3. 特定協議棧的特殊要求

在復雜應用中,建議使用異步回調模式,以便在初始化完成后自動執行后續藍牙操作流程。

2.4?bt_le_adv_update_data函數

2.4.1 函數功能

bt_le_adv_update_data?是藍牙低功耗 (BLE) 協議棧中的一個關鍵 API 函數,用于動態更新正在進行的廣播數據或掃描響應數據,而無需停止并重新啟動廣播。

核心功能

  • 動態更新廣播數據:修改廣播包(Advertising Data)或掃描響應包(Scan Response Data)內容

  • 無需重啟廣播:保持廣播持續進行,避免廣播中斷導致的設備不可見期

  • 實時數據刷新:適用于需要頻繁更新廣播信息的場景(如傳感器數據變化)

?函數原型(基于Zephyr等常見協議棧)

int bt_le_adv_update_data(const struct bt_data *ad, size_t ad_len,const struct bt_data *sd,size_t sd_len);

參數說明

參數類型說明
adbt_data*新的廣播數據數組
ad_lensize_t廣播數據項數量
sdbt_data*新的掃描響應數據數組
sd_lensize_t掃描響應數據項數量

返回值

返回值說明
0數據更新成功
-EINVAL參數無效(如數據長度超限)
-ENOMEM內存不足
-EAGAIN協議棧繁忙,需重試
-ENOTCONN當前未進行廣播

?2.4.2?典型使用場景

1)?傳感器數據實時更新

// 初始廣播
bt_le_adv_start(..., initial_ad, ...);// 當溫度變化時更新數據
void update_temp_data(float new_temp) 
{uint8_t temp_encoded = (uint8_t)(new_temp * 2);struct bt_data new_ad[] = {BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_GENERAL),BT_DATA(BT_DATA_MANUFACTURER_DATA, &temp_encoded, 1)};bt_le_adv_update_data(new_ad, ARRAY_SIZE(new_ad), NULL, 0);
}

2)?動態切換廣播模式

// 從普通廣播切換到信標模式
struct bt_data beacon_ad[] = 
{BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_NONCONN_IND),BT_DATA(BT_DATA_MANUFACTURER_DATA, beacon_payload, sizeof(beacon_payload))
};bt_le_adv_update_data(beacon_ad, ARRAY_SIZE(beacon_ad), NULL, 0);

2.4.3?關鍵特性

原子性更新

1)數據更新在單個廣播間隔內完 ;
?2)接收端不會看到部分更新的數據


廣播連續

1)保持現有廣播間隔不變;
2)避免傳統"停止-修改-重啟"方式導致的 ~300ms 廣播中斷


數據限制

1)仍需遵守31字節的廣播數據長度限制;?
2)數據類型需符合藍牙規范(不能動態修改AD Type)

?2.4.4?實現原理

2.4.5?注意事項

廣播必須處于活躍狀態


1)需在bt_le_adv_start之后調用

2)已連接的設備會自動停止廣播

數據一致性


1)更新期間應避免修改原始數據緩沖區

2)建議使用靜態或全局數據數組


性能考量


1)頻繁更新(如每秒多次)可能影響射頻穩定性

2)建議合并更新(如每200ms批量更新一次)

廠商限制


1)某些低端藍牙芯片可能不支持實時更新

2)需要檢查協議棧實現是否支持該功能

?2.4.6?錯誤處理最佳實踐

int err = bt_le_adv_update_data(new_ad, ad_len, NULL, 0);
if (err == -ENOTCONN) 
{// 廣播未激活,重新啟動bt_le_adv_start(...);
} 
else if (err){printk("Update failed (err %d), retrying...\n", err);k_sleep(K_MSEC(100));// 重試邏輯}

2.4.7?典型應用案例

  1. 電子價簽系統

    • 不建立連接,通過廣播更新價格信息

    • 每15分鐘更新一次廣播數據

  2. 運動傳感器

    • 實時廣播心率/步數變化

    • 保持低功耗的同時更新數據

  3. 智能信標

    • 動態調整廣播內容(如店鋪促銷信息)

    • 基于位置切換廣播UUID

2.4.8 應用總結

bt_le_adv_update_data?提供了高效的廣播數據動態更新機制,特別適合:

  • 需要保持持續廣播可見性的場景

  • 實時數據傳輸但無需建立連接的用例

  • 低功耗設備的數據更新需求

正確使用該API可以避免傳統重啟廣播方式帶來的連接中斷風險,同時保證數據更新的實時性和可靠性。開發者應注意目標平臺的協議棧實現差異,并進行充分的錯誤場景測試。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77745.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77745.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77745.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

8、HTTPD服務--ab壓力測試

一、ab壓力測試 # ab ‐c 100 ‐n 1000 http://vedio.linux.com/index.html 2 This is ApacheBench, Version 2.3 <$Revision: 1430300 $> 3 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 4 Licensed to The Apache Software Foundation,…

E2E 測試

以下是關于端到端(E2E)測試的基本知識總結: 一、E2E 測試核心認知 1. 定義與價值定位 "模擬真實用戶在完整應用環境中的操作流程"核心價值: 驗證跨系統/模塊的集成功能檢測用戶流程中的關鍵路徑保障核心業務場景的可用性測試金字塔定位:單元測試(70%) → 集…

python之數字類型的操作

Python數據類型與操作符完全指南&#xff1a;詳解各類數據操作技巧 目錄 數字類型 字符串 列表 元組 字典 集合 布爾 通用操作符 注意事項 1. 數字類型&#xff08;int, float, complex&#xff09; 數字類型是Python中最基礎的數據類型&#xff0c;支持多種數學運算…

基于Spring Boot+Vue 網上書城管理系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

從拒絕采樣到強化學習,大語言模型推理極簡新路徑!

大語言模型&#xff08;LLMs&#xff09;的推理能力是當下研究熱點&#xff0c;強化學習在其復雜推理任務微調中廣泛應用。這篇論文深入剖析了相關算法&#xff0c;發現簡單的拒絕采樣基線方法表現驚人&#xff0c;還提出了新算法。快來一探究竟&#xff0c;看看這些發現如何顛…

測試——BUG篇

1. 軟件測試的生命周期 軟件測試貫穿于軟件的整個生命周期&#xff0c;針對這句話我們?起來看?下軟件測試是如何貫穿軟件的整個生命周期。 軟件測試的?命周期是指測試流程&#xff0c;這個流程是按照?定順序執?的?系列特定的步驟&#xff0c;去保證產品質量符合需求。在…

【Hive入門】Hive函數:內置函數與UDF開發

Apache Hive作為Hadoop生態系統中的重要組件&#xff0c;為大數據分析提供了強大的SQL-like查詢能力。Hive不僅支持豐富的內置函數&#xff0c;還允許用戶開發自定義函數&#xff08;UDF&#xff09;以滿足特定需求。本文將深入探討Hive的內置函數&#xff08;包括數學函數、字…

關于匯編語言與程序設計——子程序設計

學習目標&#xff1a; 編程實現兩個數&#xff1a;#8888H 和 #79H 的乘除運算。 一、實驗要求 能夠熟練掌握算術運算匯編指令的使用&#xff1b;熟練掌握子程序設計的基本方法&#xff1b;熟練掌握程序的調試方法。 二、實驗設計 1.整體思路 乘法&#xff1a;將單字節的乘數…

AWS SQS 隊列策略配置指南:常見錯誤與解決方案

在 AWS 云服務中,Simple Queue Service (SQS) 是一種完全托管的消息隊列服務,廣泛應用于分布式系統組件間的解耦。為了確保隊列的安全訪問,正確配置隊列策略至關重要。本文將詳細介紹 SQS 隊列策略的配置方法,常見錯誤及其解決方案。 SQS 隊列策略基礎 SQS 隊列策略是基于…

Webshell管理工具的流量特征

目錄 一、常見Webshell工具流量特征 1. ??中國菜刀&#xff08;Chopper&#xff09;?? 2. ??冰蝎&#xff08;Behinder&#xff09;?? 3. ??哥斯拉&#xff08;Godzilla&#xff09;?? 4. ??蟻劍&#xff08;AntSword&#xff09;?? 5. ??C99 Shell??…

【每日八股】復習 MySQL Day3:鎖

文章目錄 昨日內容復習MySQL 使用 B 樹作為索引的優勢是什么&#xff1f;索引有哪幾種&#xff1f;什么是最左匹配原則&#xff1f;索引區分度&#xff1f;聯合索引如何排序&#xff1f;使用索引有哪些缺陷&#xff1f;什么時候需要建立索引&#xff0c;什么時候不需要&#xf…

Arkts完成數據請求http以及使用axios第三方庫

import http from ohos.net.http Entry Component struct HttpPage {State message: string Hello Worldbuild() {Column({space:20}) {Row(){Button(發送http請求).onClick(()>{let httpRequest http.createHttp();httpRequest.request(https://zzgoodqc.cn/index.php/in…

SELinux 從理論到實踐:深入解析與實戰指南

文章目錄 引言&#xff1a;為什么需要 SELinux&#xff1f;第一部分&#xff1a;SELinux 核心理論1.1 SELinux 的三大核心模型1.2 安全上下文&#xff08;Security Context&#xff09;1.3 策略語言與模塊化 第二部分&#xff1a;實戰操作指南2.1 SELinux 狀態管理2.2 文件上下…

CD34.【C++ Dev】STL庫的string的使用 (上)

目錄 1.知識回顧 2.串聯類和對象的知識重新理解 構造函數 string(); string (const string& str); string (const string& str, size_t pos, size_t len npos); string (const char* s); string (size_t n, char c); append和push_back string& append …

Git常用指令速查

Git常用指令速查 基本操作類&#xff1a; git init &#xff1a;初始化倉庫git log&#xff1a;查看日志&#xff0c;這個命令很重要&#xff01;git add <文件名|.>&#xff1a;添加到暫存區git commit -m 注釋&#xff1a;提交到倉庫git merge <分支名>&#xf…

探索無人機模擬環境的多元景象及AI拓展

無人駕駛飛行器&#xff08;UAVs&#xff09;在各行各業的迅速普及&#xff0c;從農業和檢測到空中操作和人機交互等令人興奮的前沿領域&#xff0c;都引發了一個關鍵需求&#xff1a;強大而逼真的模擬環境。直接在物理硬件上測試尖端算法存在固有的風險——成本高昂的墜機、中…

AI Agent開源技術棧

構建和編排Agent的框架 如果您是從頭開始構建&#xff0c;請從這里開始。這些工具可以幫助您構建Agent的邏輯——做什么、何時做以及如何處理工具。您可以將其視為將原始語言模型轉化為更自主的模型的核心大腦。 2. 計算機和瀏覽器的使用 一旦你的Agent能夠規劃&#xff0c…

jspm老年體檢信息管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 信息化時代&#xff0c;各行各業都以網絡為基礎飛速發展&#xff0c;而醫療服務行業的發展卻進展緩慢&#xff0c;傳統的醫療服務行業已經逐漸不滿足民眾的需求&#xff0c;有些還在以線下預約的方式接待病人&#xff0c;特別是針對于老年體檢的服務&#xff0c;是少之又…

ESP32- 開發筆記- 軟件開發 4 - GPIO 口

1 背景介紹 GPIO&#xff08;General Purpose Input/Output&#xff09; ——通用輸入輸出口&#xff0c;就是能由軟件自由控制輸入&#xff08;接收外界信號&#xff09;或輸出&#xff08;發出電平信號&#xff09;的引腳。 ESP32 最核心的功能之一&#xff0c;能被用來控制…

格式工廠:多媒體轉換工具

格式工廠&#xff08;FormatFactory&#xff09;是一款免費且功能全面的多媒體格式轉換工具&#xff0c;支持視頻、音頻、圖片及文檔等多種格式的轉換&#xff0c;覆蓋超過70種語言&#xff0c;并兼容Windows XP至Win10/11系統。軟件基于FFmpeg解碼庫開發&#xff0c;支持高效轉…