Posted at
FlashDay 24

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

More than 3 years have passed since last update.

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

Bluetooth ANE (Android)(有料:$14.99)

※Youtubeでコンテンツデモが公開されています。

Bluetooth Adobe Air Native Extension

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


  • Bluetooth

  • BluetoothEvent

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


【接続編】

1.Bluetoothクラスの生成


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になるのを待つ)


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検索イベントの準備)


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デバイスを検索


AS

btnBT.addEventListener(MouseEvent.CLICK,onClick_startBT);

function onClick_startBT(e:MouseEvent):void{
//他のBluetoothデバイスを検索開始
_ex.startDiscovery();
}



  • この Bluetooth.startDiscovery() を呼び出すと、状況に応じて上記3.のイベントが発生します。

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


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接続する


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です。


AS

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

_ex.sendMessage("xxxxxxxx");

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

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

}


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

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


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


まとめ

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

メリークリスマス!