vb.net udp hex packet-capture

Enviar datos UDP incluyendo hexadecimal utilizando VB.NET



packet-capture (4)

El cliente UDP envía una matriz de bytes.
Puede usar una secuencia de memoria y escribir bytes en una matriz.

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

Como hobby, me resulta interesante programar un letrero LED conectado a Ethernet para desplazar los mensajes por una pantalla. Pero estoy teniendo problemas para hacer un remitente UDP en VB.NET (actualmente estoy usando 2008).

Ahora el letrero es lo suficientemente bueno como para tener una hoja de especificaciones sobre programación para él .

Pero un ejemplo de una línea para enviarla (página 3):

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

Con códigos como <0x01> que representan el carácter hexadecimal.

Ahora, para enviar esto al signo, necesito usar UDP . Sin embargo, todos los ejemplos codifiqué el mensaje como ASCII antes de enviar, como este (desde UDP: el cliente envía paquetes a, y recibe paquetes desde, un servidor ):

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

Para generar un código hexadecimal en VB.NET, creo que la sintaxis puede ser & H1A - para enviar lo que las especificaciones definirían como <0x1A>.

¿Podría modificar ese código para enviar correctamente un paquete correctamente formateado a este signo?

Las respuestas de Grant (después de enviar un paquete con hexágono), Hamish Smith (usando una función para obtener valores hexadecimales) y Hafthor (mensaje codificado de chr () en el ejemplo) cuando se intentó todo, no funcionaron. Así que investigaré para ver qué más podría salir mal. En teoría, si esta cadena se envía con éxito, debería tener un mensaje que contenga "OK", lo que ayudará a saber cuándo funciona.

Lo he intentado y ahora puedo controlar los paquetes que están pasando. Un ejemplo de paquete de trabajo es esto (en hexadecimal en bruto): http://www.brettjamesonline.com/misc/forums/other/working.raw vs mi versión: http://www.brettjamesonline.com/misc/forums/other /failed.raw . La diferencia es que mis códigos hexadecimales todavía no están codificados correctamente, vistos en esta imagen contigua : http://www.brettjamesonline.com/misc/forums/other/snapshotcoding.png .

He usado este código para generar el paquete y enviarlo:

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)

(Fragmento completo: http://pastebin.com/f44417743 ).


Esto podría ayudar. En mi empresa, tenemos que comunicarnos con nuestro hardware usando una especie de combinación de ascii y hex.

Uso esta función para hexificar direcciones IP antes de enviarlas al hardware

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

Y ocasionalmente uso hexSomething = Hex(Val(number)).PadLeft(2,"0") también.

También puedo darte la fuente de todo el programa, aunque está diseñado para hablar con hardware diferente.

EDITAR:

¿Estás tratando de enviar paquetes en hexadecimal u obtener paquetes en hexadecimal?


Podrías armar un decodificador rápido como este:

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

luego usa esto para transformar:

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"

también podría hacer una función de codificador que deshaga esta decodificación (aunque un poco más complicada)

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

y usa esto para transformar:

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"

o podrías simplemente construir la cadena con los caracteres especiales para comenzar así:

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)

para enviar un paquete UDP, lo siguiente debería ser suficiente:

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)


Publicaron bibliotecas para varios idiomas, incluido Visual Basic (en el archivo separado). ¡Probé las demos con uno de sus signos y funcionan!

http://support.favotech.com