2014-12-23 133 views
0

我正在通過網絡遠程操作遠程站點機器人。二進制包解析

我從頭開始,我正在考慮將命令包發送給機器人。

我想使用簡單的協議。

[LENGTH] [HEADER] [BODY]

LENGTH是[HEADER + BODY]的字節。

頭將包括命令的類型,電流模式等等

機構將包括實時數據(目標位置,速度,轉矩等)

我的問題是這樣的。

如果我使用這個協議,首先我得到包的長度並根據長度信息從流中提取數據。

但是讓我們來想一下「長度數據錯誤」的情況。

分組流...

[10] [5Bytes] [10Bytes] | [15] [5Bytes] [10Bytes] | [15] [5Bytes] [10Bytes] ...

第一個數據包有長度錯誤。

我認爲這個錯誤可以打破它後面的每個數據包。

我將使用UDP作爲命令包,但不能保證數據將被正確接收。

我認爲這種情況是可能的。

真的發生了嗎?

如果是這樣,有沒有解決方案?

+0

我不會想成爲本地站點操作員當機器人錯過一個UDP數據包,並決定對瘋狂我的頭,因爲擺動手臂是不是你覺得是了... – Alnitak

+1

包送貨不保證UDP,但我非常肯定,缺乏保證只適用於整個數據包。當你得到一個數據包時,你可以認爲它是完整的。 –

回答

1

如果數據丟失,並且尤其是,如果預計會丟失字節,則需要將協議設計爲自同步

在一般情況下,您需要做出明確的規定。

就你而言,你可以通過仔細觀察你的數據來規避這一規定。

依靠UDP

如果數據足夠小(65,507 bytes每維基下),你可以選擇發送每個命令作爲一個UDP數據報。

您也可以選擇將幾個命令分組爲UDP數據報,但始終使單個命令不能跨越UDP數據包。

然後使用socket API中的sendtorecvfrom函數來發送和接收具有您所選邊界的數據報。

依靠數據本身

  • 數據報= [1字節-LEN] [報頭] [數據]
  • 假設空頭無效
  • 長度字節必須是[1 .. 255]
  • 假設在流中經常存在數據幀[4] [4字節頭部] [無數據]
  • 或者編譯最頻繁的數據報長度列表(5,10,13,200)
  • 驗證數據時,不同步的,以檢測

恢復方案可以是這樣的:

  • 處理[5] [報頭設定速度] [255,173,14,0]
  • 哦,不,速度255無厘頭
  • 假設同步丟失
  • 掃描向前尋找可能的起始字節(如4)
  • 發現4,100,23,34,56,4,78,......假設這是一個數據報後,這個(4,100,23,34)
  • 檢查數據報(4,78,......)
  • 這個和下一個數據報查出來,決定同步回收
0

如果你想讓你的數據交換或多或少可靠,你將需要爲你的包和驗證器實現模式。但最簡單的方法是使用現有的數據格式,如JSON,XML,BSON一個等

0

因此,從我看到你存儲在連續的緩衝區所有輸入數據,而問題正在失去分裂當長度屬性損壞時點。

現在,如果你正在處理傳統的套接字,你應該不必擔心具有可靠數據流的數據鏈接的責任。套接字以塊形式返回可靠數據,如果需要,您可以自由地將其添加到緩衝區。

但讓我們用的小塊對每個數據包處理256個字節。

由於使用套接字來接收數據,你會做這樣的事情的例子:

unsigned char* data = new unsigned char[256]; 

int size = recvfrom(sock, data, sizeof(buffer), ...); 

這將填補datasize與新的數據包的內容。您現在可以使用if(size > 0)檢查數據緩衝區中是否有任何數據,並從data緩衝區獲取數據包數據。

我也推薦使用TCP發送簡單的命令,要求可靠性。除非你持續發送最近狀態的命令。編寫自己的UDP可靠性系統非常好,可以通過發送可靠或不可靠的命令實現靈活性,但它非常複雜,因此存在類似ENet這樣的庫。

0

有長度誤差在第一分組。

除非您禁用UDP校驗和,否則不能發生在UDP中。

我覺得這個錯誤可以打破每包下了。

真如果它發生,但它不能。

我將使用UDP作爲命令包,並且不保證數據將被正確接收。

是這樣做,除非您已禁用UDP校驗。

我覺得這種情況是可能的。

是否真的發生什麼呢?

如果是,是否有這方面的任何解決方案?

你並不需要一個。