通过UDP

时间:2016-11-16 22:53:43

标签: vb.net visual-studio sockets udp uwp

我正在尝试使用Raspberry Pi和7英寸触摸屏来创建Assetto Corsa仪表板,在通用Windows平台上使用vb进行编码。

我遇到了很多这个平台的问题,因为对象与.net非常不同,我觉得微软的逻辑非常奇怪。

但是,我尝试解释这个问题:Assetto Corsa有自己的遥测,当用户启动会话开始向端口9996,UDP协议上的连接客户端发送一些数据。 实际上,游戏并不是那么简单,因为将客户端“绑定”到服务器上有一个“程序”,其中包括:

  • 客户必须发送包含3个整数的结构化数据(“110”)

  • 服务器响应向客户端发送包含
    的一些数据 曲目名称,球员姓名和其他人

  • 客户端必须发送另一个结构化数据,这次包含 “111”在此之后,客户端和服务器是“握手”和服务器 开始向包含大量数据的客户端发送连续数据 关于汽车的物理学。

以下是握​​手协议的更准确说明:Assetto corsa UDP Telemetry documentation

由于这些是我第一次接触UPD通信,我肯定会正确理解它是如何工作的,所以我编写了这个python脚本:

from socket import *
from struct import *

serverName='127.0.0.1'
serverPort = 9996
clientSocket = socket(AF_INET,SOCK_DGRAM)
message=pack('iii',1,1,0)

clientSocket.sendto(message, (serverName, serverPort))

messageback, ipAddress=clientSocket.recvfrom(1024)
print 'received'
pktformat='408c'
n = calcsize(pktformat)
print n
#n = len(messageback)
#print n

backString = unpack(pktformat, messageback)
#print backString[1,2,3,4,5,6,7,8,9,10]
#print "fffffff"
message=pack('iii',1,1,1)
clientSocket.sendto(message, (serverName, serverPort))

i=0
while 1:
    pktformat='4chfff??????fffhhhhfffffhf4f4f4f4f4f4f4f4f4f4f4f4f4f4fff5f'

    messageback, ipAddress =clientSocket.recvfrom(16384)
    n = calcsize(pktformat)
    print n
    n = len(messageback)
    print n
    backString = unpack(pktformat, messageback)
    print backString
    i+=1

clientSocket.close()

一切正常但Python GUI不太好看,所以我会转向VS + VB + UWP + WIN10IoT。

Dim s As String = "110"
        Dim byteCommand As Byte() = Encoding.ASCII.GetBytes(s)


        Dim writer As New DataWriter(listener.OutputStream)
        writer.WriteBytes(byteCommand)

        Try
            Await listener.ConnectAsync(hostname, "9996")
            Await writer.StoreAsync()



        Catch ex As Exception
            testo = ex.Message
            refreshTb()
        End Try

使用此代码,我可以从服务器接收第一个通信,因此我重复发送“111”的代码:

Private Async Sub HandShake(inStream As IBuffer)
        If handShaked Then
            Exit Sub
        End If
        handShaked = True
        Dim writer As New DataWriter(listener.OutputStream)


        Dim s As String = "111"
        Dim byteCommand As Byte() = Encoding.ASCII.GetBytes(s)
        writer.WriteBytes(byteCommand)

        Await writer.StoreAsync()
        testo = "hand-shaked!"

    End Sub

在此之后,没有任何反应。

我试过了:  1.以字符串形式发送数据,而不是byte()。没有改变  2.发送“XXX”而不是“110”:我希望不会收到任何内容,但收到的内容与发送“110”时相同!!!

所以我开始认为我没有正确转换“110”所以我向服务器发送了一种无法理解的数据。

有什么想法吗?

0 个答案:

没有答案