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!