ブラウザからBluetooth Low Energyを使うことができるWeb Bluetoothがアツいと思っている。


メリークリスマス！
[LIGアドベントカレンダー24日目](http://qiita.com/advent-calendar/2015/lig)です！あと1日で完走ですね :)

先日IoTLTにて"IoT時代のブラウザAPI~Chrome編~"というタイトルで話をしました。

![](https://i.gyazo.com/71464e7055192b35e1a12221f5cd9303.png)

> https://speakerdeck.com/n0bisuke/iotshi-dai-falseburauzaapi-di-10hui-number-iotlt-5fen

今日はその内容からWeb Bluetoothに注目します。

## 導入

きっかけはPlayBulbというガジェットを購入して、調べてたらWeb Bluetoothという技術を発見したことでした。

![](https://i.gyazo.com/4dec7405a918a2a48fe9b2af6605c9ce.png)

何か開発できるっぽいリポジトリがあるんですよね
https://github.com/Phhere/Playbulb

PlayBulbはBLE経由の制御なのでそこからBLEを調べ始めました。

>参考: [GoからBLE制御でPLAYBULB Candleの操作をしてみる](http://qiita.com/n0bisuke/items/d3966b11b2e9143d6651)

## Web Bluetooth

ブラウザからBluetooth(BLE)が使える技術です。BLEってけっこう低レイヤーの技術なのですが、それをブラウザから制御できるってすごいですね...!
Macでも使えるっぽいのですが、アドバタイジングだけ使えてペアリング的な部分は(おそらく)使えないみたいでした。`#enable-web-bluetooth`のflagを有効にすることで使えます。

ちゃんとした機能を使うためには

* **SSL化されているサイトのみ**
* **現状ではAndroid 6系のChrome Dev版 or Chrome OSのみ**

という縛りがまだあるみたいです。

> ちなみに **chrome://flags**って入力すると試験運用機能を色々発見できるでおもしろいです。
![](https://i.gyazo.com/567c45f9f289b08871d3dabac5b28f06.png)

### navigator.bluetooth

flagをonにした状態でconsoleで確認するとnavigatorオブジェクトの下にbluetoothオブジェクトがくっついているのがわかります。

![](https://i.gyazo.com/278d033f6796cd71e71047295dcf8a1f.png)


### Web BluetoothのDemoサイト

BLEにはGATTというプロファイルがあり、 サービスと呼ばれる単位で機能を扱うことができます。
デバイスのバッテリー情報を取得するバッテリーサービスや、デバイスの諸々の情報を取得するデバイスインフォサービスなどがあり、それらにアクセスするデモページが公開されています。

* [Web Bluetooth / Battery Level Sample](https://googlechrome.github.io/samples/web-bluetooth/battery-level.html)
* [Web Bluetooth / Reset Energy Expended Sample](https://googlechrome.github.io/samples/web-bluetooth/reset-energy.html)
* [Web Bluetooth / Device Info Sample](https://googlechrome.github.io/samples/web-bluetooth/device-info.html)
* [Web Bluetooth / Characteristic Properties Sample](https://googlechrome.github.io/samples/web-bluetooth/characteristic-properties.html)
* [Web Bluetooth / Notifications Sample](https://googlechrome.github.io/samples/web-bluetooth/notifications.html)

![](https://i.gyazo.com/bbdb067118d10276f430a7d3eaa4e7de.png)

上記の端末でなら試せます。この左の端末は俗に言うBLEデバイスと呼ばれるものです(SensorTagってやつです。 http://www.tij.co.jp/tool/jp/cc2541dk-sensor) これをデモページを開いているAndroidデバイスの近くでスイッチをいれるとサイト側で反応してくれます。

これでご自身の端末やOSがWeb Bluetooth対応しているか確認すると良いと思います。

### PlayBlub+WebBluetoothのチュートリアルがある

PlayBulb調べててWeb Bluetoothを知ったのはこれですね。
https://codelabs.developers.google.com/codelabs/candle-bluetooth/#0

実際にWebブラウザからPlayBlubをBLE制御する機能の実装を進めていきます。

ES2015のクラスの説明もしながら進めてくれるのでES2015の勉強にもなるチュートリアルです。
こんな感じで、`navigator.bluetooth.requestDevice()`を最初に呼んであげる必要があります。

```playbulbCandle.js
(function() {
  'use strict';

  const CANDLE_SERVICE_UUID = 0xFF02;

  class PlaybulbCandle {
    constructor() {
      this.device = null;
    }
    connect() {
      let options = {filters:[{services:[ CANDLE_SERVICE_UUID ]}]};
      return navigator.bluetooth.requestDevice(options)
      .then(function(device) {
        this.device = device;
      }.bind(this)); 
    }
  }

  window.playbulbCandle = new PlaybulbCandle();

})();
```

`requestDeviceメソッド`にデバイスのUUIDを指定してあげることでサービスの情報などが取得できるようになります。

UUIDなどの情報が公開されていない場合は[LightBlue](https://itunes.apple.com/jp/app/lightblue-explorer-bluetooth/id557428110?mt=8)などのアプリでUUIDを調べられます。 PlayBulb Candleは`FF02`がUUIDです。

実際に実行してみたのが[こちら](https://goo.gl/photos/cimWQFawiW5GqG836)
![](https://i.gyazo.com/8d56b44eeecba957f1f391ae62d3d66e.gif)

## まとめ: 特定のガジェットのアプリがサイトになる時代が来るかも

ざっくりとWeb Bluetoothの紹介をしました。

これの何がすごいって、今までBLE接続の機器を買うと、連携したアプリをDLしてアプリ経由でガジェット制御していました。
これがWebサイト上でできるようになる可能性を秘めているということがすごいです。

アプリDLってユーザーにとっても導入障壁あるし、開発者側からみたら工数もそれなりにあるからその辺踏まえても良いことばかりですね。

LIGみたいなWeb制作会社視点の感想としては、ガジェット連動サイトとか出来て面白そうだなって思いますね笑

明日はクリスマスということで弊社CTOの@frontainerが〆てくれます。
お楽しみに！

## 関連リンク

* w3cにちゃんとページがあります。 https://www.w3.org/community/web-bluetooth/
https://github.com/WebBluetoothCG/web-bluetooth
* chrome.bluetooh https://developer.chrome.com/apps/bluetooth
* Clome Platform Status https://www.chromestatus.com/feature/5264933985976320
* MDN https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API
* Google Devlopers https://developers.google.com/web/updates/2015/07/interact-with-ble-devices-on-the-web