C# MQTT 服務端客戶端通訊


關於MQTT

在這里我就不做過多的介紹了 , 超時空連接點我

 MQTT示例

注: 該示例演示統一使用WPF, 簡單MVVM模式演示, 復制代碼需注意引用 NuGet包  GalaSoft

 

MQTT服務端建立:

演示界面:

 演示代碼:

 public class MainViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            ClientInsTances = new ObservableCollection<ClientInstance>();
        }

        IMqttServer mqttServer;  //MQTT服務端實例

        string message; 

        /// <summary>
        /// 消息   用於界面顯示
        /// </summary>
        public string Message
        {
            get { return message; }
            set { message = value; RaisePropertyChanged(); }
        }


        ObservableCollection<ClientInstance> clientInstances; //客戶端登陸緩存信息

        /// <summary>
        /// 客戶端實例
        /// </summary>
        public ObservableCollection<ClientInstance> ClientInsTances
        {
            get { return clientInstances; }
            set { clientInstances = value; RaisePropertyChanged(); }
        }

     //開啟MQTT服務
public void OpenMqttServer() { mqttServer = new MqttFactory().CreateMqttServer(); var options = new MqttServerOptions(); //攔截登錄 options.ConnectionValidator = c => { try { Message += string.Format("用戶嘗試登錄:用戶ID:{0}\t用戶信息:{1}\t用戶密碼:{2}", c.ClientId, c.Username, c.Password) + "\r\n"; if (string.IsNullOrWhiteSpace(c.Username)) { Message += string.Format("用戶:{0}登錄失敗,用戶信息為空", c.ClientId) + "\r\n"; c.ReturnCode = MQTTnet.Protocol.MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword; return; } //解析用戶名和密碼,這個地方需要改成查找我們自己創建的用戶名和密碼。 if (c.Username == "admin" && c.Password == "123456") { c.ReturnCode = MqttConnectReturnCode.ConnectionAccepted; Message += c.ClientId + " 登錄成功" + "\r\n"; ClientInsTances.Add(new ClientInstance() { ClientID = c.ClientId, UserName = c.Username, PassWord = c.Password }); return; } else { c.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword; Message += "用戶名密碼錯誤登陸失敗" + "\r\n"; return; } } catch (Exception ex) { Console.WriteLine("登錄失敗:" + ex.Message); c.ReturnCode = MqttConnectReturnCode.ConnectionRefusedIdentifierRejected; return; } }; //攔截訂閱 options.SubscriptionInterceptor = async context => { try { Message += "用戶" + context.ClientId + "訂閱" + "\r\n"; } catch (Exception ex) { Console.WriteLine("訂閱失敗:" + ex.Message); context.AcceptSubscription = false; } }; //攔截消息 options.ApplicationMessageInterceptor = context => { try { //一般不需要處理消息攔截 // Console.WriteLine(Encoding.UTF8.GetString(context.ApplicationMessage.Payload)); } catch (Exception ex) { Console.WriteLine("消息攔截:" + ex.Message); } }; mqttServer.ClientDisconnected += ClientDisconnected; mqttServer.ClientConnected += MqttServer_ClientConnected; mqttServer.Started += MqttServer_Started; mqttServer.StartAsync(options); } private void MqttServer_Started(object sender, EventArgs e) { Message += "消息服務啟動成功:任意鍵退出" + "\r\n"; } private void MqttServer_ClientConnected(object sender, MqttClientConnectedEventArgs e) { //客戶端鏈接 Message += e.ClientId + "連接" + "\r\n"; } private void ClientDisconnected(object sender, MqttClientDisconnectedEventArgs e) { //客戶端斷開 Message += e.ClientId + "斷開" + "\r\n"; } /// <summary> /// 客戶端推送信息 - 用於測試服務推送 /// </summary> /// <param name="clientID"></param> /// <param name="message"></param> public void SendMessage(string clientID, string message) { mqttServer.PublishAsync(new MqttApplicationMessage { Topic = clientID, QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce, Retain = false, Payload = Encoding.UTF8.GetBytes(message), }); } }

 

添加MQTT 客戶端登陸實例, 用於保存客戶的登陸信息, 如下:

 演示界面:

 

    /// <summary>
    /// 登陸客戶端信息
    /// </summary>
    public class ClientInstance : ViewModelBase
    {
        private string clientID;
        private string userName;
        private string passWord;

        /// <summary>
        /// 識別ID
        /// </summary>
        public string ClientID
        {
            get { return clientID; }
            set { clientID = value; RaisePropertyChanged(); }
        }

        /// <summary>
        /// 賬戶
        /// </summary>
        public string UserName
        {
            get { return userName; }
            set { userName = value; RaisePropertyChanged(); }
        }

        /// <summary>
        /// 密碼
        /// </summary>
        public string PassWord
        {
            get { return passWord; }
            set { passWord = value; RaisePropertyChanged(); }
        }


    }

 

 

 

MQTT客戶端建立:

演示代碼:

public class MainViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            clientID = new Random().Next(999, 9999) + ""; //測試隨機生成ClientID
        }

        IMqttClient mqttClient;  //MQTT客戶端實例

        string clientID; //機器ID


        string message;

        public string Message  //用於接收當前 消息
        {
            get { return message; }
            set { message = value; RaisePropertyChanged(); }
        }

//開啟MQTT連接
public async void SignMqttServer() { var options = new MqttClientOptionsBuilder() .WithClientId(clientID) //傳遞ClientID .WithTcpServer("127.0.0.1", 1883) //MQTT服務的地址 .WithCredentials("admin", "123456") //傳遞賬號密碼 .WithCleanSession() .Build(); mqttClient = new MqttFactory().CreateMqttClient();// .CreateManagedMqttClient(); mqttClient.Connected += MqttClient_Connected; mqttClient.Disconnected += MqttClient_Disconnected; mqttClient.ApplicationMessageReceived += MqttClient_ApplicationMessageReceived; //創建消息接受事件 await mqttClient.ConnectAsync(options); //await mqttClient.SubscribeAsync(clientID); } private void MqttClient_ApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e) { Message += "收到的信息:" + Encoding.UTF8.GetString(e.ApplicationMessage.Payload) + "\r\n"; } private void MqttClient_Disconnected(object sender, MqttClientDisconnectedEventArgs e) { Message += "客戶端斷開"; } private void MqttClient_Connected(object sender, MqttClientConnectedEventArgs e) { Message += "客戶端已連接" + "\r\n"; mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic(clientID).Build()); //關聯服務端訂閱, 用於接受服務端推送信息 } }

 演示界面:

 

實際演示效果(GIF)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM