UDP Bytes empfangen gibt keine sinnvollen Werte zurück

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets.

    UDP Bytes empfangen gibt keine sinnvollen Werte zurück

    Hallo Leute,
    ich versuche beim Rennspiel Forza Horizon 4 die Datenübertragung über UDP zu verwenden, um Daten außerhalb des Spiels darstellen zu können, z.B. Tacho usw.

    Hier mein bisheriger Code:

    VB.NET-Quellcode

    1. Imports Newtonsoft.Json
    2. Imports Newtonsoft.Json.Linq
    3. Imports System.Net.Http
    4. Imports System.IO
    5. Imports System.Net
    6. Imports System.Web.Script.Serialization
    7. Imports System.Net.Sockets
    8. Imports System.Text
    9. Public Class Form1
    10. Private UdpListener As UdpClient 'Diese Client horcht auf Port 12000
    11. 'Private UdpSender As UdpClient ' mit diesem wird gesendet
    12. Private ep As IPEndPoint
    13. Private CallBack As AsyncCallback 'CallBack für asyncrones Empfangen
    14. Delegate Sub DelegateWriteRtf(t As String) 'Delegate zum schreiben des empfangenen Strings
    15. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    16. StartListener()
    17. End Sub
    18. Sub StartListener()
    19. CallBack = New AsyncCallback(AddressOf receive)
    20. ep = New IPEndPoint(IPAddress.Any, 9999)
    21. UdpListener = New UdpClient(ep)
    22. UdpListener.BeginReceive(CallBack, "") ' startet asyncrones Empfangen
    23. WriteRtf("listen to port: " & ep.Port.ToString)
    24. End Sub
    25. Sub receive(ar As IAsyncResult)
    26. Dim res() As Byte = UdpListener.EndReceive(ar, ep)
    27. Dim resString = GetStringFromBytes(res) 'Encoding.ASCII.GetString(res)
    28. WriteRtf(resString)
    29. If ar.IsCompleted Then 'wenn fertig, wieder lauschen
    30. UdpListener.BeginReceive(CallBack, "")
    31. End If
    32. End Sub
    33. Sub WriteRtf(s As String)
    34. 'da receive in einem anderen Thread läuft, muß Invoked werden
    35. If RichTextBox1.InvokeRequired Then
    36. Dim wd As New DelegateWriteRtf(AddressOf WriteRtf)
    37. RichTextBox1.Invoke(wd, s)
    38. Else
    39. RichTextBox1.AppendText(s & vbNewLine)
    40. End If
    41. End Sub
    42. Private Shared Function GetStringFromBytes(ByVal bytes() As Byte) As String
    43. Dim ByteLegth = bytes.Count
    44. If (ByteLegth >= 3) AndAlso (bytes(0) = &HEF) AndAlso (bytes(1) = &HBB) AndAlso (bytes(2) = &HBF) Then
    45. Return System.Text.Encoding.UTF8.GetString(bytes)
    46. ElseIf (ByteLegth >= 2) AndAlso (bytes(0) = &HFE) AndAlso (bytes(1) = &HFF) Then
    47. Return System.Text.Encoding.BigEndianUnicode.GetString(bytes)
    48. ElseIf (ByteLegth >= 2) AndAlso (bytes(0) = &HFF) AndAlso (bytes(1) = &HFE) Then
    49. Return System.Text.Encoding.Unicode.GetString(bytes)
    50. ElseIf (ByteLegth >= 2) AndAlso (bytes(0) = &H0) AndAlso (bytes(1) = &H0) AndAlso (bytes(2) = &HFE) AndAlso (bytes(3) = &HFF) Then
    51. Return New System.Text.UTF32Encoding(True, True).GetString(bytes)
    52. ElseIf (ByteLegth >= 2) AndAlso (bytes(0) = &HFF) AndAlso (bytes(1) = &HFE) AndAlso (bytes(2) = &H0) AndAlso (bytes(3) = &H0) Then
    53. Return System.Text.Encoding.UTF32.GetString(bytes)
    54. Else
    55. 'No BOM, assume ASCII
    56. Return System.Text.Encoding.ASCII.GetString(bytes)
    57. End If
    58. End Function
    59. End Class


    Im Spiel selbst wird eine IP (die lokale 192.168.x.x) und ein Port (z.B. 9999) angegeben.


    Folgende Daten werden zurückgegeben: (siehe Dateianhang)

    Es gibt leider keine offiziellen Dokumentationen, wie und in welcher Struktur die Daten vom Spiel übergegeben werden.


    Vielen Dank für eure Hilfe,
    mit freundlichen Grüßen,
    Hilfe0987

    Code-Tags korrigiert ~ EaranMaleasi
    Bilder
    • screen1.png

      9,79 kB, 803×489, 61 mal angesehen
    :thumbup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

    Naja, das sind halt keine Strings, die da übertragen werden, sondern binär serialisierte Daten. Dokumentation dazu, wie die aufgebaut sind, gibts auch zur Genüge - ne Minute Googeln (Stichwort forza horizon 4 telemetry udp) führt bspw. direkt hierhin: github.com/richstokes/Forza-da…ster/FH4_packetformat.dat. Da steht alles drin, was du wissen musst, um die Daten auslesen zu können.

    Edit: Oh, und ne offizielle Dokumentation gibts auch, wenn man ordentlich danach sucht: forums.forzamotorsport.net/tur…-details.aspx#post_926839
    Erstmal musst du die einzelnen Werte extrahieren - das geht bspw. mit einem BinaryReader -, dann musst du die halt irgendwie anzeigen lassen. Wie du die Anzeige machst, ist komplett dir überlassen - du kannst die Werte einfach in nen String reinpacken und dann anzeigen, oder einzelne Werte in einzelnen Labels anzeigen, ...