藍牙技術憑借其普遍性與簡潔性改變了設備之間的無線通信。由于其功耗與成本較低,在健康醫療、體育健身、家庭樓宇自動化、信標等應用領域的發展過程中發揮著至關重要的作用。 藍牙給我們帶來很多方便,不過對于一些新手,在進行藍牙開發之前,有必要對其相關的知識有詳細的了解,這里云里物里主要介紹一些藍牙應用開發的知識點和開發流程。?,一、藍牙開發必須知道的概念?,central和peripheral?,藍牙在應用開發過程中,有兩種角色,分別是central和peripheral,中文就是中心和外設。比如手機去連接智能設備,那手機就是central,智能設備就是peripheral。大多時候都是central去連接peripheral的場景,所以我們就來說他的流程。?,廣播和連接?,peripheral會發出廣播(advertisement),central掃描到廣播后,可以對設備進行連接,發出connect請求,peripheral接收到請求并同意連接后,central和peripheral就建立了連接。 協議 每個具體的智能設備,都約定了一組數據格式,這個就是數據協議。需要注意的是,設備端都是小端模式,所以在讀取數據的時候,高字節在前低字節在后。?,二、藍牙應用的一般開發流程?,已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的芯片舉例,步驟為:切系統,重啟,傳輸數據,驗證數據,切系統,重啟,完成。 注:其中數據傳輸也會分成很多節去發送,沒法送一段數據,做一次數據校驗。?,五、ota存在的問題?,以TI的芯片舉例,他需要可以存2個image,數據傳輸時候需要的空間比較大,而每個智能設備的速率,功耗,存儲都會有很多限制,導致很多設備會自己去實現ota的功能,自定義流程和數據傳輸方式,導致許多設備都是有自己私有的ota模式和協議,所以在做開發的時候,要仔細閱讀設備協議中對ota的描述。?,六、藍牙開發中的常見的問題?,1.應用如何做自動重連?,其實自動重連比想象的要簡單許多,無論是Android還是ios端,只需要在設備斷開連接的委托方法中,重新調用gatt.connet或者是centralManager.connet方法就可以了,無論當時設備是否有點,是否在周圍,當設備再次開會或者連接到可連接范圍內,都會自動被連上。?,2.連接失敗處理?,分兩個平臺來說,iOS端有連接失敗的委托,但幾乎不會發生這種情況;而對于同款設備,android常常會出現連接失敗的情況,status != BluetoothGatt.GATT_SUCCESS ,android端開發請不要把連接失敗和斷開連接放在一塊處理,因為斷開連接可以直接嘗試重新連接,而連接失敗后嘗試重新連接,需要加一些延時,并且需要gatt.close,清空一下狀態,否則會把gatt阻塞導致手機不重啟藍牙就再也無法連接任何設備的情況。 ?,3.后臺運行?,iOS后臺運行,需要設備中info.Plist權限,key:Required background modes,value: bluetooth-central(手機作為central) , bluetooth-peripheral(手機作為外設) ?,4.同時連接多個設備?,Android很簡單,創建多個gattCallback,每個gattCallback單獨管理設備連接后的操作,而iOS也最好不要創建多個CBCentralManager,多個CBCentralManager理論上可以用,但是會存在多個手機版本存在不同的行為,還有一些很容易出錯的問題,這塊內容不細說了。使用同一個CBCentralManager,通過進入委托的peripheral的identifier區分不同的設備,進行不同的操作和處理。?,5.掃描廣播包?,所有外設,只有在發出廣播包的情況下,才能被central發現,絕大多數情況下,外設被連接后就不會發出廣播(也有例外),很多人遇到無法找到設備的問題,大多屬于這種情況。 ?,6.提高藍牙連接速度?,無論是iOS,還是Android,都可以通過已綁定的設備,在不開啟掃描的情況下進行快速連接,iOS需要的參數是peripheral的identifier,Android需要mac地址。但Android和iOS還是有一些區別的,比如iOS不能拿到已綁定的設備list,但是可以通過UUID去拿到peripheral的實例。而Android可以拿到已綁定的設備list。Android綁定過程需要手動調用createBond的方法,而iOS在連接成功一次后會自動綁定。Android在處理createBond時,常常會因為不同手機平臺,不同設備,會產生兼容性的問題,這點需要注意。?,7.定向掃描?,在掃描時候可以傳入serviceUUID,這樣可以掃描到特定條件的設備,提高掃描的速度,排除干擾。,8.如何獲取mac地址?,Android可以直接通過getAddress得到mac地址;而iOS出于蘋果的安全策略問題,無法直接獲得mac地址,只能得到一個mac地址換算出來的identifier。不過在智能設備開發時,一般都會考慮到這個問題,大多數智能設備會把mac地址保存在廣播數據中,不同設備可能會存在不同的位置。?,9.Babybluetooth藍牙庫的使用?,Babybluetooth是iOS的藍牙庫的封裝,iOS藍牙委托層級特別討厭,一個委托接著一個委托,比如先進入掃描的委托,在進入鏈接的委托,在進入連接成功,發現服務,發現特征,讀寫操作,一套操作被拆分的很散,容易出錯,代碼不易維護,上手慢等缺點,Babybluetooth對CoreBluetooth進行了封裝,把委托回調進行方法調用的方式,改成了鏈式方法順序調用,直接調用baby.enjoy()方法,完成一整套操作,簡化了上手難度和代碼維護成本。本文來源網絡,如侵刪。
上一篇:
好物分享| 超低功耗藍牙溫濕度傳感器
下一篇:
物聯網設備管理常見問題