欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實現MQTT服務端與客戶端通訊功能

 更新時間:2022年01月26日 10:00:11   作者:痕跡g  
這篇文章介紹了C#實現MQTT服務端與客戶端通訊的功能,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

關于MQTT

MQTT(消息隊列遙測傳輸)是ISO 標準(ISO/IEC PRF 20922)下基于發(fā)布/訂閱范式的消息協議。它工作在 TCP/IP協議族上,是為硬件性能低下的遠程設備以及網絡狀況糟糕的情況下而設計的發(fā)布/訂閱型消息協議,為此,它需要一個消息中間件 。

MQTT是一個基于客戶端-服務器的消息發(fā)布/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易于實現的,這些特點使它適用范圍非常廣泛。在很多情況下,包括受限的環(huán)境中,如:機器與機器(M2M)通信和物聯網(IoT)。其在,通過衛(wèi)星鏈路通信傳感器、偶爾撥號的醫(yī)療設備、智能家居、及一些小型化設備中已廣泛使用。

百度百科

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;
                    }
                    //解析用戶名和密碼,這個地方需要改成查找我們自己創(chuàng)建的用戶名和密碼。
                    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; //創(chuàng)建消息接受事件

            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)

到此這篇關于C#實現MQTT服務端與客戶端通訊功能的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • winform 實現控制輸入法

    winform 實現控制輸入法

    在工作中遇到這樣一個問題,在系統使用過程中,輸入法會變灰導致無法使用輸入法輸入文字,就好像輸入法被禁用了沒有啟用似的。對此,在這里做個備錄
    2015-08-08
  • C# 延遲Task.Delay()和Thread.Sleep()的具體使用

    C# 延遲Task.Delay()和Thread.Sleep()的具體使用

    Thread.Sleep()是同步延遲,Task.Delay()是異步延遲,本文主要介紹了C# 延遲Task.Delay()和Thread.Sleep()的具體使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • C#版的 Escape() 和 Unescape() 函數分享

    C#版的 Escape() 和 Unescape() 函數分享

    從網上看到兩個方法, C# 版的 Escape() 和 Unescape(),收藏下。
    2011-05-05
  • C#通過抽象工廠模式造車

    C#通過抽象工廠模式造車

    這篇文章介紹了C#通過抽象工廠模式造車的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • c#讀取xml文件到datagridview實例

    c#讀取xml文件到datagridview實例

    c#讀取xml文件到datagridview實例,需要的朋友可以參考一下
    2013-03-03
  • C#中流的使用和分類

    C#中流的使用和分類

    這篇文章介紹了C#中流的使用和分類,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C#基于Miniblink控件編寫一個簡易的瀏覽器

    C#基于Miniblink控件編寫一個簡易的瀏覽器

    miniblink是一款精簡小巧的瀏覽器控件,基于chromium精簡而成,是市面上最小巧的chromium內核控件沒有之一,本文將結合C#和Miniblink編寫一個簡易的瀏覽器,感興趣的可以了解下
    2024-01-01
  • .NET的深復制方法(以C#語言為例)

    .NET的深復制方法(以C#語言為例)

    深復制需要將對象實例中字段引用的對象也進行復制,在平時的編程工作中經常要用到這種復制方式,下面以c#為例來演示一下方法。
    2016-10-10
  • 淺談C#多線程下的調優(yōu)

    淺談C#多線程下的調優(yōu)

    本文主要介紹了C#多線程下的調優(yōu),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • C#中DataSet,DataTable,DataView的區(qū)別與用法

    C#中DataSet,DataTable,DataView的區(qū)別與用法

    這篇文章介紹了C#中DataSet,DataTable,DataView的區(qū)別與用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論