第1章 BLEの基本とハンズオンアプリの仕様 - masato-ka/bel-key-security-app GitHub Wiki

この章ではハンズオンの導入として以下の内容を説明しています。

  • BLEの基礎知識
  • RN4020について
  • Web Bluetooth APIについて
  • ハンズオン概要について。

1.1 BLEの基本について

ここではBLEの基本について説明します。演習を進める上で必要なざっくりとした説明になります。詳細は書籍などを参考にしてください。

1.1.1 BLEの特徴

BLEはBluetooth 4.0から導入された通信規格です。これまでのBluetoothとの互換性はありません。短距離(見通し距離)、省電力、低スループットという特徴があります。またペアリングなどの接続作業をしなくても機器同士の接続ができます。機器同士の接続が容易になっています。その特徴からスマートフォンのアクセサリやホストデバイスと通信の必要があるウェアラブルデバイスなどに採用されています。以前は対応機器は多くありませんでしたが、活動量計などの普及で利用が盛んになってきた印象があります。

1.1.2 BLEの通信方法

次に、BLEがどんな仕組みで通信するかを見ていきましょう。BLEの通信では2つの役割が存在します。それぞれセントラルとペリフェラルという役割です。スマートフォンと活動量計の関係で例えると、スマートフォンがセントラル、活動量計がペリフェラルとなります。BLEで使われる用語について解説していきます。

セントラル

 セントラルはBLEデバイスにおいて通信の主導権を握るデバイスです。BLE通信ではセントラルからの通信を起点としてペリフェラルへの接続切断、また値の読み書き、通知の開始の指示を行います。今回の演習ではWEB Bluetooth APIで作るブラウザアプリがセントラルの役割です。

ペリフェラル

 ペリフェラルではアドバタイズメントと呼ばれるブロードキャスト通信を用いてセントラルに対して自らの状態を通知する機能を持っています。また、セントラルからの接続・切断要求を受け付けます。データの送信や受信もセントラルからの要求に応じて実行します。また、セントラルからノティフィケーション(通知)の指示があった場合はデータをセントラルに対して非同期に通知します。ペリフェラルの機能はGATTのサービスとキャラクタリスティックで定義されています。  今回のハンズオンではRN4020がペリフェラルになります。

参考

BLEにはサーバとクライアントと呼ばれる考え方があります。これはデータの送信側をサーバ、受信側をクライアントとして定義しています。したがってセントラル、ペリフェラルはそれぞれがサーバ側、クライアント側の役割を持っています。

サービスとキャラクタリスティック

 ペリフェラルの機能はサービスとキャラクタリスティックで定義されています。データ構造のようなものだと考えてください。  サービスは機能単位を表します。キャラクタリスティックをまとめる役割を持っています。例えば「デバイスの情報サービス」、「バッテリーサービス」、「心拍数サービス」といったペリフェラルの機能を表しています。  サービスの中にはキャラクタリスティックと呼ばれる個々のデータが定義されています。例えば「デバイス情報サービス」の中には製造者名を表すキャラクタリスティック、デバイス名が記載されたキャラクタリスティックがそれぞれ定義されています。「バッテリーサービス」ではバッテリーの残量値を表すキャラクタリスティックが存在します。  セントラルのデバイスはペリフェラルのキャラクタリスティックにアクセスし、データの読み出しや書き込み、通知を受け取ります。サービスとキャラクタリスティックには識別子として固有のUUIDが付与されています。これらは独自に定義することができます。これをプライベートサービス、キャラクタリスティックと呼びます。また、Bluetooth SIGによって標準化された識別子もあり、こちらをパブリックサービス、キャラクタリスティックと呼ぶようです。

  • 図1-1 サービスとキャラクタリスティック

ServiceAndCharacteristic

キャラクタリスティックについてもう少し細かく見ていきます。キャラクタリスティックには識別子となるUUIDの他にキャラクタリスティックへのアクセス権とデータのバイト数が定義されています。アクセス権には大きくわけてReadとWriteとNotifyがあります。実はもう少し種類があるのですが今回のハンズオンではこの3つに気をつけておけば問題ありません。またキャラクタリスティックに利用するバイト数を指定する必要があります。2章でデバイスを作る際に実際に設定するとイメージがわくかと思います。

BLEの通信では2つのフェーズがあります。一つがデバイスを探す、または見つけてもらうフェーズ。もう一つがセントラルがペリフェラルに接続してデータのやり取りをおこなう利用のフェーズです。

アドバタイズメント

 ここではセントラルをタブレット端末、ペリフェラルを RN4020として考えます。アドバタイズメントではRN4020が「Advertise Data」と呼ばれるデータをブロードキャストしています。それに対してタブレット端末は全てのデバイスからのデータを受診しており、通信可能なデバイスをスキャンしている状態です。このように、ペリフェラルがセントラルから「発見される」ためにデータを送信することをアドバタイズメントと呼びます。

  • 図1-2 アドバタイズメント

Advertisement

デバイスの接続とデータの送受信

   セントラルがアドバタイジングにより目的のペリフェラルを発見した後、セントラルはペリフェラルへの接続を試みます。ペリフェラルはアドバタイジングを停止してセントラルとの接続を確立します。  セントラルはペリフェラルがどういった機能(サービスとキャラクタリスティック)を持っているかを調査します。その後、各キャラクタリスティックに対してデータの読み書きを行い、ペリフェラルの制御を行います。

  • 図1-3 デバイスの接続とデータの送受信

BLE Flow

Beaconについて

   BLEのユースケースとしてよく出てくるBLE Beaconはデバイスの接続は行わずにアドバタイズメントを不特定多数に送信するアドバタイザー側とアドバタイズメントを受診するオブザーバーという役割がある。それぞれアドバタイザーがペリフェラル、オブザーバーがセントラルと対比した関係になっている。今回のハンズオンでは詳細に触れません。BLEの機能の使い方や設定が違うだけで基本的には同じBLEの仕様に則っています。

以上がBLEの基本的な事項になります。このハンズオンではまずは動くことを目的にしています。そのため、上記の説明が不十分であったり、実際と異なる点もあります。BLEに対して詳細な知識や正しい理解をしたい場合は書籍などをご覧ください。

1.2 RN4020について

 RN4020はMicrochip社が製造販売しているBLEモジュールです。シリアルインタフェースからBLEの機能を簡単に制御することができます。そのため、BLEのインタフェースを持たないマイコンなどにシリアルインタフェース経由で接続してBLEの機能を利用することができます。また、シリアルインタフェースからの制御だけでなく、スクリプトを作成することでRN4020自体をスタンドアローンで使うことができます。さらに、RN4020をアドホックに接続し通信させることができます。アナログI/O,デジタルI/OそしてI2Cのインタフェースも備えているため、各種センサや簡単な出力信号を出すことが可能です。さらに、ペリフェラルだけでなく、セントラルとして利用することも可能です。  このような特徴からBLEを使ってちょっとしたものを作りたい場合に便利です。

  • 図1-4 RN4020

RN4020

1.3 WEB Bluetooth APIについて

WEB Bluetooth APIはW3Cで決められたWEBブラウザからBLEを制御するためのAPI仕様になります。このAPIを実行したブラウザを利用することで、ネイティブのJavaScriptからBLE機器へのアクセスを実行できます。

1.3.1 セキュリティについて

WEB Bluetooth APIはWEBブラウザからデバイスに対して直接アクセスできるため、セキュリティ面での懸念があります。そのため、デバイスへの接続にはブラウザからのユーザアクションが必要になる点などセキュリテイのための制約があります。XSSに対する対応など実際の利用に際してはセキュリティ上の懸念点をクリアする必要があると思われます。WEB Bluetooth APIのセキュリティについて

1.3.2 対応プラットフォームの状況

WEB Bluetooth APIは現在のところ仕様の一部分のみがサポートされています。もっとも実装が進んでいるブラウザはChromeブラウザとなります。  対応OSはOSX Yosemite以上またはLinux(Kernel 4.6.0以上)でBluezがインストールされていることが必要です。Windwsではデバイスの検索や接続は可能ですがGATTプロトコルが実装されていません。そのため、デバイスのサービスやキャラクタリスティックにアクセスすることができません。また全てのプラットフォームでビーコンのアドバタイズデータを受信するためのAPIは実装されていません。(2017/10/07 現在)  その他の実装ブラウザや対応プラットフォーム、サポートされているAPIについてはこちらをご覧ください。

1.3.3 WEB Bluetooth APIでできること。

WEB Bluetooth API は大まかに以下の機能を持っています。Beaconアドバタイズの受信については前述のようにChromeブラウザでも実装されていません。 まだ実装されていません。

  • BLEデバイスへの接続
  • GATTサービスキャラクタリスティックへのアクセス
    • Read
    • Notify
    • Write
  • Beaconアドバタイズの受信

1.4 このハンズオンで作るもの

ここまでBLEの説明を行い、BLEデバイスRN4020、WEB Bluetooth APIについて説明してきました。いよいよここからはこのハンズオンで作るアプリケーションの使用について説明していきます。

1.4.1 BLE戸締りアプリの動作

今回作るアプリケーションはBLE戸締りアプリです。このアプリケーションは家の鍵の戸締りの状態を調べることができます。また、鍵が開場されるとアラートを鳴らすことができます。以下のリンクにアプリケーションの動作の様子を動画にしたものを置いています。

アプリケーションの動作  

この動画の画面はWEB Bluetooth APIで作るWEBブラウザアプリケーションが表示されています。また右上にはワイプでRN4020で作成するデバイスの様子が表示されています。まずはじめにアプリケーション側からConnectボタンを押下してデバイスの選択を行い、接続します。そうすると画面に鍵の施錠状態を表すアイコンが表示されます。ここで右上の画面に注目します。デバイスに磁石を近づけるとアイコンが「Lock」になります。また、磁石を離すと「Unlock」となります。  デバイスにはホールセンサと呼ばれる磁力を検知するセンサが接続されています。ここに磁石が接近すると鍵をかけた状態として表示しています。  次に「Set Alert」ボタンを押下します。その状態で磁石を話し「Unlock」にするとブザーから音が鳴り始めました。Alert状態で開錠するとブザーがなるようになっています。再び磁石を近づけ「Lock」にするとブザーが鳴り止みました。簡易的なセキュリティを実現しています。 このような動作を実現するデバイスとアプリケーションをハンズオンを通して実装していきます。

全体構成

作成するものの全体構成は以下のようになっています。デバイス側の回路と設定を次の2章で WEBブラウザアプリを3章で実装していきます。

  • 図1-5 作成するアプリケーションの構成

Overview

アプリを実現するためにデバイス側に設定するサービスとキャラクタリスティックを以下のように定義します。

UUID サービス名  キャラクタリスティック名 アクセス権 データ長
123456789012345678901234567890FF 戸締りサービス - - -
12345678901234567890123456789011 - 施錠状態 Read, Notify 1byte
12345678901234567890123456789022 - アラート Write 1byte

それでは早速ハンズオンを始めていきましょう。まずは2章に取り組んでください。