2014-07-04 4 views
6

Sto cercando di stabilire una connessione tra un dispositivo Android e un lettore bluetooth RFID. Per fare questo uso il codice della chat bluetooth (bluetooth chat example). Ma quando faccio mmSocket.connect(); alla riga 329 dell'esempio della chat Bluetooth, la connessione genera ogni volta un java.io.IOException. Ho provato anche questo metodo per ottenere la presa:Android bluetooth socket.connect() non riesce

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

ma niente. Ho provato con 3 dispositivi di differenza. Il primo, un Samung S2 in esecuzione 4.4.2 Android darmi questo errore:

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

Con un tablet con sistema operativo Android 4.0.3 darmi questo errore:

IOException: Connection refused 

La curiosità è che se provo per connettere il mio telefono al mio tablet non riesco. Ma se eseguo in 2 dispositivi questa applicazione, e con uno provo a collegare il secondo, mentre il secondo è alla ricerca di alcuni dispositivi per la connessione, la connessione è riuscita. Ma solo se il secondo dispositivo sta eseguendo questa applicazione e sta cercando alcuni dispositivi da connettere. Ho provato anche a disaccoppiare ma niente. Infine volevo dire che se provo a connettere i 2 dispositivi o un dispositivo con il mio lettore bluetooth rfid attraverso le impostazioni, la connessione è riuscita. E infine volevo dire che quando sto provando a collegare i 2 dispositivi o il dispositivo con il lettore rfid, se i dispositivi non sono accoppiati, confronta una finestra di dialogo che mi chiede di accoppiare il dispositivo 2 ma dopo questo la connessione non è riuscita .

risposta

0

Ho avuto lo stesso problema. È facile da risolvere. Devi configurare il tuo lettore RFID al protocollo SPP con il suo programma di configurazione e dopo questo funzionerà.

+0

Thaks molto !! Questo lavoro!! – user3805317

+4

Potrebbe chiarire la soluzione? – nAkhmedov

4

Il codice presuppone una connessione BT sicura e tenta in due modi diversi (il che è positivo). Il primo test è necessario per tentare è insicuro connessione BT utilizzando questi metodi:

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); 


Se questo non risolve il problema si dovrebbe prob. passare al controllo della correttezza della uuid che si passa al metodo di creazione. Probabilmente si sta utilizzando l'UUID predefinito SPP (?):

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

questo funziona su molti dispositivi, ma non su tutti.


Provare a interrogare il vostro peer per la lista delle UUID supporta:

// 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); 
} 

E, se non vuoto, utilizzare il primo in array come parametro al metodo di creazione.

Puoi anche usare BTWiz, scritto da te, che fa tutto ciò che per te in un modello trasparente e supporta anche Bluetooth IO asincrono.

1

Ho avuto anche questo problema, ho provato tutto ciò che è stato detto in questo post, ma non ha funzionato per me. Ho finalmente avuto modo di sistemarlo. mio codice errato utilizzato un BluetoothAdapter variabile di classe per verificare se il bluetooth era accesa, in questo modo:

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

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

}

ho avuto presa bt collegare fallisce tutto il tempo. Ma ho usato un metodo privato per attivare il Bluetooth, e il problema del socket è scomparso.

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.... 
} 

Perché ?? Non ne ho idea, ho appena lavorato per me !!!!

+0

Grazie, non so perché, ma riattivando il bluetooth, risolto questo problema – Bhupinder

0

A volte la connessione di comando nel client Bluetooth al server Bluetooth non funziona. Potrebbe essere un errore in un driver o un errore nel modulo Bluetooth, o un errore nella libreria implementa il Bluetooth in Java. Per me solo aiuta a spegnere e quindi attivare il Bluetooth, quindi una connessione inizia a funzionare normalmente.