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