灰いじり

This blog's posts are licensed under CC-BY 4.0.

RubyでPhysical Webを簡単に体験してみる

前提

ハードウェア
ソフトウェア

Physical Webとは

The 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アプリがインストールされたAndroidiPhoneがあればいい。自分の場合は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とRubyスクリプトを用意する。

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短縮サービスの使用が推奨されているようだ。

他の注意点

Today Extensionというのは、iPhoneの上の方からぐいーっとひっぱって出てくるメニューの「今日」と書かれた方のタブのこと。

実行

この状態で上記のプログラムを実行してから手元のiPhoneのToday Extensionを見ると、「フィジカルウェブ対応オブジェクトをスキャンしています…」と出たあとにRubyコードで指定したURLが表示される。タップすればChromeで開いてくれる。

上記コードではWikipediaのページが表示される。これはスマートオブジェクトからスマホに対して単に情報を提示しているだけということになるが、もしスマホと目の前のスマートオブジェクトをインタラクションさせたいとなれば、URLでアクセスした先のサーバがスマートオブジェクトとなんらかの経路で通信をして、手元のスマホの操作をスマートオブジェクトに反映させる必要があるということになる(ということだよね?)。

あるいはブラウザからJavaScriptスマートフォンBluetooth機能にアクセスできるAPI(Web Bluetooth)が策定され普及すれば、外部のサーバを経由せずスマートオブジェクトに直接やって欲しいことを伝えられるかもしれない。と、先ほど示した動画がいっぱい貼ってあるページに書いてあった。