加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶(hù)
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

嵌入式中,升級(jí)時(shí)涉及的協(xié)議兼容性問(wèn)題?

01/11 10:50
2088
閱讀需 7 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

大家好,我是雜燴君。

越來(lái)越多的硬件產(chǎn)品,硬件構(gòu)成不僅僅是集成在一塊板子上,而是多塊控制板協(xié)同工作。

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

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

在多板系統(tǒng)中,會(huì)有以下這些應(yīng)用場(chǎng)景:

    每塊板都有OTA升級(jí)的需求??赡苣硥K板是一塊公共的板子,其它項(xiàng)目也會(huì)同時(shí)使用,這塊公共板子軟件需要同時(shí)兼容多個(gè)項(xiàng)目。

我們?cè)谲浖^(guò)程中,可能會(huì)涉及到板間交互的數(shù)據(jù)的升級(jí),比如新增數(shù)據(jù)。

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

但是,這可能會(huì)涉及到兼容性問(wèn)題。

如果直接往結(jié)構(gòu)體里新增數(shù)據(jù),升級(jí)時(shí),有些板子升級(jí)成功了,有些板子沒(méi)升級(jí)成功。可能就會(huì)出現(xiàn)數(shù)據(jù)異常導(dǎo)致功能異常。

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

比如,有一條數(shù)據(jù)叫做設(shè)備信息的數(shù)據(jù)需要在板間通信,設(shè)備信息里包含了:設(shè)備IP、設(shè)備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;

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

如果是項(xiàng)目前中期,這時(shí)候還是在開(kāi)發(fā)階段,我們可以隨意修改。因?yàn)樵O(shè)備sn也是設(shè)備信息的一部分,可以直接在設(shè)備信息這個(gè)數(shù)據(jù)里添加會(huì)比較合理:

#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;

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

針對(duì)這種兼容性問(wèn)題,有如下解決方案:

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

比如針對(duì)以上例子,可以這么來(lái)擴(kuò)展:

#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;

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

而且,一開(kāi)始也不可能把所有數(shù)據(jù)都規(guī)劃得很完美。有沒(méi)有什么方法,可以比較合理地?cái)U(kuò)充數(shù)據(jù),并且也能應(yīng)對(duì)這種兼容性問(wèn)題。

看一下方案二。

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

比如protobuf。

Protocol Buffers,是Google公司開(kāi)發(fā)的一種數(shù)據(jù)描述語(yǔ)言,類(lèi)似于XML能夠?qū)⒔Y(jié)構(gòu)化數(shù)據(jù)序列化,可用于數(shù)據(jù)存儲(chǔ)、通信協(xié)議等方面。它不依賴(lài)于語(yǔ)言和平臺(tái)并且可擴(kuò)展性極強(qiáng)。

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

消息格式升級(jí)和兼容性好

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

相關(guān)文章:

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

干貨 | 項(xiàng)目乏力?nanopb助你一臂之力

干貨 | protobuf-c之嵌入式平臺(tái)使用

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

針對(duì)上面的例子,使用protobuf。

原來(lái)的數(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;
}

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

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
MOCD207R2M 1 Fairchild Semiconductor Corporation Transistor Output Optocoupler, 2-Element, 2500V Isolation, LEAD FREE, PLASTIC, SOIC-8
$1.16 查看
DS24B33S+T&R 1 Maxim Integrated Products EEPROM, 4KX1, Serial, CMOS, PDSO8, 0.208 INCH, ROHS COMPLIANT, SOP-8
$2.75 查看
AFBR-5715APZ 1 Broadcom Limited Transceiver, 830nm Min, 860nm Max, 1250Mbps(Tx), LC Connector, Panel Mount, ROHS COMPLIANT
暫無(wú)數(shù)據(jù) 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

本公眾號(hào)專(zhuān)注于嵌入式技術(shù),包括但不限于C/C++、嵌入式、物聯(lián)網(wǎng)、Linux等編程學(xué)習(xí)筆記,同時(shí),公眾號(hào)內(nèi)包含大量的學(xué)習(xí)資源。歡迎關(guān)注,一同交流學(xué)習(xí),共同進(jìn)步!