2017-02-18 49 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); 
}