iBeacon工作原理(How do iBeacon work?)
主題 iBeacon 藍牙
iBeacon是*近非?;鸬脑掝}。這種技術能夠實現室內定位,讓你的手機能夠知道是否處于一個Beacon的范圍內。使用這種技術能夠產生很多應用程序:比如幫助你在停車場中找到你的汽車,或者在零售店中根據所處位置提供優惠券或者其它一些位置相關的服務。還有很多我們現在無法想象得到的應用程序。
現在有很多種關于iBeacon是什么,以及我們可以如何使用它們的解釋。然而從技術角度上來說,它們是如何工作的?底層的技術使用的使用Bluetooth LE,因此。。。
What is Bluetooth LE?(什么是Bluetooth LE,簡寫BLE)
Bluetooth Low Energy(BLE)是2010年發布的藍牙4.0技術規范的一部分。它起源于2006年Nokia的Wibree技術,但*終被整合進了藍牙。這是一組與傳統藍牙不同的協議,并且使用的設備上也不會向后兼容。因此,現在市面上你可以看到三種類型的設備:
1.Bluetooth設備:只支持傳統藍牙的設備。
2.Bluetooth Smart Ready設備:同時支持傳統藍牙和LE模式的設備。
3.Bluetooth Smart設備:只支持LE模式的設備。
*新的手機(iPhone 4s+, SG3+)、筆記本、平板電腦等,基本上都已經支持藍牙4.0,也就是Bluetooth Smart Ready設備。Beacon,從另一方面來說,這種設備只支持low energy protocols(LE低功耗協議),屬于上面說所的“Bluetooth Smart”設備,這也是它們靠一顆紐扣電池就能運行很長時間的原因。老式設備,比如外設、汽車系統、舊手機等通常只支持傳統藍牙協議。
BLE*重要的特點當然在于它的低能耗。舉個例子,一些beacon設備靠一顆微型電池就能夠持續發送一個信號兩年左右(這種電池一般是不可拆卸的,你可能需要在beacon停止工作之后替換一個新的beacon)。傳統藍牙和LE藍牙使用的都是相同的波段(2.4GHz-2.4835GHz)。BLE協議的傳輸速率比較低,因此除了用于發現設備和做一些簡單通信之外,不太適合用于傳輸大量的數據流。在協議條款上,LE和傳統藍牙的信號都能夠覆蓋到100米的范圍。
How does BLE communication work?(BLE設備如何通信)
BLE的通信包括兩個主要部分:advertising(廣告)和connecting(連接)。
廣告(Advertising)是一種單向的發送機制。想要被搜索到的設備可以以20毫秒到10秒鐘的時間間隔發送一段數據包。使用的時間間隔越短,電池消耗的越快,但設備被發現的速度也就會快。數據包長度*多47個字節,由以下部分組成:
1 byte preamble(1字節做報頭)
4 byte access address(4字節做地址)
39 bytes advertising channel PDU(39個字節用于PDU數據包)
3 bytes CRC(3個字節用于CRC數據校驗)
對于廣告通信信道,地址部分永遠都是0x8E89BED6。對于其它數據信道,地址部分由不同的連接決定。
返回的PDU數據也擁有自己的數據報頭(2個字節:聲明有效載荷數據的長度和類型——設備是否支持連接等等)和當前有效載荷數據(*多37個字節)。
*終,有效載荷數據中的頭6個字節是設備的MAC地址,所以實際信息數據*高可占31個字節。
BLE設備可以運行在單一的不可連接的廣告模式中(在這種模式下所有的信息都包含在廣告數據包中),然而設備也是允許運行在可被連接的模式下(通常情況下都是這種模式)。
當設備被發現之后,一個連接就會被建立起來。之后就可以讀取BLE設備提供的Service,以及每個Service的characteristic(屬性,類似于GATT Profile實例)。每一個characteristic都會提供一些值,這些值可以被讀取或者修改。例如,一個小型溫控器可以開放一個service用于獲取當前的溫度或者濕度讀數(相當于是service的characteristic),同時也可以開放其它的service和characteristic用于設置期望的溫度。這里因為beacon不使用連接模式,我將會跳過這些細節。如果你想要了解更多關于連接BLE設備的內容,可以參考 Apple's Core Bluetooth guide ,盡管你可能不是一個IOS開發人。更多相關技術性的文章,可以參考 Introduction to BLE , Making the most out of BLE Advertising mode 。
How do beacons use BLE?(beacon設備如何使用BLE)
Beacon設備只使用了廣告通信信道。正如beacon(信標、燈塔)的字面意思,這種設備以一定的時間間隔發送數據包,并且發送的數據被可以被像手機這樣的設備獲取。也就是說,iBeacon只是BLE廣告模式的一種簡單的使用,并在此基礎上提供了對IOS的一些附加支持。
如果你試著攔截一段iBeacon廣告數據包,例如下面從Estimote beacon截獲的數據包:
02 01 06 1A FF 4C 00 02 15 B9 40 7F 30 F5 F8 46 6E AF F9 25 55 6B 57 FE 6D 00 49 00 0A C5(截獲以上數據,如果你使用的Mac設備,你可以參考 additional XCode download 為XCode添加藍牙掃描和數據包打印工具。如果是Window設備,請參考 這里
)
以上的數據已經將廣告數據包的報頭、修正地址、廣告PDU數據包的報頭和其中的MAC地址部分都移除掉了,也就是說這部分數據只包含了實際信息數據——一共30個字節,符合實際信息數據*多31個字節的限制。
那么一個iBeacon設備的BLE廣告數據是如何組成的?以下是Apple修正的數據格式,整理如下(也可以參考 這里 ):
02 01 06 1A FF 4C 00 02 15: iBeacon prefix (fixed) B9 40 7F 30 F5 F8 46 6E AF F9 25 55 6B 57 FE 6D: proximity UUID (here: Estimote’s fixed UUID) 00 49: major 00 0A: minor C5: 2’s complement of measured TX power

根據這些原理,如果你想要實驗beacon的功能,你不必需要一個真正的beacon設備。如果你有*新的手機(例如iPhone4S+,SG3+)或者配備藍牙4的筆記本(例如Retina MacBook),你可以將這些設備轉換成iBeacon發送設備和接收設備。以iPhone為例,你可以在AppStore上下載“Locate iB”應用。對于MacOS,可以參考 這里 。當然你可以可以使用 樹莓派 。
Breaking down the iBeacon format(解析iBeacon的數據格式)
除了修正的iBeacon前綴數據(02 01 ... 15),其它各部分數據各代表什么?
Proximity UUID (上面例子中的B9 ... 6D部分):這是將你所有的beacon與其他人的beacon設備區別開的id!例如,目前在商店里某個區域分布著多個beacon形成一條“鏈帶”,用于為顧客提供特定的服務,那么歸屬于同一條“鏈帶”的beacon將分配到相同的proximity UUID。為這條“鏈帶”設計的專用應用程序將會在后臺使用這個UUID掃描到這條“鏈帶”中的beacon設備。
major 編號(2個字節,上面例子中為0x0049,也就是73):用于將相關的beacon標識為一組。例如,一個商店中的所有beacon將會分配到相同的major編號。通過這種方式,應用程序就能夠知道顧客位于哪一家商店。
minor 標號(也是2個字節,上面例子中為0x000A,也就是10):用于標識特定的beacon設備。例如一個商店中的每一個beacon設備都擁有唯壹的minor編號,這樣你才能夠知道顧客位于商店中的哪個位置。
Measuring distance(測量距離)
*后一個值, TX power ,用于確定你和beacon之間距離有多近。根據這個值不但可以獲得粗略的信息(比如靠近/遠離/不在范圍內等),也可以獲取**到米的距離(當然你也可以轉換為以步為單位的距離)。那么如何實現?
TX power (上面例子中為0xC5=197,根據2的補碼測得256-197=-59dBm)是距離設備1米測得的信號強度值(RSSI- Received Signal Strength Indication,接收到的信號強弱指標)。假如接收到的信號強度減弱了,那么我們可能在遠離。只要知道1米距離的RSSI,以及當前的RSSI(我們可以從接收到的信號中一塊獲取到這些信息),那么計算出當前的距離是可能的。IOS已經實現了個這個功能,對于其它平臺需要自己手動編碼計算,可以參考 這里 。
譯注:Java代碼粗略計算距離代碼:
protected static double calculateAccuracy(int txPower, double rssi) { if (rssi == 0) { return -1.0; // if we cannot determine accuracy, return -1. } double ratio = rssi*1.0/txPower; if (ratio < 1.0) { return Math.pow(ratio,10); } else { double accuracy = (0.89976)*Math.pow(ratio,7.7095) + 0.111; return accuracy; } }
然而,在實際應用中,由于人體或者其它通信阻礙物都有可能削弱信號,因此這個距離只是一個估算值。
IOS integration(IOS整合)
IOS已經整合了iBeacon。當你進入beacon的范圍內,你的應用程序就可以接收到通知,即使你的應用程序處于在后臺也能接收到。一個應用程序可以注冊一個區域的進入或者退出事件,因此即使應用程序沒有運行也可以被喚醒。為了響應這些事件,應用程序可以發送例如本地推送通知,提示用戶打開應用程序查看商店的促銷廣告(這些促銷廣告可以從網絡上面獲?。?,或者是其它相關的內容。
更準確的說,當手機處于不活動狀態時,也就是IOS進入了低電量監控模式的時候,只有iBeacon區域進入/退出事件能夠被接收到。當手機和應用程序處于活動狀態,你可以進入ranging模式,這個能夠讓你檢測的信號強度和估算距離更加準確。
注意你的手機檢測beacon需要花費一定的時間。首先,beacon設備是間隔一定的時間才發送一次廣告。其次,如果你的手機處于非活動模式,它只在有些時候才會檢測藍牙信號。一個beacon設備要被檢測到,上面兩段工作時間就需要有交集。實踐證明,它可能需要15分鐘才能檢測到一個beacon設備。
按步驟開發一個iOS iBeacon應用程序可以參考 這里 。Beacon的制造商通常也會提供SDK幫助開發Beacon應用程序。參考Estimote的 iOS SDK 和 Android SDK 。
How can I get some beacons?(如何獲取Beacon設備)
Beacon設備資源現在比較**,你通常需要等上幾個星期才能拿到貨,但可以肯定的是將來這種情況會改善。
因此,*快的選擇就是創建一個Beacon模擬器:將iPhone/Android/MacBook/其它筆記本/樹莓派轉換成了Beacon模擬器。
**種選擇就是試著去訂購一些Beacon設備了:
pre-order Estimote beacons; 3 for $99
Kontakt beacons come in a couple of packages; 4 for $99, 10 for $279
RaspberryPi kits from RadiusNetworks: 1 for $99
RedBearLab offers BLE shields for Arduino for $30
Bleu sells USB-iBeacon dongles. 1 for $40, 5 for $150
Alternatives(替代品)
iBeacon不是唯壹一種基于BLE近距離技術開發的設備。高通同樣正在開發自己的Beacon——Gimbal,并集合了iOS和Android SDK。它們提供的功能比較類似,但是BLE廣告的數據格式可能不一樣。我的開發工具還在運送途中,因此我還沒有測試過,但是這種Beacon肯定很有趣,尤其是它的價格*低只有5美元。
What's next?(下一步是什么?)
現在還沒有做的事情就是開發一些基于Beacon的應用程序。為了實現這個目的,記住 SoftwareMill :我們經常尋找一些有趣的項目來開發。