2008-10-04 11 views
3

В качестве хобби мне интересно программировать светодиодный знак Ethernet для прокрутки сообщений по экрану. Но у меня возникают проблемы с отправкой отправителя UDP в VB.NET (сейчас я использую 2008).Отправка данных UDP, включая гекс, с использованием VB.NET

Теперь знак достаточно хорош, чтобы иметь 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> 

С кодами, таких как < 0x01> представляющих шестигранную характер.

Теперь, чтобы отправить это знаку, мне нужно использовать 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 

Для вывода hexcode в VB.NET, я думаю, что синтаксис может быть, возможно, & H1A - отправить то, что спецификации будут определять как < 0x1A>.

Мог ли я изменить этот код, чтобы правильно отправить правильно сформированный пакет этому знаку?

Ответы от Grant (после отправки пакета с шестнадцатеричным в нем), Hamish Smith (с использованием функции для получения шестнадцатеричных значений) и сообщения Hafthor (hardcoded chr() в пример), когда все попытки не работали. Поэтому я буду исследовать, что еще может пойти не так. Теоретически, если эта строка отправлена ​​успешно, у меня должно получиться сообщение, содержащее «ОК» назад, что поможет узнать, когда оно будет работать.

Я пробовал и теперь могу отслеживать проходящие пакеты. Пример рабочего пакета - это (в шестнадцатеричном формате): http://www.brettjamesonline.com/misc/forums/other/working.raw против моей версии: 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

Хорошо, я возобновил смотреть в к этому. Я обнаружил, что using wirehark позволяет просматривать исходные пакеты udp. Он появляется с примером кода, который я использовал, HEX charecters появляются как пустые (00) символы в фактическом пакете. – SuperRoach 2008-12-07 10:12:04

+0

Вы когда-нибудь успешно работали с этим предприятием? У меня есть один из этих знаков, который имеет последовательный порт для отправки его команд, и мне еще не удалась с отправкой его команд. – NexAddo 2012-03-13 21:07:28

ответ

0

Это может помочь. В моей компании мы должны общаться с нашим оборудованием, используя комбинацию ascii и hex.

Я использую эту функцию для hexify IP-адреса перед отправкой их к аппаратному

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 

И occationally я использую hexSomething = Hex(Val(number)).PadLeft(2,"0"), а также.

Я могу предоставить вам источник для всей программы, хотя он предназначен для разговора с различным оборудованием.

EDIT:

Вы пытаетесь послать пакеты в шестнадцатеричном, или получить пакеты в шестнадцатеричном?

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

Они разместили библиотеки для нескольких языков, включая Visual Basic (в отдельном файле). Я тестировал демо с одним из своих знаков, и они работают!

http://support.favotech.com

 Смежные вопросы

  • Нет связанных вопросов^_^