7

2つのAndroidデバイスをBluetooth経由で接続する際に問題が発生しています。私はサーバーとクライアントの両方を実行しています。既にペアリングされているデバイスとAndroid Bluetooth accept()/ connect()

  1. チェック、各種のBluetoothのステータス(使用可能なアダプタ、有効になっている、など):ここで

    は、サーバー側で、物事の順序です。
  2. 私が選んだあらかじめ定義されたUUIDでlistenUsingRfcommWithServiceRecord()を呼び出します。
  3. デバイスを発見可能にする要求
  4. 私はaccept()を呼び出して着信接続を待つため、非同期でディスカバリが発生するためです。

クライアント側:

  1. チェック、各種のBluetoothステータス(利用可能なアダプタなど、有効になっています)。
  2. getBondedDevices()のデバイスごとに、getName()とサーバーの名前を比較します。一致する場合は、手順6に進みます。
  3. 開始BT検出
  4. 検出された各デバイス(2aのペアデバイスはここに表示されません)に、デバイス名とサーバー名を比較します。一致するものがある場合は、手順6に進みます。
  5. 検出をキャンセルします。
  6. 手順2で検出されたデバイス上で、サーバー側で使用されたのと同じ定義済みのUUIDでcreateRfcommSocketToServiceRecord()を呼び出します。
  7. connect()を呼び出し、接続されたソケットを返すのを待ちます。

上記のプロセスは、クライアントとサーバーが以前にペア設定されていない場合には問題なく動作します。しかし、Androidがデバイスリストに登録した後、必然的にconnect()/ accept()ステージでタイムアウトになります。

私は今、数日のためのソリューションを探していると、この1を含むかなりの数のことを試してみました: Connecting to a already paired Bluetooth device

反射法はどちらか私のために動作しません。 connect()はすぐに戻りますが、getOutputStream()を試行したときに例外が発生します。 accept()側では、誰かが接続しようとしたことを登録していません。私は真剣に彼らが以前にペア設定されている接続を確立するためにデバイスを取得する上でいくつかの助けやポインタが必要です。ここで

はデバイスに関するいくつかの情報は次のとおりです。

  • 私は2台のLG G2Xの携帯電話上のサーバーとクライアントをテストしています。
  • 両方ともAPIレベル10に対応するAndroid 2.3.3で動作します。
  • 上記の設定は、手動で設定を解除した後も機能します。

ありがとうございます。私はAndroidとBluetoothの2週間ぐらいです。欠落している手順やベストプラクティスがある場合は、それらも指摘してください。

答えて

6

クライアントでは、ボンディングされたデバイスに接続しようとしたときに、私はBluetoothAdapter.getBondedDevices()にあるBluetoothDeviceで単にそのデバイスを呼び出しました。これは動作しません。

が適切にBluetooth接続を確立するために、私は以下の擬似コードに似た何かをしなければならなかった:Bluetooth Chat Service

BluetoothDevice bonded = a device from BluetoothAdapter.getBondedDevices(); 
BluetoothDevice actual = BluetoothAdapter.getRemoteDevice(bonded.getAddress()); 

BluetoothSocket socket = actual.createRfcommSocketToServiceRecord(SOME_UUID); 
socket.connect(); 

私は正確にBluetoothのチャットの例に従うことによって、この答えに到着しました。なぜデバイス上で動作しないのですか?getBondedDevices()は私の外です。たぶん、Androidのより親密な知識を持つ誰かがそれに答えることができます。

+0

getRemoteDeviceはあなたが常に – raja

+1

それを呼び出しているかの静的メソッドではない(ほとんど?)あなたのBluetoothAdapterとしてBluetoothAdapter.getDefaultAdapter()を使用します。上記は擬似コードなので、単純にコピー&ペーストすることはできません。 –

+0

素晴らしい投稿ですが、これは実際には意味があります。デバイスがリファレンスであり、古くなるからです。アダプターは常に更新されます。 – Cookster

0
private static BluetoothSocket mSocket; 
BluetoothDevice selectDevice = null; 

void connectDevice(){ 
    if(mSocket == null) { 
     //Log.d(TAG, "Socket is null"); 
     UUID SPP_UUID = UUID 
       .fromString("8ce255c0-200a-11e0-ac64-0800200c9a66"); 
     Set<BluetoothDevice> bondedDevices = BluetoothAdapter 
       .getDefaultAdapter().getBondedDevices(); 
     //Log.d(TAG, "Size: " + bondedDevices.size()); 
     /** 
     * Select your divice form paired devices 
     */ 
     for (BluetoothDevice bluetoothDevice : bondedDevices) { 
      selectDevice = bluetoothDevice; 
      //Log.d(TAG, bluetoothDevice.getName()+" "+bluetoothDevice.getAddress()); 
     } 

     if(selectDevice.getBondState() == selectDevice.BOND_BONDED) { 
      //Log.d(TAG, selectDevice.getName()); 
      try { 
       mSocket = selectDevice.createInsecureRfcommSocketToServiceRecord(SPP_UUID); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       //Log.d(TAG, "socket not created"); 
       e1.printStackTrace(); 
      } 
      try { 
       mSocket.connect(); 
      } catch (IOException e) { 
       try { 
        mSocket.close(); 
        //Log.d(TAG, "Cannot connect"); 
       } catch (IOException e1) { 
        //Log.d(TAG, "Socket not closed"); 
        e1.printStackTrace(); 
       } 
      } 
    } 
関連する問題