13

任意に宣言されたサービス名を使用しながら、APIレベル2.3.3で2つのAndroidデバイス間に安全でないRFCOMM接続を作成する方法を知っている人はいますか?(ランダムまたは変更されるサービス名ではなく、自分で定義したサービス名のみ)

詳細

2つのAndroidデバイス(DroidX2とAsusTransformer)の間に安全でないRfcomm接続を作成しようとしています。私は、これらのデバイスの両方が、安全でないRfcommを実際に使用できるようにするために、Android2.3.3のレベルの機能を備えていると想定しています。

ここで説明するようにBluetooth接続を作成しようとすると、現在公開されているcreateInsecureRfcommSocketToServiceRecord()とlistenUsingInsecureRfcommWithServiceRecord(SERVICE、UUID)を使用して、次のレポートが表示されます。

java.io.IOException: Service discovery failed
at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:377)
at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:201)
at com.s4d.bluenomad.DeviceConnections$ClientThread.run(DeviceConnections.java:406)

通常の接続を作成している誰かがこのエラーを受け取り、リフレクションを使用してプライベートメソッドを呼び出すという関連する質問を見つけました。ただし、「安全でない」接続の開始に対応するプライベートメソッドが何であるかはわかりません。その関連する質問で提案された解決策を使用してみましたが、Androidから、デバイスをペアリングするように求められました。これは、まさに避ける必要があるものです。私は本当に安全でないアプローチが必要です。

ここで概説した公式ソリューションとハッキングされたソリューションの組み合わせも試しました

関連するコードスニペット

接続をリッスンするServerThreadの作成

Log.i(TAG, "Constructing a ServerThread");
// Use a temporary object that is later assigned to serverSocket,
// because serverSocket is final
BluetoothServerSocket tmp = null;
try {
    // MY_UUID is the app's UUID string, also used by the client code
    tmp = btAdapter.listenUsingInsecureRfcommWithServiceRecord(SERVICE_NAME, SERVICE_UUID);
    Log.i(TAG,"Started listening on insecure RFCOMM channel for service requests for: " + SERVICE_NAME);
} catch (IOException e) { }
serverSocket = tmp;

接続をリッスンするServerThread

BluetoothSocket socket;
while(true)
{
    try
    {
        socket = serverSocket.accept();
    }
    catch( IOException e)
    {
        break;
    }

    if( socket != null )
    {
        Log.i(TAG, "Received new socket connection requesting service: " + SERVICE_NAME);
    }
    else
    {
        Log.i(TAG, "Socket connection attempted, but socket received is NULL.");
    }
}

接続を開始するためのClientThreadの作成

Log.i(TAG, "Constructing a ClientThread");
BluetoothSocket tmp = null;
try {
    // MY_UUID is the app's UUID string, also used by the server code
    tmp = device.createInsecureRfcommSocketToServiceRecord(SERVICE_UUID);
    Log.i(TAG,"Created client socket on insecure RFCOMM channel for service requests for: " + SERVICE_NAME);
} 
catch (IOException e) 
{ 
    Log.i(TAG, "Failed to createInsecureRfcommSocket() against MAC: " + device.getAddress());
}
clientSocket = tmp;

サーバーに接続しているClientThread

try
{
    clientSocket.connect();
}
catch( final IOException e)
{
    DeviceConnections.this.runOnUiThread(new Runnable()
    {

        @Override
        public void run() 
        {
            console.append("Client unable to connect to service.");
            Log.i(TAG, "Client socket unable to connect() to: " + clientSocket.getRemoteDevice().getAddress());
            e.printStackTrace();
        }

    });

}

「クライアントソケットが接続できません():[MY_MAC_ADDRESS]」というログ出力が表示された後、「サービス検出に失敗しました」例外のスタックトレースが表示されます。

4

5 に答える 5

15

問題は、私が電話する前だったようです

clientSocket.connect()

私は電話する必要がありました

btAdapter.cancelDiscovery()

これはドキュメントで見たことがありますが、「パフォーマンス」の問題としてリストされていました。私の場合、これは実際には「機能」の問題だったようです。キャンセル ディスカバリ コールを追加すると、ソケット接続はすぐに機能しました。

于 2012-01-06T01:25:41.677 に答える
5

確認すべき点がいくつかあります

  • クライアントとサーバーの両方で同じ一意のUUIDを使用します。
  • BLUETOOTHの許可を得る
  • 標準のよく知られているSPPUUID00001101-0000-1000-8000-00805F9B34FBを試してください

また、クライアント側とサーバー側に完全なログを貼り付けて、APIエラーコードがあればそれを印刷できると便利です。

于 2011-12-15T16:18:52.853 に答える
3

「サービスの検出に失敗しました」とは、デバイスが他のデバイスで同じ UUID を持つサービスを見つけることができないことを意味します。

2 番目のデバイスは、1 番目のデバイスから「createInsecureRfcommSocketToServiceRecord」を呼び出そうとする前に、「listenUsingInsecureRfcommWithServiceRecord」メソッドを呼び出していません。

最初のデバイスから接続する前に、このコードが 2 番目のデバイス (onResume()、またはボタン/オプション項目のクリックなど) で実行されていることを確認してください。

 if ((mChatService != null) &&  (mBluetoothAdapter.isEnabled())) {
// Only if the state is STATE_NONE, do we know that we haven't started already
if (mChatService.getState() == BluetoothChatService.STATE_NONE) {
// Start the Bluetooth chat services
mChatService.start();
            }
        }
于 2011-12-28T07:43:51.710 に答える
0

8ce255c0-200a-11e0-ac64-0800200c9a66 を他の UUID に変更する必要があります。8ce255c0-200a-11e0-ac64-0800200c9a66 は事前定義されたサービス BluetoothChatInsecure に使用されるため、サービス名を使用できます。

于 2013-02-25T13:24:07.057 に答える