歡迎訪問我的部落格 muhlenXi,該文章出自我的部落格,歡迎轉載,轉載請註明來源: muhlenxi.com/2017/05/02/…。
導語:
不知不覺從事 iOS 低功耗藍芽開發也很長一段時間了,一直沒時間來的及把自己關於這方面的學習和收穫寫下來,最近專案迭代更新上線完,有點業餘時間,抓緊時間總結一下,說這是與同階段的小夥伴們之間的交流也好,是給後來的小夥伴的掉坑經驗也好。畢竟時間是擠出來的!做技術的人一般都有一個很開放的心態!
現在我們都知道,很多智慧硬體裝置都已經整合了低功耗藍芽模組,這樣我們就可以開發一個 iOS 或者 Mac APP 與它們進行互動。從 macOS 10.9 和 iOS 6 以後,Mac 和 iOS 裝置就支援 低功耗藍芽技術了,我們可以通過 CoreBluetooth
這個框架與底層的各種藍芽協議棧進行互動,比如 GATT、ATT 和 L2CAP 等。
與底層互動的過程如下圖所示:
開始下文之前,我們需要了解幾個概念。對藍芽不夠了解的可以看一下維基百科關於藍芽的簡介。
Bluetooth 4.0
: 藍芽 4.0 是 Bluetooth SIG 於2010年7月7日推出的新的規範,其最重要的特性是功耗低,省電!
BLE
: Bluetooth low energy wireless technology,也就是低功耗無線藍芽技術。
簡單瞭解 CoreBluetooth
BLE 是什麼?
BLE 是關於藍芽4.0 的詳細說明,它定義了一套用於低功耗裝置之間通訊的協議。而CoreBluetooth 則是對 BLE 協議棧的抽象。也就是說,它隱藏了許多底層的詳細實現細節,這樣對我們開發者來說,開發一個 APP 與 BLE 裝置進行互動將會很便捷。
兩個核心角色 Central 和 Peripheral
CoreBluetooth 中最關鍵的兩個角色就是 Central(中心) 和 Peripheral(周邊), Peripheral 一般是提供資料的一方,而 Central 一般獲取 Peripheral 提供的資料然後來完成特定的任務。舉個例子,一個整合 BLE 的數字室溫計可能提供房間中的實時溫度,我們通過 APP 就可以讀取、分析和顯示房間中的溫度。
Peripheral 通過向空中廣播資料的方式來使我們能感知到它的存在。Central 通過掃描搜尋來發現周圍正在廣播資料的 Peripheral, 找到指定的 Peripheral 後,傳送連線請求進行連線,連線成功後則與 Peripheral 進行一些資料互動, Peripheral 則會通過合適的方式對 Central 進行響應。
CoreBluetooth 簡化常見藍芽任務
CoreBluetooth 對通用的藍芽任務進行了簡化處理,你在 App 中通過 CoreBluetooth 來整合 BLE 功能將會變得簡單,如果你開發的 APP 遵循了 Centrals 的開發規範,CoreBluetooth 將會幫你處理與 Peripheral 的掃描、連線以及資料互動的過程,除此之外,通過 CoreBluetooth 將你的裝置設定為 本地 Peripheral 也會很便捷。
iOS APP 的狀態影響藍芽的行為
iOS APP 的狀態也會影響藍芽的行為,當你的 APP 在後臺執行或者處於暫停狀態中,藍芽的行為將會受到影響。預設情況下,當你的 APP 在後臺執行時或者處於暫停狀態中,你的 APP 是不能與 BLE 進行資料通訊的,也就是說,當 APP 後臺執行時,你需要與 BLE 進行資料通訊,你需要宣告你的 APP 支援藍芽後臺執行模式,即使你宣告瞭支援後臺執行模式,藍芽在後臺執行模式下的資料處理方式也會變得不同,當開發你的 BLE APP 時,你需要注意這些不同點。
即使 APP 在後臺執行時,當系統記憶體過低時也會殺掉 APP 的後臺程式,對於 iOS 7,CoreBluetooth 支援 Central 和 Peripheral 的狀態資訊的儲存和恢復。可以通過這個功能來實現與 BLE 裝置的長期互動。
通過恰當的方式提高使用者體驗
CoreBluetooth 框架為你的 APP 與許多常見的 BLE 裝置進行互動提供了互動介面,通過合理的利用和實踐將會提高使用者的體驗。
舉個例子,當你實現 Central 或 Peripheral 的功能時,會利用裝置攜帶的無線電廣播裝置(Radio)向空中廣播訊號,這樣就會影響到電池的續航時間,因此當你設計 APP 時,需要儘可能的減少 Radio 的使用頻率。
深入 CoreBluetooth
重要提醒: 在 iOS 10以後,通過 CoreBluetooth 與 BLE 裝置進行資料通訊時,必須在專案的Info.plist
檔案中包含關於NSBluetoothPerpheralUsageDescription
的描述,否則會導致 APP 閃退,詳情見NSBluetoothPerpheralUsageDescription。
Central 和 Peripheral 的通訊方式
在 BLE 通訊中主要包含兩種角色:Central(中心)和 Peripheral(周邊),基於傳統的客戶-伺服器架構,Peripheral 通常會提供其他裝置需要的資料,Central 通常利用通過 Peripheral 獲取的資訊來完成特定的任務,如圖所示,心率監視器 提供資料給 Mac 或 iOS APP,然後來顯示使用者的心率資料。
Central 搜尋和連線正在廣播資料的 Peripheral
Peripheral 以廣播資料包的形式廣播服務中的資料,廣播資料包指的是包含 Peripheral 有用資訊的一個較小資料包,比如 Peripheral 的名字和主要功能資料。比如,一個數字室溫計廣播的資料中可能包括當前室溫,對於 BLE,廣播是顯示它們存在的主要方式。
如圖,對於一個 Central 來說,它能夠搜尋和獲取到它想要的 Peripheral 的廣播資訊。
Peripheral 是如何組織資料的
連線 Peripheral 的目的就是和 Peripheral 提供的資料進行互動,在你理解這一點後,可以更好的明白 Peripheral 的資料組成結構。
Peripheral 包含一個或多個 Service(服務)和連線訊號強度的有用資訊。Service 可以理解成是一個完成指定功能的資料集合。舉個例子,一個心率監測服務的功能就是可能就是從心率感測器中讀取心率資料。
Service 是由 Characteristic(特徵) 組成的,Characteristic 為 Peripheral 的 Service 提供更詳細的資訊,舉個例子,心率服務可能包含一個測量不同體位的心率資料的 Characteristic 和一個傳輸心率資料的 Characteristic,下圖所示的是一個心率監測裝置的資料組成結構。
Central 與 Peripheral 的資料互動
當 Central 與 Peripheral 建立成功的連線後,Central 可以發現 Peripheral 提供的全系列的 Service 和 Characteristic,廣播資料包中的資料僅僅是可用服務的一小部分而已。
Central 可以通過讀取或寫入 Service Characteristic 值的方式與 Service 進行互動。你的 APP 也許需要從數字室溫計中獲取當前室內的溫度或者設定一個溫度值到數字室溫計中。
如何表示 Central、Peripheral和 Peripheral 資料
BLE 通訊過程中涉及到的主要角色和資料處理已經簡單的整合到 CoreBluetooth 框架中了。
Central 方面的物件
當你通過本地 Central 與周邊 Peripheral 進行互動時,你只需要呼叫 Central 方面的方法就可以了,除非你設定一個本地 Peripheral,並用它來響應其他的 Central 的互動請求,實際運用中,你的藍芽處理大部分會在 Central 方面。
Local(本地) Central 和 Remote(遠端) Peripheral
在 Central 方面,用 CBCentralManager
物件來表示一個Local Central 裝置,這個物件被用來管理 Remote Peripheral 裝置(用 CBPeripheral
物件來表示),包括搜尋和連線正在廣播資料的 Peripheral。如圖所示的是 CoreBluetooth 框架中如何表示 Local Central 和 Remote Peripheral。
用 CBService 和 CBCharacteristic 物件來表示 Peripheral 中的服務資料
當你與 Remote Peripheral 進行資料互動時,你將處理它的 Service 和 Characteristic,在 CoreBluetooth 框架中,用 CBService
物件來表示 Peripheral 中的服務,同樣地,用 CBCharacteristic
物件來表示 Service 中的特徵。下圖所示的是 Remote Peripheral 的服務特徵結構樹。
Peripheral 方面的物件
對於 macOS 10.9 和 iOS 6, Mac 和 iOS 裝置可以實現 BLE Peripheral 的功能,如為其他裝置(包括 Mac,iPhone,和 iPad)提供資料。當你遵循 Peripheral 的開發規範時,就可以呼叫 BLE 通訊的 Peripheral 方面的方法。
Local(本地) Peripheral 和 Remote(遠端) Central
在 Peripheral 方面,一個 Local Peripheral 可以用 CBPeripheralManager
物件來表示,這個物件被用來管理髮布包含的服務,包括組織構建 Peripheral 的資料結構以及向中心裝置廣播資料,Peripheral Manager 也對 Remote Central的讀寫互動請求做出響應。如圖所示的是一個 Local Peripheral 和 Remote Central。
用 CBMutableService 和 CBMutableCharacteristic 物件表示 LocalPeripheral 的資料
當你設定並與 Local Peripheral 進行資料互動時,你處理的是它的可變的 Service 和 Characteristic,在 CoreBluetooth 框架中,用 CBMutableService
物件來表示 Local Peripheral 中的服務,同樣地,用 CBMutableCharacteristic
物件來表示Local Peripheral 服務中的特徵。下圖表示的是一個 Local Peripheral 中的服務特徵結構樹。
後續章節會進一步補充關於 BLE 開發的知識。
參考文獻
結束語
歡迎在本文下面留言一起交流心得...