<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【后附源碼】全網(wǎng)唯一MQTT結(jié)構(gòu)分析,不進(jìn)來(lái)看看?

          共 5309字,需瀏覽 11分鐘

           ·

          2021-03-25 17:14


          全網(wǎng)唯一物聯(lián)網(wǎng)MQTT協(xié)議報(bào)文

          結(jié)構(gòu)分析以及基于C#代碼的報(bào)文組裝實(shí)現(xiàn)

          介紹

          MQTT是一種基于TCP/IP協(xié)議的應(yīng)用層協(xié)議,它規(guī)定了不同應(yīng)用之間進(jìn)行數(shù)據(jù)交換時(shí)的傳送格式。既然是協(xié)議,理論上可以被任何開(kāi)發(fā)語(yǔ)言實(shí)現(xiàn)它,以運(yùn)行在任何平臺(tái),這個(gè)特性就可以將所有可聯(lián)網(wǎng)的物品通過(guò)此協(xié)議的方式進(jìn)行數(shù)據(jù)通信,這是其一,之所以被物聯(lián)網(wǎng)所青睞,還因?yàn)樗膸讉€(gè)主要的特性:

          1、使用發(fā)布/訂閱消息模式,提供一對(duì)多的消息發(fā)布,解除耦合,各終端之間無(wú)關(guān)

          2、對(duì)負(fù)載內(nèi)容屏蔽的消息傳輸,可以對(duì)消息訂閱者所接受到的內(nèi)容有所屏蔽

          3、具體有三種消息發(fā)布的服務(wù)質(zhì)量(以后細(xì)說(shuō))

          4、小型傳輸,開(kāi)銷(xiāo)小,固定長(zhǎng)度的頭部是 2 字節(jié),協(xié)議交換最小化,以降低網(wǎng)絡(luò)流量

          5、使用Last Will和Testament特性通知有關(guān)各方客戶端異常中斷的機(jī)制

          應(yīng)用實(shí)現(xiàn)

          為了更方便的抓包分析,進(jìn)行了MQTT協(xié)議的服務(wù)端與客戶端的應(yīng)用實(shí)現(xiàn)

          運(yùn)行機(jī)制

          服務(wù)端:通過(guò)云端一個(gè)服務(wù)器程序開(kāi)啟MQTT服務(wù)器(Broker),常見(jiàn)的如EMQ

          客戶端:不管是IoT管理應(yīng)用程序還是IoT設(shè)備,都屬性于客戶端程序

          訂閱:各客戶端程序如果想要接收到別人發(fā)送過(guò)來(lái)的數(shù)據(jù),就需要訂閱一個(gè)主題(Topic)

          發(fā)布:任何客戶端都可以根據(jù)一個(gè)主題向服務(wù)器發(fā)布消息,服務(wù)器會(huì)根據(jù)訂立記錄,將消息推送至訂閱了對(duì)應(yīng)主題的客戶端


          數(shù)據(jù)傳輸格式

          MQTT報(bào)文大體上包含三大部分:固定報(bào)頭、可變報(bào)頭、報(bào)文載荷,整體結(jié)構(gòu)如下

          固定報(bào)頭

          第一個(gè)字節(jié)中高4位保存了消息的類(lèi)型信息,包含1-14種類(lèi)型(5.0版本擴(kuò)充了第15個(gè):認(rèn)證交換)

          1 CONNECT – 連接服務(wù)端

          2 CONNACK – 確認(rèn)連接請(qǐng)求

          3 PUBLISH – 發(fā)布消息

          4 PUBACK –發(fā)布確認(rèn)

          5 PUBREC – 發(fā)布收到(QoS 2,第一步)

          6 PUBREL – 發(fā)布釋放(QoS 2,第二步)

          7 PUBCOMP – 發(fā)布完成(QoS 2,第三步)

          8 SUBSCRIBE - 訂閱主題

          9 SUBACK – 訂閱確認(rèn)

          10 UNSUBSCRIBE –取消訂閱

          11 UNSUBACK – 取消訂閱確認(rèn)

          12 PINGREQ – 心跳請(qǐng)求

          13 PINGRESP – 心跳響應(yīng)

          14 DISCONNECT – 斷開(kāi)連接

          15 AUTH – 認(rèn)證交換

          可變報(bào)頭

          報(bào)文載荷

          報(bào)文截獲

          利用 WireShark進(jìn)行報(bào)文截獲,以連接請(qǐng)求報(bào)文為例:

          C#代碼實(shí)現(xiàn)

          此處以客戶端發(fā)送連接請(qǐng)求為例,完整報(bào)文拼接實(shí)例如下

          static void Main(string[] args){    Console.WriteLine("歡迎關(guān)注朝夕教育,我是Jovan");    try    {        string ip = "127.0.0.1";        int port = 1883;        string username = "admin";        string password = "123456";        string clientId = "C001";
                 //        Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);        socketClient.Connect(ip, port);        Console.WriteLine(">>> TCP 連接通道已建立");
                 // 建立MQTT連接        {            // 構(gòu)建MQTT報(bào)文            Listbytes = new List();
                     bytes.AddRange(new byte[] { 0, 4 });// Protocol Name Length            bytes.AddRange(Encoding.ASCII.GetBytes("MQTT"));// Protocol Name            bytes.Add(4);
                     byte flag = 0;            flag |= 128;// 用戶名標(biāo)記            flag |= 64; // 密碼標(biāo)記            flag |= 2;  // Clean Session 標(biāo)記            bytes.Add(flag);
                     // KeepAlive            byte[] bytesKeepAlive = BitConverter.GetBytes((int)TimeSpan.FromSeconds(100).TotalSeconds);            bytes.Add(bytesKeepAlive[1]);            bytes.Add(bytesKeepAlive[0]);
                     // ClientID            byte[] clienIdBytes = Encoding.ASCII.GetBytes(clientId);            bytes.Add((byte)(clienIdBytes.Length / 256));            bytes.Add((byte)(clienIdBytes.Length % 256));// 長(zhǎng)度占兩個(gè)字節(jié)            bytes.AddRange(clienIdBytes);
                     // UserName            byte[] usernameBytes = Encoding.ASCII.GetBytes(username);            bytes.Add((byte)(usernameBytes.Length / 256));            bytes.Add((byte)(usernameBytes.Length % 256));// 長(zhǎng)度占兩個(gè)字節(jié)            bytes.AddRange(usernameBytes);
                     // Password            byte[] passwordBytes = Encoding.ASCII.GetBytes(password);            bytes.Add((byte)(passwordBytes.Length / 256));            bytes.Add((byte)(passwordBytes.Length % 256));// 長(zhǎng)度占兩個(gè)字節(jié)            bytes.AddRange(passwordBytes);

                     byte[] bufferLen = new byte[] { (byte)bytes.Count };
                     MemoryStream memoryStream = new MemoryStream();            memoryStream.WriteByte(1 << 4);            memoryStream.Write(bufferLen, 0, (int)bufferLen.Length);            memoryStream.Write(bytes.ToArray(), 0, (int)bytes.Count);            byte[] array = memoryStream.ToArray();            memoryStream.Close();            socketClient.Send(array);        }    }    catch (Exception ex)    {        Console.WriteLine(ex.Message);    }    Console.ReadLine();}



          往期精彩回顧




          【推薦】.NET Core開(kāi)發(fā)實(shí)戰(zhàn)視頻課程 ★★★

          .NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門(mén)篇-開(kāi)篇及總體規(guī)劃

          【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開(kāi)篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴(lài)注入與動(dòng)態(tài)選擇看這篇就夠了

          10個(gè)小技巧助您寫(xiě)出高性能的ASP.NET Core代碼

          用abp vNext快速開(kāi)發(fā)Quartz.NET定時(shí)任務(wù)管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度

          現(xiàn)身說(shuō)法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議

          C#異步編程看這篇就夠了


          瀏覽 37
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本高清不卡视频 | 黄色网址国产 | 可以在线免费看黄片的网站 | 国内毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 豆花视频无码在线 |