その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

Bluetooth のプロファイルについて調べたことのまとめ

Bluetoothのプロファイルって何?というところから、iOSのCore Bluetoothで対応しているプロファイルについてのアレコレまで、ググって調べたことのまとめ。


注意:この記事は全くの無知な状態から調べながら書いたので、(とくに序盤に)多分に誤解・語弊のある言い回しが含まれております。

プロファイルとは?

Bluetoothはその特性上、様々なデバイスでの通信に使用される為、機器の種類ごとに策定されたプロトコルがあり、これをプロファイル (Profile) と呼び標準化している。 通信しようとする機器同士が同じプロファイルを持っている場合に限り、そのプロファイルの機能を利用した通信をおこなえる。

プロファイルは、各機器がBluetoothを使って何ができるかを示したもので、機器同士の接続性が一目でわかるようになるものと期待された。しかし現実には、Bluetooth応用分野の拡大に伴って急激にプロファイルが増加したこともあり、以下のような問題が目立つ。

  • 同じような機能のプロファイルが乱立気味であり、利用可能な、あるいは目的に適したプロファイルがわかりにくい。
  • 対応プロファイルの少ない古い製品の陳腐化を助長し、しかもアップグレードが提供されないことが多いので買い替えを余儀なくされる。
  • 「同じBluetoothなのにプロファイルの有無が原因でつながらない」という印象を与えやすい。

Bluetooth - Wikipedia

汎用の短距離無線通信技術であるBluetoothは、さまざまな情報機器が対応し、データを交換することができる。その際、パソコンなどを介さずに機器同士が直接データを転送して互いの機能を利用するという使用法も想定されている。


このため、Bluetoothでは従来の通信技術のように単に回線を確立してデータが転送できるだけでは不十分で、どのような順番・タイミングで、どんな種類の情報を転送すべきか、という機器の「使い方」にあたる手順を共通化しておく必要がある。


こうした機器固有の通信手順(プロトコル)を製品の特性ごとに標準化したものがBluetoothプロファイルである。業界団体のBluetooth SIGによって機器の種類ごとに標準のプロファイルが策定されているほか、メーカーが自社固有の機能を実装した独自のプロファイルを提供することもできる。


たとえば、デジタルカメラが自分の保存している画像を近くのプリンタで印刷したい場合は、プリンタプロファイル(Printing Profile)を使って通信し、プリンタに印刷を依頼するのである。パソコンがデジタルカメラの保存している画像を一覧したい場合にはデジタルカメラプロファイル(実際には、「Still Image Profile」というプロファイルを使う)を使ってデータの転送を依頼すればよい。

Bluetoothプロファイル(Bluetooth Profile)とは - IT用語辞典 e-Words

代表的なプロファイルの一覧

  • GAP (Generic Access Profile)

機器の接続/認証/暗号化を行うためのプロファイル。

  • SDAP (Service Discovery Application Profile)

他のBluetooth機器が提供する機能を調べるためのプロファイル。

  • SPP (Serial Port Profile)

Bluetooth機器を仮想シリアルポート化するためのプロファイル。

  • DUN (Dial-up Networking Profile)

携帯電話・PHSを介してインターネットにダイヤルアップ接続するためのプロファイル。

  • FTP (File Transfer Profile)

パソコン同士でデータ転送を行うためのプロファイル。ファイル転送プロトコルのFTPとは無関係。

  • HID (Human Interface Device Profile)

マウスやキーボードなどの入力装置を無線化するためのプロファイル。

  • HCRP (Hardcopy Cable Replacement Profile)

プリンタへの出力を無線化するためのプロファイル。

  • BPP (Basic Print Profile)

プリンタへ転送・印刷するためのプロファイル。

  • OPP (Object Push Profile)

名刺データの交換などを行うためのプロファイル。

  • SYNC (Synchronization Profile)

携帯電話・PHSやPDAと、PCとの間で、スケジュール帳や電話帳のデータ転送を行い、自動的にアップデートするためのプロファイル。

  • LAP (LAN Access Profile)

Bluetoothを利用して無線LANを構築するためのプロファイル。

  • FAX (FAX Profile)

PCからFAXを送信するためのプロファイル。

  • HSP (Headset Profile)

Bluetooth搭載ヘッドセットと通信するためのプロファイル。モノラル音声の受信だけではなく、マイクで双方向通信する。

  • HFP (Hands-Free Profile)

車内やヘッドセットでハンズフリー通話を実現するためのプロファイル。HSPの機能に加え、通信の発信・着信機能を持つ。

  • BIP (Basic Imaging Profile)

静止画像を転送するためのプロファイル。

  • PAN (Personal Area Network Profile)

小規模ネットワークを実現するためのプロファイル。

  • A2DP (Advanced Audio Distribution Profile)

音声をレシーバー付きヘッドフォン(またはイヤホン)に伝送するためのプロファイル。HSP/HFPと異なり、ステレオ音声・高音質となる。

  • AVRCP (Audio/Video Remote Control Profile)

AV機器のリモコン機能を実現するためのプロファイル。

  • PBAP (Phone Book Access Profile)

電話帳のデータを転送するためのプロファイル

  • OBEX (Object Exchange)

オブジェクト交換 (OPP、BIP、FTP、SYNC) で用いる認証方式の一つ。データ転送プロファイルの一つで、実装しているとデータ送受信時にOBEX認証パスキーの入力を接続相手に要求する。

  • ICP (Intercom Profile)

同一ネットワーク内にあるBluetooth搭載携帯電話同士を公衆電話網を介さずに直接、接続させるためのプロファイル。

  • HDP (Health Device Profile)

健康管理機器同士を接続するためのプロファイル。

これらプロファイルのうち、DUN/FTP/HID/OPP/HSP/HFP/A2DP/AVRCPなどの使用頻度が高い。GAPやSDAPのような下位層のものは実装されていても意識されないことが多い。

Bluetooth - Wikipedia


別のプロファイル一覧ページ:Bluetoothプロファイルの一覧 - Wikipedia

Core Bluetoothが対応しているプロファイル

プロファイルとは何か、どんなのがあるのかわかったところで、Core Bluetooth フレームワークではどんなプロファイルが使えるのか調べてみたところ、

Core Bluetooth is meant for low energy,You can only implement GATT Profiles(like Heart Rate,Alert Notification) with BLE and BLE is for small data rates.

iphone - What profile can I use with CoreBluetooth? - Stack Overflow


とあり、使えるのはGATT(Generic Attribute Profile)と呼ばれるプロファイル、もしくはGATTをベースとして定義されたプロファイルだけらしい。


Core BluetoothはiOSアプリに Bluetooth LE (BLE) デバイスの発見、接続と読み書きの操作を提供するフレームワークであり、BLEデバイスの振る舞いはGATTプロファイルとして定義されている、ということのようです。


(参考:http://reinforce-lab.github.io/blog/2013/09/19/blebook-ch3-corebluetooth/


# というわけで上に載せたプロファイル一覧はBluetooth3.0以前用で、MFIを取得してExternal Accessoryフレームワークを使用しないと使えない類いのもののようです。

GATTプロファイルとは?

Bluetooth LEでは、基本的に「GATT(Generic Attribute Profile)」と呼ばれるプロファイルをベースとして定義されたプロファイルで通信が行われます。

iPhoneアプリでBluetooth通信を使うための基礎知識(2/4)- @IT


GATTをベースにしたプロファイルとしては、"https://developer.bluetooth.org/gatt/profiles/Pages/ProfilesHome.aspx" によると、次のようなものがあるようです。

  • Alert Notification
  • Blood Pressure
  • Cycling Power
  • Cycling Speed and Cadence
  • Find Me
  • Glucose
  • Health Thermometer
  • Heart Rate
  • HID OVER GATT
  • Location and Navigation
  • Phone Alert Status
  • Proximity
  • Running Speed and Cadence
  • Scan Parameters
  • Time

GATTの詳細

このデータ通信はGATT(Generic Attribute Profile)をベースとして,service(サービス)を用いて行います.serviceは,属性値のcharacteristic(キャラクタリスティック),任意属性値のdescriptor(ディスクリプタ)から構成されます.


例として,バッテリー情報を提供するBattery Serviceでは,Battery Lavelという電池残量値を持ったcharacteristicと,そのフォーマットを指定するdescriptorで構成されます.

[iOS] Bluetooth Low Energyでアプリ開発: Seesaa京都アプリエンジニアブログ

実際のデータのやりとりは、キャラクタリスティックに対して読み書きすることで行われます。オブジェクト指向プログラミングをしている方々には、サービスがクラス、キャラクタリスティックがプロパティととらえるとわかりやすいかもしれません。


各キャラクタリスティックの値は無暗号化状態で読み書きすることもできますが、ペアリングの操作を行うと暗号化されます。また、キャラクタリスティックの値が変化したときに通知を受け取れるものもあります(notify)。


これらのサービスやキャラクタリスティックは Bluetooth SIG が標準として定義しているもののほかに、デバイスの開発者が独自に定義することも可能です。


いくつかの必要なサービスを組み合わせたものを「プロファイル」と呼んでいます。(特にこれまでのBluetoothのプロファイルと区別する必要のある場合はGATTベースプロファイルと呼ばれます) プロファイルも標準的なものは Bluetooth SIG が定義しており、たとえば、マウス・キーボードにあたる「HID over GATT」というプロファイルには、「Human Interface Device」「Device Information」「Battery Service」「Scan Parameters(オプション)」のサービスが含まれると定義されています。


サービス・キャラクタリスティックは、UUID で識別されます。UUID は 32 桁ですが、Bluetooth SIG の標準で定義されているものについては 4 桁で表現されます。4 桁の UUID は実際には Bluetooth Base UUID というものをつけ、0000●●●●-0000-1000-8000-00805f9b34fb となります(●のところに4桁 UUID が入ります)。規格外で独自に定義する場合は Mac では uuidgen コマンドを使うなどして生成します。

【連載】Bluetooth LE (1) Bluetooth Low Energy の基礎 (フェンリル | デベロッパーズブログ)

GATTは、サーバが持つデータを、キャラクタリスティクスという単位で読み書きする仕組みを提供します。また、サーバには多くのキャラクタリスティクスがありますが、そのキャラクタリスティクスをグループ化する、サービスという仕組みも提供します。


サービスは、その機器のハードウェアとしての機能を表します。例えば、体温計があるとします。体温計のハードウェアとしての機能は、温度の計測と、計測が完了した時のアラート音の出力の2つだとします。この場合、温度計測をするサービスが1つ、そして警告音を出すサービスが1つ、あるでしょう。それぞれのサービスには、温度を読み出すキャラクタリスティクス、警告音のOn/Offの指示を書き込むキャラクタリスティクスがあるでしょう。体温計という振る舞いにではなく、ハードウェアとしての機能に、サービスが割り当てられます。


Bluetooth LEのアプリケーションは、GATTの上に作られます。Bluetooth LEの規格認証の範囲はGATTまでです。サーバがどのようなサービスやキャラクタリスティクスを提供するかは、機器のアプリケーションとして実装されます。ですから、機器の開発者は、Bluetooth LEの規格認証のもとで、任意のサービスおよびキャラクタリスティクスを定義して、それを実装できます。


これはiOSアプリケーションでも同じです。iOSアプリケーションは、Core Bluetoothフレームワークを通して、GATTのサービスとキャラクタリスティクスにアクセスできます。iOSアプリケーションは、接続した機器の複数のサービスを組み合わせて、機器の振る舞いを制御します。Bluetooth LEを使うiOSアプリケーションは、パソコンで言うデバイス・ドライバに相当する部分を、アプリケーション内部に持つことになります


クラシックBluetoothで任意のアプリケーションを作る場合は、勝手なプロファイルを定義できないため、SPPの汎用通信を使うほかありません。しかし、Bluetooth LEは、その規格のもとで任意のプロファイルを勝手に定義することができます。例えば、先ほどの体温計のサービスを利用して、iOSアプリケーションの振る舞いの制御を変えれば、室温を計測して熱中症をアラート音で警告する振る舞いをさせることも、できます。


Bluetooth SIGは、よく使われるサービスやプロファイルを定義しています。例えば、バッテリー残量やアラートの出力のようなサービスが定義されています。必要なプロファイルに使えるサービスがすでに定義されていれば、それを利用することができます。わざわざ定義や開発をする必要はありません。


また、プロファイルは、開発者が任意に定義できますが、これでは特定のメーカや機種を超えた汎用性が得られません。Bluetooth SIGは、それぞれの業界団体から提出された汎用化したプロファイルを公式のプロファイルとして審査承認して、Bluetooth LEの公式のプロファイルの定義とすることで、これを解決します。

http://reinforce-lab.github.io/blog/2013/09/19/blebook-ch3-corebluetooth/

GATTプロファイルは、「サービス」「キャラクタリスティック」「ディスクリプタ」と呼ばれる3つの要素で構成されています。プロファイルは1つ以上のサービスから構成されます。


サービスはプロファイルの一機能を表します。サービスは、複数の入れ子になっているサービスと複数のキャラクタリスティックから構成されます。


キャラクタリスティックは単一の値を持った属性を表します。キャラクタリスティックは、キャラクタリスティック自体の値、値へのアクセス方法を定義するプロパティ、複数のディスクリプタで構成されます。


ディスクリプタはキャラクタリスティックに付加情報が必要な際に用いられる属性値を表しており、キャラクタリスティックによってはディスクリプタは定義されていません。

クライアントは発見した任意のサーバと接続した後、GATTプロファイルをベースとしたプロファイルで情報の取得や書き込みを行います。実際には、上述のキャラクタリスティックまたはディスクリプタの値で情報をやりとりします。

なお、Bluetooth Smartデバイス側は、鳴動によるユーザーへの通知機能を提供する「Immediate Alert」サービスと、バッテリー残量情報を提供する「Battery Service」サービスに対応している必要があります。Immediate Alertサービスを含むプロファイルとしては「Find Me」プロファイルなどが、Battery Serviceサービスを含むプロファイルは「HID OVER GATT」プロファイルなどがあります。

iPhoneアプリでBluetooth通信を使うための基礎知識(2/4)- @IT

参考書籍

上を目指すプログラマーのためのiPhoneアプリ開発テクニック iOS 7編
加藤 寛人 西方 夏子 藤川 宏之 鈴木 晃 高丘 知央
インプレスジャパン
売り上げランキング: 6,194


「7-2 Core Bluetooth」に約20ページにわたる詳細な解説があります。プロファイルの話も出てきます。


(参考記事:http://d.hatena.ne.jp/shu223/20131220/1387517015