嵌入式中自定義協議的一些典型例子


關於自定義協議,對於會的人很簡單,對於不會的人就摸不著頭腦。下面分享一些關於自定義協議的筆記。


什麼是協議?

協議這個概念我覺得挺雜的。就像嵌入式的概念一樣,說法不一,比如大家常常爭論FPGA是不是嵌入式、單片機是不是屬於嵌入式等等。下面簡單看一下嵌入式中協議這個概念。

在互聯網領域,協議常常指的是網絡協議。

在嵌入式中,協議按大類分主要可分為底層協議(硬件層協議/物理層協議)與上層協議(用戶層協議應用層協議),根據實際還可細分成很多層。底層協議如串口等,底層協議決定著數據傳輸的方式(傳輸數據需要多少條信號線,傳輸數據的時序是怎樣的)。上層協議決定著這些數據是拿來幹什麼用的。太難解釋了。。看實例吧:

嵌入式中自定義協議的一些典型例子

這是多功能電能表的協議通訊協議,其中底層協議是485通訊,上層協議有很多條,但格式基本都統一:

嵌入式中自定義協議的一些典型例子

每一幀(包)數據的格式都類似是這樣子的格式,例如讀數據協議:

主站往從站發送數據(控制器->智能電錶):

嵌入式中自定義協議的一些典型例子

從站往主站發送數據(智能電錶->控制器):

嵌入式中自定義協議的一些典型例子

明確了協議之後,該發什麼數據、收到的數據是怎麼樣我們都心裡有數,那麼這個通信的過程就很明朗了。一般控制器往外發送協議數據都比較簡單,重點是返回數據的處理(解析),解析方式根據協議的不同而有不同的方法。

協議(上層協議)按照通用性來分可以分為專有協議與自定義協議,例如上面電錶的協議其實是專有協議(具有一些標準的協議):

嵌入式中自定義協議的一些典型例子

自定義協議就是我們開發者可以針對一些應用、一些需求自己制定的一些協議。下面來分享一些常見的自定義協議:

常見的自定義協議

在我們嵌入式開發中,自定義協議的應用很多。例如上下位機之間的通訊、控制器與控制器之間的通訊、服務器與設備終端之間的通訊等。自定義協議也沒有什麼特定的規範、標準,可以很靈活地制定,只要能滿足開發需要即可。下面依舊以實例來做分享:

例子一(典型):

之前有個物聯網項目,服務器往我們終端設備發送的協議數據類似於:

嵌入式中自定義協議的一些典型例子

我們設備終端需要用到協議數據中字段的實際數據,整個數據包是字符串的形式,這時候可以用sscanf函數來做解析:

嵌入式中自定義協議的一些典型例子


關於sscanf函數就不做解釋了,不會的朋友自行百度。sscanf函數在做類似的解析非常好用,很多時候都可以使用。如:

嵌入式中自定義協議的一些典型例子

嵌入式中自定義協議的一些典型例子

因為是兩端通訊,當然要確保通訊的正確性。比如服務器往設備發送數據,怎麼知道有沒有發送,這就得設備端在收到數據的同時回應相應的數據包。可以使用與sscanf函數相對應的sprintf函數做組包操作。比如(這個sprintf例子與上例無關,只是為了說明一下sprintf的用法):

嵌入式中自定義協議的一些典型例子

一端給另一端發送數據一般有兩種,以設備端在往服務端發送數據為例:

(1)當設備收到服務端的數據時,會回應與之對應的數據,這稱為被動應答。

(2)設備主動給服務端發送數據,例如設備常常定時、主動地給服務端發送一些時間戳信息等(俗稱心跳包),這樣服務端就知道設備是在正常工作的(活著的狀態)。這稱為主動發送或主動申請。

在處理這些字符串形式的協議數據的時候用sscanf、sprintf、strcmp、strstr、strcat等函數非常方便,有時候可以搭配正則表達式來做匹配。


例子二(典型):

之前有個項目需要從控制板顯示主控制板的運行狀態,兩控制板之間使用的底層協議為485協議。上層協議(從控板接收數據協議)如:

嵌入式中自定義協議的一些典型例子

這裡省略的部分為其他信息,比如整個數據包的長度等。

解析函數如:


嵌入式中自定義協議的一些典型例子

這裡的應用比較簡單,只是解析一個報警信息來顯示。有時候需要用到整個數據包裡的數據,這時候我們可以建立一個結構體來保存所有我們需要的數據,這樣方便我們清晰、有條理地對數據進行處理。例如:

嵌入式中自定義協議的一些典型例子


例子三(其它):

上面的兩個例子中的自定義協議是比較典型的、用得比較多的。下面也分享其它我自己的一些例子,很多時候為了滿足我們自己通訊應用的需要,我們也會自己建立一些自己的小協議來滿足我們的需求。

(1)例子一

之前使用串口屏與STM32通訊的時候,我們有制定一些對應的協議。

為了讓STM32能識別我串口屏不同頁面發送的數據,必須要制定一條協議來識別頁面:

嵌入式中自定義協議的一些典型例子

這樣,每切換至不同的頁面時,就會往STM32發送關於頁面的協議數據,這樣我們就可以知道當前處於哪個界面。

為了讓STM32能接收到正確的WiFi設置信息(如何區分WiFi名與密碼),必須要給WiFi信息添加一些輔助協議數據,如:

嵌入式中自定義協議的一些典型例子

相應的解析處理函數:

嵌入式中自定義協議的一些典型例子


(2)例子二

之前在一個單相用電器監測的應用中,有用到zigbee無線通訊,即其中一塊控制板做採集板。另一塊控制板做顯示板,有些朋友可能會有疑問為什麼不做在同一塊板上?其實這是一道全國大學生電賽題,我們只是根據題目要求來做的:

嵌入式中自定義協議的一些典型例子

我們當時在做這個通訊時也是有制定一個簡單的協議,在數據前面加個標識,就像JSON格式數據的鍵值對。

我們制定的協議如:

嵌入式中自定義協議的一些典型例子

相應的解析及結果:

嵌入式中自定義協議的一些典型例子

嵌入式中自定義協議的一些典型例子


類似這樣子的協議解析實際上是有套路的,摸清楚這些套路之後以後在做類似應用的時候其實就很簡單了。重點掌握sscanf、sprintf、strcmp、strstr、strcat等函數以及上面的兩種典型例子。小編在三個地方搬過磚,每個地方都有用到類似的自定義協議,而且都形成專門的協議文檔,每次做類似通訊類的應用的時候,都會按照這樣已份協議文檔來修改以適應不同的項目。

以上就是本次分享的關於嵌入式中自定義協議的一些筆記,希望各位看官喜歡。如有錯誤,歡迎指出,謝謝!


分享到:


相關文章: