[Raspberry P 3] 內建藍牙能幹嘛?來試試 Google 物聯網計畫的關鍵之一:Eddystone Beacon 如何!

by 4月 24, 2016 3 意見            

物聯網 (Internet of Things) 這塊大餅,各路人馬都想要吃,Google 自然也不會眼巴巴的看著這塊餅被拿走,他們推出了 實體化網路 (The Physical Web),希望讓人們與硬體之間能夠有更好的溝通方式,而 Eddystone Beacon 就是其中很重要的一環。

兩年前,我們已經在 Raspberry Pi 的應用 - iBeacon 發射器 這篇文章,實作了Apple 的 iBeacon 技術,當時的應用範圍主要是在室內導航、行動支付、廣告推播 ...... 等。

而 Google 的 Eddystone Beacon 跟 iBeacon 有點像又不太一樣。


雖然同樣是用 Bluetooth Low Energy 做為底層技術,主要的差別有:
  • Eddystone 連接的可以是某個網址或是某支 App,iBeacon 連接的只能是某支 App。
  • Eddystone 支援三種封包模式,iBeacon 只有一種。
若想要了解更詳細的差別,請參閱:
簡單的說,Google 的主力命脈是在 Web,追求的目標自然就是市佔率與觸及率,為了能掌握到所有能連上網的物品,從收購智慧型感測器廠商 Nest、公佈 The Physical Web 計畫,到推出物聯網作業系統 Brillo,不管是虛擬或是實體,完全一個不漏。

而 Eddystone Beacon 除了可以像是 iBeacon 一樣透過 UUID 來連接某個 App 來進行定位、支付、推播等互動之外,還可以直接傳送一個特定的 URL,讓瀏覽器可以直接以 Web 的方法讓手機和物品之間產生互動,一來減少開發者的負擔,也可以讓使用者延續熟悉的操作方式。


事前準備


請先參閱  [Raspberry Pi 3] 老朋友,新功能!關於那些開箱後馬上要作的事,完成初始設定。

若是用 Raspberry Pi 0, 1, 2 的朋友,別忘了參閱 Raspberry Pi 的應用 - iBeacon 發射器 的內容,將外接的 USB 藍牙 4.0 傳輸器正確的驅動完成。


建立 Eddystone Beacon


在 GitHub 上有一個 node-eddystone-beacon 專案,可以用來建立一個簡單的 Eddystone Beacon


首先要安裝 Node.js。

不過我們可不打算從 Node.js 官網下載原始碼從頭開始,用 NodeSource 已經編譯好的 for ARM 版本會輕鬆許多,依照他們在 GitHub 上釋出的指令來安裝 5.x 版。
curl -sL https://deb.nodesource.com/setup_5.x | sudo bash -

sudo apt-get install -y nodejs

安裝好 Node.js 之後,再安裝 node-eddystone-beacon 這個專案。
npm install eddystone-beacon

我們先用 Eddystone-URL 模式來測試,新增一個 Java Script 檔案。
vi eddystone-beacon.js

輸入下列程式碼。
var eddystoneBeacon = require('eddystone-beacon');
var options = {
  name: 'MyEddystoneBeacon',
  txPowerLevel: -22,

  tlmCount: 2,
  tlmPeriod: 10
};
var url = 'http://blog.itist.tw';

eddystoneBeacon.advertiseUrl(url, [options]);


url 後面的字串請改成要在手機上看到的連結網址,而且長度最多只能有 17 個字,太長的話,請用 goo.glbit.ly 之類的短網址服務來把 URL 縮短。

最後,執行這個 js 檔案。
nodejs eddystone-beacon.js

它會在前景執行,而且不會顯示任何訊息,要停止按 Ctrl + C 就可以了。

如果想讓它在背景執行的話,加個 & 符號在最後面。
nodejs eddystone-beacon.js &

要停止的話,執行這行指令即可。
killall nodejs


用戶端實測


iOS 有這幾套 App 可以用。

而 Android 的話,可以用這幾套 App 來試試。

這邊以 iPhone 為例,先安裝好上面提到的 iOS App。

也別忘了把藍牙功能開啟。

Google Chrome 跟 Physical Web 可以在通知中心顯示,我們可以在解鎖的狀況下,從上方把通知中心拉下來,點按最下方的「編輯」。

把  Google Chrome 跟 Physical Web Beacons 加入。

接著,通知中心就會偵測到 Eddystone Beacon,並顯示先前設定的網址,更可以直接點選網址用瀏覽器來開啟。

當然也可以直接打開 Physcial Web Beacons 和 eBeacon 這兩個 App 來偵測附近的 Beacon。


至於要怎麼讓手機跟物品互動,既然是大家都熟悉的 Web + URL,例如用 GET、POST 帶參數之類的方式,或是更多無限的想像空間讓我們實作了。


異常處理


問題:
在執行 npm install eddystone-beacon 時,出現了「../libusb/libusb/os/linux_udev.c:40:21: fatal error: libudev.h: No such file or directory」的錯誤訊息?

答案:
這代表系統少了 libudev-dev 套件包,安裝它就可以了。
sudo apt-get -y install libudev-dev

問題:
在執行 nodejs eddystone-beacon.js 時,出現了「bleno warning: adapter state unauthorized」的錯誤訊息?

答案:
這代表權限不足,可以改用 sudo 來執行。
sudo nodejs eddystone-beacon.js

或是依照 GitHub - sandeepmistry / bleno 提到的步驟,提升 nodejs 存取 Bluetooth LE 的權限。
sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)

問題:
在執行 nodejs eddystone-beacon.js 時,出現了「Error: Encoded URL (http://xx.yy.zz) is too long (max 18 bytes)」的錯誤訊息?

答案:
url 網址過長,請用 goo.glbit.ly 之類的短網址服務來把 URL 縮短。

問題:
Chrome 完全偵測不到 Eddystone Beacon?

答案:

參考資料


圖片來源

  • https://visualhunt.com/f/photo/8345412396/50cd13bf37/

更新記錄

  •  2016/04/24 撰文。

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

IT 技術家 - 創站部落客

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

3 則留言 :

  1. 非常感謝您的這篇文章,讓我獲益良多!想請教的是樹莓派使用這個 Eddystone Beacon,一定要連上 Internet 嗎?因為我只要將實體網路線或是 Wifi 關閉的話,就無法偵測的到,但只要連上 Internet 就又可以正常運作!

    回覆刪除
    回覆
    1. 這是 Google Physical Web 的特性,雖然它是透過 BLE 來廣播 Beacon 位置,但實際還是要走 Wi-Fi 或 3G/4G 來連上 internet。
      https://google.github.io/physical-web/faq

      刪除
  2. 感謝您寫的文章,我有幾個點不太明白想詢問:
    網路上看到有些人有用beacon的小裝置+raspberry pi
    另一些人只有用raspberry pi
    請問這兩種的差異在哪,或是只有一種方式?
    感謝~!!

    回覆刪除