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