C#應用:MQTT分析——CONNECT為例子

 源代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;namespace ConsoleApp1
{class Program{static void Main(string[] args){Connect();}/// <summary>/// 向服務器端發送請求,使用socket連接請求/// </summary>static void Connect(){Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);socket.Connect("127.0.0.1", 1883);//TCP三次握手//發送MQTT的登錄請求//固定報頭//第一個字節8個位,(消息類型4個位,DUP位1個位,Qos2個位,Retain1個位)//請求,根據固定報文控制類型,第一個請求為 00010000,表示從客戶端到服務器List<byte> list = new List<byte>();list.Add(0x10);//===========可變報頭+載荷部分==============List<byte> list2 = new List<byte>();//可變報頭由以下組成:協議名(MQTT)+協議級別+連接標志+保持連接string protocolName = "MQTT";byte[] probyet = Encoding.UTF8.GetBytes(protocolName);//MQTT對應的ascii碼的十六進制//協議長度list2.Add((byte)(probyet.Length / 256 % 256));list2.Add((byte)(probyet.Length % 256));list2.AddRange(probyet);//協議名稱list2.Add(0x04);//協議級別,只能是0x04//連接標志 一個字節(8位)//11000010byte flag = 0; //0000 0000flag |= 128;   //1000 0000//flag |=128 ==> 1000 0000或運算flag |= 64;    //0100 0000//flag |=64 ==>//1100 0000或運算flag |= 2;     //0000 0010//flag |=2  ==>//1100 0010list2.Add(flag);//keep alive保持連接int second = 100; //保持100秒,持續到150秒list2.Add((byte)(second / 256 % 256));list2.Add((byte)(second % 256));//有效載荷(客戶端標識符,遺囑主題,遺囑消息,用戶名,密碼)string clientStr = "JTVL";byte[] idBytes = Encoding.UTF8.GetBytes(clientStr); //ID的字節數組int idBytesLen = idBytes.Length; //ID字節數組的長度list2.Add((byte)(idBytes.Length / 256 % 256));list2.Add((byte)(idBytesLen % 256));list2.AddRange(idBytes); //添加ID字節數組//UserNamestring userName = "JT";byte[] nameByte = Encoding.UTF8.GetBytes(userName);list2.Add((byte)(nameByte.Length / 256 % 256));list2.Add((byte)(nameByte.Length % 256));list2.AddRange(nameByte);//Passwordstring passWord = "123";byte[] passByte = Encoding.UTF8.GetBytes(passWord);list2.Add((byte)(passByte.Length / 256 % 256));list2.Add((byte)(passByte.Length  % 256));list2.AddRange(passByte);//把可變報頭+載荷部分加到固定報頭的后面//添加固定報頭的第二個字節list.Add((byte)(list2.Count));//添加list.AddRange(list2);//發送連接請求報文socket.Send(list.ToArray());}}
}

一、知識基礎

1、C#的byte類型

在C#中,byte類型表示一個8位無符號整數(也稱為字節)。由于它是無符號的,它的值范圍是0到255,即 1111 1111

2、BitConverter.GetBytes

BitConverter.GetBytes(int) 的返回值為 byte數組 ,但是創建的數組容量為4個,如果不夠會依次增加4個,返回的順序是順序。即:如果是 256 ,則為 1 0000 0000 ,也就是第二個數組的值為1,第一個數組為0 ,而第三和第四為0;如果是 1 ,則為 0000 0001 ,第二第三第四值為0。<

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207112.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HarmonyOS應用程序框架——UIAbility實操

UIAbility概述 UIAbility是一種包含用戶界面的應用組件&#xff0c;主要用于和用戶進行交互。UIAbility也是系統調度的單元&#xff0c;為應用提供窗口在其中繪制界面。 每一個UIAbility實例&#xff0c;都對應于一個最近任務列表中的任務。 一個應用可以有一個UIAbility&…

Leetcode—901.股票價格跨度【中等】

2023每日刷題&#xff08;五十二&#xff09; Leetcode—901.股票價格跨度 算法思想 實現代碼 class StockSpanner { public:stack<pair<int, int>> st;int curday -1;StockSpanner() {st.emplace(-1, INT_MAX);}int next(int price) {while(price > st.top(…

油猴(Tampermonkey)瀏覽器插件簡單自定義腳本開發

介紹 瀏覽器插件&#xff0c;包括油猴插件和其他插件&#xff0c;通過它們可以實現瀏覽器網頁的定制化與功能增強。 其他插件一般只有某種具體的功能&#xff0c;且已經寫死而不能更改&#xff0c;比如Adblock插件只用于去廣告。 油猴插件是一款用于管理用戶腳本的插件&…

使用Rust 構建C 組件

協議解析&#xff0c;這不就很快了&#xff0c;而且原生的標準庫紅黑樹和avl 樹支持&#xff0c;異步tokio 這些庫&#xff0c;編寫應用組件就很快了 rust 標準庫不支持 unix 的消息隊列&#xff0c;但是支持 shm 和 uds&#xff0c;后者從多方面考慮都比&#xff0c;消息隊列更…

教育類直播介紹

教育類直播是一種在線教育形式&#xff0c;它允許學生和教師通過實時視頻通話進行互動學習。這種學習方式可以為學生提供更靈活的學習時間和地點&#xff0c;同時也可以幫助教師更好地與學生進行互動和指導。 在教育類直播中&#xff0c;學生可以通過網絡與教師和其他學生進行…

c/c++中一些不常用但有用的知識

1.變長數組 bool fun(int cnt) {unsigned char data[cnt];return true; } 在 C 語言中&#xff0c;變長數組&#xff08;Variable Length Arrays&#xff0c;VLA&#xff09;是 C99 標準引入的特性&#xff0c;允許使用變量來定義數組的長度。因此&#xff0c;在 C 版本的代碼…

快速在VMware虛擬機上運行Kali Linux(保姆級教程)

本期將演示如何在VMware虛擬機上快速、輕松地安裝Kali Linux。Kali Linux是一款專為滲透測試和網絡安全而設計的操作系統&#xff0c;擁有很多強大的工具和功能。 在運行任何虛擬機之前&#xff0c;一定要先確保已經打開主板BIOS上的虛擬化支持。 下載VMware 接著來到vmware的…

vue 一直運行 /sockjs-node/info?及 /sockjs-node/info報錯解決辦法

sockjs-node介紹 sockjs-node 是一個JavaScript庫&#xff0c;提供跨瀏覽器JavaScript的API&#xff0c;創建了一個低延遲、全雙工的瀏覽器和web服務器之間通信通道。 服務端&#xff1a;sockjs-node&#xff08;https://github.com/sockjs/sockjs-node&#xff09; 客戶端&a…

[全志Tina/Linux]全志修改bootlogo分區數據從而修改bootlogo

一、需求 在不進行鏡像燒錄的情況下&#xff0c;通過啟動項或腳本將已存在于主板的bootlogo文件更新到bootlogo分區中&#xff0c;從而實現bootlogo的更新 二、操作 1、在主板上查找bootlogo文件路徑 find -name bootlogo* 實機效果&#xff1a; 2、進入文件夾路徑 cd ./d…

Java網絡編程——對象的序列化與反序列化

當兩個進程進行遠程通信時&#xff0c;彼此可以發送各種類型的數據&#xff0c;如文本、圖片、語音和視頻等。無論是何種類型的數據&#xff0c;都會以二進制序列的形式在網絡上傳送。當兩個Java進程進行遠程通信時&#xff0c;一個進程能否把一個Java對象發送給另一個進程呢&a…

LeetCode 每日一題 Day 6(DFS+BFS)

1466. 重新規劃路線 n 座城市&#xff0c;從 0 到 n-1 編號&#xff0c;其間共有 n-1 條路線。因此&#xff0c;要想在兩座不同城市之間旅行只有唯一一條路線可供選擇&#xff08;路線網形成一顆樹&#xff09;。去年&#xff0c;交通運輸部決定重新規劃路線&#xff0c;以改變…

c語言詞法分析器

詞法分析器&#xff08;也稱為詞法解析器或詞法掃描器&#xff09;是編譯器的一個組成部分&#xff0c;它的任務是將輸入的源代碼&#xff08;字符流&#xff09;分解成稱為“標記”的序列&#xff0c;其中每個標記對應于源代碼中的一個單詞或符號。 以下是一個簡單的C語言詞法…

12月7日作業

使用QT模仿一個登陸界面&#xff08;模仿育碧Ubisoft登錄界面&#xff09; #include "myqq.h"MyQQ::MyQQ(QWidget *parent): QMainWindow(parent) {this->resize(880,550); //設置窗口大小this->setFixedSize(880,550); //固定窗口大小this->setStyleShee…

android 藍牙開關設置

frameworks/base/packages/SettingsProvider/res/values/defaults.xml <bool name"def_bluetooth_on">false</bool>將 def_bluetooth_on 的值設為false&#xff08;系統默認開啟值&#xff09; adb動態設置 關閉&#xff1a;adb shell settings put gl…

【華為OD題庫-082】TLV解析II-Java

題目 兩端通過TLVQ格式的報文來通信&#xff0c;現在收到對端的一個TLV格式的消息包&#xff0c;要求生成匹配后的(tag,length,valueOffset)列表。具體要求如下: (1)消息包中多組tag、length、value緊密排列&#xff0c;其中tag,length各占1字節(uint8),value所占字節數等于len…

SpringMVC 案例

文章目錄 前言1. 計算器1.1 準備前端代碼1.2 測試前端代碼1.3 完成后端代碼1.4 驗證程序 2. 留言板2.1 前端代碼準備2.2 測試前端代碼2.3 完成前后端交互代碼2.4 完成后端代碼2.5 案例測試2.6 完善前后端交互2.7 完善后端代碼2.8 完整功能測試 lombok簡單的方式添加Lombok工具3…

vue3使用mitt用于組件之間傳值

vue3已經沒有提供配套的事件總線bus&#xff0c;需要使用第三方庫mitt來完成vue2中bus完成的事情 1.安裝 npm install mitt2.引用 bus.js import mitt from mitt; const bus mitt(); export default bus;3.在需要使用的vue文件中導入bus import bus from ./mitt4.使用mitt…

HarmonyOS學習 第1節 DevEco Studio配置

俗話說的好&#xff0c;工欲善其事,必先利其器。我們先下載官方的開發工具DevEco Studio. 下載完成后&#xff0c;進行安裝。 雙擊DevEco Studio&#xff0c;點擊Next按照指引完成安裝 重新啟動DevEco&#xff0c;點擊 Agree 進入環境配置&#xff0c;安裝Node.js和ohpm 點擊Ne…

MQTT 協議入門:輕松上手,快速掌握核心要點

文章目錄 什么是 MQTT&#xff1f;MQTT 的工作原理MQTT 客戶端MQTT Broker發布-訂閱模式主題QoS MQTT 的工作流程開始使用 MQTT&#xff1a;快速教程準備 MQTT Broker準備 MQTT 客戶端創建 MQTT 連接通過通配符訂閱主題發布 MQTT 消息MQTT 功能演示保留消息Clean Session遺囑消…

【WPF】使用ObservableCollection解決:累積計數x與實際計數x不相同

使用觀察模式和集合 錯誤代碼 public List<IPAddress> iPAddressDevices new List<IPAddress>();public List<IPAddress> IPAddressDevices { get > iPAddressDevices; set {iPAddressDevices value;RaisePropertyChanged(nameof(IPAddressDevices));…