BluetoothServerSocket принимает сбой и выдает IOException

У меня есть устройство, которое поддерживает OBEX Object Push Profile, этот профиль основан на профиле последовательного порта. Я предполагаю, что я могу использовать пример Android Bluetooth Chat для подключения этого устройства к моему телефону Android. Но я столкнулся с проблемой, касающейся socket.accept() функциональность в андроид SDK. Я пытаюсь выполнить соединение моего телефона с этим устройством следующим образом:

adapter = BluetoothAdapter.getDefaultAdapter(); 
device = adapter.getRemoteDevice("00:1B:DC:0F:EC:7E");

AcceptThread = new AcceptThread(true, adapter, device);
AcceptThread.start(); 

Конструктор в AcceptThread кодируется так:

public AcceptThread(boolean secure, BluetoothAdapter adapter, BluetoothDevice device) {
    BluetoothServerSocket tmp = null;
    this.adapter = adapter;
    this.device = device;

    // Create a new listening server socket
    try {
        tmp = adapter.listenUsingInsecureRfcommWithServiceRecord(device.getName(), UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
    } catch (Exception e) {
        Log.e(TAG, ".AcceptThread # listen() failed", e);
    } 
    mmServerSocket = tmp;
}

Проблема в том, когда я пытаюсь сделать connect() как я сказал ранее

public void run() {
    BluetoothSocket socket = null;

    // Listen to the server socket if we're not connected
    while (mState != STATE_CONNECTED) {
        try {
            // This is a blocking call and will only return on a
            // successful connection or an exception
            Log.d(TAG, "AcceptThread.run: accepting server socket connection");

            socket = mmServerSocket.accept(20000); 

            Log.d(TAG, ".AcceptThread.run # server socket connection accepted");
        } catch (Exception e) {
            Log.e(TAG, ".run # accept() failed: "+e);
            break;
        }
    }
}

Как вы можете видеть, ServerSocket принимает каждое входящее соединение для 20 seconds или же 20000 ms. Когда время истечет, приложение выдаст IOException, как это

07-11 10:30:08.355: E/SIMPLECONNECT(1301): .run # accept() failed: java.io.IOException: Connection timed out

который говорит мне, что мое устройство не может подключиться к моему телефону Android. Устройство не имеет кнопки подключения на дисплее, просто функция отправки, которая отправит файл на мой телефон. Я считаю, что эта функция отправки также делает подключение в фоновом режиме, но я не уверен.

Кто-нибудь может определить какие-либо решения для меня? Я запускаю свое приложение на Samsung Galaxy SIII с Android 4.0.4

1 ответ

Я наконец-то решил, проблема в том, что разные версии Android и разные устройства, похоже, нуждаются в разных сокетах. Я попробовал это с Samsung Galaxy XCOVER, Tab1, Tab2, Nexus, Note, Motorola Defy и HTC Flyer. Сокеты, которые я использовал:

A:

Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
mSocket = (BluetoothSocket) m.invoke(mmDevice, Integer.valueOf(1));

B:

Method m = mmDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[]{int.class});
mSocket=(BluetoothSocket)m.invoke(mmDevice,Integer.valueOf(1));

C:

mSocket=BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mmDevice.getAddress()).createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

Android 4.0.x работает на Nexus, Flyer,Tab1 с A,B Android 4.0.3 работает на Tab2 с B Android 3,6,x работает на DEFY с A,B Android 2.3.6 работает на XCOVER с C

Я не могу найти решение, которое работает для всех устройств, и я не могу определить, будет ли работать ведьма-сокет до того, как я создаю и использую Socket, особенно XCOVER выполняет connect() для всех сокетов без исключения, но поймать, если я попробую tro write(). Так что, если вы хотите установить подключение bloothoh, которое работает для всех устройств, вам нужно создать сокеты, подключить запись и затем запомнить сокет, который работает (например, в настройках)

Другие вопросы по тегам