2017-02-18 50 views
1

首先,我对使用错误的术语表示歉意。使用UDPClient收听特定端口并获取传输数据包

我在本地网络上有一个传感器。它通过端口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是一个无会话广播。由于来自单个设备的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); 
}