0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

網(wǎng)絡(luò)協(xié)議棧:MQTT的報(bào)文格式解析

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:Rice嵌入式開發(fā)技術(shù)分享 ? 作者:Rice嵌入式開發(fā)技術(shù) ? 2021-05-13 14:06 ? 次閱讀

在上一篇文章,直接在本地搭建了服務(wù)器和客戶端,簡(jiǎn)單的實(shí)踐了MQTT的用法。而這一篇來解析MQTT的報(bào)文格式。MQTT的報(bào)文字段很精簡(jiǎn)。但是解析起來還是有些復(fù)雜的。

解析報(bào)文最好的工具是采用wireshark抓包,不過我發(fā)現(xiàn),wireshark的2.xxx的版本無法進(jìn)行回環(huán)抓包(即無法抓取127.0.0.1的數(shù)據(jù)報(bào)文)。通過一番度娘,發(fā)現(xiàn)新版本的wireshark用Npcap替換WinPcap,Npcap是基于WinPcap 4.1.3開發(fā)的,api兼容WinPcap。

030

MQTT報(bào)文

MQTT報(bào)文格式

MQTT的報(bào)文字段主要包含3部分,如下表:

名稱 說明
Fixed header(固定報(bào)文頭) 所有MQTT報(bào)文都包含
Variable header(可變報(bào)文頭) 只有部分MQTT報(bào)文包含
Payload(MQTT數(shù)據(jù)段) 只有部分MQTT報(bào)文包含

MQTT固定報(bào)文頭[Fixed header]

每個(gè)MQTT報(bào)文都包含一個(gè)固定報(bào)文頭,固定報(bào)文頭部格式如下:

bit76543210 +-----+-----+-----+-----+-----+-----+-----+-----+-----+ |Byte1|MQTT控制報(bào)文類型|指定控制報(bào)文類型的標(biāo)志| +-----+-----------------------------------------------| |Byte2|剩余長(zhǎng)度| +-----+-----------------------------------------------| |...|剩余長(zhǎng)度| +-----------------------------------------------------|

MQTT控制報(bào)文類型

MQTT的控制報(bào)文類型在固定報(bào)文頭的第1個(gè)字節(jié)的4 ~ 7bit,共4位無符號(hào)值。這些值如下表描述:

類型 報(bào)文方向 描述
RESERVED 0 禁止 保留
CONNECT 1 客戶端到服務(wù)端 客戶端請(qǐng)求連接服務(wù)器
CONNACK 2 服務(wù)端到客戶端 連接報(bào)文確認(rèn)
PUBLISH 3 雙向 發(fā)布消息
PUBACK 4 雙向 QoS 1消息發(fā)布收到確認(rèn)
PUBREC 5 雙向 發(fā)布收到(保證交付第一步)
PUBREL 6 雙向 發(fā)布釋放(保證交付第二步)
PUBCOMP 7 雙向 QoS 2消息發(fā)布完成
SUBSCRIBE 8 客戶端到服務(wù)端 客戶端訂閱請(qǐng)求
SUBACK 9 服務(wù)端到客戶端 訂閱請(qǐng)求報(bào)文確認(rèn)
UNSUBSCRIBE 10 客戶端到服務(wù)端 客戶端取消訂閱請(qǐng)求
UNSUBACK 11 服務(wù)端到客戶端 取消訂閱請(qǐng)求報(bào)文確認(rèn)
PINGREQ 12 客戶端到服務(wù)端 心跳請(qǐng)求
PINGRESP 13 服務(wù)端到客戶端 心跳響應(yīng)
DISCONNECT 14 客戶端到服務(wù)端 客戶端斷開連接
RESERVED 15 禁止 保留

MQTT控制報(bào)文標(biāo)志

MQTT的控制報(bào)文標(biāo)志在固定報(bào)文頭的第1個(gè)字節(jié)的4 ~ 7bit,包含每個(gè)MQTT報(bào)文類型的特定的標(biāo)志。

注意:如果接收方收到非法的標(biāo)志,接受者必須關(guān)閉網(wǎng)絡(luò)連接。標(biāo)志如下表:

其中:

DUP:控制報(bào)文的重復(fù)分發(fā)標(biāo)志

QoS:PUBLISH報(bào)文的服務(wù)質(zhì)量等級(jí)

RETAIN:PUBLISH報(bào)文的保留標(biāo)志

類型 報(bào)文標(biāo)志 Bit3 Bit2 Bit1 Bit0
CONNECT Reserved 0 0 0 0
CONNACK Reserved 0 0 0 0
PUBLISH Used in MQTT 3.1.1 DUP QoS QoS RETAIN
PUBACK Reserved 0 0 0 0
PUBREC Reserved 0 0 0 0
PUBREL Reserved 0 0 1 0
PUBCOMP Reserved 0 0 0 0
SUBSCRIBE Reserved 0 0 1 0
SUBACK Reserved 0 0 0 0
UNSUBSCRIBE Reserved 0 0 1 0
UNSUBACK Reserved 0 0 0 0
PINGREQ Reserved 0 0 0 0
PINGRESP Reserved 0 0 0 0
DISCONNECT Reserved 0 0 0 0

MQTT報(bào)文剩余長(zhǎng)度

剩余長(zhǎng)度字段從固定報(bào)文頭的第2個(gè)字節(jié)開始,最長(zhǎng)可達(dá)4個(gè)字節(jié),所以剩余長(zhǎng)度訪問是Byte[2 ~ 5]。

剩余長(zhǎng)度表示當(dāng)前報(bào)文剩余部分的字節(jié)數(shù),包含可變頭部和Payload。

上面的描述,那么怎么確定其長(zhǎng)度用幾個(gè)字節(jié)來描述呢?答案:取決于字節(jié)的最高位Bit7(默認(rèn)都是在搞自己在前);如果Bit7為1,那么需要繼續(xù)計(jì)算字節(jié)長(zhǎng)度,如果Bit7為0,那么不需要繼續(xù)計(jì)算字節(jié)長(zhǎng)度。

消息長(zhǎng)度可以簡(jiǎn)單理解為128禁止的數(shù)據(jù),4位長(zhǎng)度最大可以表示:128 * 128 * 128 * 128 Byte = 256MB。

需注意計(jì)算規(guī)則,低位在前,高位在后,字節(jié)最高位Bit7標(biāo)記是否繼續(xù)計(jì)算消息長(zhǎng)度。其消息長(zhǎng)度范圍如下表:

字節(jié) 最小值 最大值
1 0(0x00) 127(0x7F)
2 128(0x80, 0x01) 16383(0xFF, 0X7F)
3 16384(0x80, 0x80, 0x01) 2097151(0xFF, 0xFF, 0x7F)
4 2097152(0x80, 0x80, 0x80, 0x01) 268435455(0xFF, 0xFF, 0xFF, 0x7F)

舉例:

第一字節(jié)最高位是1,需要繼續(xù)向后計(jì)算,去掉標(biāo)記位(0xC1%128),得到1000001=41

第二字節(jié)最高位是1,需要繼續(xù)向后計(jì)算,去掉標(biāo)記位(0xC2%128),得到1000010=42

第三字節(jié)最高位是0,不需要向后計(jì)算,其結(jié)果就是0x33=51

因?yàn)榈臀辉谇?,高位在后,即消息長(zhǎng)度為:41 + 42 * 128 + 51 * 128 * 128=841001Byte = 821KB

0xC1 = 11000001

0xC2 = 11000010

0x33 = 00110011

消息長(zhǎng)度是0x60,其二進(jìn)制是01100000b,字節(jié)最高位Bit7位0,所以不需要往后計(jì)算,其十進(jìn)制是96(即消息長(zhǎng)度為96個(gè)字節(jié))。

消息長(zhǎng)度是0xC1, 0xC2, 0x33。分別二進(jìn)制為:

MQTT可變報(bào)文頭[Variable header]

在某些MQTT控制報(bào)文包含了一個(gè)可變報(bào)文頭部分,它在固定報(bào)文頭和payload之間,可變報(bào)頭的內(nèi)容根據(jù)報(bào)文類型的不同而不同,可變報(bào)頭的報(bào)文標(biāo)識(shí)符(Packet Identifier)字段存在與多個(gè)類型的報(bào)文里??勺儓?bào)頭其實(shí)就是MQTT開發(fā)中使用的Packet ID,通過Packet ID 進(jìn)行一些操作確認(rèn)。包含Packet ID的報(bào)文類型如下:

類型 包含可變報(bào)文頭
PUBLISH √(QoS > 0)
PUBACK
PUBREC
PUBREL
PUBCOMP
SUBSCRIBE
SUBACK
UNSUBSCRIBE
UNSUBACK

Packet ID默認(rèn)是從1開始并自增,如果一個(gè)Packet ID被用完后,這個(gè)Packet ID可以被重用。對(duì)于PUBLISH(QoS 1)來說,如果發(fā)送端接收到PUBACK,那么這個(gè)Packet ID就用完了。對(duì)于PUBLISH(QoS 2),如果接收方收到PUBCOMP,那么這個(gè)Packet ID就用完了。對(duì)于SUBSCRIBE和UNSUBSCRIBE,Packet ID使用完成的標(biāo)記是發(fā)送方收到了對(duì)應(yīng)的SUBACK和UNSUBACK。

MQTT數(shù)據(jù)段[Payload]

MQTT中有些報(bào)文類型是包含Payload

如PUBLISH的Payload指消息內(nèi)容。

如CONNECT的Payload指Client Identifier,Will Topic,Will Message,Username,Password等信息

包含Payload的報(bào)文類型如下:

類型 包含Payload
CONNECT
PUBLISH 可選
SUBSCRIBE
SUBACK
UNSUBSCRIBE

通過wireshark分析MQTT報(bào)文

因?yàn)槲覀兊姆?wù)器和客戶端是在PC上搭建的,所以需要通過wireshark的回環(huán)抓包,來分析報(bào)文類型CONNECT和CONNACK。

打開wireshark,選擇進(jìn)行回環(huán)抓包

使用MQTT.fx創(chuàng)建一個(gè)客戶端,點(diǎn)擊連接,便可以抓到CONNECT和CONNACK的報(bào)文。

紅色圈子的報(bào)文類型CONNECT的內(nèi)容:

c4fb05c0-b31f-11eb-bf61-12bb97331649.png

內(nèi)容: 1025 00044d515454 04 c2 003c 0008636c69656e743031 000561646d696e 00083132333435363738

報(bào)文類型CONNECT內(nèi)容分析:

0x10:高四位0001,代表報(bào)文類型:CONNECT。

0x25:二進(jìn)制-0010 0101,Bit7為0,所以剩余長(zhǎng)度只有一個(gè)字節(jié)長(zhǎng),即0x25十進(jìn)制:37個(gè)字節(jié)

0x00 0x04 0x4d 0x51 0x54 0x54:其中-0x00,0x04表示協(xié)議長(zhǎng)度;0x4d 0x51 0x54 0x54對(duì)應(yīng) "M", "Q", "T", "T"。

0x04:代表MQTT版本號(hào):v3.1.1

0xc2: 次字節(jié)含義如下表,該字節(jié)描述緊跟數(shù)據(jù)有 User Name、Password,沒有遺囑設(shè)置,選擇了清理會(huì)話方式與服務(wù)器連接。

Bit 7 6 5 4 3 2 1 0
含義 User Name Flag Password Flag Will Retain Flag Will QoS MSB Will QoS LSB Will Flag Clean session Rreserved
1 1 0 0 0 0 1 0


00 3c:對(duì)應(yīng)十進(jìn)制為60,即保持連接(Keep Alive)60秒,以秒為單位,它是指在客戶端傳輸完成一個(gè)控制報(bào)文的時(shí)刻到發(fā)送下一個(gè)報(bào)文的時(shí)刻,兩者之間允許空閑的最大時(shí)間間隔。客戶端負(fù)責(zé)保證控制報(bào)文發(fā)送的時(shí)間間隔不超過保持連接的值。如果沒有任何其它的控制報(bào)文可以發(fā)送,客戶端 必須發(fā)送一個(gè)PINGREQ 報(bào)文。客戶端隨時(shí)可以發(fā)送ping指令,服務(wù)器如果發(fā)現(xiàn)在KeepAalive時(shí)間內(nèi)沒有收到客戶端的消息,會(huì)自動(dòng)斷開與客戶端建立的連接。

00 08 63 6c 69 65 6e 74 30 31:其中-0x00, 0x08表示clientID的長(zhǎng)度8個(gè)字節(jié);0x63,0x6c,0x69,0x65,0x6e,0x74,0x30,0x31:代表client01。即是我們?cè)贛QTT.fx創(chuàng)建客戶端的時(shí)候設(shè)置clientID。

00 05 61 64 6d 69 6e:其中-0x00,0x05表示User Name的的長(zhǎng)度5個(gè)字節(jié);0x61,0x64,0x6d,0x69,0x6e:代表User Name為admin,即是我們?cè)贛QTT.fx創(chuàng)建客戶端的時(shí)候設(shè)置User Name。

00 08 31 32 33 34 35 36 37 38:其中-0x00,0x08表示User Name的的長(zhǎng)度8個(gè)字節(jié);0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38:代表Password為12345678,即是我們?cè)贛QTT.fx創(chuàng)建客戶端的時(shí)候設(shè)置Password。

紅色圈子的報(bào)文類型CONNACK的內(nèi)容:

c5174456-b31f-11eb-bf61-12bb97331649.png

內(nèi)容: 20 02 00 00

報(bào)文類型CONACK內(nèi)容分析:

20:高四位0010,代表報(bào)文類型:CONNACK。

02:二進(jìn)制-0000 0010,Bit為0,所以剩余長(zhǎng)度只有一個(gè)字節(jié)長(zhǎng),即0x02十進(jìn)制:2個(gè)字節(jié)。

00:可變頭部的第一個(gè)字節(jié)的第0位連接確認(rèn)。

c5331d3e-b31f-11eb-bf61-12bb97331649.png

00:可變頭部的第二個(gè)字節(jié)。

返回碼響應(yīng) 描述
0 0x00連接已接受 連接已被服務(wù)器接受
1 0x01連接已拒絕,不支持的協(xié)議版本 服務(wù)器不支持客戶端請(qǐng)求的協(xié)議版本
2 0x02連接已拒絕,不合格的客戶端ID 客戶端ID是正確的UTF-8碼,但服務(wù)器不允許使用
3 0x03連接已拒絕,服務(wù)端不可用 網(wǎng)絡(luò)連接已建立,但MQTT服務(wù)不可用
4 0x04連接已拒絕,無效的用戶名或密碼 用戶名或密碼的數(shù)據(jù)格式無效
5 0x05連接已拒絕,未授權(quán) 客戶端未被授權(quán)連接到此服務(wù)器
6-255 Reserved 保留

原文標(biāo)題:教你動(dòng)手寫網(wǎng)絡(luò)協(xié)議棧-MQTT報(bào)文解析6-解析

文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:教你動(dòng)手寫網(wǎng)絡(luò)協(xié)議棧-MQTT報(bào)文解析6-解析

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)

    網(wǎng)絡(luò)協(xié)議是操作系統(tǒng)核心的一個(gè)重要組成部分,負(fù)責(zé)管理網(wǎng)絡(luò)通信中的數(shù)據(jù)包處理。在 Linux 操作系統(tǒng)中,網(wǎng)絡(luò)
    的頭像 發(fā)表于 09-10 09:51 ?194次閱讀
    Linux<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>的實(shí)現(xiàn)

    自動(dòng)售貨機(jī)MDB協(xié)議中文解析(四)通信格式

    自動(dòng)售貨機(jī)MDB協(xié)議中文解析(四)通信格式
    發(fā)表于 09-09 10:45 ?1次下載

    IEC101、IEC103、IEC104、Modbus報(bào)文解析工具

    IEC101\IEC104\IEC103\Modebus報(bào)文解析軟件,可有效解析上述協(xié)議的各種類型報(bào)文
    的頭像 發(fā)表于 09-02 09:56 ?348次閱讀
    IEC101、IEC103、IEC104、Modbus<b class='flag-5'>報(bào)文</b><b class='flag-5'>解析</b>工具

    基于MQTT協(xié)議云平臺(tái)的Modbus轉(zhuǎn)MQTT網(wǎng)關(guān)

    鋇錸Modbus轉(zhuǎn)MQTT網(wǎng)關(guān)BL100是一款高性能、高性價(jià)比的物聯(lián)網(wǎng)網(wǎng)關(guān),它支持將Modbus協(xié)議(包括Modbus RTU和Modbus TCP)的數(shù)據(jù)轉(zhuǎn)換為MQTT協(xié)議的數(shù)據(jù)
    的頭像 發(fā)表于 07-29 17:59 ?605次閱讀
    基于<b class='flag-5'>MQTT</b><b class='flag-5'>協(xié)議</b>云平臺(tái)的Modbus轉(zhuǎn)<b class='flag-5'>MQTT</b>網(wǎng)關(guān)

    如何通過北向MQTT自定義報(bào)文格式對(duì)接到物聯(lián)網(wǎng)云平臺(tái)

    不管是公有物聯(lián)網(wǎng)云平臺(tái),還是自建云平臺(tái),幾乎都會(huì)支持MQTT協(xié)議,雖然設(shè)備和云平臺(tái)之間都支持MQTT協(xié)議,但是雙方卻無法進(jìn)行很好的交互上。因?yàn)槊總€(gè)公司定義json
    的頭像 發(fā)表于 06-03 17:11 ?312次閱讀
    如何通過北向<b class='flag-5'>MQTT</b>自定義<b class='flag-5'>報(bào)文格式</b>對(duì)接到物聯(lián)網(wǎng)云平臺(tái)

    modbus報(bào)文解析,modbus報(bào)文格式詳解

    支持點(diǎn)對(duì)點(diǎn)和多點(diǎn)通信,可以實(shí)現(xiàn)控制器之間的通信。 Modbus報(bào)文是Modbus協(xié)議中的基本通信單位。Modbus報(bào)文包含一個(gè)頭部和數(shù)據(jù)部分。頭部包含了從站地址、功能碼和數(shù)據(jù)長(zhǎng)度等信息,數(shù)據(jù)部分包含了請(qǐng)求或響應(yīng)數(shù)據(jù)。 1. 地址
    的頭像 發(fā)表于 04-16 15:16 ?2238次閱讀

    CAN報(bào)文為什么會(huì)發(fā)送失?。?/a>

    怎么樣的。表1是一幀正常標(biāo)準(zhǔn)數(shù)據(jù)幀的報(bào)文組成。表1標(biāo)準(zhǔn)數(shù)據(jù)幀報(bào)文格式組成圖1標(biāo)準(zhǔn)數(shù)據(jù)幀格式CAN總線是一種基于廣播的通訊方式,為了保證總線上的每一個(gè)正常節(jié)點(diǎn)都能正
    的頭像 發(fā)表于 04-12 08:25 ?1637次閱讀
    CAN<b class='flag-5'>報(bào)文</b>為什么會(huì)發(fā)送失???

    CAN的報(bào)文格式和發(fā)送總流程

    在標(biāo)準(zhǔn)格式中,報(bào)文的起始位稱為幀起始(SOF),然后是由11位標(biāo)識(shí)符和遠(yuǎn)程發(fā)送請(qǐng)求位(RTR)組成的仲裁場(chǎng)。RTR位標(biāo)明是數(shù)據(jù)幀還是請(qǐng)求幀,在請(qǐng)求幀中沒有數(shù)據(jù)字節(jié)。
    發(fā)表于 04-11 10:07 ?7893次閱讀
    CAN的<b class='flag-5'>報(bào)文格式</b>和發(fā)送總流程

    通信網(wǎng)絡(luò)協(xié)議之UDP協(xié)議技術(shù)解析

    在通常的網(wǎng)絡(luò)協(xié)議中,TCP/IP協(xié)議是一個(gè)常見的示例,其中UDP和TCP都是傳輸層協(xié)議。傳輸
    發(fā)表于 02-01 11:00 ?786次閱讀
    通信<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>之UDP<b class='flag-5'>協(xié)議</b>技術(shù)<b class='flag-5'>解析</b>

    11種協(xié)議報(bào)文格式介紹

    用16bit表示所以端口號(hào)范圍為0~65535,用來標(biāo)識(shí)源主機(jī)和目的主機(jī)上的進(jìn)程,用于運(yùn)輸層的多路復(fù)用和多路分解。
    的頭像 發(fā)表于 01-17 10:19 ?1194次閱讀
    11種<b class='flag-5'>協(xié)議</b><b class='flag-5'>報(bào)文格式</b>介紹

    modbus報(bào)文解析,modbus報(bào)文格式詳解

    支持點(diǎn)對(duì)點(diǎn)和多點(diǎn)通信,可以實(shí)現(xiàn)控制器之間的通信。 Modbus報(bào)文是Modbus協(xié)議中的基本通信單位。Modbus報(bào)文包含一個(gè)頭部和數(shù)據(jù)部分。頭部包含了從站地址、功能碼和數(shù)據(jù)長(zhǎng)度等信息,數(shù)據(jù)部分包含了請(qǐng)求或響應(yīng)數(shù)據(jù)。 ? 1.
    的頭像 發(fā)表于 01-09 16:45 ?5453次閱讀

    IPv4報(bào)文格式各字段的含義

    Version版本 4Bit :ip報(bào)文中,用來表示該協(xié)議采用的是那一個(gè)版本的ip,相同版本的ip才能進(jìn)行通信。一般此處的值為4,表示ipv4。
    的頭像 發(fā)表于 12-13 09:43 ?2466次閱讀
    IPv4<b class='flag-5'>報(bào)文格式</b>各字段的含義

    關(guān)于TCP協(xié)議總結(jié)的硬核干貨

    本文給出TCP報(bào)文格式的詳細(xì)說明,介紹網(wǎng)絡(luò)數(shù)據(jù)包傳遞中如何進(jìn)行地址解析、建立TCP連接的三次握手過程以及斷開TCP連接的四次揮手過程。
    發(fā)表于 11-17 09:26 ?433次閱讀
    關(guān)于TCP<b class='flag-5'>協(xié)議</b>總結(jié)的硬核干貨

    TCP協(xié)議詳細(xì)解析

    TCP是TCP/IP協(xié)議族中一個(gè)最核心的協(xié)議,它向下使用網(wǎng)絡(luò)層IP協(xié)議,向上為應(yīng)用層HTTP、FTP、SMTP、POP3、SSH、Telnet等協(xié)議
    的頭像 發(fā)表于 11-03 09:14 ?4086次閱讀
    TCP<b class='flag-5'>協(xié)議</b>詳細(xì)<b class='flag-5'>解析</b>

    CAN協(xié)議與LIN協(xié)議介紹

    CAN協(xié)議 汽車CAN協(xié)議是一種軟件組件,用于實(shí)現(xiàn)汽車電子系統(tǒng)中的CAN總線通信功能。它包含了一系列的功能軟件,用于處理CAN總線的物理層和數(shù)據(jù)鏈路層的通信
    的頭像 發(fā)表于 10-27 16:16 ?2752次閱讀
    CAN<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>與LIN<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>介紹