Bluetoothを利用した複数端末の接続方法 ~MeetingForce~

こんにちは。アスネット開発部の増田です。
アスネットが開発したAndroidアプリの『MeetingForce』では、
Bluetoothを利用して複数端末の接続・データ共有を行っております。
今回は、その複数端末で接続を行うための概要を紹介します。

MeetingForceロゴ

『MeetingForce』とは?

まず始めに『MeetingForce』の紹介です。
このアプリはJPEGPNG、PDF等のファイルへメモが出来、
そのファイルを複数の端末でリアルタイムで共有・同期が出来る、コミュニケーションをサポートするアプリです。

ミーティング画面画像

上記の画像のように会議や打合せで使用する資料を参加者がアプリで開き、
その資料へ直接文字等を書き込むことで、より簡単にお互いの考えを理解し合えます。

さて、このMeetingForce、BluetoothもしくはWi-Fi接続によってファイルや描画を共有しています。
今回はBluetoothでの接続に注目してみたいと思います。

Bluetoothの利用例

皆さんはどのような場面でBluetoothを利用しているでしょうか?
MeetingForceでのBluetoothの活用方法を紹介する前に、利用例を見てみましょう。

  • PCとマウス
    日頃使用しているPCとマウスをBluetoothで繋ぎ、ワイヤレスでマウスを使用します。

  • スマートフォンとイヤホン
    スマートフォンBluetooth対応のイヤホン(もしくはヘッドフォン)を繋いで、音楽やラジオ等を再生します。
    通勤やスポーツ時等、幅広い場面で利用されています。

  • スマートフォン・PCとヘッドセット
    スマートフォンやPCとヘッドセットを繋いで、スマートフォンでの通話や無料通話アプリを利用します。
    端末を持ったり、ケーブルに気を使う必要がなく、運転中なども通話が可能です。

このように様々なシチュエーションで使用されているBluetoothですが、3つの例に共通していることがあります。
その共通点とは「1対1での接続(ペアリング)」であるということです。
基本的にBluetoothは、1対1での接続に利用されることが多いです。
ですが、冒頭で説明した様にMeetingForceでは、複数の端末を繋げてファイルや文字等の描画を相互に共有・同期が可能です。
では、どのように複数接続を行っているのか、活用方法を紹介します。

『MeetingForce』でのBluetoothの活用方法

MeetingForceでは1台の端末を「ホスト」として使用し、
その端末へ「ゲスト」として複数の端末を繋いでいきます。
ソースコードでは、以下のようにホストが他端末からの接続要求を待ち受け、
ゲストがホストを検出して接続要求を送ります。

【サーバ側】

//BluetoothServerSocketの取得
BluetoothServerSocket tmpServerSock = null;
myBtAdapter = btAdapter;
try{
    //自デバイスのBluetoothサーバーソケットの取得
        tmpServerSock = myBtAdapter.listenUsingRfcommWithServiceRecord("BlueToothSample", UUID_SAMPLE);
}catch(IOException e){
    e.printStackTrace();
}
//クライアントからの接続要求待ち → 接続完了
BluetoothSocket receivedSocket = null;
try{
    //クライアントからの接続要求待ち
        receivedSocket = servSock.accept();
} catch(IOException e) {
    break;
}
 
if(receivedSocket != null){
    //接続完了時の処理
}

【クライアント側】

//クライアントのBluetoothSocket取得
BluetoothSocket clientSocket= null;
BluetoothSocket tmpSock = null;
BluetoothDevice = device;
myBtAdapter = btAdapter;
 
try{
    //自デバイスのBluetoothクライアントソケットの取得
    tmpSock = device.createRfcommSocketToServiceRecord(UUID_SAMPLE);
} catch(IOException e) {
    e.printStackTrace();
}
clientSocket = tmpSock;
//サーバへ接続要求送信 → 接続完了
try{
    //サーバー側に接続要求
    clientSocket.connect();
} catch(IOException e) {
    try {
    clientSocket.close();
} catch (IOException closeException) {
    e.printStackTrace();
}
    return;
}
//以下、接続完了時の処理

Bluetoothで端末を繋ぐアプリを作成する際には、ごく一般的な実装です。
ですが、MeetingForceではホストへ上記のように接続要求を送ってきた複数ゲストの情報(ソケット)を保持し、
管理している点が異なります。
ファイルの共有から描画の送受信までの流れを下記の例で追ってみましょう。

例)ホスト1台に対して2台のゲスト(A、B)が接続された場合

1.ホスト1台に対して2台のゲスト(A、B)の接続前の状態。

ホスト・ゲスト2台


2.ホストとそれぞれのゲストでペアリングを行って接続し、
  ホストから共有したいファイルをゲストたちへ送信する。

ホスト・ゲスト2台_ファイル共有


3.ホストが描画を加える。
 →ホストが管理しているゲストのソケットを通して描画の情報を送信し、
   ゲストは受け取った情報で描画を表示。

ホスト・ゲスト2台_ファイル共有


4.ゲストAが描画を加える。
 →ホストへ描画の情報を送信。
   ホストは受信した情報で描画を表示し、さらにゲストBへ描画情報を送信。
  ゲストBはホストから受信したゲストAの描画情報を基に描画を表示。

ホスト・ゲスト2台_ファイル共有

このようにホストが常に仲介役となることで、
全ての端末で同じファイルや描画をリアルタイムで同期することが可能となるのです。

まとめ

Bluetoothの利用例を踏まえて、複数端末接続方法を紹介してきましたが、いかがでしたでしょうか?
MeetingForceでは、Bluetoothの基本的な利用方法である「1対1での接続(ペアリング)」を同時に複数使用することで、
複数端末の同時接続を実現しています。
MeetingForceについて知ってもらえただけでなく、Bluetooth1つを取り上げても使い方を工夫するだけで、
可能性が広がるということをお伝え出来ていれば・・と思います。

最後に、MeetingForceはGooglePlayにて無料でダウンロード出来ますので、ぜひ使ってみてください!
https://play.google.com/store/apps/details?id=jp.co.asnet.android.mf

参考URL

MeetingForce
http://meetingforce.net/
TechBooster Bluetoothで通信を行う(3)
http://techbooster.org/android/device/5833/