Raspberry Pi 的應用 - iBeacon 發射器

by 5月 12, 2014 4 意見                    

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 連結。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

4 則留言 :

  1. 您好,請問有沒有辦法將樹莓派設定為server端,做為接收beacon訊號的模式呢
    若方便的話能否讓我用email跟您聯繫呢 dnex779@gmail.com

    回覆刪除
  2. 開機時..要restart才可以scan到

    回覆刪除
  3. 寫得真好!! 請問不用外接藍牙, 用樹莓派內建的藍牙可以嗎?

    回覆刪除