iOS BLE 開發小記[1] CoreBluetooth 是什麼

歡迎訪問個人博客 muhlenXi,該文章出自個人博客,歡迎轉載,轉載請註明來源: muhlenxi.com/2017/05/02/…html

導語:

不知不覺從事 iOS 低功耗藍牙開發也很長一段時間了,一直沒時間來的及把本身關於這方面的學習和收穫寫下來,最近項目迭代更新上線完,有點業餘時間,抓緊時間總結一下,說這是與同階段的小夥伴們之間的交流也好,是給後來的小夥伴的掉坑經驗也好。畢竟時間是擠出來的!作技術的人通常都有一個很開放的心態!服務器

如今咱們都知道,不少智能硬件設備都已經集成了低功耗藍牙模塊,這樣咱們就能夠開發一個 iOS 或者 Mac APP 與它們進行交互。從 macOS 10.9 和 iOS 6 之後,Mac 和 iOS 設備就支持 低功耗藍牙技術了,咱們能夠經過 CoreBluetooth 這個框架與底層的各類藍牙協議棧進行交互,好比 GATT、ATT 和 L2CAP 等。數據結構

與底層交互的過程以下圖所示:架構

底層交互

開始下文以前,咱們須要瞭解幾個概念。對藍牙不夠了解的能夠看一下維基百科關於藍牙的簡介。app

Bluetooth 4.0: 藍牙 4.0 是 Bluetooth SIG 於2010年7月7日推出的新的規範,其最重要的特性是功耗低,省電!框架

BLE: Bluetooth low energy wireless technology,也就是低功耗無線藍牙技術。less

簡單瞭解 CoreBluetooth

BLE 是什麼?

BLE 是關於藍牙4.0 的詳細說明,它定義了一套用於低功耗設備之間通訊的協議。而CoreBluetooth 則是對 BLE 協議棧的抽象。也就是說,它隱藏了許多底層的詳細實現細節,這樣對咱們開發者來講,開發一個 APP 與 BLE 設備進行交互將會很便捷。學習

兩個核心角色 Central 和 Peripheral

CoreBluetooth 中最關鍵的兩個角色就是 Central(中心) 和 Peripheral(周邊), Peripheral 通常是提供數據的一方,而 Central 通常獲取 Peripheral 提供的數據而後來完成特定的任務。舉個例子,一個集成 BLE 的數字室溫計可能提供房間中的實時溫度,咱們經過 APP 就能夠讀取、分析和顯示房間中的溫度。ui

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,而後來顯示用戶的心率數據。

Peripheral 提供數據給 Central

Central 搜索和鏈接正在廣播數據的 Peripheral

Peripheral 以廣播數據包的形式廣播服務中的數據,廣播數據包指的是包含 Peripheral 有用信息的一個較小數據包,好比 Peripheral 的名字和主要功能數據。好比,一個數字室溫計廣播的數據中可能包括當前室溫,對於 BLE,廣播是顯示它們存在的主要方式。

如圖,對於一個 Central 來講,它可以搜索和獲取到它想要的 Peripheral 的廣播信息。

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。

Local Central 和 Remote Peripheral

用 CBService 和 CBCharacteristic 對象來表示 Peripheral 中的服務數據

當你與 Remote Peripheral 進行數據交互時,你將處理它的 Service 和 Characteristic,在 CoreBluetooth 框架中,用 CBService 對象來表示 Peripheral 中的服務,一樣地,用 CBCharacteristic 對象來表示 Service 中的特徵。下圖所示的是 Remote Peripheral 的服務特徵結構樹。

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。

Local Peripheral 和 Remote Central

用 CBMutableService 和 CBMutableCharacteristic 對象表示 LocalPeripheral 的數據

當你設置並與 Local Peripheral 進行數據交互時,你處理的是它的可變的 Service 和 Characteristic,在 CoreBluetooth 框架中,用 CBMutableService 對象來表示 Local Peripheral 中的服務,一樣地,用 CBMutableCharacteristic 對象來表示Local Peripheral 服務中的特徵。下圖表示的是一個 Local Peripheral 中的服務特徵結構樹。

Local Peripheral 中的服務特徵結構樹

後續章節會進一步補充關於 BLE 開發的知識。

參考文獻

一、TP40013257-CH1-SW1

二、CoreBluetoothOverview

結束語

歡迎在本文下面留言一塊兒交流心得...

相關文章
相關標籤/搜索