第一次寫技術博客,既當作對本身的技術總結,也看成和廣大網友們分享討論的一個平臺吧。linux
最近在研究BLE技術,而ibeacon是其中比較簡單的一個應用。雖然由蘋果公司推出已經四五年了,網上的資料仍是稍顯的零散。下面就從理論和實踐兩個方面來總結一下這項技術,力求剛剛接觸這個的朋友也能很快的瞭解而且能本身動手實現ibeacon,畢竟我以爲本身動手實踐才能真正的學會。固然,不足或者錯漏之處請你們不吝賜教。ubuntu
一:ibeacon的基本原理和數據包結構服務器
ibeacon是由蘋果公司在2013年推出的,其初衷是解決室內定位的問題。由於GPS在室內很難發揮做用,而如今手機上標配藍牙。利用低功耗的BLE多點定位來解決室內(大型商場、停車場、醫院等)定位的問題也就理所應當了。微信
ibeacon本質上就是BLE的廣播,不涉及到BLE設備間的連接,不過這裏的廣播包有特定的格式。這裏須要兩個設備,ibeacon基站和帶藍牙4.0以上的手機,而整個定位過程的實現涉及三個方面。除了基站和手機以外,還有個遠程的服務器提供的服務,這裏通常以APP的方式存在於手機之上。數據結構
整個的過程是這樣的:工具
ibeacon基站一直在廣播,廣播包裏包含的主要是一、本基站的設備類型。 二、本基站的編號。三、本基站的發射功率。三個重要信息;spa
打開藍牙的手機靠近基站以後收到了廣播包的信息,經過廣播包的設備類型判斷出這是個ibeacon設備,經過廣播包裏記載的發射功率與本身接受到的信號功率對比得出和基站的距離(經驗公式D =10^((abs(RSSI)-A)/(10*n),其中D是得出的距 離, A是發射設備和接收設備相距一米時的信號強度,n爲環境因子)。而後經過手機上特定的APP將基站編號發送給服務器(這個過程要求手機必定要能聯網),服務器查詢該編號返回該基站所在的具體詳細地址;命令行
根據服務器返回的具體基站地址,加上前面測算的和該基站的距離,就可以定位本身位置啦!固然,多個基站存在時,多點定位就能更加準確肯定本身的位置了。code
蘋果ibeacon的定位功能在國內實用的例子還不太多,反卻是藉助於Ibeacon的微信搖一搖火爆了起來。相比於室內定位,微信搖一搖更加側重於商家用來展現廣告和促銷信息等。前面講到了須要一個手機上的APP,這裏國內的超級APP微信就承擔了這樣一個角色。其基本原理和過程與上述相同,可是這裏微信後臺查詢基站編號以後返回的是一個網頁地址。商家在此網頁上配置本身的促銷信息,優惠券以及其餘廣告。這樣一來,客戶一旦走近商家店鋪,手機上就自動可以獲得該商家優惠信息等等。blog
說完了原理,如今來詳細的解析ibeacon廣播包的數據結構。ibeacon基於BLE的廣播,而BLE廣播限定數據長度不能超過31 Bytes。ibeacon將廣播包的長度固定爲30 Bytes。
這30個Bytes分爲兩個AD structure(這是BLE廣播數據的一種組織形式)。每一個AD structure由 1字節的length+1字節的AD Type+用戶數據 構成。下面拿一個實例來講明:
02 01 06 1a ff 4c 00 02 15 fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25 29 11 30 39 1c
這是一個ibeacon包的payload,其中「02 01 06」是第一個AD structure,「1a ff 4c 00 02 15 fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25 29 11 30 39 1c」是第二個AD structure的內容。
對第一個AD structure,
1 02 ,// AD structure的長度 這裏表示接下來還有兩個字節 2 01, //AD Type 這是由藍牙聯盟定義的標識,這裏表示藍牙支持類型 3 06, //0x06=0000 0110 每一個位的意義以下 4 bit0=0 OFF // LE Limited Discoverable Mode 5 bit1=1 ON // LE General Discoverable Mode 6 bit2=1 ON // BR/EDR Not Supported 7 bit3=0 OFF // Simultaneous LE and BR/EDR to Same Device Capable (controller) 8 bit4=0 OFF //Simultaneous LE and BR/EDR to Same Device Capable (Host)
對第二個AD structure,
1a, // AD structure長度,這裏是26個字節 ff, // ADType. 由於ibeacon並未寫入官方協議,這裏使用自定義類型Manufacturer Specific Data 4c, 00, //這個指公司, 00 4c是APPLE 02, 15, //這是ibeacon的標識,指示這個廣播是ibeacon廣播 fd,a5,06,93,a4,e2,4f,b1,af,cf,c6,eb,07,64,78,25,//16字節的proximity UUID 由設備廠商和設備用途決定,這裏用的是微信的UUID 29,11, // Major 30, 39 //Minor Major和Minor共同決定設備的編號 1c //1米距離上的信號功率
二:利用Bluez的協議棧和工具集實現ibeacon
瞭解完ibeacon的理論知識以後,如今咱們利用linux下的藍牙官方協議棧Bluez和它提供的工具集來實現Ibeacon。由於我用的不是蘋果的手機,咱們最後用微信搖一搖來檢測ibeacon。周圍沒有ibeacon設備的時候,微信搖一搖是沒有「周邊」這個選項的,當檢測到ibeacon設備時,搖一搖以後就會出現「周邊」這一項,點進去會出現商家配置的頁面。而之因此選用PC 上的Linux和Bluez協議棧來實現是由於對咱們試驗性質來說他們足夠簡便,你須要的硬件設備是一臺Linux的PC(我用的是Ubuntu的虛擬機),以及一個藍牙適配器(藍牙dongle),藍牙適配器十幾塊於淘寶上購得。軟件上你不須要寫代碼,由於Bluez已經幫你集成了一套的工具集,你只要使用相應指令就能夠。
第一步:插入藍牙dongle(要支持藍牙4.0以上的),直到Linux下看到藍牙設備的圖標
第二部:在命令行下輸入 hciconfig 檢查輸出的結果
若是是這樣顯示「DOWN」表示適配器還未啓動,須要輸入 hciconfig hci0 up 來啓動該適配器。直到出現下圖
接下來使用Bluez的工具 hcitool,輸入如下指令:
sudo hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 06 1a ff 4c 00 02 15 fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25 29 11 30 39 cd 00 這裏hcitool cmd是Bluez提供的操做藍牙HCI層的指令,-i hci0是指定使用哪一個適配器,0x08是OGF指令、這裏指BLE而不是BE/EDR的操做,0x0008是OCF指令、這裏是指設置廣播數據,後面1e以後到最後00以前的部分正是咱們前面講的ibeacon廣播的數據。這裏有個小坑注意,1e後面必須跟31個字節的數據,不夠的補 00(由於BLE廣播數據的長度是31),而1e(30)指的是有效數據的長度,ibeacon的數據長度是30因此這裏是1e。更多的hcitool 和hciconfig命令的信息能夠在網上搜索,關於OGF OCF指令以及藍牙HCI層操做的方法能夠參見藍牙核心協議。(BLE操做的部分在core 5.0協議的7.8)
以後在輸入 sudo hcitool -i hci0 cmd 0x08 0x000a 01 這裏的0x000a是藍牙廣播使能的指令,寫入01是開啓,寫入00是關閉。輸入以後的結果以下;
到這裏ibeacon的配置已經所有完成了!
打開手機藍牙你會看到一個"ubuntu"的藍牙設備(可能根據具體設備名字不一樣),打開微信->發現->搖一搖, 而後搖一搖你會發現出現了一個「周邊」的欄目,若是你配置的Major,和Minor是向微信申請的正式編號,這裏就會顯示出相應的商家頁面。
我隨便編的因此是黑屏:)