2017-01-20 6 views
0

Я пытаюсь создать соединение между Android-смартфоном (клиентом) с Bluetooth приложение (сервер), запущенное на ПК.Ошибка соединения с Bluetooth-сервером с сервером Bluetooth-ПК «ava.io.IOException: чтение не удалось, сокет может быть закрыт или таймаут, прочитать ret: -1»

Ниже приведен фрагмент кода для клиента

private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 

    private class ConnectThread extends Thread { 
    private BluetoothSocket mmSocket; 
    private final BluetoothDevice mmDevice; 

    public ConnectThread(BluetoothDevice device) { 
     mmDevice = device; 
     BluetoothSocket tmp = null; 

     try { 
      //tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 
      tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID); 

     } catch (IOException e) { 
      Log.d(TAG, "create() failed", e); 
      e.printStackTrace(); 
     } 
     mmSocket = tmp; 
    } 


    public void run() { 
     mAdapter.cancelDiscovery(); 

     try { 

      mmSocket.connect(); 
     } 

     catch (IOException e) { 
     //Exception caught 
     //java.io.IOException: read failed, socket might closed or timeout,  read ret: -1 
     ... 
     } 
     ... 
    } 

Ниже приведен код сервера (Использует BlueCover баночку)

собственной недействительным waitForConnection() { LocalDevice локальный = NULL;

StreamConnectionNotifier notifier; 
    StreamConnection connection = null; 

    try { 
     local = LocalDevice.getLocalDevice(); 
     local.setDiscoverable(DiscoveryAgent.GIAC); 
     String uuidstr = "00001101-0000-1000-8000-00805F9B34FB"; 
     String uuid_wo_space = uuidstr.replaceAll("-", "");  

     String url = "btspp://localhost:" + uuid_wo_space + ";authenticate=false;encrypt=false;name=RemoteBluetooth"; 
     notifier = (StreamConnectionNotifier) Connector.open(url); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
     return; 
    } 

    // waiting for connection 
    while(true) { 
     try { 
      connection = notifier.acceptAndOpen(); 
      Thread processThread = new Thread(new ProcessConnectionThread(connection)); 
      processThread.start(); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
      return; 
     } 
    } 

Я прочитал несколько ссылок, предполагающие изменить UUID на «00001101-0000-1000-8000-00805F9B34FB», который я уже пробовал. Я также попытался создать небезопасный сокет, используя createInsecureRfcommSocketToServiceRecord, который по-прежнему терпит неудачу с тем же результатом.

Ниже стек IOException след

java.io.IOException: read failed, socket might closed or timeout, read ret: -1 
at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:900) 
at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:912) 
at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:531) 
+0

Когда я проверить BluetoothSocket.java, я вижу способ подключения после открытия сокета пытается прочитать значение канала из входного потока, который в моем случае неисправный. Не уверен, что это за значение канала и почему он не подходит для меня. Любые предложения по этому вопросу будут полезны. – Sumeet

ответ

1

Извините за то, что написал новый ответ, но таким образом информация более заметна, чем ответ. Вот пример список уникальных идентификаторов для моего устройства:

UUID: 0000xxxx-0000-1000-8000-00805f9b34fb   

i xxxx Status Mode 
0 110a N.A.  
1 1105 Connected Serial Port Protocol (SPP) 
2 1106 Connected File transfer (FTP) 
3 1116 N.A.  
4 112d Connected Remote SIM mode 
5 112f Connected Phone book request 
6 1112 Connected 
7 111f Connected 
8 1132 Connected Message access request 
+0

Спасибо, позвольте мне попробовать его на другом ПК. Я опубликую результаты в ближайшее время. – Sumeet

+0

Я попробовал это на другом ПК на этот раз, получил те же результаты. Устройство не может подключиться (IOException), а доступные UUID равны нулю, поэтому он не может перечислить UUID. Я что-то не так с серверным компонентом, можете ли вы просмотреть эту часть? Кроме того, когда я проверяю BluetoothSocket.java, я вижу способ подключения после открытия сокета, пытается прочитать значение канала из входного потока, который в моем случае не работает. Не уверен, что это за значение канала и почему он не подходит для меня. – Sumeet

+0

Упрощение голосования и принятие этого в качестве ответа, поскольку я понял, что это правильный подход для подключения к UUID в случае сбоя подключения сокета. Также, моя проблема действительно оказалась проблемой инфраструктуры (на обоих компьютерах, которые я пробовал). Я удалил и переустановил драйверы Broadcom BCM2070, и соединение было установлено! Спасибо за помощь. – Sumeet

0

Есть обычно множество уникальных идентификаторов, которые обозначают различные режимы работы, как File Transfer (FTP), Remote SIM, запрос телефонной книги и т.д.

You может запросить и попробовать все UUID, на интерфейсе, как это:

device = (from bd in adapter.BondedDevices 
      where bd.Name == "YourDeviceName" 
      select bd).FirstOrDefault(); 

Android.OS.ParcelUuid[] parcel = device.GetUuids(); 

for (int i = 0; i < parcel.Length; i++) { 
    socket = device.CreateRfcommSocketToServiceRecord(parcel[i].Uuid); 
    try { 
     socket.Connect(); 
     break; 
    } 
    catch { 
     throw new Exception("Unsupported UUID"); 
    } 
} 

Также убедитесь, что никакое другое устройство не подключено к ПК/Android и иметь открытый сокет, потому что только один разъем может обслуживаться одновременно. Вы можете иметь столько пар, сколько хотите, но только один сокет.

+0

Спасибо за быстрый поворот. Я уже пробовал использовать device.GetUuids(), в моем случае он возвращает null. Кроме того, на ПК и телефоне нет открытого сокета. – Sumeet

+0

Когда я проверяю код для BluetoothSocket.Java, я вижу, что здесь не работает код (не удается прочитать значение канала из входного потока в методе connect(). private int readAll (InputStream is, byte [] b) throws IOException { int left = b.length; while (left> 0) { int ret = is.read (b, b.length - left, left); if (ret <= 0) throw new IOException ("read не удалось, сокет может быть закрыт или таймаут, read ret: « + ret); ... } – Sumeet

+0

@Sumeet Если UUID не возвращается из' device.GetUuids() ', у вас может быть сбой интерфейса. может попробовать запустить тот же код на другом устройстве. Я видел устройства с изворотливым BT интерфейсы раньше. На одном устройстве, в частности, отвечал конкретный UUID, необходимый для протокола последовательного порта (SPP), но он не смог установить сокет. – NikosD