2017年2月13日月曜日

Web Bluetooth APIをつかうにあたって気になったこと

Chrome最新版でWeb Bluetooth APIが使えるようになり、実際に動かしてみました。コードを書いたり関連したドキュメントを読むにあたって、気になった箇所をまとめておきます。

なぜWeb Bluetooth APIを作ったのか

Until now, the ability to interact with bluetooth devices has been possible only for native apps. The Web Bluetooth API aims to change this and brings it to web browsers as well.
Interact with Bluetooth devices on the Web By François Beaufort

BLEに限らず、端末の各種ハードウェアを動かすにはネイティブアプリからでないと無理だった。Webアプリでもネイティブアプリがやっていることを実現できるようにしようとするのがこのAPIの目的です。WebGLやWeb Audioの流れと、これからUSBシリアル通信を実装しようとしている未来を考えれば、まあ実装するよねという感じがします。ブラウザがOSになろうとしていた時期の計画と野望を、着々と進めているんだなという印象です。

なぜ動作に制限が多いのか

コードを動作させるにあたって、(いま私が認識しているだけで)下記の制限があります。

  • HTTPでは動作しない(localhostを除く)。HTTPSやfile://では動作する。
  • クリック等のユーザーからのアクションがないと開始できない。onloadなどで自動的に開始するのは不可。
  • 一部接続しないサービスが定義されている

HTTPでは動作しない

localhostを除き、HTTP接続ではnavigator.bluetooth.requestDevice()を実行してもerrorとなります。HTTPでも許可されるのはlocalhostのみで、プライベートIPアドレスでもHTTPならerrorです。

これは、Web Bluetoothに限った話ではありません。ブラウザの強力な機能を使う際には、少なくともそのサーバの出処がはっきりしているものだけに制限しておきましょうというもので、"Secure Origins"と呼ばれています。

ユーザーからのアクションがないと開始できない

確実にユーザーの意思によって動作させる必要があります。ページ読み込みと同時にバックグラウンドで勝手に動かすのは不可です。たとえば、もしユーザーがBLEで座標を飛ばせるGPS受信機(こういうものはLocation and Navigation Serviceを使って飛ばしていると考えられます)を使っていたら、バックグラウンドでユーザーがどこにいるのかが結構な精度で取得されることも考えられます。

一部接続しないサービスが定義されている

キーボードやDFU等の特に扱いが敏感なサービスについては、そもそもAPIからブロックされています。ブロックリストはこちら。ちょっとした理由も含めて記載されています。

どのような場面で使うのがよいのか

スマホアプリの代用とした使い方がいいのかなと思います。ちょっとした機能としてのみ使うときに、わざわざ専用アプリをストアからインストールしてもらう必要がなくなります。特定の施設内に対応したビーコンを使うためとか、Amazon Dash Buttonのようなデバイスの接続設定を書き込むためとか、そのくらいの用途のためにわざわざアプリをインストールするとなると、面倒くさいからいいわとなるのを防げそうとは考えられます。

一方で、この「専用アプリをストアからインストールしない」が、そのまま脆弱性につながるように思います。どのサービス・キャラクタリスティックに接続しているかは、Webページが何もしなければ特に明示されません。ユーザーにきちんと明示しておくようと記載されています

参考文献

2017年1月20日金曜日

Intel Edisonのカーネルを自前でビルドして入れ替える方法

IntelのEdisonでfbtftを実行する方法が公開されていたので試してみようとしたら、カーネルビルドにすごい手間取ったので詰まった箇所をまとめておきます。

Intel配布の最新版は初回ビルドが通らない

これを書いているときの最新版はiot-devkit-yp-poky-edison-20160606.zipですが、bitbake edison-imageのコマンドでビルドを始めても、OpenJDKまで来るとビルドが止まります。フォーラムでキレている人自分でJavaを筆頭に最低限まで削ったソースを配布していますが、これは本当に最低限なのでNode.jsやconfigure_edison等は含まれません。とりあえずJavaだけなくなれば初回のビルドは通るので、ソースコード内の設定ファイルからOpenJDKとicedtea関係の箇所をどんどん削る必要がありました。どこをどう削ったかは忘れた。

それに加えて、iotkit-comm-jsとiotkit-comm-c-devも削る必要があります。これはIntelのIoT Analytics dashboardの運営が終了となったため、それにともなって対応するライブラリ群がIntelのGiuHubから削除されたことが原因になっています。修正箇所はフォーラムの記載を参照してください。

カーネルモジュールをビルドする

基本的にIntelが公開しているページの内容どおりです。が、上記最新版では.configの位置が build_edison/tmp/work/edison-poky-linux/linux-externalsrc/1.0-r2/linux-externalsrc-1.0/.config に、置き換えるdefconfigの位置が poky/linux-kernel/arch/x86/configs/i386_edison_defconfig にそれぞれ変わっています。

動きました

Intel Edison with TFT Display