Buongiorno a tutti,
sto impazzendo ancora con la gestione udp,
cioe' mi arrivano i dati correttamente, ma non so quando ho finito di ricevere tutti i dati,
come si fa a sapere si i dati sono arrivati tutti?
mi spiego, invio una stringa tramite udp, e poi il device mi risponde con un'altra stringa di lunghezzza variabile a cui non so mai quale sia la lunghezza,
per cui arrivano i dati tramite UDP_PacketArrived a Pacchetti,
io dovrei elaborare la stringa solo dopo averla ricevuta tutta, ma non so mai quando ha finito di ricevere tutta la stringa.
Ecco il codice che utilizzo
l'unico modo che ho trovato e' mettere un timeout fisso, ma cosi devo aspettare la fine del timeout , anche se i dati sono arrivati prima,
oppure se la stringa e' molto lunga devo prevedere un timeout piu lungo,
non esiste un metodo per verificare lo stato di UDP_PacketArrived, se ho finito, ritorno una variabile true?
ecco il metodo che ho utilizzato ma che non mi sembra professionale:
sto impazzendo ancora con la gestione udp,
cioe' mi arrivano i dati correttamente, ma non so quando ho finito di ricevere tutti i dati,
come si fa a sapere si i dati sono arrivati tutti?
mi spiego, invio una stringa tramite udp, e poi il device mi risponde con un'altra stringa di lunghezzza variabile a cui non so mai quale sia la lunghezza,
per cui arrivano i dati tramite UDP_PacketArrived a Pacchetti,
io dovrei elaborare la stringa solo dopo averla ricevuta tutta, ma non so mai quando ha finito di ricevere tutta la stringa.
Ecco il codice che utilizzo
B4X:
Sub Process_Globals
Dim UDPSocket1 As UDPSocket
End Sub
Sub Globals
Private LETTURA As String
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("vmain")
Activity.Title = "UDP"
LETTURA=""
UDPSocket1.Initialize("UDP", 9000, 1024)
UDP_Send(UDPSocket1, "testo", 192.168.1.10, 9000)
' qui dovrei elaborare i dati ricevuti e contenuti nella variavbile lettura
' ma trovo solo gli ultimi byte, come facci a sapere quando ha finito di ricevere i dati
' la sub UDP_PacketArrived (Packet As UDPPacket)'
log(LETTURA.Length)
End Sub
Sub UDP_PacketArrived (Packet As UDPPacket)
Dim msg As String = BytesToString(Packet.Data, Packet.Offset, Packet.Length, "UTF8")
LETTURA=LETTURA & msg
End Sub
Sub UDP_Send(socketa As UDPSocket, command As String, ipaddress As String, port As String)
Dim Packet As UDPPacket
Dim data() As Byte
data = command.GetBytes("UTF8")
Dim myIp As String =UDPSocket1.GetBroadcastAddress
Packet.Initialize(data, myIp, port)
socketa.Send(Packet)
End Sub
l'unico modo che ho trovato e' mettere un timeout fisso, ma cosi devo aspettare la fine del timeout , anche se i dati sono arrivati prima,
oppure se la stringa e' molto lunga devo prevedere un timeout piu lungo,
non esiste un metodo per verificare lo stato di UDP_PacketArrived, se ho finito, ritorno una variabile true?
ecco il metodo che ho utilizzato ma che non mi sembra professionale:
B4X:
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("vmain")
Activity.Title = "UDP"
LETTURA=""
UDPSocket1.Initialize("UDP", 9000, 1024)
UDP_Send(UDPSocket1, "testo", 192.168.1.10, 9000)
Wait For (Attesa(1000)) Complete (Success As Boolean)
log(LETTURA.Length)
End Sub
Sub Attesa (Timeout As Int) As ResumableSub
Do While Timeout > 0
Sleep(100)
Timeout = Timeout - 100
Loop
Return True
End Sub