使用VB.NET发送UDP数据(包括十六进制)

使用VB.NET发送UDP数据(包括十六进制)

问题描述:

作为一种爱好,我很感兴趣的是编程连接以太网的LED指示灯以在屏幕上滚动消息。但我在制作VB.NET(我目前使用2008)的UDP发件人时遇到了麻烦。使用VB.NET发送UDP数据(包括十六进制)

现在标志已经足够好,可以有a specifications sheet on programming for it

但线的一个例子,以发送给它(第3页):

<0x01>Z30<0x02>AA<0x06><0x1B>0b<0x1C>1<0x1A>1This message will show up on the screen<0x04> 

随着码,诸如< 0×01>表示十六进制字符。

现在,要发送此标志我需要使用UDP。然而,我有所有的实施例编码消息作为ASCII发送,像这样的(从UDP: Client sends packets to, and receives packets from, a server)之前:

Imports System.Threading 
Imports System.Net.Sockets 
Imports System.IO 
Imports System.Net 


Public Class MainClass 
    Shared Dim client As UdpClient 
    Shared Dim receivePoint As IPEndPoint 


    Public Shared Sub Main() 
     receivePoint = New IPEndPoint(New IPAddress(0), 0) 
     client = New UdpClient(8888) 
     Dim thread As Thread = New Thread(New ThreadStart(AddressOf WaitForPackets)) 
     thread.Start() 


     Dim packet As String = "client" 
     Console.WriteLine("Sending packet containing: ") 

     ' 
     ' Note the following line below, would appear to be my problem. 
     ' 

     Dim data As Byte() = System.Text.Encoding.ASCII.GetBytes(packet) 
     client.Send(data, data.Length, "localhost", 5000) 
     Console.WriteLine("Packet sent") 

    End Sub 

    Shared Public Sub WaitForPackets() 
     While True 
     Dim data As Byte() = client.Receive(receivePoint) 
     Console.WriteLine("Packet received:" & _ 
      vbCrLf & "Length: " & data.Length & vbCrLf & _ 
      System.Text.Encoding.ASCII.GetString(data)) 

     End While 

    End Sub ' WaitForPackets 

End Class 

为了输出在VB.NET一个十六进制编码,我想的语法可能是& H1A - 发送规范定义为< 0x1A>。

我可否修改该代码,将正确格式的数据包正确发送至此标志?

当尝试所有都不起作用时,从Grant(在发送包含十六进制的数据包之后),Hamish Smith(使用函数获取十六进制值)和Hafthor(硬编码的chr()消息)所以我会研究看看还有什么可能出错的。理论上,如果这个字符串发送成功,我应该有一个包含“OK”的消息,这将有助于了解它何时起作用。

我已经试过了,现在我能够监视正在经过的数据包。一个工作包的例子是这样的(原始十六进制):http://www.brettjamesonline.com/misc/forums/other/working.raw vs我的版本:http://www.brettjamesonline.com/misc/forums/other/failed.raw。不同之处在于我的十六进制代码仍然没有正确编码,在这个并行图像中看到:http://www.brettjamesonline.com/misc/forums/other/snapshotcoding.png

我已经使用这个代码生成数据包,并将其发送:

container = &H1 & "Z" & &H30 & &H2 & "temp.nrg" & &H1C & "1Something" & &H4 
    ' This did not appear to work neither 
    'container = Chr(&H1) & "Z" & Chr(&H30) & Chr(&H2) & Chr(&H1C) & "1Something" & Chr(&H4) 
    '<0x01>Z00<0x02>FILENAME<0x1C>1Test to display<0x04> <- the "official" spec to send 
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes(container) 

(全段:http://pastebin.com/f44417743

+0

好吧,我已经恢复寻找这个。我发现使用wireshark可以查看正在发送的原始udp数据包。它与我用过的示例代码一起出现,HEX文字记录器在实际数据包中出现空白(00)字符。 – SuperRoach 2008-12-07 10:12:04

+0

你是否曾经在这次冒险中取得过成功?我有这些标志之一有一个串口发送它的命令,我还没有任何运气,但发送它的命令。 – NexAddo 2012-03-13 21:07:28

这可能会有帮助。在我的公司,我们必须使用ascii和十六进制的组合来与我们的硬件进行通信。

我用这个功能将它们发送到硬件

Public Function HexFromIP(ByVal sIP As String) 
    Dim aIP As String() 
    Dim sHexCode As String = "" 
    aIP = sIP.Split(".") 

    For Each IPOct As String In aIP 
     sHexCode += Hex(Val(IPOct)).PadLeft(2, "0") 
    Next 

    Return sHexCode 
End Function 

而且偶尔我用hexSomething = Hex(Val(number)).PadLeft(2,"0")以及前hexify IP地址。

我也可以给你整个程序的源码,虽然它的目的是与不同的硬件进行通信。

编辑:

你们是不是要在十六进制发送数据包,或十六进制得到数据包?

你可以把一个匆匆解码器像这样的:

Function HexCodeToHexChar(ByVal m as System.Text.RegularExpressions.Match) As String 
    Return Chr(Integer.Parse(m.Value.Substring("<0x".Length, 2), _ 
     Globalization.NumberStyles.HexNumber)) 
End Function 

然后使用此转换:

Dim r As New System.Text.RegularExpressions.Regex("<0x[0-9a-fA-F]{2}>") 
Dim s As String = r.Replace("abc<0x44>efg", AddressOf HexCodeToHexChar) 
' s should now be "abcDefg" 

你也可以做出撤销该解码(虽然有点编码器功能更复杂)

​​

并用它来转换:

Dim r As New Regex("[^ -~]|<0x[0-9a-fA-F]{2}>") 
Dim s As String = r.Replace("abc"+chr(4)+"efg", AddressOf HexCharToHexCode) 
' s should now be "abc<0x04>efg" 

,或者你可以只建立在它的特殊字符的字符串,像这样开始:

Dim packet As String = Chr(&H01) + "Z30" + Chr(&H02) + "AA" + Chr(&H06) + _ 
    Chr(&H1B) + "0b" + Chr(&H1C) + "1" + Chr(&H1A) + _ 
    "1This message will show up on the screen" + Chr(&H04) 

发送一个UDP包,以下就足够了:

Dim i As New IPEndPoint(IPAddress.Parse("192.168.0.5"), 3001) ''//Target IP:port 
Dim u As New UdpClient() 
Dim b As Byte() = Encoding.UTF8.GetBytes(s) ''//Where s is the decoded string 
u.Send(b, b.Length, i) 

UDP客户端发送一个字节数组。
您可以使用内存流并将字节写入数组。

Public Class MainClass 
    Shared client As UdpClient 
    Shared receivePoint As IPEndPoint 


    Public Shared Sub Main() 
     receivePoint = New IPEndPoint(New IPAddress(0), 0) 
     client = New UdpClient(8888) 
     Dim thread As Thread = New Thread(New ThreadStart(AddressOf WaitForPackets)) 
     thread.Start() 


     Dim packet As Packet = New Packet("client") 
     Console.WriteLine("Sending packet containing: ") 
     Dim data As Byte() = packet.Data 

     client.Send(data, data.Length, "localhost", 5000) 
     Console.WriteLine("Packet sent") 

    End Sub 

    Public Shared Sub WaitForPackets() 
     While True 
     Dim data As Byte() = client.Receive(receivePoint) 
     Console.WriteLine("Packet received:" & _ 
      vbCrLf & "Length: " & data.Length & vbCrLf & _ 
      System.Text.Encoding.ASCII.GetString(data)) 

     End While 

    End Sub ' WaitForPackets 

End Class 

Public Class Packet 
    Private _message As String 

    Public Sub New(ByVal message As String) 
     _message = message 
    End Sub 

    Public Function Data() As Byte() 

     Dim ret(13 + _message.Length) As Byte 

     Dim ms As New MemoryStream(ret, True) 

     ms.WriteByte(&H1) 

     '<0x01>Z30<0x02>AA<0x06><0x1B>0b<0x1C>1<0x1A>1This message will show up on the screen<0x04> 
     ms.Write(System.Text.Encoding.ASCII.GetBytes("Z30"), 0, 3) 

     ms.WriteByte(&H2) 

     ms.Write(System.Text.Encoding.ASCII.GetBytes("AA"), 0, 2) 

     ms.WriteByte(&H6) 

     ms.Write(System.Text.Encoding.ASCII.GetBytes("0b"), 0, 2) 

     ms.WriteByte(&H1C) 

     ms.Write(System.Text.Encoding.ASCII.GetBytes("1"), 0, 1) 

     ms.WriteByte(&H1A) 

     ms.Write(System.Text.Encoding.ASCII.GetBytes(_message), 0, _message.Length) 

     ms.WriteByte(&H4) 

     ms.Close() 

     Data = ret 
    End Function 
End Class 

他们为包括Visual Basic在内的一些语言(在单独的文件中)发布了库。我用他们的一个标志测试了这些演示,并且他们工作了!

http://support.favotech.com