1. 程式人生 > >關於藍芽歷史以及藍芽基本介紹

關於藍芽歷史以及藍芽基本介紹

什麼是藍芽4.0, 藍芽其他標準又是什麼

低功耗藍芽(Low Energy; LE),又視為Bluetooth Smart或藍芽核心規格4.0版本。其特點具備節能、便於採用,是藍芽技術專為物聯網(Internet of Things; IOT)開發的技術版本。

所以它最主要的特點是低功耗,普及率高。現在所說的藍芽裝置,大部分都是在說4.0裝置,ble也特指4.0裝置。 在4.0之前重要的版本有2.1版本-基本速率/增強資料率(BR/EDR)和3.0 高速藍芽版本,這些統稱為經典藍芽,

4.0還有4.1101和4.2的小版本,其中4.2版本對傳輸速率做了進一步他提升,提高了2.5倍,蘋果從iphone6開始使用4.2


最新的藍芽標準為藍芽5.0

其中最大的特點連線範圍擴大了4倍,速度又提高了2倍,無連線資料廣播能力提高了8倍,增加了藍芽組網的能力。2017年才開始有晶片出廠,我和Ti,nordic工程師有聊過,他們的5.0晶片都已經完成,準備量產。

應用側iOS,android作業系統支援的藍芽協議

蘋果從iphone4s,ipad3,pod touch 5開始支援藍芽4.0,android從4.3以上系統開始支援4.0,此外,蘋果從iphone 6開始,支援藍芽4.2協議,提高了資料傳輸速度。就如前面所說的,提高大約2.5倍。

藍芽5.0很期待,不過要普及到手機和其他智慧裝置上,可能還需要等上幾年。

藍芽開發必須知道的概念

central和peripheral

藍芽應用開發中,存在兩種角色,分別是central和peripheral(pə’rɪfərəl) ,中文就是中心和外設。比如手機去連線智慧裝置,那手機就是central,智慧裝置就是peripheral。大多時候都是central去連線peripheral的場景,所以我們就來說他的流程

廣播和連線

peripheral會發出廣播(advertisement:ædvɚ’taɪzmənt),central掃描到廣播後,可以對裝置進行連線,發出connect請求,peripheral接收到請求後,同意連線後,central和peripheral就建立了連線。

連線後的操作

write,read,notify,indecate, response or not … 這個在後面詳細說

indecate和notify的區別就在於,indecate是一定會收到資料,notify有可能會丟失資料(不會有central收到資料的迴應),write也分為response和noresponse,如果是response,那麼write成功回收到peripheral的確認訊息,但是會降低寫入的速率。

協議

每個具體的智慧裝置,都約定了一組資料格式,這個就是資料協議,例如手環中獲取到資料0X001023,其中第2位到第5位表示步數,那麼就2310就是步數的16進位制的資料,轉換成10進位制就是8976步,需要注意的是,裝置端都是小端模式,所以取4位時候,高位元組在前低位元組在後

藍芽應用的一般開發流程

已iOS為例,android也和這個是類似的。

  1. 建立中心角色
  2. 掃描外設(discover)
  3. 連線外設(connect)
  4. 掃描外設中的服務和特徵(discover) 
    • 4.1 獲取外設的services
    • 4.2 獲取外設的Characteristics,獲取Characteristics的值,獲取Characteristics的Descriptor和Descriptor的值
  5. 與外設做資料互動(explore and interact)
  6. 訂閱Characteristic的通知
  7. 斷開連線(disconnect)

藍芽的資料互動

write,read,notify,indecate, response or not … 讀寫大家都是容易理解的,indecate和notify對應的是長連線,建立indecate後,peripheral可以隨時往central傳送資料。

indecate和notify的區別就在於,indecate是一定會收到資料,notify有可能會丟失資料(不會有central收到資料的迴應),write也分為response和noresponse,如果是response,那麼write成功回收到peripheral的確認訊息,但是會降低寫入的速率。

對於一個charateristic,他的讀寫訂閱的許可權是peripheral決定的,熟悉可以被同時設定,一般會根據外設的功能來決定。

藍芽ota DFU

藍芽ota,DFU(Device Firmware Update)指的是藍芽裝置的韌體升級,其實是一整套流程,不同的藍芽晶片,ota的流程有不同之處,我這裡用ti的晶片舉例。步驟為:切系統(bootloader mode),重啟,傳輸資料,驗證資料,切系統,重啟,完成。

其中資料傳輸也會分成很多節去傳送,沒法送一段資料,做一次資料校驗。

ota存在的問題

以TI的晶片舉例,他需要可以存2個image,資料傳輸時候需要的空間比較大,而每個智慧裝置的速率,功耗,儲存都會有很多限制,導致很多裝置會自己去實現ota的功能,自定義流程和資料傳輸方式,導致許多裝置都是有自己私有的ota模式和協議,所以在做開發的時候,要仔細閱讀裝置協議中對ota的描述。

藍芽開發中的常見的問題和坑

應用如何做自動重連

其實自動重連比想象的要簡單許多,無論是android還是ios端,只需要在裝置斷開連線的委託方法中,重新呼叫gatt.connet或者是centralManager.connet方法就可以了,無論當時裝置是否有點,是否在周圍,當裝置再次開會或者連線到可連線範圍內,都會自動被連上,就是這麼簡單。

連線失敗處理

分兩個平臺來說,iOS端也有連線失敗的委託,但是好像幾乎不會發生這種情況,至少我從來沒遇見過,而對於同款裝置,android常常會出現連線失敗的情況,status != BluetoothGatt.GATT_SUCCESS ,android端開發請不要把連線失敗和斷開連線放在一塊處理,因為斷開連線可以直接嘗試重新連線,而連線失敗後嘗試重新連線,需要加一些延時,並且需要gatt.close,清空一下狀態,否則會把gatt阻塞導致手機不重啟藍芽就再也無法連線任何裝置的情況。

後臺執行

iOS後來執行,需要裝置中info.Plist許可權,key:Required background modes ,value: bluetooth-central(手機作為central) , bluetooth-peripheral(手機作為外設) 參考連結

同時連線多個裝置

android很簡單,建立多個gattCallback,每個gattCallback單獨管理裝置連線後的操作,而iOS也最好不要建立多個CBCentralManager,多個CBCentralManager理論上可以用,但是會存在多個手機版本存在不同的行為,還有一些很容易出錯的問題,這塊內容不細說了。使用同一個CBCentralManager,通過進入委託的peripheral的identifier區分不同的裝置,進行不同的操作和處理。 在阿里的smurfs藍芽模組中,我使用了一個dispatcher去分發每個連線裝置的事件到不同例項中進行處理。

掃描廣播包

所有外設,只有在發出廣播包的情況下,才能被central發現,絕大多數情況下,外設被連線後就不會發出廣播(也有例外),很多人遇到無法找到裝置的問題,大多屬於這種情況。 重複掃描問題——————

提高藍芽連線速度

無論是iOS,還是android,都可以通過已繫結的裝置,在不開啟掃描的情況下進行快速連線,iOS需要的引數是peripheral的identifier,android需要mac地址。但android和iOS還是有一些區別的,比如iOS不能拿到已繫結的裝置list,但是可以通過UUID去拿到peripheral的例項。而android可以拿到已繫結的裝置list。android繫結過程需要手動呼叫createBond的方法,而iOS在連線成功一次後會自動繫結。 android在處理createBond時,常常會應為不同手機平臺,不同裝置,會產生相容性的問題,這點需要注意。

定向掃描

在掃描時候可以傳入serviceUUID,這樣可以掃描到特定條件的裝置,提高掃描的速度,排除干擾。

如何獲取mac地址

android可以直接通過getAddress得到mac地址,而iOS出於蘋果的安全策略問題,無法直接獲得mac地址,只能得到一個mac地址換算出來的identifier。不過在智慧裝置開發時,一般都會考慮到這個問題,大多數智慧裝置會把mac地址儲存在廣播資料中,不同裝置可能會存在不同的位置。

Babybluetooth藍芽庫的使用

Babybluetooth是iOS的藍芽庫的封裝,iOS藍芽委託層級特別討厭,一個委託接著一個委託,比如先進入掃描的委託,在進入連結的委託,在進入連線成功,發現服務,發現特徵,讀寫操作,一套操作被拆分的很散,容易出錯,程式碼不易維護,上手慢等缺點,Babybluetooth對CoreBluetooth進行了封裝,把委託回撥進行方法呼叫的方式,改成了鏈式方法順序呼叫,直接呼叫baby.enjoy()方法,完成一整套操作。簡化了上手難度和程式碼維護成本。現在開源在github上,有2300個star,藍芽庫中排名第一。

github bady的主頁