EdisonでEddystoneを使いURLを送信する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Physical Web対応は追い風になるか

どうも。大村です。 前回のEddystoneとはなんぞやっというエントリーが出る前後で、丁度iOS版Chromeブラウザが更新され、Physical Webに対応したというニュースが流れました。
Eddystone-URLを利用でき、既にiOSでも受信できるということです。
この対応はEddystoneとしても追い風になるアップデートですね。まあ、どちらもGoogle社のプロダクトなので当然といえば当然ですが。
一般的に利用者の高いChromeブラウザが標準で使えるようになるということに、やはり期待に胸が膨らむわけです。

早速この機能を使ってみるべく、Eddystoneを試してみたいと思います。

Edisonよ、復活の時が来た

さて、早速Eddystoneを試してみようと思ったのですが、弊社では今手元にEddystoneに対応したBeaconモジュールがありません。
(Estimoteで試してみたかったのですが、弊社小室の私物で、かつ現在札幌オフィス勤務のためすぐに試すことが出来ません。)
日本でも幾つか対応しているEddystone対応モジュールが販売されていますが、中々手に入れづらく、Amazonでポチポチしたり、弊社目の前のアキヨド(ヨドバシカメラマルチメディア秋葉原)にダッシュして購入するというわけにも行きません。
ということで、久しぶりに登場です。

「Intel Edison」

弊社でもIoTの施策としてEdisonを使ったプロダクトを提案しつつ、ブログ記事も沢山執筆されています
せっかくですので、このEdisonをEddystone送信機にして、iOSやAndroidで受信してみる、みたいなことをしてみたいと思います。

Edisonに実装する方法

EdisonでEddystoneを動かすのに一番簡単なのが、Node.jsで動かす方法です。
Node.jsであれば、Edisonにデフォルトでインストールされています。
node-eddystone-beaconを使用します。

BluetoothをONにする

デフォルトではEdisonのBluetoothはONになっていません。
まずは、Bluetoothモジュールを使えるようにします。

$ rfkill unblock bluetooth
$ hciconfig hci0 up

node-eddystone-beaconをインストールする

Node.jsでEddystoneを使えるモジュールをインストールします。

$ npm install eddystone-beacon

次に、ソースコードをちょろちょろっと記述します。

sample.js

var eddystoneBeacon = require('eddystone-beacon');
var url = 'https://dev.classmethod.jp/';
eddystoneBeacon.advertiseUrl(url);

実行してみたらエラーが出る

さて、上記ソースで実行してみます。

$ node sample.js
(略)
Error: Encoded URL (https://dev.classmethod.jp/) is too long (max 18 bytes): 19 bytes
(略)

エラーを見ていただいたらわかりますが、URLが長すぎると言われます。
もともとBLEのパケット上限は、ヘッダ等を含めて47byteと決められており、URL長も18byte(http://を1バイトとして換算する)は使えずEddystoneの規格上17byteまでになってます。
ここで登場するのが、短縮URLサービスです。
もともとGoogleもこの方法を提唱しています。

もう一度実行する

先ほどのurlを、短縮URLで変換かけてみると、「http://goo.gl/KhZwM」になりました。
これに置き換えます。

// var url = 'https://dev.classmethod.jp/';
var url = 'http://goo.gl/KhZwM';

これを実行します。

$ node sample.js

iOS Chromeブラウザで受信する

早速iOS Chromeブラウザで受信できるかどうかを確認します。
ニュース記事にもある通り、通知センターの今日の箇所にChromeを追加します。

ios-eddystone1

引っ張って出して、「Physical Web対応オブジェクトをスキャンしています。」と出るか、有効にしてください、といったメッセージが出てきたらONにします。
すると、以下の様にタイトルとURLが取得できます。

ios-eddystone2

ここで気がついたのが、短縮URLを利用していても、このChrome上ではちゃんと元のURLが表記され、タイトルも取得されています。
Chrome内部で一度ウェブにアクセスしていることがわかります。

Androidで受信する

AndroidでEddystone-URLを受信してみます。
Androidの場合は、「Locate Beacon」を使って受信してみます。

起動して「Locate Beacons」をクリックすると、Visible Beaconsに先ほど設定したURLが受信できています。

android-eddystone1 android-eddystone2

パラメーターもEddystone-URLであることがわかります。
ただし、こちらは受信したURLをそのまま表示しているのか、タイトルや短縮前のURLが表示されるわけではありませんでした。

最後に

今回は、Eddystone-URLをEdisonで実装して、iOSとAndroidで受信する一連の流れを確認しました。
結構簡単なソースでURLを送信することが出来ます。
ただし、Eddystone-URLで出来ないのは、プッシュ型の配信です。
それこそ、あちこちにEddystone-URLのBeaconを設置していたら、プッシュ通知されまくってえらいことになってしまいます。

URLを送信できることになり、更にEdisonのような端末でURL書き換えながら送信し続けることもできるので、なにか面白いことができるような気がします。