Hatena::ブログ(Diary)

Android開発日記

2011-02-25

自動ペアリング

Bluetooth携帯プリンタに印字しようとしたら、どうもAndroidではBluetooth機器をペアリングしないとRFCOMMやSPPでは接続できないみたい。

一応、BluetoothDevice.javaを見てみるとcreateRfcommSocketメソッドでのBluetoothSocketクラス生成時にauthフラグが固定でtrueになっているから、これがfalseで設定できればあるいはと思ったけど・・・

FHTPR231ではペアリングがそもそもできないようなので、BLM80で印字してみた。結果印字できた。

ただ、毎回ペアリングを手動で行うのはめんどうなので自動でペアリングする方法

// 自動ペアリング処理
protected boolean execPairing(String bluetoothAddress, String pinCode) throws Exception {

    // Bluetoothアダプタ取得
    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

    // BluetoothデバイスをMACアドレスから取得
    BluetoothDevice device = adapter.getRemoteDevice(bluetoothAddress);

    // ペアリング開始処理呼び出し
    Method createBond = device.getClass().getMethod("createBond", new Class[] {});
    Boolean result = (Boolean)createBond.invoke(device);
    if (!result.booleanValue()) {
        return false;
    }

    // PINコードをUTF8に変換
    Method convertPinToBytes = BluetoothDevice.class.getMethod("convertPinToBytes", new Class[] { String.class });
    byte[] pinCodes = (byte[])convertPinToBytes.invoke(BluetoothDevice.class, pinCode);

    // PINコード登録
    Method setPin = device.getClass().getMethod("setPin", new Class[] { byte[].class });
    result = (Boolean)setPin.invoke(device, pinCodes);
    if (!result.booleanValue()) {
        return false;
    }

    return true;
}

本当はこの後にBroadcastReceiverでACTION_BOND_STATE_CHANGEDをキャッチする処理が

いると思うけど・・・

しかし、なんかリフレクションでしか呼べないメソッドばっかりだなぁ。

ハマーハマー 2012/11/26 11:31 昔の記事にコメントしてしまい申し訳ありません。

Androidアプリの開発を始めて間もない者なのですが、上のexecPairingというメソッドは、どのように用いれば良いのでしょうか?
String bluetoothAddress、String pinCodeという引数がどこで生成されているものなのか、もしくはどのように定義すべきであるのかという部分でつまずいてしまい、行き詰っております。
よろしければご教授いただけないでしょうか。よろしくお願いいたします。

androiddevandroiddev 2012/11/26 11:47 この時はユーザーにペアリング作業をさせたくなかったので自動ペアリングの方法を模索していましたが、やはり非公開APIを使用するのは、将来的によくないので今はペアリングが必要な機器はAndroidの標準機能でまずペアリングを行ってもらって、アプリケーションでは単にそのデバイスにcreateRfcommSocketToServiceRecordやcreateInsecureRfcommSocketToServiceRecordなどで接続するだけに留めています。

ハマーハマー 2012/11/26 12:35 androiddev様

早速のお返事ありがとうございます。
現状ではあくまで実験用なのですが、実はすれ違い通信を実装したいと考えておりまして、そのため自動ペアリングをどうにかして機能させたいと試行錯誤しています。
現在、サンプルプロジェクトであるBluetoothChatを基に勉強していまして、そこでは、MACアドレス[String bluetoothAddress]をdoDiscovery()という関数で取得していることは分かったのですが、知識不足のため、ピンコード[String pinCode]についてどのように生成し、またどのようにexecPairing()を呼べばよいかお手上げ状態です。
今では標準APIを利用されてるandroiddev様に今さらこのようなことをお尋ねするのは申し訳ないのですが、もしこれらについて覚えていらっしゃることがありましたらアドバイスいただけませんか。何度もごめんなさい。よろしくお願いいたします。

androiddevandroiddev 2012/11/26 13:38 Android同士のSPP接続にPINコード認証って必要なのかなぁ・・・BluetoothChatのUUIDをSPP用に変更してみたらどうでしょう?

http://dietposter.b.sourceforge.jp/2011/02/17/bluetoothchat%E3%81%A7%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E6%8E%A5%E7%B6%9A%EF%BC%88spp%EF%BC%89%E3%82%92%E8%A1%8C%E3%81%86/

ハマーハマー 2012/11/26 16:16 androiddev様

ありがとうございます。
頂いたURLを参考にSPP接続に切り替えて接続を試みたのですが、同じようにペア設定リクエストのダイアログが出てしまいました(>_<)
やはり私はまだまだ知識が大量に不足していそうなので、もう少し自分なりに勉強していきたいと思います。
ご丁寧にありがとうございました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/androiddev/20110225/1298623271