幾乎任何專案都會涉及到通訊,那麼通訊協議的設計就顯得十分關鍵,目前就我個人來說串列埠 網口為從位元組流中取到正確的資料必須要開始通訊協議的設計。
轉義字元 幾乎能保證99%的傳輸正確,除非硬體丟包太嚴重。
對於很多裝置之間的通訊,經常需要自己設計一套通訊協議。當然此處的通訊協議一般都是建立在tcpip協議等協議基礎之上的協議,也就是在已有協議的基礎之上,在定義一套協議。例如:有一套檢測降雨量的裝置(一般為簡單的嵌入式裝置)需要把採集到的的資料上報給中心伺服器(一般為一台效能特別好的計算機)。就需要一套通訊協議。以保證,嵌入式裝置上發的資料,可以被中心伺服器正確的理解和處理。再例如:在橋梁檢測的專案中,會檢測很多橋梁的資料,應力,索力,溫度等,這些檢測裝置一般都是由簡單的感測器組成的嵌入式裝置 ,需要通過各種方式把採集到的的資料上報給中心伺服器,中心伺服器經過分析處理後,再進一步判斷橋梁的各種狀態。這些都涉及到自定義通訊協議。
但這些自定義通訊協議如何設計?有設計到那些方面?
協議的設計,是為了保證雙方能夠正常的通訊,由於上位裝置和下位裝置一般是不同的裝置,處理能力有很大差異,這些都是設計協議必須考慮的問題。
一套完整的協議,通常包含很多命令,每乙個命令都會規定乙個完整的命令(也就是乙個完整的資料幀)包含哪些部分,一般包含以下幾部分:
1、資料幀的組成的形式
一般形式有位元組流(有的地方也叫做二進位制協議)和字元流。位元組流一般會規定每乙個位元組表示的含義,而字元流由於都是可見的字元,一般會規定,字元的含義。
2、資料幀頭和尾
資料幀頭和尾其實是為了解析資料而設計的,主要是為了獲取乙個完整的幀。由於網路的不確定性,無法保證一條完整的資料幀的一次性就傳送給對方。一般選擇用很少出現的位元組或者字元作為資料幀頭和尾。
例如我曾經解析過得mode 04 protocol的一套協議,就是以0x03,0x14開頭的,由於mode 04 protocol是位元組流協議,因此規定了命令的開頭兩個位元組是0x03,0x14,還曾經解析過字元流的協議,命令是以##開頭。資料幀尾有時會有,有時沒有,例如mode 04 protocol就沒有協議尾,因為它有兩個位元組表示本條資料幀的長度,所以沒必要規定資料幀尾。相反,如果無法判斷一條命令的長度,就會規定資料幀如何結束。如果資料幀長度都是一樣的,也沒有必要規定,但實際中很少遇到資料幀長度是固定的情況。
3、資料幀的驗證部分
對於位元組流的協議,一般會規定驗證資料幀的驗證部分,例如mode 04 protocol就規定了資料幀最後兩個位元組是crc驗證部分。
對於字元流的也可以加驗證字段,但因為每一部分都都是可視的字元,也可以不加。
4、轉義字元
再少出現的字元由於資料幀內容的不確定性,也有可能在資料幀內部出現,例如:mode 04 protocol協議當資料幀內部出現了0x03,0x14,也就是資料幀規定的開始部分,就必須轉義,否則就會解析出錯。導致乙個資料幀變成兩部分不完整無法理解的資料幀。
5、命令字及其他
命令字就是標示此資料幀,需要完成的命令,例如:讀取時間命令資料幀,就有一部分標示此資料幀是讀取時間,設定時間命令資料幀就有一部分標示此資料幀是用來設定時間的,當然會有命令內容例如把時間調整到多少。
6、心跳包
心跳包作為一條很特殊的資料幀,作用其實和人的心跳類似。每隔一段時間,就會傳送一條很特殊的資料幀心跳包。作用就是表明此裝置還在工作。
對比:
位元組流協議難度顯然比字元流大很多,解析過程也更複雜,如果沒有協議文件,幾乎不能解析,因為收到的就是一串毫無意思的數字,乙個位元組處理錯誤就完全可能導致整條資料解析錯誤,此外位元組流還需要規定大端模式和小端模式等。當然好處就是,傳輸同樣的資訊,資料量明顯少很多。
字元流就簡單很多,解析的過程可能就是乙個正規表示式。
IIC通訊協議分析
iic iic,inter integrated circuit 兩線式序列匯流排,用於mcu和外設間的通訊。iic只需兩根線 資料線sda和時鐘線scl。以半雙工方式實現mcu和外設之間資料傳輸,速度可達400kbps。多主機i2c匯流排結構 注意sda和scl兩根匯流排需要上拉,使匯流排處於空閒...
Arduino通訊協議設計
最近在一直在研究arduino 硬體平台的東西,先從做乙個簡單的東西入手,比如說,我通過android端向arduino硬體傳送指令,控制電機的正轉 反轉。其中乙個必不可少的問題就是這兩個端裝置之間的通訊問題。它們之間的通訊可以通過藍芽模組來完成,此外,還需要自己設計通訊協議。從最簡單的模組開始,需...
網路通訊協議分析
目標 1.研究資料格式 2.研究協議的閱讀和制定 使用 疑問 1.傳輸層協議只有tcp和udp嗎 答案 推測,兩個協議的特性決定,只有可靠,不可靠的區分。錯誤,看維基百科 2.為什麼tcp要有三次 答案 建立可靠連線。客戶端 我發資料呢 服務端 恩,你發吧 客戶端 好,那我發了。服務端 等待接收中 ...