2015-08-17 294 views
0

我正在使用通過TCP進行通信的arduino's來自動化很多我的公寓(前門,恆溫器,燈光等)。我想簡單地解析字符串消息協議,例如用起始字節和停止字節。我不想使用可能最終用於字符串或作爲命令的字符,所以我想到了一些ASCII控制字符。設計一個通過TCP與Arduino進行通信的協議

服務器將用C#編寫,客戶端將是arduino的以太網屏蔽(特別是更便宜的HR91105A模塊)。從技術上說,我的信息不應該被分解(它們將小於1kb),但是我希望在某些情況下我會放置一些信息組裝機制,以便我決定要這樣做。我是否在說這個?我應該僅僅依靠它來獲取整個信息嗎?

這是我第一次設計系統通信協議(即使這只是一個小規模),我想知道是否有人有任何最佳實踐?

+0

我會用換行字符作爲消息分隔符(你需要逃避將是焦炭的唯一字符)。這樣,您可以使用StreamReader的ReadLine WriteLine方法將命令發送到另一端。 – EZI

+0

我的意思是[this](http://stackoverflow.com/a/21510978/932418)。其中'T'可以是任何你想要發送或接收的對象。 – EZI

回答

1

你絕對應該是而不是依靠你將在一次調用接收函數中得到整個消息。 TCP是一個字節流協議,句號。它不會將信息粘合在一起,並試圖假裝它幾乎總是以痛苦結束。

您可以使用簡單的name=value[,name=value]<newline>類型的協議。

+0

你能否提供一些有關TCP不可靠的參考?我假設我會按照它們傳輸的順序傳輸字節,但要注意連接無限期地停止或可能關閉。我的假設有什麼不正確的嗎? – Steve

+0

TCP是可靠的。您將按照傳輸的順序獲取傳輸的字節。但是,您認爲您的消息不會被打破的假設是不合理的。 TCP是一種不保存應用程序消息邊界的字節流協議。 –

+0

'TCP提供在通過IP網絡進行通信的主機上運行的應用程序之間可靠,有序和錯誤檢查的八位字節流的傳遞。「這是來自[Wikipedia](https://en.wikipedia.org/wiki/Transmission_Control_Protocol )。這是錯的嗎? – Steve

1

設計方案要考慮的事情

  1. 可擴展性:協議的規格應能在需要時延長本身。例如今天一個命令只能返回20個字節,明天它可以是50個,因此總是嘗試在發送和接收規範中都有字段用於請求的字節數和響應字節。 Modbus是一個很好的例子,它一次提供多個寄存器讀取。

  2. 錯誤檢查和適當的錯誤代碼定義[CRC]或錯誤代碼保留字節總是有幫助的。在解析數據之前,您可以檢查錯誤代碼並決定如何處理這個數據包。在串行通信中它也很重要,它在以太網中變得有用並且有助於測試

  3. 作爲協議的一部分的日期時間:這不是嚴格的要求,但它總是有好處的,所以在任何時候客戶端應該知道服務器何時處理數據將始終準確並與設備時間戳同步。在實時通信的情況下被刷新的數據變得離我很重要

2美分

相關問題