Autore Topic: BluetoothSocket, read() non bloccante..  (Letto 673 volte)

Offline doctorX

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Ubuntu 10.04
BluetoothSocket, read() non bloccante..
« il: 09 Gennaio 2012, 18:10:05 CET »
0
Ciao ragazzi.. ho realizzato un applicazione bluetooth per lo scambio di informazioni tra dispositivi.
Mi trovo di fronte ad un problema:

Se l'utente prova a connettere un dispositivo bluetooth che non sta eseguendo l'applicazione,
il thread che realizza il protocollo di comunicazione rimane bloccato.

Infatti chi inizia la comunicazione (dispositivo A) invia un primo messaggio e si mette in attesa di un ack.
Se il dispositivo B non sta eseguendo l'applicazione, l'ack non verrà mai inviato,
di conseguenza il thread di comunicazione del dispositivo A rimane in attesa infinita sulla read() senza terminare.

Per risolvere il problema ho cercato di realizzare una read() non bloccante, pensando di poter
impostare un timeout di 300ms sulla socket.

L'idea era quella di bloccare la read per un tot di tempo,
allo scadere della quale controllare se fosse stato letto qualcosa.
Se l'ack viene effettivamente ricevuto, vuol dire che il dispositvo B è in ascolto, quindi il protocollo può continuare.
Se non viene letto niente, vuol dire che il dispositivo B non è in ascolto, quindi il thread può terminare e l'utente viene avvertito con un messaggio.

In tutto ciò il problema è che (da quanto ho capito io..) BluetoothSocket non mi consente di settare il timeout come accade per le socket classiche in java.

Qulacuno ha un idea??

O magari anche qualche strategia che consente al dispositivo A di capire se il dispositivo B sta eseguendo
o meno l'applicazione.

Grazie mille..

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:BluetoothSocket, read() non bloccante..
« Risposta #1 il: 09 Gennaio 2012, 18:28:48 CET »
+1
C'è qualcosa che non mi torna, perchè il solo fatto di aprire un socket e stabilire una connessione, vuol dire che l'altro dispositivo sta quanto meno eseguendo un'applicazione che attende connessioni BlueTooth. Se l'altro terminale non è un ascolto, non si instaura nemmeno il socket.

Comunque, stabilito il socket e fatto un write(), effettivamente la read() è bloccante se l'altro terminale non risponde per qualche ragione. Potresti però far partire un timer di 5 secondi in occasione della write, allo scadere del quale interrompi il thread di comunicazione se non c'è stata risposta.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline doctorX

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Ubuntu 10.04
Re:BluetoothSocket, read() non bloccante..
« Risposta #2 il: 09 Gennaio 2012, 18:53:58 CET »
0
Intanto grazie per l'interessamento  :D..

Potrebbe accadere che il dispositivo contattato è in attesa di comunicazioni bluetooth che comunque sono estranee alla mia applicazione..
Il problema l'ho rilevato facendo delle prove e, mediante delle stampe sul logcat, mi sono accorto che il thread iniziava ma non terminava..

Avevo pensato anche io ad una sleep subito dopo la write..
quindi strutturare write - sleep - read

ma non ho capito una cosa:
dopo la sleep come faccio a controllare se la read non ha letto niente se il flusso rimane bloccato sulla read stessa ??

Offline doctorX

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Ubuntu 10.04
Re:BluetoothSocket, read() non bloccante..
« Risposta #3 il: 10 Gennaio 2012, 11:40:18 CET »
0
Pensandoci un attimo l'idea era buona e la soluzione altrettanto facile..

Ho risolto inizializzando un booleano false appena prima della read(), che viene convertito a true subito dopo la read().
(quindi diventa true solo se la read legge qualcosa)

Sempre prima della read faccio partire un thread ausiliario che dorme per 2 secondi e poi va a controllare lo stato del booleano.

Se il booleano è ancora false, vuol dire che la read era rimasta bloccata, quindi cancello la socket e termino il thread..

Se il booleano è true vuol dire che la read ha letto.. quindi l'ausiliario termina senza fare niente..

Grazie per il supporto..

alla prossima.. :D