CH579 CH573 CH582 CH592 藍牙主機(Central)實例應用講解

藍牙主機(Central),顧名思義,就是一個藍牙主設備,與從機(Peripheral)建立連接進行通信,可以接收從機通知,也可以給從機發送信息,通常Central和Peripheral結合使用。

一、官方例程Central的工作流程

從官方例程中,我們可以看到,Central的工作流程大致如下:

一、初始化完成開啟掃描,

二、獲取掃描信息

三、將掃描到的mac地址與目標連接mac地址作比較,掃描到目標mac就發起連接否則繼續開啟掃描

四、枚舉服務進行通信測試

上圖標注1:開始掃描
標注2將掃描獲取的從機MAC地址加入掃描列表
標注3與目標連接MAC地址比較
標注4沒有找到目標,重新開始掃描
標注5找到目標mac,發起連接

從上述描述中我們知道,要想與Peripheral建立連接,必須知道Peripheral的MAC地址,但實際應用中,我們很難知道Peripheral的MAC的地址,就算知道了,也很難輸入Central中,畢竟大多數情況下,每個Peripheral的MAC地址是不同的,尤其是我們針對的是現有的產品時。

那么我們如何應對這種問題呢?

二、BLE廣播數據中的AD Type詳解

?一般來說,同一種產品,廣播數據是相同的,甚至同一個廠家的同一種類型的產品,廣播數據也會有一些共同的特征,我們可以通過研究產品的廣播數據來解決上面提到的問題。所以我們先來了解一下廣播數據中的AD Type。

AD Type是廣播數據單元(AD Structure)的核心字段,用于定義后續數據(AD Data)的類型和格式。以下是常見AD Type的分類及說明:

一)、基礎設備信息類

  1. ?Flags(類型=0x01)?

    • ?功能?:標識設備的發現模式和兼容性,如是否支持BLE/BR/EDR雙模。
    • ?數據格式?:1字節,各bit位含義:
      • Bit 0:LE有限發現模式(僅臨時可連接)
      • Bit 1:LE普通發現模式(持續可連接)
      • Bit 2:不支持BR/EDR(純BLE設備)
      • Bit 3-4:控制器/主機支持雙模
    • ?示例?:0x06表示支持普通發現模式且不支持BR/EDR。
  2. ?完整設備名稱(類型=0x09)?

    • ?功能?:聲明設備完整名稱(如Nordic_HRM)。
    • ?數據格式?:UTF-8字符串,長度由Len字段定義。
  3. ?縮短設備名稱(類型=0x08)?

    • ?功能?:設備名稱的縮寫形式,用于節省廣播數據空間。

二)、服務聲明類

  1. ?完整16位服務UUID列表(類型=0x03)?

    • ?功能?:廣播設備支持的所有16位標準服務UUID(如心率服務0x180D)。
    • ?數據格式?:多個2字節UUID連續排列。
  2. ?非完整服務UUID列表(類型=0x02)?

    • ?功能?:僅聲明部分服務,需通過掃描響應或連接后獲取完整列表。
  3. ?32位/128位服務UUID(類型=0x04-0x07)?

    • ?功能?:聲明長格式服務UUID(如自定義服務)。

三)、設備能力與參數類

  1. ?發射功率等級(類型=0x0A)?

    • ?功能?:廣播設備的發射功率值(單位dBm),用于距離估算。
    • ?數據格式?:1字節有符號整數(如0xF6表示-10 dBm)。
  2. ?設備類別(類型=0x0D)?

    • ?功能?:標識設備類型(如手機、傳感器)。
    • ?數據格式?:3字節,按藍牙標準分類編碼。

四)、廠商自定義數據類

  • ?廠商特定數據(類型=0xFF)?
    • ?功能?:攜帶廠商自定義數據(如iBeacon、Eddystone協議)。
    • ?數據格式?:前2字節為廠商ID(如蘋果為0x004C),后續為自定義內容。

五)、其他類型

  • ?可連接間隔(類型=0x12)?:聲明設備建議的連接參數。
  • ?服務請求(類型=0x14)?:主動請求特定服務(如定位服務)。
  • 還有更多AD Type,這里就不細說,畢竟與我們的主題關系不大,有興趣的朋友可以很容易從網上搜索到相關的解釋。

六)、關鍵限制與注意事項

  1. ?數據長度限制?:單個廣播包載荷(Payload)總長度不超過31字節。
  2. ?組合使用?:一個廣播包可包含多個AD Structure,需合理分配類型優先級(如優先Flags和服務聲明)。
  3. ?動態更新?:部分AD Type(如設備名稱)支持動態修改以適應場景需求。
  4. 以上AD Type并非全部必需,可以根據產品的特性及實際需要來提供。

?三、實例講解

根據”BLE廣播數據中的AD Type詳解“一節所述,以及上面三張廣播包圖,我們很容易知道,廣播包包含的內容比較隨意,沒有強制要求,但AD Type 0x09,也就是設備名稱通常會包含,所以藍牙主機(Central)在掃描時,可以根據AD Type 0x09來判斷是否是目標連接。當然我們根據廣播包的信息,很容易知道,可以用AD Type 0x07(自定議服務UUID)或用AD TypxFF(廠家自定義的數據類型)來判斷是否是目標連接。

接下來,我們以佳能相機藍牙遙控器為例來講解如何根據AD Type 0x09及AD Type 0x07來判斷是否是目標連接,如果是,則發起連接請求。(因為該項目是商用項目,我們沒辦法所完整的源碼上傳,所以只會貼一部分與本主題有關的代碼)。

#define PAIR_MODE_TYPE 0x07const uint8_t Serv_uuid[ATT_UUID_SIZE] = {0x21,0xa8,0xff,0x2f,0x49,0xd8,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x05,0x00};const uint8_t cannon_EOSM50[DEVICE_NAME_MAX_LEN] = {0x45,0x4F,0x53,'M',0x35,0x30,0,0,0,0,0,0,0,0,0,0};
const uint8_t cannon_EOS800D[DEVICE_NAME_MAX_LEN] = {0x45,0x4F,0x53,0x38,0x30,0x30,0x44,0,0,0,0,0,0,0,0,0};
const uint8_t cannon_SX70[DEVICE_NAME_MAX_LEN] = {0x53,0x78,0x37,0x30,0,0,0,0,0,0,0,0,0,0,0,0};
const uint8_t * Device_List[DEVICE_COUNT] = {cannon_EOSM50,cannon_EOS800D,cannon_SX70};case GAP_DEVICE_INFO_EVENT:{// Add device to list
//            centralAddDeviceInfo(pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType);if (IsPaired)break;uint8_t cmystata;uint8_t UserNamelen,len;uint8_t EvtData[31];#ifdef DEBUGsprintf(EvtData,"%s",pEvent->deviceInfo.pEvtData);    //將掃描的數據格式化成字符串進行子字符串匹配
#endif//以下為字符串匹配for (uint8_t i = 0; i < pEvent->deviceInfo.dataLen;){if(pEvent->deviceInfo.pEvtData[i]>=2){len = pEvent->deviceInfo.pEvtData[i];if(pEvent->deviceInfo.pEvtData[i+1] == PAIR_MODE_TYPE){
#if 0for (uint8_t idx = 0; idx < DEVICE_COUNT; idx ++){cmystata = tmos_memcmp(&pEvent->deviceInfo.pEvtData[i+2],Device_List[idx],len-1);if (cmystata == TRUE){
//                    Device_Ctrl.Device_Idx = idx;break;}}
#elsecmystata = tmos_memcmp(&pEvent->deviceInfo.pEvtData[i+2],Serv_uuid,len-1);
#endifif(cmystata == TRUE) //  找到了{
//                StrMatchingFlag = TRUE;GAPRole_CentralCancelDiscovery();     //取消設備掃描發現centralAddDeviceInfo(pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType);}PRINT("\r\n");return;}else{i += len+1;}}else{i++;}}}break;case GAP_DEVICE_DISCOVERY_EVENT:{PRINT("Device found...\n");GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,DEFAULT_LINK_WHITE_LIST,centralDevList[0].addrType,centralDevList[0].addr);//                BLEConnected = BLE_CONNECTING;// Start establish link timeout eventtmos_start_task(centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT);PRINT("Connecting...\n");}break;

以上代碼,簡單闡述一下,本來我們開始是打算根據AD Type 0x09(也就是設備名稱)來判斷是否是目標連接,但后來客戶不斷的增加相機類型,甚至還要求支持沒有提供的設備,所以轉為根據AD Type 0x07(自定議服務UUID)來判斷。

#define PAIR_MODE_TYPE 0x07就是指AD Type 0x07,如果要根據AD Type 0x09,這個地方需要修改,程序代碼可能也需要略作修改,畢竟我們后面的代碼全部是根據AD Type 0x07(自定議服務UUID)來開發的。

代碼本身比較簡單,與官方例程不同的是,?case GAP_DEVICE_INFO_EVENT:官方例程只是把掃描到的信息添加到相應的列表中,?case GAP_DEVICE_DISCOVERY_EVENT: 在這里才判斷是否是目標連接。而我們的實例則是在case GAP_DEVICE_INFO_EVENT:就判斷是否是目標連接,而在case GAP_DEVICE_DISCOVERY_EVENT: 只是簡單的發起連接請求。

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

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

相關文章

不同類型的 SAP 項目

目錄 1 實施項目 2 SAP S/4 HANA 升級項目 3 數據遷移項目 4 優化項目 5 Rollout 項目 6 運維項目 1 實施項目 企業第一次用 SAP 系統&#xff0c;從硬件搭建到安裝 SAP、根據業務流程做配置、開發、培訓業務、測試系統直到系統上線。 SAP S/4 HANA ACTIVATE 實施方法論…

【uniapp】errMsg: “navigateTo:fail timeout“

項目場景&#xff1a; 在點擊編輯的時候不能跳轉的編輯的頁面&#xff0c;然后直接報錯errMsg: "navigateTo:fail timeout" 解決方案&#xff1a; 看看是否是出現了盒子的冒泡事件導致了兩次調用跳轉路徑 tap.stop

記錄學習的第三十五天

今天主攻單源最短路Dijkstra算法。不過&#xff0c;還是沒有完全掌握。 首先是書本的例題我理解了一遍。 然后其實在力扣上做了三道題的&#xff0c;但是我看題解的情況就不太會。然后試著用上面的方法敲了一下↓的題&#xff0c;但是不對啊&#xff0c;我也不知道為什么呀。

Spring-博客系統項目

一,實現效果 登錄: 注冊: 博客列表 個人博客中心 博客詳情: 更新博客 編寫博客 二,數據庫的建立和連接 首先,需要建庫,需要兩個實體,一個是用戶,一個是博客,需要如下屬性,需要注意的是需要將密碼的變長字符創設置的長一些,因為之后會對用戶的密碼進行加密,該博客中密碼…

依賴注入詳解與案例(前端篇)

依賴注入詳解與案例&#xff08;前端篇&#xff09; 一、依賴注入核心概念與前端價值 依賴注入&#xff08;Dependency Injection, DI&#xff09; 是一種通過外部容器管理組件/類間依賴關系的設計模式&#xff0c;其核心是控制反轉&#xff08;Inversion of Control, IoC&…

diy裝機成功錄

三天前&#xff0c;我正式開啟了這次裝機之旅&#xff0c;購入了一顆性能強勁的 i5-12400 CPU&#xff0c;一塊繪圖能力出色的 3060ti 顯卡&#xff0c;還有技嘉主板、高效散熱器、16G 內存條、2T 固態硬盤&#xff0c;以及氣派的機箱和風扇&#xff0c;滿心期待能親手打造一臺…

計算機三大主流操作系統的前世今生 - Linux|macOS|Windows

全文目錄 1 引言2 起源之路2.1 Linux 起源2.2 macOS 起源2.3 Windows 起源 3 綜合解析3.1 Linux系統綜合解析3.1.1 系統定義與核心架構3.1.2 發展歷程3.1.3 核心特點3.1.4 主流發行版3.1.5 應用場景 3.2 macOS系統綜合解析3.2.1 系統定義與核心架構3.2.2 發展歷程3.2.3 核心特點…

【AI智能推薦系統】第七篇:跨領域推薦系統的技術突破與應用場景

第七篇:跨領域推薦系統的技術突破與應用場景 提示語:?? “打破數據孤島,實現1+1>2的推薦效果!深度解析美團、亞馬遜如何用跨領域推薦技術實現業務協同,知識遷移核心技術全公開!” 目錄 跨領域推薦的商業價值跨領域推薦技術體系 2.1 基于共享表征的學習2.2 遷移學習…

R 語言科研繪圖 --- 桑基圖-匯總

在發表科研論文的過程中&#xff0c;科研繪圖是必不可少的&#xff0c;一張好看的圖形會是文章很大的加分項。 為了便于使用&#xff0c;本系列文章介紹的所有繪圖都已收錄到了 sciRplot 項目中&#xff0c;獲取方式&#xff1a; R 語言科研繪圖模板 --- sciRplothttps://mp.…

LintCode第485題-生成給定大小的數組,第220題-冰雹猜想,第235題-分解質因數

第485題 描述 給你一個大小size,生成一個元素從1 到 size的數組 樣例 1:輸入: size 4輸出: [1, 2, 3, 4]樣例解釋: 返回一個順序填充1到4的數組。樣例 2:輸入: size 1輸出: [1]樣例解釋: 返回一個順序填充1到1的數組 代碼如下: public class Solution { /** * param s…

Pandas:數據處理與分析

目錄 一、Pandas 簡介 二、Pandas 的安裝與導入 三、Pandas 的核心數據結構 &#xff08;一&#xff09;Series &#xff08;二&#xff09;DataFrame 四、Pandas 數據讀取與寫入 &#xff08;一&#xff09;讀取數據 &#xff08;二&#xff09;寫入數據 五、數據清洗…

Linux云計算訓練營筆記day05(Rocky Linux中的命令:管道操作 |、wc、find、vim)

管道操作 | 作用: 將前面命令的輸出&#xff0c;傳遞給后面命令&#xff0c;作為后面命令的參數 head -3 /etc/passwd | tail -1 取第三行 head -8 /etc/passwd | tail -3 | cat -n 取6 7 8行 ifconfig | head -2 | tail -1 只查看IP地址 ifconfig | grep 192 過濾192的ip…

動態規劃:最長遞增子序列

給定一個數組&#xff0c;求最長遞增子序列的長度,就是要求我們求出一個序列中最長的上升子序列的長度&#xff0c;最長上升子序列的定義就是從原序列中按照孫旭去除一些數字&#xff0c;這些數字是逐漸增大的。 *定義dp[i]表示以第i個元素結尾的最長上升子序列的長度。 *初始…

湖北理元理律師事務所:債務優化如何實現還款與生活的平衡?

債務壓力往往讓債務人陷入“還款還是生存”的兩難選擇。湖北理元理律師事務所通過案例實踐發現&#xff0c;科學規劃的核心在于平衡法律義務與基本生活保障&#xff0c;而非單純追求債務縮減。本文結合實務經驗&#xff0c;解析債務優化的可行路徑。 剛性需求優先&#xff1a;…

重力場模型、球諧函數以及重力異常

地球重力場有兩種表達方法&#xff1a; 1、拉普拉斯&#xff08;Laplace&#xff09;方法&#xff0c;將重力場展開為球諧級數。 2、斯托克斯&#xff08;Stokes&#xff09;方法&#xff0c;根據地球的總質量和旋轉角速度計算。 本篇主要說第一種方法&#xff0c;該方法將地…

MySQL的視圖

一、MySQL視圖的介紹和作用 MySQL視圖&#xff0c;加油兄弟們&#xff0c;孰能生巧&#xff0c;完整代碼在最后&#xff01;&#xff01;&#xff01; 視圖是一個虛擬的表&#xff0c;并不是真是存在的&#xff0c;視圖其實并沒有真實的數據&#xff0c;他只是根據一個sql語句…

Scala與Go的異同教程

當瑞士軍刀遇到電鋸&#xff1a;Scala vs Go的相愛相殺之旅 各位準備禿頭的程序猿們&#xff08;放心&#xff0c;用Go和Scala不會加重你的發際線問題&#xff09;&#xff0c;今天我們來聊聊編程界的"冰與火之歌"——Scala和Go的異同。準備好瓜子飲料&#xff0c;我…

SaaS場快訂平臺項目說明【持續更新】

一、項目介紹 SaaS場快訂平臺是一個高效、便捷的體育場館在線預訂平臺。本項目采用SaaS方式開發&#xff0c;用戶不需要安裝軟件&#xff0c;直接通過互聯網訪問在線程序即可使用。本項目主要構建了一個體育館預訂系統&#xff0c;項目的功能主要包括&#xff1a;用戶注冊與登…

linux中常用的命令(三)

目錄 1- ls(查看當前目錄下的內容) 2- pwd (查看當前所在的文件夾) 3- cd [目錄名]&#xff08;切換文件夾&#xff09; 4- touch [文件名] &#xff08;如果文件不存在&#xff0c;新建文件&#xff09; 5- mkdir[目錄名] &#xff08;創建目錄&#xff09; 6-rm[文件名]&…

使用Simulink開發Autosar Nvm存儲邏輯

文章目錄 前言Autosar Nvm接口設計模型及接口生成代碼及arxmlRTE接口mappingRTE代碼分析總結 前言 之前介紹過Simulink開發Dem故障觸發邏輯&#xff0c;本文接著介紹另外一個常用的功能-Nvm存儲的實現。 Autosar Nvm接口 Autosar Nvm中一般在上電初始化的時調用Nvm_ReadAll獲…