Skocz do zawartości
szagi44

komunikacja Bluetooth na android 4.4

    Rekomendowane odpowiedzi

    Witam,

    mam aplikacje która za pomocą bluetooth łączy się ze sterownikiem

    kod jest następujący:

    Method m=null;

    try {

    m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});

    } catch (NoSuchMethodException e) {

    e.printStackTrace();

    }

    try {

    tmp = (BluetoothSocket) m.invoke(device, 1);

    } catch (IllegalArgumentException e) {

    e.printStackTrace();

    } catch (IllegalAccessException e) {

    e.printStackTrace();

    } catch (InvocationTargetException e) {

    e.printStackTrace();

    }

    tmp.connect();

    i ten kod działa pięknie do androida 4.2 na androidzie 4.4 dostaje wyjątek w lini tmp.connect(); o następującej treści:

    java.io.IOException: read failed, socket might closed or timeout, read ret: -1

    Czy ktoś spotkał sie z podobnym problemem?, czy tez może jakieś wskazówki jak to rozwiązać?

    rozwiązanie poniższe działa dla androida 4.4

    try {

    tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID_INSECURE);

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    tmp.connect();

    ale tego rozwiązania nie mogę użyć ponieważ urządzenie z którym się łącze nie publikuje żadnego UUID i nie mam na to żadnego wpływu.

    Z góry dziękuje za pomoc.

    Pozdrawiam

    Robert Sadza

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    asmok

    Jeśli to ma być połączenie SPP zdefiniuj uuid jako:

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

    teoretycznie powinno działać.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    tak jak pisałem w poście nie mogę połączyć się ze sterownikiem używając createInsecureRfcommSocketToServiceRecord gdzie jako parametr podaje UUID chodzi o to aby uzyskać połączenie bez podawania UUID. Nie da się połączyć za pomocą createInsecureRfcommSocketToServiceRecord z urządzeniem które nie posiada żadnego UUID.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    asmok

    W takim razie musisz zacząć od teorii i doczytać co to właściwie jest ten UUID. Stwierdzenie że urządzenie nie posiada UUID oznacza że nie obsługuje żadnych usług. To by oznaczało że nie można się z nim połączyć w żaden sposób, czy to z podaniem uuid czy bez. Skoro się łączysz, to znaczy że urządzenie jednak coś obsługuje. Może co najwyżej nie rozgłaszać.

    W przypadku SPP u mnie działa UUID który Ci podałem. Z tym że korzystam z metody createRfcommSocketToServiceRecord (bez Insecure). Może masz problem z automatycznym parowaniem, a nie z połączeniem do usługi. To by tłumaczyło timeout i brak widoczności usług.

    Spróbuj sparować ręcznie i dopiero sparowane urządzenia połączyć metodą createRfcommSocketToServiceRecord z uuid który Ci podałem. Chyba że w ogóle nie używasz SPP tylko czego innego, wtedy uuid wylicz lub wygooglaj sam. Ogólnie za mało danych w pytaniu. Podaj przynajmniej jaką chcesz usługę (to niezbędne do wyliczenia uuid) i co to właściwie znaczy że "urządzenie nie posiada uuid". Bo prawdopodobnie okaże się że problem występuje wcześniej, już na etapie rozgłaszania i negocjacji a nie na etapie połączenia do usługi. Bo właśnie na tym etapie masz timeout i zawsze będziesz go mieć jeśli któryś z wcześniejszych etapów łączenia się nie udał.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.