«Ошибка обнаружения службы» от Android Bluetooth. Небезопасный Rfcomm

Кто-нибудь знает, как создать небезопасное соединение RFCOMM между двумя устройствами Android на уровне API 2.3.3, используя произвольно объявленное имя службы? (не случайно) или изменение имени службы, просто имя службы, которое я определяю сам)

Подробности

Я пытаюсь создать небезопасное Rfcomm-соединение между двумя устройствами Android: Droid X2 и Asus Transformer. Я предполагаю, что оба этих устройства имеют функциональность на уровне Android 2.3.3, чтобы фактически получить возможность использовать небезопасный Rfcomm.

Когда я пытаюсь создать соединение Bluetooth, как описано здесь , используя теперь общедоступные createInsecureRfcommSocketToServiceRecord () и listenUsingInsecureRfcommWithServiceRecord (СЕРВИС, 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)

Я обнаружил связанный вопрос , где кто-то, создающий нормальное соединение, получал эту ошибку и использовал отражение для вызова частного метода. Однако я понятия не имею какая цена vate теперь будет соответствовать инициированию "небезопасного" соединения. Я попытался использовать решение, предложенное в этом связанном вопросе, но 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 Listening для подключений

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]», затем я получаю трассировку стека для исключения «Ошибка обнаружения службы».

13
задан Community 23 May 2017 в 12:26
поделиться