■ 接続デバイスの発見と接続
接続可能なデバイスが見つかると、以下のように接続するデバイスを選択するダイアログが表示されます。
デバイスを選択すると、選択されたデバイス側で接続を許可するかを選択するダイアログが表示されます。
ダイアログで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 フォーラム トップページへ |
- 夏休みの自由研究にマイコンボードで「電子サイコロ」を作ったり、音楽プログラミングをしたりしてみよう (2017/7/24)
子ども向け電子工作&プログラミング用マイコンボード「chibi:bit」の基本的な使い方を紹介する企画。夏休みの自由研究に「電子サイコロ」を作ったり、音楽プログラミングをしたりしてみよう - 子ども向け電子工作&プログラミング用マイコンボード「chibi:bit」の基本的な使い方 (2017/7/20)
子ども向け電子工作&プログラミング用マイコンボード「chibi:bit」の基本的な使い方を紹介する。夏休みの子どもの自由研究などに役立てつつ、プログラミングを始めるきっかけにしてみてはいかがだろうか - 3DゲームのAIをiOSのSceneKitとGameplayKitで作る基本 (2017/7/10)
3Dゲーム用のフレームワークSceneKitを使った簡単なアプリ制作を通して、3Dゲーム用の人工知能(AI)について学ぶ - UnityアプリをWebGL、UWP、Android、iOS用としてビルドしてみた (2017/6/27)
アプリをWebで実行できるように書き出す方法やWindows上でUWP、Android、iOS用などにビルドする方法について解説する【Windows 10、Unity 5.6に対応】
|
|