AIR for Android で2台の端末をBluetooth接続

先日、あるデモのためにAndroid端末間でBluetooth通信するコンテンツを作りました。Bluetooth用のANEを調べて、使ってみたのでご紹介します。

[Bluetooth ANE (Android)](http://www.myflashlabs.com/product/bluetooth-ane-adobe-air-native-extension/)（有料：$14.99）

※Youtubeでコンテンツデモが公開されています。
[Bluetooth Adobe Air Native Extension](https://www.youtube.com/watch?v=mmN3vC1H3W8)

クラスは下記の2つとシンプルです。

- Bluetooth
- BluetoothEvent

以下、Bluetoothでデバイスを接続するまでと、接続後の通信にわけてざっくり説明します。

##【接続編】

1.Bluetoothクラスの生成

```lang:AS
// Bluetoothクラスの生成
var _ex:Bluetooth;

if (_ex) {
	//このANEを使っている場合にメモリを解放するためのメソッド
	_ex.dispose();
}
_ex = new Bluetooth(); 

//Bluetoothの状態チェック
if (_ex.isEnable)
{
	//---デバイスのBluetooth：ON
		//他のデバイスにこのデバイスが表示されるようにする
		_ex.visible(0);
		//2つのデバイス間の通信を初期化する
		_ex.initCommunicationService();
} else {
	//---デバイスのBluetooth：OFF

	//Bluetoothへのアクセス許可を要求（「ONにしていいか」のメッセージが、Android OSから通知されます）
	_ex.enable();
}
```
- Bluetooth.initCommunicationServiceには、UUIDを引数として渡します。省略時は規定値が設定されます。
当然ですが接続する2台のUUIDは同じである必要があります。
- Bluetoothへのアクセス許可を要求（Bluetooth.enable()）した場合、ユーザがAndroid OSからの通知にOKすると、下記2.のイベントが呼び出されます。

2.Bluetoothの状態を確認（OFFの場合、ONになるのを待つ）

```lang:AS
//status監視 
_ex.addEventListener(BluetoothEvent.BLUETOOTH_STATE , bluetoothState); 

//BLUETOOTH_ONで行う処理
private function bluetoothState(e:BluetoothEvent):void
{
	if (e.param == "bluetoothOn"){
		//他のデバイスにこのデバイスが表示されるようにする
		_ex.visible(0);
		//2つのデバイス間の通信を初期化する
		_ex.initCommunicationService();
	}
}
```

3.Bluetoothの検索状態の監視（Bluetooth検索イベントの準備）

```lang:AS
//他のBluetoothデバイスの検索状態を監視
_ex.addEventListener(BluetoothEvent.DISCOVERING_STATUS , discovering); 

//他のBluetoothデバイスの検索状態を通知
private function discovering(e:BluetoothEvent):void
{
	trace("discovering >> " + e.param);
	
	if (e.param == "discoveringStarted")
	{
		//---検索開始
		trace("デバイスの検索開始...");

	}
	else if (e.param == "discoveringFinished")
	{
		//---検索終了
		trace("デバイスの検索終了しました");
	}
}

//新しいデバイス検知 
_ex.addEventListener(BluetoothEvent.NEW_DISCOVERD , newDiscoverd); 

//新しいデバイス検知
private function newDiscoverd(e:BluetoothEvent):void
{
	var obj:Object = e.param;
	
	//obj.device >> device名 obj.mac >> macアドレス
	trace("newDiscoverd >> " + "device = " + obj.device + " mac :" + obj.mac);

}
```
- この BluetoothEvent.NEW_DISCOVERD で返ってくるmacアドレスをbluetooth接続時に使います。

4.他のBluetoothデバイスを検索

```lang:AS
btnBT.addEventListener(MouseEvent.CLICK,onClick_startBT);

function onClick_startBT(e:MouseEvent):void{
	//他のBluetoothデバイスを検索開始
	_ex.startDiscovery();
}
```
- この Bluetooth.startDiscovery() を呼び出すと、状況に応じて上記3.のイベントが発生します。

5.他のデバイスとのBluetooth接続監視（Bluetooth接続イベントの準備）

```lang:AS
//接続処理：監視
_ex.addEventListener(BluetoothEvent.COMMUNICATION_STATUS , communication);

//接続処理：監視
private function communication(e:BluetoothEvent):void
{
	trace("communication >> " + e.param);
	
	if (e.param == "connecting")
	{
		trace("デバイスに接続中です...");
	}
	else if (e.param == "connected")
	{
		trace("デバイスに接続しました！");

		//---ここに接続後の処理を記述
	}
}
```

6.他のデバイスとBluetooth接続する

```lang:AS
//他のBluetoothデバイスと接続する
btn1.addEventListener(MouseEvent.CLICK, toConnect);

function toConnect(e:MouseEvent):void
{
	

	//ペアリング済のデバイスリストを取得
	var pairList:Array = _ex.pairedList;

	//ペアリング済かチェックする
	var currDevice:Object;
	for (var i:int = 0; i < pairList.length; i++) 
	{
		currDevice = pairList[i];
	
		if (currDevice.mac == mac)
		{
			//ペアリング済の場合は、デバイスと接続します
			_ex.connectTo(mac);

			return;
		}
	}

	//ペアリングしていない場合、デバイスとペアリングします
	_ex.pairWith(mac);
}
```
- 上記スクリプト中の「mac」は、上記4.で取得したmacアドレスを使用します。
- Bluetooth.pairWhith()は、ペアリングと接続を行います。
- ここで実行したメソッドの結果に応じて、上記5.のイベントが発生します。

##【通信編】

1.他デバイスへのメッセージ送信

- 送信出来るのは、Stringです。

```lang:AS
//他デバイスへのメッセージ送信
_ex.sendMessage("xxxxxxxx");


//他デバイスへのメッセージ送信：監視イベント
_ex.addEventListener(BluetoothEvent.SEND_MESSAGE , sendMessage);

//他デバイスからのメッセージ受信：監視イベント
private function sendMessage(e:BluetoothEvent):void
{
	trace("sendMessage >> " + e.param);
	
}
```

2.他デバイスからのメッセージ受信

Bluetooth.sendMessage()で送信されたメッセージは、下記のイベントで受け取ります。

```lang:AS
//他デバイスからのメッセージ受信：監視
_ex.addEventListener(BluetoothEvent.READ_MESSAGE , readMessage);

//他デバイスからのメッセージ受信監視
private function readMessage(e:BluetoothEvent):void
{
	//---e.paramが受信されたStirng
	trace("readMessage >> " + e.param);
}
```

##補足事項
- 【確認環境】MacOSX 10.9.5+Flash Professional CS2014+AIR 17.0.0.124 for Android
- テスト端末：GALAXY NEXUS2、ASUS MeMo Pad 7 ME176

##まとめ
実際に使うときは、接続用の画面と本編（コンテンツ）の画面を別に作って、接続後に切り替えることになると思います。有料ですがカンタンに使えるので、必要な方は使ってみて下さい。

メリークリスマス！