German Brauche Hilfe bei UDP-Kommunikation

juergen_pool

Member
Licensed User
Longtime User
Hallo zusammen,

ich habe ein VB.NET-Programm unter Windows 7, eine Jukebox mit Touchscreenbedienung. Diese sendet per UDP/Broadcast aktuelle Statusinformationen (laufernder Titel, nächster Titel) in's LAN. Über einen Thread im Hintergrund empfängt sie Kommandos (Skip, Pause, neuer Titel für Playlist). So kann ich von beliebigen Clients über UDP die Statusmeldungen empfangen und Kommandos an die Jukebox absetzen. Das funktioniert hervorragend. Nun möchte ich das auch von meine Archos-Tablett können, den B4A unterstützt ja jetzt auch UDP. Für einen ersten Test habe ich mir das Beispiel aus der "Doku zu Network 1.10" unter UDPSockets genommen, nur die Ports angepasst. Leider bekomme ich es aber nicht hin. Weder empfange ich irgendwelche Statusmeldungen noch werden meine Kommandos von der Jukebox empfangen.

Vorher hatte ich das schon über TCP realisiert, das funktionierte auch unter B4A einwandfrei. Ich möchte aber zu UDP wechseln, da ich mir dann das Verwalten der An- und Abmeldungen von Clients sparen kann.

Die Beispiele, die ich bisher für B4A/UDP gefunden habe, arbeiten alle mit festen IP-Adressen für die Gegenseite, das ist bei mir ja nicht der Fall (auch die IP der Jukebox kann sich von mal zu mal ändern).

Kann mir jemand ein paar Tipp's geben? Oder geht das unter B4A nur mit festen IP's?
 

chris

New Member
Licensed User
Longtime User
Hallo

Also Broadcast senden geht bei mir:


B4X:
'Activity module
Sub Process_Globals
   'These global variables will be declared once when the application starts.
   'These variables can be accessed from all modules.
   Dim UDPSocket1 As UDPSocket
End Sub

Sub Globals
   'These global variables will be redeclared each time the activity is created.
   'These variables can only be accessed from this module.

End Sub

Sub Activity_Create(FirstTime As Boolean)
   Activity.LoadLayout("Layout1")
    If FirstTime Then
        UDPSocket1.Initialize("UDP", 0, 8000)
    End If
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub UDP_PacketArrived (Packet As UDPPacket)

End Sub 

Sub Button1_Click
    Dim Packet As UDPPacket
    Dim data(8) As Byte
   data(0) = Rnd(1, 255)
   data(1) = 42
   data(2) = 77
   data(3) = 55
   data(4) = 33
   data(5) = 1
   data(6) = 2
   data(7) = 3
    'Packet.Initialize(data, "192.168.2.255", 6666)
   Packet.Initialize(data, "255.255.255.255", 6666)
    UDPSocket1.Send(Packet)
End Sub
 
Last edited:

juergen_pool

Member
Licensed User
Longtime User
Helbe Miete...

Hallo Chris,

tatsächlich kann ich "Broadcasten", wenn ich Deinen Source verwende. Allerdings ist mir nicht klar, warum es bei mir nicht funktioniert hat. Im Unterschied zu deiner Variante habe ich in Activity_Create allerdings nur einmal beim Start gesendet, zu früh?

Empfangen kann ich aber immer noch keine Packete, die vom PC per Broadcast gesendet werden. UDP_PacketArrived wird nie aufgerufen, keine Ahnung, warum. Aber trotzdem Danke, immerhin kann ich jetzt schon Steuerungskommandos absetzen. Mir fehlt jetzt nur noch die Info zum laufenden und nächsten Titel.

Gruß

Jürgen
 

chris

New Member
Licensed User
Longtime User
Hallo

Den lokalen Port noch setzen, dann funktioniert auch der
Empfang:

UDPSocket1.Initialize("UDP", 6666, 8000)

B4X:
'Activity module
Sub Process_Globals
   'These global variables will be declared once when the application starts.
   'These variables can be accessed from all modules.
   Dim UDPSocket1 As UDPSocket
End Sub

Sub Globals
   'These global variables will be redeclared each time the activity is created.
   'These variables can only be accessed from this module.
   Dim EditText1 As EditText
End Sub

Sub Activity_Create(FirstTime As Boolean)
   Activity.LoadLayout("Layout1")
    If FirstTime Then
        UDPSocket1.Initialize("UDP", 6666, 8000)
    End If
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub UDP_PacketArrived (Packet As UDPPacket)
   Dim Length As Int
   Length = Packet.Length
   EditText1.Text = Length
End Sub 

Sub Button1_Click
    Dim Packet As UDPPacket
    Dim data(8) As Byte
   data(0) = Rnd(1, 255)
   data(1) = 42
   data(2) = 77
   data(3) = 55
   data(4) = 33
   data(5) = 1
   data(6) = 2
   data(7) = 3
    'Packet.Initialize(data, "192.168.2.255", 6666)
   Packet.Initialize(data, "255.255.255.255", 6666)
    UDPSocket1.Send(Packet)
End Sub
 

juergen_pool

Member
Licensed User
Longtime User
Wow, das war's

Hallo Chris,

ich DANKE Dir. Allerdings wäre ich anhand der Doku nie darauf gekommen,

...
Initialize (EventName As String, Port As Int, ReceiveBufferSize As Int)

-> ReceiveBufferSize - The size of the receiving packet. Packets larger than this value will be truncated.
...

?????

Entweder habe ich hier ein totales Verständnisproblem oder in die Doku hat sich ein kleiner Fehler eingeschlichen, oder? Aber Egal, endlich kann ich mein Projekt fortsetzen. Nochmal Danke!

Gruß

Jürgen
 

juergen_pool

Member
Licensed User
Longtime User
Endgültig gelöst

War nur verwirrt durch das Beispiel in der Doku. Habe statt den Port zu setzen mit BufferSize experimentiert. Das Beispiel empfängt keine Daten, weil Port = 0.

Danke an alle.
 

chris

New Member
Licensed User
Longtime User
Hallo

Bei UDPSocket steht folgendes:

Initialize (EventName As String, Port As Int, ReceiveBufferSize As Int)

Initializes the socket and starts listening for packets.
EventName - The name of the Sub that will handle the events.
Port - Local port to listen on. Passing 0 will cause the OS to choose an available port automatically.
ReceiveBufferSize - The size of the receiving packet. Packets larger than this value will be truncated.
Pass 0 if you do not want to receive any packets.

--------------

Mal eine Frage dazu:

Bei UDP_PacketArrived bekommt man auch die eigenen Broadcast Nachrichten.
Filtern könnte man das zum Beispiel mit "Host = Packet.Host" und
dann den emfangenen Host Namen mit dem eigenen Namen vergleichen.
Ich bekomme als Host Name zb.: "android_a27..".

Kann man den eingenen Host Namen vorher auslesen?
 

juergen_pool

Member
Licensed User
Longtime User
Hostname

Hallo chris,

ja, die Doku habe ich eben nicht richtig gelesen und statt den Port zu setzen mit der Buffergröße rumgespielt, mein Fehler. Jetzt funktioniert alles perfekt!

Also, ich bekomme meine eigenen Nachrichten nicht!? Aber ich hätte das Problem auch nicht, da ich auf jeder Seite Nachrichten in einem bestimmten Format erwarte und alles andere einfach ignoriere. Und man kann ja auch nach dem Empfang den Hostnamen auslesen und dann entscheiden, was passieren soll.

Gruß

Jürgen
 
Top