iBeacon 是蘋果公司 2013 年 9 月釋出的移動裝置用 OS(iOS7)上配備的新功能。其工作方式是,配備有低功耗藍牙(BLE)通信功能的裝置使用 BLE 技術向周圍發送自己特有的 ID,接收到該 ID 的應用軟體會根據該 ID 采取一些行動。比如,在店鋪裡設定 iBeacon 通信子產品的話,便可讓 iPhone 和 iPad 上運作一資訊告知伺服器,或者由伺服器向顧客發送折扣券及進店積分。此外,還可以在家電發生故障或停止工作時使用 iBeacon 向應用軟體發送資訊。
蘋果 WWDC 14 之後,對 iBeacon 加大了技術支援和對其用于室内地圖的應用有個更明确的規劃。蘋果公司公布了 iBeacon for Developers 和 Maps for Developers 等專題頁面。
1) 定義兩個 BLE 裝置通過叫做 Service 和 Characteristic 的東西進行通信。中心裝置和外設需要雙向通信的話,唯一的方式就是建立 GATT 連接配接。
2) GATT 連接配接是獨占的。基于 GATT 連接配接的方式的,隻能是一個外設連接配接一個中心裝置。
3) 配置檔案是裝置如何在特定的應用程式中工作的規格說明,一個裝置可以實作多個配置檔案。
GAP(Generic Access Profile):用來控制裝置連接配接和廣播,GAP 使你的裝置被其他裝置可見,并決定了你的裝置是否可以或者怎樣與合同裝置進行互動。
1) GATT 連接配接,必需先經過 GAP 協定。
2) GAP 給裝置定義了若幹角色,主要兩個:外圍裝置(Peripheral)和中心裝置(Central)。
3) 在 GAP 中外圍裝置通過兩種方式向外廣播資料:Advertising Data Payload(廣播資料)和 Scan Response Data Payload(掃描回複)。
Profile:并不是實際存在于 BLE 外設上的,它隻是一個被 Bluetooth SIG(一個以制定藍牙規範,以推動藍牙技術為宗旨的跨國組織)或者外設設計者預先定義的 Service 的集合。
Service:服務,是把資料分成一個個的獨立邏輯項,它包含一個或者多個 Characteristic。每個 Service 有一個 UUID 唯一辨別。UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通過認證的,需要花錢購買,128 bit 是自定義的,可以自己設定。每個外設會有很多服務,每個服務中包含很多字段,這些字段的權限一般分為讀 read,寫 write,通知 notiy 幾種,就是我們連接配接裝置後具體需要操作的内容。
Characteristic:特征,GATT 事務中的最低界别,Characteristic 是最小的邏輯資料單元,當然它可能包含一個組關聯的資料,例如加速度計的 X/Y/Z 三軸值。與 Service 類似,每個 Characteristic 用 16 bit 或者 128 bit 的 UUID 唯一辨別。每個裝置會提供服務和特征,類似于服務端的 API,但是機構不同。
Description:每個 Characteristic 可以對應一個或多個 Description 使用者描述 Characteristic 的資訊或屬性。
Peripheral、Central:外設和中心,發起連接配接的是 Central,被連接配接的裝置為 Peripheral。
藍牙通信中,首先需要提到的就是 central 和 peripheral 兩個概念。這是裝置在通信過程中扮演的兩種角色。直譯過來就是 [中心] 和 [周邊(可以了解為外設)]。iOS 裝置既可以作為 central,也可以作為 peripheral,這主要取決于通信需求。
例如在和心率監測儀通信的過程中,監測儀作為 peripheral,iOS 裝置作為 central。區分的方式即是這兩個角色的重要特點:提供資料的是誰,誰就是 peripheral;需要資料的是誰,誰就是 central。就像是 client 和 server 之間的關系一樣。

那怎麼發現 peripheral 呢
在 BLE 中,最常見的就是廣播。實際上,peripheral 在不停的發送廣播,希望被 central 找到。廣播的資訊中包含它的名字等資訊。如果是一個溫度調節器,那麼廣播的資訊應該還會包含目前溫度什麼的。那麼 central 的作用則是去 scan,找到需要連接配接的 peripheral,連接配接後便可進行通信了。
當 central 成功連上 peripheral 後,它便可以擷取 peripheral 提供的所有 service 和 characteristic。通過對 characteristic 的資料進行讀寫,便可以實作 central 和 peripheral 的通信。
CoreBluetooth 架構的核心其實是兩個東西,central 和 peripheral, 對應他們分别有一組相關的 API 和類。
這兩組 API 分别對應不同的業務場景,如下圖,左側叫做中心模式,就是以你的手機(App)作為中心,連接配接其他的外設的場景。而右側稱為外設模式,使用手機作為外設連接配接其他中心裝置操作的場景。
iOS 裝置(App)作為 central 時:
當 central 和 peripheral 通信時,絕大部分操作都在 central 這邊。此時,central 被描述為 CBCentralManager,這個類提供了掃描、尋找、連接配接 peripheral(被描述為 CBPeripheral)的方法。
下圖示示了 central 和 peripheral 在 Core Bluetooth 中的表示方式:
當你操作 peripheral 的時候,實際上是在和它的 service 和 characteristic 打交道,這兩個分别由 CBService 和 CBCharacteristic 表示。
iOS 裝置(App)作為 Peripheral 時:
在 OS X 10.9