• 正文
  • 推薦器件
  • 相關推薦
申請入駐 產業(yè)圖譜

嵌入式中,升級時涉及的協(xié)議兼容性問題?

2024/01/11
1539
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

大家好,我是雜燴君。

越來越多的硬件產品,硬件構成不僅僅是集成在一塊板子上,而是多塊控制板協(xié)同工作。

此時,就會涉及到多塊板之間的通信(有線/無線通信),就會涉及到到通信協(xié)議。很多時候,我們都會自定義一些協(xié)議。

我們之前在也分享一種常用的自定義協(xié)議格式:分享一種靈活性很高的協(xié)議格式(附代碼例子)

在多板系統(tǒng)中,會有以下這些應用場景:

    每塊板都有OTA升級的需求??赡苣硥K板是一塊公共的板子,其它項目也會同時使用,這塊公共板子軟件需要同時兼容多個項目。

我們在軟件迭代過程中,可能會涉及到板間交互的數(shù)據(jù)的升級,比如新增數(shù)據(jù)。

新增的某個數(shù)據(jù)屬性上屬于某個數(shù)據(jù)集合,比如與某個結構體是同類數(shù)據(jù),理論上為了程序設計得更合理些,應該把這個數(shù)據(jù)加在已有的結構體里面。

但是,這可能會涉及到兼容性問題。

如果直接往結構體里新增數(shù)據(jù),升級時,有些板子升級成功了,有些板子沒升級成功??赡芫蜁霈F(xiàn)數(shù)據(jù)異常導致功能異常。

公共板升級新增協(xié)議之后,可能就不能完全兼容與其通信的板子。

比如,有一條數(shù)據(jù)叫做設備信息的數(shù)據(jù)需要在板間通信,設備信息里包含了:設備IP、設備Mac。

#define??MSG_ID_DEV_INFO???0x0001

typedef?struct?_dev_info
{
?char?dev_ip[IP_MAX_LEN];
?char?dev_mac[MAC_MAX_LEN];
}dev_info_t;

此時,有新需求需要再加一個設備的sn,這個數(shù)據(jù)我們應該如何加?

如果是項目前中期,這時候還是在開發(fā)階段,我們可以隨意修改。因為設備sn也是設備信息的一部分,可以直接在設備信息這個數(shù)據(jù)里添加會比較合理:

#define??MSG_ID_DEV_INFO???0x0001

typedef?struct?_dev_info
{
?char?dev_ip[IP_MAX_LEN];
?char?dev_mac[MAC_MAX_LEN];
?char?dev_sn[SN_MAX_LEN];
}dev_info_t;

如果是項目后期,或已經(jīng)上市流通,則就需要考慮兼容性問題了。

針對這種兼容性問題,有如下解決方案:

方案一:新增的數(shù)據(jù)單獨走一條數(shù)據(jù)協(xié)議

比如針對以上例子,可以這么來擴展:

#define??MSG_ID_DEV_INFO???0x0001
#define??MSG_ID_DEV_SN?????0x0002

typedef?struct?_dev_info
{
?char?dev_ip[IP_MAX_LEN];
?char?dev_mac[MAC_MAX_LEN];
}dev_info_t;

typedef?struct?_dev_sn
{
????char?dev_sn[SN_MAX_LEN];
}dev_sn_t;

這種方案雖然能解決問題,但越到后面,程序會越來越亂,各種數(shù)據(jù)很散亂,很不好維護。

而且,一開始也不可能把所有數(shù)據(jù)都規(guī)劃得很完美。有沒有什么方法,可以比較合理地擴充數(shù)據(jù),并且也能應對這種兼容性問題。

看一下方案二。

方案二:項目設計初期,引入一些數(shù)據(jù)序列化庫。

比如protobuf。

Protocol Buffers,是Google公司開發(fā)的一種數(shù)據(jù)描述語言,類似于XML能夠將結構化數(shù)據(jù)序列化,可用于數(shù)據(jù)存儲、通信協(xié)議等方面。它不依賴于語言和平臺并且可擴展性極強。

同XML相比,Protocol buffers在序列化結構化數(shù)據(jù)方面有許多優(yōu)點:

消息格式升級和兼容性好

    支持跨平臺多語言序列化反序列化速度很快序列化后體積相比Json和XML很小,適合網(wǎng)絡傳輸

相關文章:

Protobuf:一種更小、更快、更高效的協(xié)議

干貨 | 項目乏力?nanopb助你一臂之力

干貨 | protobuf-c之嵌入式平臺使用

如何利用Google的protobuf,來實現(xiàn)自己的RPC框架

針對上面的例子,使用protobuf。

原來的數(shù)據(jù):

syntax?=?"proto2";
?
message?dev_info
{
????required?string?dev_ip????=?1;
????required?string?dev_mac???=?2;
}

新增數(shù)據(jù)dev_sn直接新增即可:

syntax?=?"proto2";
?
message?dev_info
{
????required?string?dev_ip????=?1;
????required?string?dev_mac???=?2;
????required?string?dev_sn????=?3;
}

以上就是本次的分享,歡迎收藏、轉發(fā)!

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
XLH730080.000000X 1 Integrated Device Technology Inc HCMOS Output Clock Oscillator, 80MHz Nom
暫無數(shù)據(jù) 查看
OPB100Z 1 TT Electronics Resistors LED Emitter
$7.92 查看
24LC64-I/SN 1 Microchip Technology Inc 8K X 8 I2C/2-WIRE SERIAL EEPROM, PDSO8, 3.90 MM, ROHS COMPLIANT, PLASTIC, SOIC-8

ECAD模型

下載ECAD模型
$0.29 查看

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

本公眾號專注于嵌入式技術,包括但不限于C/C++、嵌入式、物聯(lián)網(wǎng)、Linux等編程學習筆記,同時,公眾號內包含大量的學習資源。歡迎關注,一同交流學習,共同進步!