Italian Invio dati tramite TCP...

stefanoxjx

Active Member
Licensed User
Longtime User
Ciao a tutti, rieccomi :D
Ho trovato 5 minuti per fare delle prove con B4A in preparazione di un lavoro che vorrei fare, ma come al solito ho bisogno del vostro aiuto.
Vorrei semplicemente e banalmente inviare dei dati tramite TCP.
Ho buttato giù una bozza veloce di programma che però funziona in parte:

B4X:
sub Globals
   Dim TxWrite As TextWriter
   Dim Socket1 As Socket
End Sub

Sub btnChiudi_Down
   Socket1.Initialize("Socket1")
   Socket1.Connect("192.168.0.53",8888,5000)
   TxWrite.Initialize(Socket1.OutputStream)
   TxWrite.WriteLine("1234")
   Label2.Text="CHIUSO"
End Sub

La cosa in se dovrebbe essere abbastanza banale, quando clicco sul pulsante "btnChiudi" dovrebbe aprire
una connessione con 192.168.0.53 sulla porta 8888 ed inviare una stringa (1234).
La cosa funziona in parte, cioè nel device vedo che arriva una connessione, però poi l'app mi da questo
errore "An error has occured in sub: java.lang.Exception: Sub socket1_connected was nont found" e la stringa 1234 non arriva a destinazione.
Se però la stessa operazione verso 192.168.0.53 la faccio con telnet funziona tutto regolarmente.
Cosa ho sbagliato secondo voi?

Grazie.
Ciao.
 

udg

Expert
Licensed User
Longtime User
Te lo dice l'errore..ovvero manca la sub Socket1_Connected.
Dai un'occhiata alla definizione dell'oggetto socket qui.
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Semplicemente aggiungi il codice

B4X:
Sub socket1_connected (stato As Boolean)
#dosomething
end sub
 

stefanoxjx

Active Member
Licensed User
Longtime User
Grazie a tutti e due delle risposte.
Ho aggiunto il codice consigliato da imgsimonebiliato ma poi è uscito un'altro errore.
Ho detto vabbè, mi guardo le definizioni dell'oggetto e stavolta risolvo da solo, ma questo non c'è sulle definizioni :(

B4X:
An error has occured in sub: java.net.SocketException: Socket is not connected

Comunque ho risolto lo stesso.
Ho pensato che probabilmente il socket non faceva in tempo ad essere creato correttamente prima che venisse eseguita l'istruzione che creava l'errore

B4X:
TxWrite.Initialize(Socket1.OutputStream)

e così infatti era.
Ho aggiunto un delay ed ora l'errore non appare più.
Purtroppo però dall'altra parte non mi arriva l'1234 :(
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Bene bravo stefanoxjx.. Peri grazie, ci sono i like! :D
 

stefanoxjx

Active Member
Licensed User
Longtime User
Scusami, non ci avevo fatto caso.
Non sono abituato a questa nuova diavoleria dei Like :)
Sono abituato a ringraziare di persona ;)
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Eh si, magari anche con una birra :D...
 

stefanoxjx

Active Member
Licensed User
Longtime User
E perchè no?
In base al tuo cognome penso che potresti anche essere dalle mie parti.
Altrimenti ti offro una birra virtuale :D
 

coslad

Well-Known Member
Licensed User
Longtime User
Stefano stai però attento che se la connessione cade non verrai avvisato , ti consiglio di inserire un "watchdog" che controlli periodicamente la vitalità della connessione e poi magari di utilizzare l'oggetto astreams che non fa male .
Ciao
 

giannimaione

Well-Known Member
Licensed User
Longtime User
ciao stefanoxjx,

"inviare dati tramite TCP" ..... e poi dici "con Telnet funziona tutto regolarmente"
Mi spieghi chi invia i dati (un dispositivo android?) e chi li riceve ?
Telnet? mi interessa! mi spieghi qualcosa in merito?

grazie
 

stefanoxjx

Active Member
Licensed User
Longtime User
@coslad: Ti ringrazio per la puntualizzazione, effettivamente avevo già in mente di aggiungere dei controlli, ma intanto mi interessava capire se la cosa funzionava e come.
Tra le altre cose, mi sembra di aver capito che la funzione:
B4X:
Sub socket1_connected (stato AsBoolean)
end sub
viene richiamata ogni volta che lo stato della connessione cambia.
Devo verificare se è così, però se ho ragione basterebbe mettere una variabile boolean che cambia stato ogni volta che questa funzione viene richiamata.

@giannimaione: Ciao Gianni, allora i dati li invia (al momento ma poi li riceverà anche) il dispositivo android e li riceve (al momento ma poi ne trasmetterà anche) un modulo wifi collegato ad un microcontrollore.
Per l'esattezza il modulo è l'ESP8266.
Ho parlato di telnet perchè i primi esperimenti di comunicazione con il modulo li ho fatti tramite telnet e una volta visto come funzionava la cosa ho buttato giù due righe di codice per farlo fare al dispositivo android.
Ora, l'unica cosa che mi può fermare è solo la mancanza di fantasia :D
 

coslad

Well-Known Member
Licensed User
Longtime User
Cambia di stato se la connessione viene chiusa secondo le regole , ma se la connessine cade perché la linea è disturbata nessuno ti avverte
 

coslad

Well-Known Member
Licensed User
Longtime User
Se la connessione è fra due o poco più dispositivi puoi scrivere tranquillamente delle procedure per svegliare le comunicazioni, se i dispositivi aumentano e/o di mezzo c'è internet allora dovresti pensare a qualcosa tipo mqtt
 

stefanoxjx

Active Member
Licensed User
Longtime User
MQTT sta per?
Comunque, per la prima app il problema si pone in maniera marginale, perchè funzionerà banalmente così:

- Apertura connessione
- Invio codice (2-3 byte massimo)
- Ricezione conferma (2-3 byte massimo)
- Chiusura connessione

Comunque un minimo di controllo dovrò implementarlo lo tesso.
 

coslad

Well-Known Member
Licensed User
Longtime User
Trovi la libreria per la gestione dei messaggi mqtt nella sezione delle librerie.
 
Top