3

作为一种爱好,我对编程连接以太网的 LED 标志以在屏幕上滚动消息很感兴趣。但我无法在VB.NET中创建 UDP 发送器(我目前使用的是 2008)。

现在这个标志已经足够好了,有一个关于它的编程规格表

但是发送给它的一行示例(第 3 页):

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

用 <0x01> 等代码表示十六进制字符。

现在,要将其发送到我需要使用UDP的标志。但是,我在发送之前都将消息编码为ASCII的示例,例如这个(来自UDP:客户端将数据包发送到服务器并从服务器接收数据包):

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与我的版本:http ://www.brettjamesonline.com/misc/forums/other /失败的.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。)

4

4 回答 4

2

你可以像这样组装一个快速解码器:

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"

您还可以创建一个编码器功能来撤消此解码(虽然有点复杂)

Function HexCharToHexCode(ByVal m As Match) As String
    If m.Value.StartsWith("<0x") And m.Value.EndsWith(">") And m.Value.Length = "<0x??>".Length Then
        Return "<0<0x78>" + m.Value.Substring("<0x".Length)
    ElseIf Asc(m.Value) >= 0 And Asc(m.Value) <= &HFF Then
        Return "<0x" + Right("0" + Hex(Asc(m.Value)), 2) + ">"
    Else
        Throw New ArgumentException("Non-SBCS ANSI characters not supported")
    End If
End Function

并使用它来转换:

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)
于 2008-10-04T00:36:05.213 回答
0

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

http://support.favotech.com

于 2009-05-02T08:28:55.637 回答
0

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

我使用此功能在将 IP 地址发送到硬件之前对其进行 hexify

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")

我也可以为您提供整个程序的源代码,尽管它旨在与不同的硬件通信。

编辑:

您是尝试以十六进制发送数据包,还是以十六进制获取数据包?

于 2008-10-04T00:28:40.580 回答
0

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
于 2008-10-04T00:47:47.000 回答