iBeacon 是 Apple 公司在 WWDC 2013 上發表的一種利用 Bluetooth 4.0 Low-Energy 技術為基礎的室內定位技術,在安裝 iOS 7.0 的 iPhone 4S 以上、iPad 3 以上,以及含 BT 4.0晶片的 Android 4.3 以上...等等的行動設備,就可以使用這個協定來確認使用者所在的位置。
最後更新日期 - 2015/01/13
事前準備
- Raspberry Pi Type A / B / B+ 均可。
- Raspbian 作業系統。
- 支援 Bluetooth 4.0 Low Energy 的 USB 藍牙傳輸器,這次是使用 嘻哈部落 SBD-40,它用的是 CSR 的藍牙晶片。
開始安裝
- 直接從 Raspbian 套件庫安裝。
sudo apt-get -y install bluez
- 自行安裝最新的版本,請直接到 BlueZ 官網下載,目前版號是 5.27。
wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.27.tar.xz
將檔案解壓縮。
unxz bluez-5.27.tar.xz && tar xvf bluez-5.27.tar
安裝所需的相依套件
sudo apt-get -y install libglib2.0-dev libudev-dev libical-dev libreadline-dev libdbus-1-dev
開始環境組態、編譯及安裝
cd bluez-5.27
./configure --disable-systemd
make && sudo make install
啟動 Bluetooth Low Engery
先確認藍牙接收器已被 Linux 偵測到,並已正確驅動。
lsusb
再確認藍牙接收器已被啟動,接收器的編號是「hci?」,? 從 0 開始排序。
hciconfig
預設會自動啟動,可以用 down 參數把它關閉。
sudo hciconfig hci0 down
再用 up 參數啟動。
sudo hciconfig hci0 up
關閉掃瞄 Host 端功能,只用來發射訊息,如果這些需要 root 權限的指令沒有配合 sudo 指令執行的話,就會出現「Operation not permitted」的錯誤訊息。
sudo hciconfig hci0 noscan
啟動 BLE 訊號的廣播功能。
sudo hciconfig hci0 leadv
若要停止 BLE 的廣播,可以用這個指令。
sudo hciconfig hci0 noleadv
開始發送訊號
這行指令就是重點中的重點了,開始發送 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
- BLE Device
藍牙接收器的編號。 - UUID
通用唯一識別碼 (Universally Unique Identifier),須自訂,用來讓對應的 iOS App 或 Android App 進行辨識,再進行後續處理程序。 - Major
須自訂,用來辨識的自訂大分類編號,由 0000 到 FFFF。 - Minor
須自訂,用來辨識的自訂小分類編號,由 0000 到 FFFF。 - Measured Power
用來調整 iBeacon 發射端與接收端相距一公尺時的訊號強度。
iBeacon 實測
iBeacon 的 Host 端處理完成後,接著安裝 Client 端來測試一下,這邊推薦 Locate Beacon for iOS 這支 App。
安裝完畢後,找到這支 App 的圖示來啟動它。
別忘了把 iPhone 上的藍牙功能打開。
iOS 7.x 的藍牙開關在「設定」-「藍牙」選單裡。
Locate Beacon 的主畫面有四個功能,我們選擇「Locate iBeacons」來偵測附近的 iBeacon Host 端。
這邊可以看到 Raspberry Pi 剛剛設定的 iBeacon Host 端了。
點選偵測到的 iBeacon Host,就可以看到 UUID、RSSI ... 等詳細資料。
Andorid 平台的朋友可以在 Google Play 上安裝 Locate Beacon for Android。
開機自動啟動
建立 iBeacon 服務的相關檔案。
mkdir /home/pi/ibeacon
建立主要參數檔,下列的設定值請依需求自行修改。
vi /home/pi/ibeacon/ibeacon.conf
########## 我是分隔線 ##########
export BLE_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="c8"
########## 我是分隔線 ##########
建立啟動腳本檔。
vi /home/pi/ibeacon/start
########## 我是分隔線 ##########
#!/bin/sh
. ./ibeacon.conf
echo
echo "Enable iBeacon singal Advertising ..."
sudo hciconfig $BLE_DEVICE up
sudo hciconfig $BLE_DEVICE noleadv
sudo hciconfig $BLE_DEVICE noscan
sudo hciconfig $BLE_DEVICE leadv
sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 $UUID $MAJOR $MINOR $POWER 00
echo "Complete"
########## 我是分隔線 ##########
建立停止腳本檔。
vi /home/pi/ibeacon/stop
########## 我是分隔線 ##########
#!/bin/sh
. ./ibeacon.conf
echo
echo "Disable iBeacon Advertising ..."
sudo hciconfig $BLE_DEVICE noleadv
echo "Complete"
########## 我是分隔線 ##########
加入「執行」權限。
chmod +x /home/pi/ibeacon/start /home/pi/ibeacon/stop
建立系統服務設定檔。
sudo vi /etc/init.d/ibeacon
########## 我是分隔線 ##########
#!/bin/bash
### BEGIN INIT INFO
# Provides: ibeacon
# Required-Start: $local_fs $syslog
# Required-Stop: $local_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: iBeacon Emmiter
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:$PATH
DESC="iBeacon Service"
PIDFILE=/var/run/ibeacon.pid
SCRIPTNAME=/etc/init.d/ibeacon
case "$1" in
start)
printf "%-50s" "Starting ibeacon..."
cd /home/pi/ibeacon
./start
;;
stop)
printf "%-50s" "Stopping ibeacon..."
cd /home/pi/ibeacon
./stop
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
########## 我是分隔線 ##########
加入「執行」權限。
sudo chmod +x /etc/init.d/ibeacon
開機時自動啟動 iBeacon。
sudo update-rc.d ibeacon defaults
啟動服務。
service ibeacon restart
延伸閱讀
圖片來源
- https://developer.apple.com/ibeacon/
更新紀錄
- 2014/05/12 撰文。
- 2015/01/13 更換執行畫面,加入了 Client 端的實測方法。
- 2015/11/06 加入 Android 平台的測試用 App 連結。
您好,請問有沒有辦法將樹莓派設定為server端,做為接收beacon訊號的模式呢
回覆刪除若方便的話能否讓我用email跟您聯繫呢 dnex779@gmail.com
我用不到,所以沒實作過....
刪除開機時..要restart才可以scan到
回覆刪除寫得真好!! 請問不用外接藍牙, 用樹莓派內建的藍牙可以嗎?
回覆刪除