Help us understand the problem. What is going on with this article?

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

まとめ

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

メリークリスマス!

c_geru
フリーランスのWeb&iOSデベロッパー。VoiceCard、アイコン顔カメラ。App Storeで公開中です。 apple.co/2uA7EcT itunes.apple.com/jp/app/icon-fa…
https://c-geru.com/as_blind_side/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした