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

上一篇: 好物分享| 超低功耗藍(lán)牙溫濕度傳感器
下一篇: 物聯(lián)網(wǎng)設(shè)備管理常見(jiàn)問(wèn)題