2017-02-18 30 views
1

Прежде всего, я прошу прощения за неправильное использование терминологии.Слушайте конкретный порт с UDPClient & Get Transmitted Packets

У меня есть датчик в моей локальной сети. Он передает текущие значения температуры всем в сети на порту 35333. Я хочу создать консольную программу C#, которая непрерывно принимает пакеты от этого датчика.

Это мой текущий код:

public static UdpClient Client = new UdpClient(35333); 

private static async void Start() 
{ 
     Client.BeginReceive(new AsyncCallback(recv), null); 
} 

private static void recv(IAsyncResult res) 
{ 
     IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); 
     byte[] received = Client.EndReceive(res, ref RemoteIpEndPoint); 

     //Process codes 

     Client.BeginReceive(new AsyncCallback(recv), null); 
} 

Код выше работает, однако вот проблема: Я все получил же самый массив байтов все время.

... 
    [114][51][57][48][48][77][72][112] 

    [114][51][57][48][48][77][72][112] 

    [114][51][57][48][48][77][72][112] 

    [114][51][57][48][48][77][72][112] 

    [114][51][57][48][48][77][72][112] 
... 

Насколько я знаю, и опять же, простите за плохое знание сети, я должен каким-то образом послать подтверждение назад к этому датчику, поэтому он начинает посылать мне «реальных«»данные».

Любые советы или предложения приветствуются!

+0

UDP является sessionless вещания. С потенциалом для нескольких приемников UDP-пакета с этого единственного устройства ACK маловероятен. Вы должны просмотреть документы протокола устройства, а также посмотреть, есть ли пример кода. – JamieMeyer

ответ

1

Здесь есть как минимум две возможности.

Во-первых, это может быть только температура, и она не меняется. В этом случае вам нужно проанализировать байты так, как диктует спецификация датчика.

Во-вторых, если это действительно пакет, которому требуется подтверждение, вам нужно будет узнать, какой порт датчик прослушивает (из спецификации), и какой должен быть пакет подтверждения (из спецификации) и отправьте его в этот порт.

Ключом здесь является рассмотрение документов, прилагаемых к датчику. Новый код будет сидеть внутри recv метода и выглядеть примерно следующим образом:

private static void recv(IAsyncResult res) 
{ 
    IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); 
    byte[] received = Client.EndReceive(res, ref RemoteIpEndPoint); 

    //Pseudo code 
    //start_packet is the packet of bytes above from the sensor 
    If (received == start_packet) 
    { 
     //send acknowledgement 
    } 

    //Process codes 
    Client.BeginReceive(new AsyncCallback(recv), null); 
} 

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

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