藍牙(BLE)應用框架接口設計和應用開發——以TI CC2541為例


本文從功能需求的角度分析一般藍牙BLE單芯片的應用框架(SDK Framework)的接口設計過程,並以TI CC2541為例說明BLE的應用開發方法。

一、應用框架(Framework)

我們熟知的Framework包含Android Framework、Linux QT、Windows MFC。應用框架抽象並封裝實現了一般應用場景的需求,完畢應用開發的80%,剩下的20%則以回調(callback)和接口的方式供應用開發者調用以完畢詳細的需求。

一般Framework完畢的工作包含:任務分發、消息通信和UI等。比如以上三種框架所屬的IDE都能夠實現所見即所得的UI可視化編程,框架完畢了UI控件的大部分工作。而開發者僅僅須要完畢UI控件的消息處理邏輯就可以。如點擊了這個button后怎樣進行響應等。

藍牙BLE單芯片的系統架構包含操作系統、SOC硬件抽象接口和藍牙應用框架等組成部分,操作系統和SOC硬件抽象接口的理解請理解《怎樣高速理解一個全新的嵌入式操作系統》(發送55獲取)和《怎樣高速理解一個全新的嵌入式操作系統(續)》(發送56獲取)。本文僅僅討論藍牙應用方面框架接口設計和應用開發。

二、 藍牙BLE的應用需求

我們都知道BLE是為了實現連接后的通信傳輸和控制。

BLE設計的初衷是為了完畢少數據量的通信,側重於通信控制。所以我們能夠理解BLE的協議棧包含兩大組成部分:一個是藍牙連接;還有一個是通信控制。前者即相應GAP(General Access Profile)。后者相應GATT(General Attribute Profile)。Profile在藍牙術語里面相應於特定的應用場景協議。

三、 藍牙BLE的應用需求分析

我們分別對連接和通信控制進行分析。這里以藍牙設備Peripheral角色進行分析,簡單理解即是從設備。

手機APP所用的藍牙一般充當central角色,即主設備。

1.   連接

連接部分。藍牙外設要完畢的功能包含:

1)  藍牙外設要被發現,其必須要進行廣播

2)  在主設備掃描時要給出掃描響應。這時藍牙設備還是處於廣播狀態。

3)  主設備發起連接時,其能夠要求password配對,而也能夠選擇無需password驗證。

4)  主設備發起連接過程的握手,接受連接。

5)  藍牙外設連接成功后才會開啟通信服務。


2.   通信控制

1)  藍牙外設在連接后通過GATT來提供服務發現(service discover),這樣主設備能夠從中獲取藍牙外設提供的各種服務profile。

2)  主設備在獲取藍牙外設服務后,會對GATT profile的各種特征字(characteristics)進行讀寫傳輸控制。

3)  特征字主要包含write、read、notify和indicate等主要通信方式。對於藍牙外設的write特征字。主設備(如手機)能夠進行寫操作;對於read,主設備則能夠從中讀取信息;write和read對於藍牙外設來說。其屬於被動控制,即藍牙外設被動接受主控制的通信控制。而notify和indicate則是藍牙外設主動向主設備數據傳輸,前提是主設備要預先訂閱相應的characteristics的信息更新。Notify數據后,主設備不須要應答響應。而indicate則須要應答響應。

四、 藍牙BLE的應用框架(framework)設計

我們之前已經分析過,framework應該完畢應用開發的80%工作。即基本完畢了常見的應用需求。剩下20%則是由各個詳細應用的詳細場景需求來決定的。比如,藍牙底層連接時怎么握手,咱們應用開發者不須要關心吧。GATT的characteristics value值的通信過程。我們不要關心吧。當藍牙外設有新的數據要傳輸給主設備時,僅僅須要調用notify或者indicate接口就能夠了,至於底層怎么實現,那是協議棧開發者的工作。

OK,咱們依據第三部分的需求分析來找出應用開發者所關心的20%工作任務。換句話來說,剩下的80%工作量即是藍牙應用框架Framework所要完畢的任務。

一般藍牙單芯片都會給用戶提供SDK進行開發,其里面已經實現framework了。我們應用開發者應當重點關注這20%的任務。


1.   連接

1)  對於廣播來說,不同的應用須要廣播的信息並不一樣。如ibeacon和微信airsync協議的廣播數據格式要求是不一樣的。

所以。framework應該提供給用戶一個自己定義廣播數據的接口。

2)  同理,framework應該提供給用戶一個自己定義掃描響應數據的接口。

3)  對於password配對過程,常見的做法是framework給應用開發提供一個回調接口,當收到主設備傳送過來的password后。對這個接口進行回調,並將這個password以參數的形式傳遞給這個接口,以讓用戶自己推斷password是否跟預設的一致。

4)  Framework應該對連接的狀態進行管理。分別提供用戶回調接口,在連接成功時對接口進行回調。以讓用戶在連接成功時做一些特定的操作,如閃燈標識、開啟GATT服務等;在斷開連接時也應該回調用戶接口,以讓用戶在斷開連接時做一些特定的操作。


2.   通信控制

我們這里還是僅僅分析藍牙外設Peripheral角色的framework,不探討主設備的framework,讀者能夠相應進行分析。

1)framework應該明白怎樣用最簡單的方式定義並加入一個藍牙GATT profile服務。藍牙BLE有自己的協議標准,一個藍牙服務service包含一個或者多個characteristics。而每一個characteristics都包含相應UUID、屬性描寫敘述(如可讀、可寫、長度等)、屬性值value、屬性配置(代表訂閱信息)等等。

為了簡化興許的數據處理,一般framework會設置一個handle來相應一個characteristics。

2)framework提供接口給用戶來對各個characteristics的屬性value進行設置和獲取。

3)framework提供回調接口給用戶。當主設備讀characteristics回調讀接口。以讓用戶進行特定操作后再進行傳輸;當主設備寫characteristics時回調寫接口,以讓用戶完畢相應的操作。

4)framework提供用戶接口,完畢主動的notify和indicate操作。

OK,以上即是藍牙BLE單芯片普遍的framework設計需求。我們在接觸一款新的BLE單芯片時,僅僅要能夠重點把握好以上這20%的編程方法,就能高速進行應用開發。


五、Ti CC2541應用開發

TI CC2541 SDK有一個簡單的演示樣例projectSimpleBLEPeripheral,向開發者展現怎樣進行藍牙應用開發。我們通過這個project來理解上述框架設計和編程。


1.   連接

1)定義廣播數據

GAPRole_SetParameter(GAPROLE_ADVERT_DATA,…);

2)自己定義掃描響應數據

GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA,…);

3)password管理回調

ProcessPasscodeCB()

4)狀態管理回調

peripheralStateNotificationCB()


2.通信控制

      1)加入GATT服務

GATTServApp_RegisterService()

      2)讀回調

           simpleProfile_ReadAttrCB()

      3)寫回調

                 simpleProfile_WriteAttrCB()

     4 )屬性值設置和獲取    

                 SimpleProfile_SetParameter()

                 SimpleProfile_GetParameter()

    5)主動傳輸

                 GATT_Notification()

                 GATT_Indication()

參數能夠對比詳細的接口進行分析。我們在看詳細的接口之前,能夠思考一下,這些接口的參數應該包含什么東西。假設你能想到包含什么,恭喜你,你的應用框架設計能力已經大大提高了。

 

記住:嵌入式企鵝圈不僅會告訴你怎樣實現功能(實踐)。還會告知你為什么要這樣實現(理論)。

我們在開發的過程中也要注重怎么去思考和總結開發方法,以積累經驗,舉一反三。觸類旁通!


很多其它嵌入式和物聯網原創技術分享敬請關注微信公眾號:嵌入式企鵝圈




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM