2015年8月2日 星期日

「Raspberry Pi」實作ibeacon發射器

看到網上用Pi做iBeacon發設器的應用,俺也想來試試。

iBeacon介紹



Beacon這項技術常見的應用就是室內定位。目前常見室內定位技術大致分為Wifi、

Zigbee及BLE三種,這三種技術大致上的共同點都是使用無線傳輸中RSSI

( Received Signal Strength Indication,接收信號強度指示 )的

dB值強弱來判斷距離。

Beacon與iBeacon的差別於廣播訊號頻率。

iBeacon 其實是基於BLE的訊號廣播設備,在架構中通常會有一個 iBeacon 發射器,

發射器有一個唯一的ID號碼其主要的內容包括內容 UUID(16 byte)、Major (2 byte)、

Minor (2 byte)及 Tx Power等資訊。通常發射器只有單向發射訊號的功能,

除非客製化成Dual-Mode iBeacon的服務否則沒有接收功能。

iBeacon定位


在室內定位技術部分,iBeacon的信號強度採用RSSI值表示。隨著距離的遠近,

RSSI值會產生變化透過校準發射功率 (txPower)就可以算出與發射器的距離。

當iBeacon接收器(手機或硬體裝置)接收到這組資料,就可以判斷所在位置。
由於訊號會因為一些物理或空間上的影響而改變,Apple定義了四種範值:
Immediate 很近,小於1公尺。
Near 附近,約1-3公尺。
Far 較遠。(或離開範圍)
Unknown 未知,一般出現在啟動階段,或者因為某些原因無法判斷。
至於定位方案則可以透過單點定位、兩點定位及多點定位方式以 

iBeacon 發射器的數量多寡來完成定位的精準。


iBeacon發射器環境建立

軟硬體環境:


Raspberry Pi 2
D-Link DWA-121 USB無線網卡

嘻哈佈落科技 CSR V4.0藍牙傳輸器

RASPBIAN Debian Wheezy 2015-05-05

安裝所需要的套件


sudo apt-get -y install libglib2.0-dev libudev-dev libical-dev libreadline-dev libdbus-1-dev

下載最新版bluez (BlueZ官網找找)

wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.33.tar.xz

解壓縮bluez( 注意它是.xz壓縮喔)


tar xvf bluez-5.33.tar.xz


Compiler bluez


cd bluez-5.33/

./configure --disable-systemd

make -j4  (pi 2 有4個核心)

sudo make install

檢查是否有捉到usb 藍芽卡

lsusb












看到 Cambridge Silicon Radio, Ltd Bluetooth Dongle(HCI mode) ,有捉到

藍芽USB卡,沒問題。

檢查藍芽是否被啟動

hciconfig












我的藍芽名稱是 hci0 ,目前是DOWN的狀態


啟動藍芽並關閉掃描功能

sudo hciconfig hci0 up
sudo hciconfig hci0 noscan






啟動BLE的廣播功能

sudo hciconfig hci0 leadv


測試發送 iBeacon 的資料封包

sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 C5 6D B5 DF FB 48 D2 B0 60 D0 F5 A7 10 96 E0 00 00 00 00 C8 00


內容如下

0x08 BLE Controller Commands,

0x008 表示Advertising Data (length)廣播資料

1E Number of bytes that follow in the advertisement
02 Number of bytes that follow in first AD structure
01 Flags AD type
1A Flags value 0x1A = 000011010  
   bit 0 (OFF) LE Limited Discoverable Mode
   bit 1 (ON) LE General Discoverable Mode
   bit 2 (OFF) BR/EDR Not Supported
   bit 3 (ON) Simultaneous LE and BR/EDR to Same Device Capable (controller)
   bit 4 (ON) Simultaneous LE and BR/EDR to Same Device Capable (Host)
1A Number of bytes that follow in second (and last) AD structure
FF Manufacturer specific data AD type
4C Company identifier code LSB
00 Company identifier code MSB (0x004C == Apple)
02 Byte 0 of iBeacon advertisement indicator
15 Byte 1 of iBeacon advertisement indicator
接下去則是UUID(16 byte)、Major (2 byte)、 Minor (2 byte)及 Tx Power等參數

UUID 服務識別碼: 這裡用來區別不同公司不同的系統。
Apple在它們自家的iBeacon服務中定義了 Apple AirLocate 其UUID開頭為 

E2C56DB5 、5A4BCFCE 及 74278BDA。

上述的UUID就是採用 E2C56DB5 開頭的一組 Apple AirLocate UUID : 

E2 C5 6D B5 DF FB 48 D2 B0 60 D0 F5 A7 10 96 E0

Major ID: 在同樣 UUID 的一群 iBeacon 發射器中為了區隔不同分類

定義以此Major Number (2 byte),例如喜宴會場 A 就定義為0001、會場B就定義0002

Minor ID: 細分類,例如喜宴會場A的男方親友區為0001 ,女方親友區為0002

TX power:則是用來判斷使用者與beacon之間的距離遠近。















接下來可以拿支援BLE的裝置出來安裝 Locate Beacon 這個APP 

Anrdoid



AppStroe 








































房間的斜對角













































還算準確(房間小~_~)。

接下來我走到房間外面去看看距離的變化














































只是轉個角出門口,PI 放在門口旁邊的桌子上,距離就開始拉長了。

參考資料:

http://www.cheng-min-i-taiwan.blogspot.tw/2015/03/raspberry-pi-40ibeacon.html

http://stackoverflow.com/questions/20416218/understanding-ibeacon-distancing

ios ibeacon 接收軟體
https://github.com/relevante/ibeacon-tutorial


Android ibeancon接收軟體
https://github.com/Vinayrraj/Android-iBeacon-Demo


http://stackoverflow.com/questions/23483086/using-hcitool-to-set-ad-packets

http://stackoverflow.com/questions/22144098/understanding-ibeacon-data-the-power-field-and-other-bytes/22148306#22148306

沒有留言:

張貼留言