2014-07-04 15 views
6

Próbuję połączyć urządzenie z Androidem i bluetooth czytnika RFID. W tym celu korzystam z kodu czatu bluetooth (bluetooth chat example). Ale kiedy wykonuję mmSocket.connect(); w wierszu 329 przykładu czatu bluetooth, połączenie generuje za każdym razem java.io.IOException. Próbowałem również tej metody, aby uzyskać gniazdo:Android bluetooth socket.connect() zawiedzie

tmp = mDevice.createRfcommSocketToServiceRecord(MY_UUID); 
Method m = mDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
tmp = (BluetoothSocket) m.invoke(mDevice, 1); 

, ale nic. Próbowałem z 3 urządzeniami różnicowymi. Pierwszy, o Samung S2 z Androidem 4.4.2 dać mi ten błąd:

failed:read failed, socket might closed, read ret: -1 

Z tabletem z Androidem 4.0.3 dać mi ten błąd:

IOException: Connection refused 

Ciekawostką jest to, że gdy próbuję aby połączyć telefon z tabletem, nie udało mi się. Ale jeśli uruchomię na 2 urządzeniach tę aplikację, a jedną spróbuję połączyć drugą, podczas gdy druga będzie szukała niektórych urządzeń do połączenia, połączenie się powiedzie. Ale tylko wtedy, gdy drugie urządzenie uruchamia tę aplikację i szuka niektórych urządzeń do połączenia. Próbowałem też sparować, ale nic. W końcu chciałem powiedzieć, że jeśli spróbuję połączyć 2 urządzenia lub jedno urządzenie z moim czytnikiem rfid bluetooth przez ustawienia, połączenie się powiodło. I na koniec chciałem powiedzieć, że gdy próbuję połączyć 2 urządzenia lub urządzenie z czytnikiem rfid, jeśli urządzenia nie są sparowane, porównaj okno dialogowe, które poprosi mnie o sparowanie 2 urządzenia, ale po tym nieudanym połączeniu .

Odpowiedz

0

Miałem ten sam problem. Łatwo to rozwiązać. Musisz skonfigurować czytnik RFID na protokół SPP z jego programem konfiguracyjnym, a po tym zadziała.

+0

Thaks dużo !! Ta praca!! – user3805317

+4

Czy mógłbyś wyjaśnić rozwiązanie? – nAkhmedov

4

Twój kod zakłada bezpieczne połączenie BT i próbuje na dwa różne sposoby (co jest dobre). Pierwszy test trzeba próbować to niezabezpieczone połączenie BT pomocą tych metod:

BluetoothSocket sock; 

// open API 
sock = device.createInsecureRfcommSocketToServiceRecord(serviceUuid); 

// if failed: hidden API 
createMethod = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] { int.class }); 
sock = (BluetoothSocket)createMethod.invoke(device, 1); 


Jeśli to nie rozwiąże problemu należy prob. przejdź do sprawdzania poprawności z uuid przechodzisz do metody tworzenia. Jesteś prawdopodobnie używając domyślny SPP UUID (?):

UUID DEFAULT_SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 

To działa na wielu urządzeniach, ale nie na wszystkich.


Spróbuj przesłuchać swoją porównawczą dla listy UUID to obsługuje:

// for apiVer >= 15 
supportedUuids = device.getUuids(); 


// for apiVer < 15 
try { 
    Class cl = Class.forName("android.bluetooth.BluetoothDevice"); 
    Class[] params = {}; 
    Method method = cl.getMethod("getUuids", params); 
    Object[] args = {}; 
    supportedUuids = (ParcelUuid[])method.invoke(device, args); 
} 
catch (Exception e) { 
    // no op 
    Log.e("uuids", "Activation of getUuids() via reflection failed: " + e); 
} 

A jeśli nie jest pusta, należy po pierwsze w tablicy jako parametr do metody tworzenia.

Możesz również użyć BTWiz, napisanego przez Ciebie naprawdę, który robi to wszystko dla ciebie w przezroczystym modelu przewracania, a także obsługuje asynchroniczną technologię Bluetooth IO.

1

Ja też miałem ten problem, próbowałem wszystkiego, co zostało powiedziane w tym poście, ale nic nie działało dla mnie. W końcu muszę to naprawić. Moja niewłaściwy kod używany do klasy zmiennej BluetoothAdapter aby sprawdzić, czy bluetooth było na coś takiego:

public class PrintClass extends Activity { 
private XXXX myClassVar; 
private BluetoothAdapter bluetooth; // created and checked in other method 

... other methods in my class.... 

}

mam gniazdo bt połączyć nie cały czas. Ale użyłem prywatnej metody aktywacji Bluetooth, a problem z gniazdem zniknął.

public class PrintClass extends Activity { 

private XXXX myClassVar; 

private void turnBlueToothOn(){ 

    try { 
     BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); 
     if(!bluetooth.isEnabled()){ 
      bluetooth.enable(); 
     } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
....other methods in my class.... 
} 

Dlaczego ?? Nie mam pojęcia, po prostu pracował dla mnie !!!!

+0

Dzięki, nie wiem dlaczego, ale ponownie włączam bluetooth, naprawiłem ten problem – Bhupinder

0

Czasami połączenie polecenia w kliencie Bluetooth do serwera Bluetooth nie działa. Może to być błąd sterownika lub błąd w module Bluetooth lub błąd w bibliotece implementuje Bluetooth w Javie. U mnie pomaga tylko wyłączyć, a następnie włączyć Bluetooth, a połączenie zacznie działać normalnie.