1. 程式人生 > >藍芽(BLE)應用框架介面設計和應用開發——以TI CC2541為例

藍芽(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)  主裝置發起連線時,其可以要求密碼配對,而也可以選擇無需密碼驗證。

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)  對於密碼配對過程,常見的做法是framework給應用開發提供一個回撥介面,當收到主裝置傳送過來的密碼後,對這個介面進行回撥,並將這個密碼以引數的形式傳遞給這個介面,以讓使用者自己判斷密碼是否跟預設的一致。

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有一個簡單的示例工程SimpleBLEPeripheral,向開發人員展現如何進行藍芽應用開發。我們通過這個工程來理解上述框架設計和程式設計。

1.   連線

1)定義廣播資料

GAPRole_SetParameter(GAPROLE_ADVERT_DATA,…);

2)自定義掃描響應資料

GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA,…);

3)密碼管理回撥

ProcessPasscodeCB()

4)狀態管理回撥

peripheralStateNotificationCB()

2.通訊控制

      1)新增GATT服務

GATTServApp_RegisterService()

      2)讀回撥

           simpleProfile_ReadAttrCB()

      3)寫回調

                 simpleProfile_WriteAttrCB()

     4 )屬性值設定和獲取    

                 SimpleProfile_SetParameter()

                 SimpleProfile_GetParameter()

    5)主動傳輸

                 GATT_Notification()

                 GATT_Indication()

引數可以對照具體的介面進行分析。我們在看具體的介面之前,可以思考一下,這些介面的引數應該包括什麼東西,如果你能想到包括什麼,恭喜你,你的應用框架設計能力已經大大提高了。

記住:嵌入式企鵝圈不僅會告訴你如何實現功能(實踐),還會告知你為什麼要這樣實現(理論)!

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

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