CoreBluetoothの概要

iOSアプリケーション開発

この章は、iOSアプリケーション開発にBluetooth LEを提供するCore Bluetoothフレームワークを解説します。

Core Bluetoothフレームワークは、iOSアプリケーションにBluetoot LEデバイスの発見、接続と読み書きの操作を提供します。このフレームワークが、2章で述べたBluetooth LEの通信規格や振る舞いなどの技術詳細を隠蔽して抽象化するので、アプリケーション開発者はアプリケーション開発だけに注力できます。

iOS5とiOS6で、Core Bluetothフレームワークが対応する機能が大きく異なります。iOS5は、Bluetooth LEのセントラルという役割を提供します。iOS6は、セントラルに加えてペリフェラルという役割も提供します。iOSのバージョンごとの対応を、iOS5およびiOS6のアイコンを節のタイトルに表示して明示します。

アプリケーション開発のBluetooth LE基礎知識

キーホルダや心拍センサなどの一般に販売されているBluetooth LEデバイスをアプリケーションから使う場合、たいていデバイスに接続して操作するためのライブラリが提供されているので、Core Bluetoothフレームワークを意識することはないかもしれません。また、Core BluetoothフレームワークがBluetooth LEを抽象化していますから、Bluetooth LEの基礎知識がなくてもアプリケーションを開発できます。

しかし、Bluetooth LEを使うオリジナルのハードウェアを企画設計する場合は、Bluetooth LEの基礎知識が不可欠です。iOSとBlutooth LEでなにができるかは企画に必要な知識ですし、試作品のハードウェアが意図した振る舞いをしない時に、その原因を明らかにするには知識が必要です。

2章でBluetooth LEそれ自体の技術詳細を述べました。ここでは、iOSアプリケーション開発者からみたBluetooth LEの基礎技術情報をまとめます。

クラシックBluetoothとBluetooth LE

Bluetooth4.0は、Bluetooth3.0までの近接高速通信技術にBluetooth Low Energyの超低消費電力通信技術を統合したものです。Bluetooth3.0までの技術を、Bluetooth LEと区別するために、ここではクラシックBluetoothと呼びます。

クラシックBluetoothがヘッドフォンやファイル交換などに使う、連続したより高速のデータ通信を目指しているのに対して、Bluetooth Low Energyは、少量のデータを低頻度でやりとりする用途に、ハードウェアの低コスト化と、コイン型電池で1〜2年間の連続動作ができる超低消費電力に特化しています。

クラシックBluetoothのプロファイル

iPhoneは、Human Interface Device Profile (HID)などのクラシックBluetoothのプロファイルをサポートします。BluetoothキーボードをiPhoneに接続しても、アプリケーションは、それがBluetooth接続なのか、あるいは他の接続方式なのかを気にせずに、キーボードとして扱うことができます。クラシックBluetoothでは、周辺機器との接続および制御は全てiOSがおこない、アプリケーションから操作する手段はありません。もしも設計したい周辺機器が、定義されたプロファイルのどれかにあてはまるのであれば、クラシックBluetoothの認証制度に従い設計するだけです。

規格で定義されたプロファイルに当てはまらない機器のために、クラシックBluetoothには、任意の通信を提供するシリアルポートプロファイル(Serial Port Profile, SPP)があります。iOSアプリケーションから、このSPPを使うことはできません。iOSデバイスと接続するクラシックBluetoothデバイスを設計するには、Made For iPhone(MFi)プログラムをApple社と締結して、機器の認証ハードウェアと開発ライブラリの提供をうけなくてはなりません。

シリアルポートプロファイルは、単なる通信路を提供するだけです。例えば、Windowsパソコンに、シリアルポートプロファイルがあるクラシックBluetoothデバイスを接続すると、デバイス・マネージャーは、その接続を仮想シリアルポートとして扱います。Windowsパソコンでは、ユーザが、Bluetoothデバイスの仮想シリアルポートのポート番号をアプリケーションに指定します。

iOSの認証ハードウェアは、これがApple社のライセンスをうけた正規製品であることを示すとともに、 この機器が接続べきiOSアプリケーションもiOSに伝えます。この、本来のシリアルポートプロファイルにはない機能があるため、周辺機器は自動的に対応するiOSアプリケーションと接続できます。

Bluetooth LEのプロファイルとプロトコル

Bluetooth LEは、その規格のもとで任意のプロファイルを勝手に定義することができます。例えば、先ほどの体温計のサービスを利用して、iOSアプリケーションの振る舞いの制御を変えれば、室温を計測して熱中症をアラート音で警告する振る舞いをさせることも、できます。プロトコルと、プロファイルという2つの用語があります。プロファイルはBluetooth LEを使うデバイスの振る舞いを示します。プロトコルは、通信の手順やデータ表現を示します。

Bluetooth LEのデバイスの振る舞いは、ジェネリック・アトリビュート・プロファイル(Generic Attribute Profile, GAP)として定義されています。GAPが定義するBluetooth LEデバイスの4つの役割のうち、Core Bluetoothフレームワークでアプリケーション開発者が扱うのはセントラルとペリフェラルの2つです。ペリフェラルは、そのデバイスを発見してもらうためのアドバタイジングを行なう役割です。セントラルは、アドバタイジングをしているデバイスを発見して、そのデバイスに接続する役割です。

通信機能は、機能毎に階層表示したプロトコル・スタック<TBD スタックの図/>で表されます。

リンク層は隣接するデバイス都の間に信頼できる1本の通信路を確立します。Bluetoothには、他のデバイスのパケットを他のデバイスに中継するトランスポート層はなく、隣接したデバイスとの直接通信のみをサポートします。このリンク層で通信タイミングなどを制御する中心となる役割をマスターと呼び、そのマスターに接続するデバイスの役割をスレーブと呼びます。1つのマスターに複数のスレーブが接続した小さなネットワークを、ピコネットと呼びます。

L2CAP(Logical Link Control and Adaptation Protocol)は、上層にある複数のプロトコルが、お互いの存在を気にせず、それぞれが通信できる論理的な通信路を提供します。TCP/IPネットワーキング・アプリケーション開発で使う、HTTPやFTPなどのプロトコルには、デフォルトのポート番号を指定して通信します。L2CAPの論理的な通信路は、このポート番号の指定に相当します。

BLEの通信仕様

Bluetooth Low Energyの無線通信技術

この章は、組み込み機器開発およびiOSアプリケーション開発に必要な無線通信技術を要点をおさえて解説します。

Bluetooth Low Energy(以下、Bluetooth LE)の無線技術の知識は、独自のBluetooth LEデバイス設計に必要です。また、iOSアプリケーション開発に使うCoreBluetoothフレームワークのクラスや使い方そして振る舞いの理解に、役立ちます。

さらに詳細にBluetooth LEの無線通信技術を知りたいときは、Robin Heydon, Bluetooth Low Energy: The Developer’s Handbook, Prentice Hall, 2012、を参照してください。

Bluetooth4.0の仕様書は、PDF形式でだれでも無償で入手ができます。しかし、それは2000ページを超える膨大なものです。Bluetooth4.0の半導体やスタックを設計するのではないのですから、仕様書は読むものではなく、詳細な数値や記述を調べる辞書として利用します。

Bluetooth LEのアーキテクチャ

Bluetooth LEのアーキテクチャを階層表示したのが図<TBD BLEのアーキテクチャ>です。通信技術は異なる機種間でデータをやりとりする技術です。0/1のビット・データのやりとりにはじまり、接続管理やビット・データのかたまりの意味づけなど、いくつもの役割が組みあわさって、はじめて通信ができます。Bluetoothは、通信の手順やデータ構造をプロトコル、機器の振る舞いをプロファイル、と呼びます。

物理層からGATTまでの階層は、それぞれ下層の機能を使って、相手の同じ階層のプロトコルと通信します。ジェネリック・アクセス・プロファイルは、機器の振る舞いを定義します。機器の振る舞いは、物理層からGATTまでのレイヤそれぞれの役割を通じて実現されるので、ジェネリック・アクセス・プロファイルは、特定のレイヤのものではなく、物理層からGATTまでの全てのレイヤに影響を与えます。物理層からGATTまでの階層は、相手の同じ階層のプロトコルと通信します。レイヤの役割は以下のとおりです:

  • Generic attribute profile (GATT, ジェネリック・アトリビュート・プロファイル)
    • サービス/キャラクタリスティクスを提供。 -Attribute protocol(ATT, アトリビュート・プロトコル)
    • アトリビュートという値をやりとりする
  • Logical Link Control and Adaptation Protocol(L2CAP, ロジック・リンク・コントロール・アンド・アダプティブ・プロトコル)
    • 論理チャンネルの提供
  • Logic link(ロジックリンク)
    • 近接デバイスの発見と接続、通信
  • Physical layer(物理層、フィジカル・レイヤ)
    • 無線通信

コントローラとホスト

Blueoothのアーキテクチャは、コントローラ、ホストそしてアプリケーションの3つに分けられます。コントローラは、電波の送受信、パケット通信、接続管理をおこないます。高周波回路とその制御回路、専用回路またマイクロコントローラで実行されるソフトウェア、で実装されます。ホストは、Bluetoothのプロトコルやプロファイルごとの通信の多重化など、Bluetoothの複雑な通信機能を提供します。アプリケーションは、ユーザが作るアプリケーションです。この2つはソフトウェアです。

ホスト・コントロール・インタフェース

コントローラとホストの間に、Host Control Interface (HCI)という、コマンドとデータの通信仕様があります。HCIはコントローラとホストを、論理的に、また物理的に分離します。ホストとコントローラを1つの半導体に実装する1チップ構成と、別々の半導体で実装する2チップ構成のいずれかがとれます。

1チップ構成は、半導体チップの中にあるマイクロコントローラで実行されるソフトウェアで、コントローラの制御部分とホストが実装されます。このときHCIは、2つのソフトウェアを接続する(ライブラリ呼び出しなどの)、論理的な接続仕様として使われます。1チップ構成では、チップ内部のマイクロコントローラはユーザのアプリケーションも実行します。

コントローラをモジュール化すると、2チップ構成になります。モジュールとは、半導体や高周波回路の素子などを小さな基板に実装して部品化したものです。電波を出力する機器は各国の電波法の承認を取得しなければなりません。この電波を出力するモジュールが承認を取得していれば、機器本体で承認を取る必要がなくなる、メリットがあります。ホストは別のプロセッサで実装されます。ホストはモジュールのコントローラと、シリアル端子やSPI、USBなどの物理インタフェースを通じて、HCIで通信します。

規格にHCIがあるので、2チップ構成でも、どのメーカのコントローラでも共通に使えるようになります。例えば、パソコンでは、ホストはBluetoothスタックと呼ばれるソフトウェアで提供されます。どのメーカのBluetooth USBドングルでも、USBを通してHCIで通信することで、同じように使えます。

どのようなチップ構成でも、ユーザのアプリケーションは、ホストと同じプロセッサで実行されます。ですから、HCIの場合と違い、ホストとユーザアプリケーションの間のインタフェースは、規格に定義がありません。メーカーやOSなどの提供側が決めるもので、開発環境に依存します。

どちらの構成をとるかは、状況によります。機能が単純な周辺機器ならば、製造コストを最小にするため1チップ構成をとるでしょう。機能が複雑だったり、既存設計にBluetooth LEの通信機能を追加するなどで、1チップ構成ではユーザアプリケーションを処理できないならば、2チップ構成を選びます。モバイル機器やパソコンなど、モジュールを採用すれば、おのずと2チップ構成になります。

ホストのLogical Link Control and Adaptation Protocol(L2CAP)は、通信の多重化を行うレイヤです。2つのデバイス間のデータ通信を提供するコントローラを通じて、プロトコルごとに、指定したチャネルごとの独立した通信を提供します。頭文字で略すとLLCAPですが、Lが2つ並ぶのを数字で表して、L2CAP、と表記します。

Bluetooth LEの解説本、第1章

Bluetooth Low Enrgyとは

Bluetooth3.0までのBluetoothと、Bluetooth4.0で統合されたBluetooth Low Energy(ブルートゥース ロー エナージー、以下 Bluetooth LE)は、技術も使われ方も、まったく異なるものです。

本書では、Bluetooth3.0までの技術と、Bluetooth LEを区別するために、このBluetooth3.0までの技術をクラシックBluetoothと呼びます。

この章は、クラシックBluetoothとBluetooth LEの違いを述べます。アプリケーション開発やハードウェアの開発と製造販売、使われ方それぞれで、Bluetooth LEだからできるようになったことが、たくさんあります。自分の担当分野が技術でなくても、企画立案やメンバー全員でのブレイン・ストーミングの前に、この章の知識をメンバー全員で共有しておけば、その後の進行が早く確実なものになります。

Bluetooth LEとクラシックBluetoothの違い

まず、これまでのBlueoothとBluetooth LEの違いを、かいつまんで見ていきます。項目ごとの詳細説明は次節以降を読んでください。

無線通信技術

クラシックBluetoothに対して、Bluetooth LEは:

  • Bluetooth3.0までの端末は、Bluetooth LEのみに対応した周辺機器と接続できない
  • リチウムコイン型電池1つで1〜2年間の無線通信ができるほど超低消費電力
  • 低頻度、少量データの通信に向く
  • 任意の機能を任意に実装できる
  • 近接検出、ブロードキャストができる

です。

Bluetooth4.0に統合されたBluetooth LEは、コンビニエンスストアでも売られているほど一般的な直径2cm程度のリチウムコイン型電池1つで、1年間程度の無線通信ができるほどの、超低消費電力無線通信技術です。

Bluetooth4.0は、Bluetooth3.0にBluetooth LEを統合したものです。Blueooth LEは、Bluetooth3.0までの技術とは異なる技術です。そのため、Bluetooth LEだけに対応した周辺機器(シングルモードと呼びます)は、Bluetooth3.0までの対応機器とは接続できません。

超低消費電力の無線通信技術には、ほかにもANT+やZigbeeなどの規格がありますが、Bluetoothというブランドに統合されたこと、そしてiPhoneが採用したことで、一気に世界に普及しました。

Bluetooth LEの使い道は、たまにしか通信をしないが(低頻度)、必要があればすぐ通信ができる(通信の遅れ時間、レイテンシが小さい)、分野です。

BluetoothLEの応用分野は、例えば、テレビのリモコンのようなデバイスです。リモコンは、普段は使われることがなく、たまにボタンが押されます。ですが、ボタンが押されたら直ちにテレビが反応しなければなりません。

クラシックBluetoothでリモコンを作ると、通信を保持するために、リモコンを使っていない間も電池を消費します。そのため充電し続ける必要があります。もしも電池節約のために、ボタンが押されたら通信接続する設計にすると、通信接続に数秒は時間がかかりますから、反応が悪くて使えません。

Bluetooth LEは、任意のオリジナルの機能を実装できる規格です。クラシックBluetooth規格は、ヘッドセットなど応用ごとに振る舞いを定義していました。そのため、規格の認証に、機器の振る舞いまでが含まれました。Bluetooth LEは、Generic Attribute Profile(ジェネリック アトリビュート プロファイル、GATT)までを規格として、このうえに実装されるデバイスの機能は規格に含みません。通信と機器の振る舞いを分離することで、ユーザは任意の機能の実装ができます。

Bluetooth LEデバイスは、近接検出や少量データのブロードキャストができます。Bluetooth LEは、そのデバイスをiPhoneに発見してもらうために、アドバタイズメント・パケットを送信します。このアドバタイズメント・パケットは、周囲の端末が受信できる、ブロードキャストです。このパケットの受信信号強度から、デバイスとの距離がおおまかに算出できます。また、このパケットには、20バイト程度の任意のバイト・データを入れられます。これを屋内測位や位置ビーコンに応用できます。

iOSアプリケーション開発

iOSアプリケーション開発では、クラシックBluetoothとBluetooth LEデバイスとで、扱いが違います。

  • ペアリングがなくてもよい
  • iOSを通さず、アプリケーションから直接、デバイスの発見と接続ができる
  • Bluetooth LE用のバックグラウンド・モードがある
  • iPhoneはセントラルとペリフェラル、どちらにもなれる

Bluetooth LEデバイスには、ペアリングをしなくても接続させることができます。クラシックBluetoothデバイスは、初めてiPhoneと接続するときに、ペアリングという接続認証が必要でした。

Bluetooth LEデバイスでは、鍵の交換をペアリング、交換した鍵などの情報を保存することをボンディングと言います。ボンディングをしていれば、再接続時にそれらの鍵を使い前回ペアリングしていた状態を復帰できます。ペアリングもボンディングもしない、ペアリングするがボンディングはしない、ペアリングをしてボンディングもする、の組み合わせが取れます。

Bluetooth LEのデバイスの発見、接続、通信そして切断も、すべてiOSアプリケーションが行います。iOSが関与することはありません。

iOSアプリケーションには、Bluetooth LE専用のバックグラウンド・モードが用意されています。バックグラウンドで、Bluetooth LEデバイスと接続して通信しつづける、あるいはデバイスを発見して接続をすることができます。

BTLEハンズオンを開催しました

Bluetooth Low Energyのハンズオン(実物を手にした実践的な講座)を、大垣市ドリームコアで、2013年3月22日に開催しました。

このハンズオンは、 有限会社トリガーデバイスと株式会社間チルダが受託した2012年度岐阜県スマートフォンアプリ開発関連人材育成事業におけるスタッフと研修生が担当しました。 このハンズオンの会場になったドリームコアは、とてもユニークな外観の建物で、長年に渡りiOSアプリ開発者を始めとしたIT人材育成に注力し続けてきた岐阜県大垣市にあります。ちょっとしたハードウェアと無線でつながるBluetooth Low Energyは、これまで実現が不可能だったアプリおよびサービス開発を可能にする鍵になる技術です。その技術の使い方を、実践的なTipsをからめて、ハンズオンにまとめました。

参加募集はATNDで行いました。10名の枠が2時間ほどで埋まり、BTLEへの興味の高まりを感じました2013年3月22日 BluetoothLE体験講座(iOS):iOS開発者向けFacebook BTLEグループに掲載したのも、効果があったのかもしれません。

プレゼン資料は以下のとおりです:

これまでのCoreBluetoothフレームワークを取り上げたiOSアプリ開発本など、いくつか情報はありましたが、いずれもアプリケーション開発者の視点からのもので、物足りなさを感じていました。BTLEは、ハードウェア、アプリ、そしてサービスが一体になり企画されたときに、真価を発揮すると思っていたからです。

このプレゼンテーション資料は、CoreBluetoothフレームワークの使い方はもちろんですが、BTLEのプロトコルスタック(ATT,GATT)、そしてBTLEを本当に理解するための3つのキーワード、サービス/キャラクタリスティクス/プロファイル、を掘り下げて述べて、さらに、CoreBluetoothフレームワークの作りと絡めて、まとめました。

”これまで不可能だったことが可能になる”キーテクノロジーの活用情報として、参考になればと思います。

勝手に関連スライドのリンク

Octopressのカスタマイズ

Octopressを使ってブログを書いているのですが、見た目の調整をしたので、その作業メモ。やりたいことは:

  1. サイドバーにアマゾンリンクをのせたい。
  2. 見出しの文字が大きいのを調整したい。

サイドバーにアマゾンリンクをのせたい。

サイドバーは、1.どのファイルをサイドバーに入れるかを _config.yml ファイルに設定、2.読み込むべきファイルを作る、の2ステップです。 まず _config.yml を編集。アマゾンリンクは自己紹介と一緒のファイル custom/asides/about.html に入れることにしました。表示させたくないasidesをコメントアウトしました。

	# To add custom asides, create files in /source/_includes/custom/asides/ and add them to the list like 'custom/asides/ custom_aside_name.html'
	default_asides: [custom/asides/about.html, asides/recent_posts.html, asides/github.html, asides/twitter.html]
	#asides/delicious.html, asides/pinboard.html, asides/googleplus.html]

次に source/_includes/custom/asides/about.html を書きます。

	 <section>
		  <h1>About Me</h1>
		  <p>A little something about me.</p>
		  <h1>自己紹介</h1>
		  <p>iPhone 関連のハードウェア開発の開発者。個人事業主(屋号 リインフォース・ラボ)、合同会社わふう 代表社員。 </p>
		  <h1>著作紹介</h1>
		  <iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=feb-hare-22&o=
	 </section>

見出しの文字を調整する

H1とH2の見出しの文字サイズを調整しました。 sass/custom/_styles.scss に設定を追加します。 sass はCSSと互換で、変数の使用などを拡張した表記フォーマットでRubyでパースしてCSSを作り出す仕組み、らしいです。ですから、スタイルはoctopressの仕組みではなく、sassで書きます。

参考 : Octopressのスタイル設定とカスタマイズ(http://tokkonopapa.github.com/blog/2012/01/03/customizing-octopress-styles/)

まずタイトルの見出しのフォントサイズを1.8emに設定、2つ目以降の見出しのタイトル下の空白を設定しました。

	 article {
	 //タイトル見出し
	       h1 { font-size: 1.8em;}
	// タイトル直下の見出し
	  h2 {
	    padding-top: 0.8em; //タイトル直下のスペース
	    font-size: 1.3em;   //記事最初の見出しのフォントサイズ
	  }
	  h3 {
	    font-size: 1.1em;
	  }
	  .entry-content & h2:first-child, header + h2 { padding-top: 0; } // その他のタイトルの下余白を0に
	  h2:first-child, header + h2 { background: none; } //
	}

	ul { 
		margin-left: 2em;
	}