RubyでPhysical Webを簡単に体験してみる
前提
ハードウェア
- MacBook Pro (Retina, 13-inch, Early 2013)
- Bluetooth 4.0 に対応しているマシンなら可
- iPhone 5s
ソフトウェア
Physical Webとは
「事前の準備なしに、近くにあるスマートなオブジェクト(例えば自販機、ポスター、おもちゃ、バス停、レンタカー等)から簡単に情報を受け取ったり、手元のデバイスでそれらとインタラクションできたら嬉しいよね?」という動機でGoogleが提唱しているオープン規格。具体的には、スマートなオブジェクト側はビーコンのように無線でURLを飛ばし、手元のデバイス(スマホ)はそれを察知してURLを説明付きで提示、利用者がURLを選択するとそれをブラウザで開く。そこから先はWebの技術を用いて情報提示なりインタラクションなりをするという形。まだまだexperimentalな段階らしい。
ここらへんの動画を見ると何をしたいか分かるかと思います。 https://google.github.io/physical-web/examples
現状はBLE(Bluetooth Low Energy)での利用を想定しているが別の規格も使えるようにすることも考えているとのこと。
こういうビーコン的なものというとiBeaconがあるが、iBeaconではサービス提供側が変わればまたそれ専用のアプリをダウンロードしなければならないのに比べて、Physical Webではどんなスマートオブジェクトに対してもURL送信を察知するアプリが1つあれば良い(あるいはスマホに最初から組み込んである?)という状態を目指している(現状はAndroidにしろiPhoneにしろChromeアプリが必要)。といっても、iBeaconを置き換えるためのものではないと書かれている。
Eddystone
このPhysical WebはEddystoneというBLEのプロトコルを採用している。Physical Webを試してみるには送信側としてわざわざビーコンを買う必要はなく、Bluetooth通信ができるPC上にEddystoneの作法にしたがって通信できるプログラムを用意すればよいようだ。あとは受信側としてChromeアプリがインストールされたAndroidかiPhoneがあればいい。自分の場合はMacbook+iPhoneでやってみた。
scan_beacon gem
で、調べてみると、送信側にnode.jsのEddystoneライブラリを使って試してみたという記事がいくつか見つかる。
iOSとnode.jsでEddystone入門 - Qiita
Physical Web / Eddystone によるO2Oのお手軽実装 | CHANGE-MAKERS
RubyではEddystoneライブラリはないのだろうかと調べてみると、scan_beaconというgemが名前に反してadvertise(送信)も出来るようだったので、これを使ってみた。Mac以外にもLinuxでも動くようだ。
コード
Gemfile
source "https://rubygems.org" gem "scan_beacon"
beacon.rb
require 'scan_beacon' beacon = ScanBeacon::EddystoneUrlBeacon.new( url: "https://goo.gl/VPfbp1", power: -20 ) advertiser = ScanBeacon::DefaultAdvertiser.new(beacon: beacon) advertiser.start puts "Advertising started." puts "Press Enter key to stop advertising." gets # 入力待ちしたいだけ advertiser.stop puts "Advertising stopped."
下の方がごちゃっとしているが、単にEnterキーを押したら送信終わりにしたかっただけ。advertiserがstartしたあとはstopするまでは毎秒URLを周囲に送信し続ける。
最初の方のScanBeacon::EddystoneUrlBeacon.new
でスマホに送るURLが指定できるが、気をつけないといけないのはURLは17バイト以内じゃないとダメだということ(Eddystone-URLの仕様)。「http://」のようなschemeや「.com」のようなTLDの部分はそれぞれ予め定められた1バイトのデータにエンコードされるらしいので、それを含めて17バイトに収める必要がある。なのでここではGoogle URL Shortenerを使った。Eddystoneの公式の説明でもURL短縮サービスの使用が推奨されているようだ。
他の注意点
- MacbookのBluetoothをオンにしておく
- iPhone側もBluetoothをオンにしておく
- iPhone側にChromeアプリを入れたうえで、Today ExtensionにChromeアプリを追加しておく
Today Extensionというのは、iPhoneの上の方からぐいーっとひっぱって出てくるメニューの「今日」と書かれた方のタブのこと。
実行
この状態で上記のプログラムを実行してから手元のiPhoneのToday Extensionを見ると、「フィジカルウェブ対応オブジェクトをスキャンしています…」と出たあとにRubyコードで指定したURLが表示される。タップすればChromeで開いてくれる。
上記コードではWikipediaのページが表示される。これはスマートオブジェクトからスマホに対して単に情報を提示しているだけということになるが、もしスマホと目の前のスマートオブジェクトをインタラクションさせたいとなれば、URLでアクセスした先のサーバがスマートオブジェクトとなんらかの経路で通信をして、手元のスマホの操作をスマートオブジェクトに反映させる必要があるということになる(ということだよね?)。
あるいはブラウザからJavaScriptでスマートフォンのBluetooth機能にアクセスできるAPI(Web Bluetooth)が策定され普及すれば、外部のサーバを経由せずスマートオブジェクトに直接やって欲しいことを伝えられるかもしれない。と、先ほど示した動画がいっぱい貼ってあるページに書いてあった。