iPhone/iPadスマートアプリ開発レシピ
iPhone/iPadスマートアプリ開発レシピ(4)

iPhoneアプリでBluetooth通信を使うための基礎知識


クラスメソッド株式会社
開発部 掛川敦史
2012/6/19

接続デバイスの発見と接続

 接続可能なデバイスが見つかると、以下のように接続するデバイスを選択するダイアログが表示されます。

 デバイスを選択すると、選択されたデバイス側で接続を許可するかを選択するダイアログが表示されます。

 ダイアログでAcceptを選択すると接続が完了し、GKPeerPickerControllerDelegateのpeerPickerController:didConnectPeer:toSession:メソッドが呼び出されます。

- (void)peerPickerController:(GKPeerPickerController *)picker
              didConnectPeer:(NSString *)peerID
                   toSession:(GKSession *)session
{
    // セッションを保管
    currentSession = session;
    // デリゲートのセット
    session.delegate = self;
    // データ受信時のハンドラを設定
    [session setDataReceiveHandler:self withContext:nil];
   
    // ピアピッカーを閉じる
    picker.delegate = nil;
    [picker dismiss];
}
- PR -

 GKSessionは接続中のセッションを表すクラスで、これを利用してデータの送受信などを行います。GKPeerPickerControllerを利用している場合、GKSessionは自動的に生成されます。GKSessionをカスタマイズしたい場合は、GKPeerPickerControllerDelegateのpeerPickerController:sessionForConnectionType:デリゲートメソッドを実装して、このメソッド内部でGKSessionを生成して返します。

 また、接続中のデバイスとのコネクションが切断された際などセッションに変化があった場合には、GKSessionによって検出されます。これをハンドリングするためには、GKSessionDelegateプロトコルに適合したデリゲートを利用します。

 デリゲートとは別に、データを受信した際にハンドラを呼び出すオブジェクトを設定するメソッドとして、GKSessionにsetDataReceiveHandler:withContextメソッドがあります。デバイスの接続完了時にpeerPickerController:didConnectPeer:toSessionメソッドで渡されたピアIDをwithContextパラメータに指定した場合、該当するピアからデータを受信した場合にのみ、設定したオブジェクトのハンドラメソッドを呼び出すよう設定されます。

 また、ハンドラメソッドは以下の形式です。

- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context

 dataパラメータにはNSData型の受信データが渡されます。このサンプルアプリではNSKeyedArchiverクラスでエンコードされた描画情報が渡されるので、NSKeyedUnarchiverクラスでデコードして描画情報を取得し、画面に反映しています。

データの送信

 接続先のデバイスにデータを送信する部分のコードです。

NSError *error = nil;
// 接続中のすべてのピアにデータを送信
[currentSession sendDataToAllPeers:data
                      withDataMode:GKSendDataReliable
                             error:&error];
if (error)
{
    NSLog(@"%@", [error localizedDescription]);
}

 GKSessionのsendDataToAllPeers:withDataMode:error:メソッドは接続中のデバイスすべてにデータを送信します。送信するデータはNSData型である必要があります。このアプリでは、先ほど説明したとおり描画情報をエンコードしてデータを送信しています。

接続の切断

 PtoP接続を切断する部分のコードです。

if (currentSession)
{
    // PtoP接続を切断する
    [currentSession disconnectFromAllPeers];
    currentSession = nil;
}

 GKSessionのdisconnectFromAllPeersメソッドを呼び出してすべてのデバイスとの接続を切断しています。

アプリの実行結果

 作成したサンプルアプリをiPhoneとiPadで動作させた際の様子です。

 一方のクライアントで絵を描くと、もう一方のクライアントにも反映されます。

 今回紹介したのは、Game Kitを利用したBluetoothによる通信の一番簡単な利用方法です。特に接続部分に関しては、GKPeerPickerControllerを利用せずに自前で接続処理を行うためのメソッドが用意されており、これらを利用することによって、接続のプロセスをある程度自由にカスタマイズできます。

 Game Kitの詳細に関しては、アップル公式ドキュメントである、「Game Kit プログラミングガイド」を参照してください。

「Core Bluetooth」によるBluetooth LE通信

 Core BluetoothはBluetooth LE対応デバイスと通信を行うためのフレームワークです。Core Bluetoothの利用方法に触れる前に、Bluetooth LEで利用されるプロファイルを見てみましょう。

GATTプロファイル

 Bluetooth LEでは、基本的に「GATT(Generic Attribute Profile)」と呼ばれるプロファイルをベースとして定義されたプロファイルで通信が行われます。基本的にGATTプロファイルは、「サービス」「キャラクタリスティック」「ディスクリプタ」と呼ばれる3つの要素で構成されています。プロファイルは1つ以上のサービスから構成されます。

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

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

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

 これらの関係を図にまとめると、下図のようになります。

 GATTプロファイルとそれをベースとしたプロファイルの仕様に関しては、「Bluetooth Developer Portal」の「GATT Specifications」を参照してください。

Bluetooth SmartデバイスとBluetooth Smart Readyデバイスの関係

 Bluetoothのデバイスは、自分の存在をほかのデバイスに知らせるために自デバイスや対応サービスの情報を公開する仕組みがあり、これを「アドバタイズ」といいます。

 Bluetooth LE対応デバイスが接続を行う際は、Bluetooth Smartデバイスがアドバタイズを行い、Bluetooth Smart Readyデバイスがアドバタイズしているデバイスを探索します。このとき、Bluetooth Smartデバイスがサーバ、Bluetooth Smart Readyデバイス側がクライアントという関係になります。

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

「Core Bluetooth」フレームワークのサンプルアプリ

 「Core Bluetooth」はBluetooth LEに対応する機器との通信を行うためのAPIを提供しています。なお、Core BluetoothはiOS SDK 5.0以降で利用できます。

 今回は、iOSデバイスとBluetooth Smartデバイスの間でのBluetooth LE通信を利用した、以下の機能を持つサンプルアプリを作成しながらCore Bluetoothの利用法を見ていきます。

  • Bluetooth Smartデバイスの鳴動によるユーザーへの通知機能のiOSデバイス側からの呼び出し
  • Bluetooth Smartデバイスのバッテリー残量情報のiOSデバイス側からの取得

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

 このサンプルアプリは、以下の環境で動作を確認しています。ソースコードはこちらからダウンロードできます

  • 開発環境:Xcode 4.3.2、iOS SDK 5.1
  • 動作環境:iPhone 4S(iOS 5.1.1)
  • Bluetooth Smart機器:Logitec LBT-VRU01

 次ページでは、このサンプルアプリの実装について解説します。

1-2-3-4

 INDEX
iPhone/iPadスマートアプリ開発レシピ(4) 
iPhoneアプリでBluetooth通信を使うための基礎知識
  Page1
意外と知らない? 「Bluetooth」は3種類ある
Bluetooth LE対応機器
iOSデバイスのBluetooth対応状況
「Game Kit」によるBluetooth通信
Game Kitを使ったアプリの実装
Page2
「Core Bluetooth」によるBluetooth LE通信
  Page3
Core Bluetoothを使ったアプリの実装
  Page4
Bluetoothでスマホは生活に欠かせないものに



 Smart&Social フォーラム トップページへ



Smart & Social フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Smart & Social 記事ランキング

本日 月間