製作 iBeacon for Linux 版本

製作 iBeacon for Linux 版本

iOS7之後,apple提出一個室內定位的解決方案iBeacon,它利用藍牙低功耗(BLE)的通訊方式,進行接收訊號,經過訊號強度來辦別距離,所以iBeacon可以達成趨近偵測定位的功能,間接解決當初Apple未加入NFC時,產生的一些疑問。 但iBeacon究竟是怎麼完成的?其實它只是在藍牙發射的封包做一些結構,當收到封包時將它解成有義意的資訊。以下為iBeacon封包的結構,我們會在Linux製作出相容的封包完成iBeacon的功能,

藍牙Dongle

準備一支有支援Bluetooth LE功能的藍牙USB裝置,而且必需要相容Linux的Bluez Stack,這建議使用Broadcom的產品,經過實驗,使用CSR的藍牙4.0 Dongle似乎有些問題存在。

Bluez

Bluez是在Linux上使用的Bluetooth Stack,所以Dongle有支援Bluez就能正常使用藍牙的功能,首先要確認一下您的環境是否有安裝 Bluez Stack,我們執行相關命令來判斷:

sudo hciconfig

這是查詢藍牙週邊的命令,安裝正確就能列出Bluetooth Dongle

hci0:   Type: BR/EDR  Bus: USB
    BD Address: 00:02:xx:DC:xx:4F  ACL MTU: 1021:8  SCO MTU: 64:1
    UP RUNNING
    RX bytes:1144 acl:0 sco:0 events:71 errors:0
    TX bytes:1173 acl:0 sco:0 commands:71 errors:0

Linux允許你可以安裝多個Bluetooth Dongle,在命名上類似網卡一樣有前綴字,這裡的是hci開頭,使用時只要指定名稱就能對Bluetooth Dongle操作。

準備工作

下載iOS APP

這次實作後需要使用到iOS上的APP來檢查iBeacon是否有正常運作,直接到itunes store下載Locate for iBeacon

安裝iBeacon For Linux執行程式

iOS APP都準備好時,到GitHub下載iBeacon For Linux,裡面是利用Script組成,直接對於Bluez Statck下藍牙的命令。

開始測試

開啟iOS APP

開啟之前下載安裝好的Locate for iBeacon

Radius Networks的APP功能蠻多的,這是一家極力推廣iBeacons的公司,APP本身自已也可以變成一個iBeacon週邊,如果你有2台裝置可以配合測試使用,因為我們現階段已經選擇另一個方式的iBeacon,所以我我們選擇Locate iBeacons功能,這功能目的是要偵測週邊的iBeacon狀態。

下面這畫面是還未偵測到iBeacon週邊的訊息狀態,下階段我們開啟Linux上的iBeacon就可以看到變化

執行Linux程式

首先,先到Linux環境中到剛剛下載並解壓好的程式看一下:

pi@raspberrypi ~/iBeaconForLinux-master $ ls -l
total 20
-rwxr-xr-x 1 pi   pi    151 Mar 26 10:54 ibeacon.conf
-rwxr-xr-x 1 pi   pi    989 Mar 26 10:54 README.md
-rwxr-xr-x 1 pi   pi    415 Mar 26 10:58 start.sh
-rwxr-xr-x 1 pi   pi    132 Mar 26 10:58 stop.sh
drwxr-xr-x 5 root root 4096 Mar 26 09:38 tools
pi@raspberrypi ~/iBeaconForLinux-master $

其中有start.shstop.sh分別為啟動與停止功能,我們先下命令啟動iBeacon功能:

./start.sh

結果:

pi@raspberrypi ~/iBeaconForLinux-master $ ./start.sh
[Bluetooth-Startup Bluetooth]
[iBeacon-Setting iBeacon]
LE set advertise enable on hci0 returned status 12
< HCI Command: ogf 0x08, ocf 0x0008, plen 44
  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 C9 00 00 00 00 00 00 00 00 00
  00 00 00 00
> HCI Event: 0x0e plen 4
  01 08 20 00
iBeacon-iBeacon is working
pi@raspberrypi ~/iBeaconForLinux-master $

代表已經運作成功,要停止功能可以執行

./stop.sh

結果:

pi@raspberrypi ~/iBeaconForLinux-master $ ./stop.sh
 iBeacon-Disabling iBeacon
-Stopped.

iOS運作畫面

當前面操作都完成並且啟動iBeacon時,可以回到iDevice上看一下APP的訊息,整個過程有成功時能在APP上看到已有偵測到iBeacon的訊息,

上圖已經顯示卡現iBeacon狀置,直接點選可以看細節內容,

內容有顯示訊號(RSSI)、準確性、距離(Accuracy)…等訊息,以上就是iBeacon在Linux上的操作。

進階設定

先前所寫的內容都是直接操作,但其實細節上有部分是可以設定的,設定的功能是定義在ibeacon.conf,我們cat一下內容:

pi@raspberrypi ~/iBeaconForLinux-master $ cat ibeacon.conf
export BLUETOOTH_DEVICE=hci0
export UUID="e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0"
export MAJOR="00 00"
export MINOR="00 00"
export POWER="c9"
pi@raspberrypi ~/iBeaconForLinux-master $

這些都是可以自行設定的功能,解說一下設定內容:

  • BLUETOOTH_DEVICE Bluetooth的名稱,以hci開頭,第一個週邊名稱為hci0,有多個就hci0hci1以此類推
  • UUID 12bit的UUID,也就是掃描到iBeacon可以看到的UUID,這通常代表的就是你iBeacon的類型
  • MAJOR 16bit表示這組iBeacon的ID
  • MINOR 16bit表示這組內的某個特定的ID
  • POWER 訊號強度,這個經過計算後會成為RSSI的值

我們可以經過ibeacon.conf設定檔去自由的設定這些值,但要要注意的是參數POWER,此參數必需要經過調整與測試,如果設定的不是很正確時,在接收iBeacon的APP或是裝置可能對於距離的計算會產生誤差,以上設定值都設定完成後,要重新啟動(停止、啟動)才會生效。