源代碼:
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。<