任意に宣言されたサービス名を使用しながら、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]」というログ出力が表示された後、「サービス検出に失敗しました」例外のスタックトレースが表示されます。