最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)MQTT服務(wù)端與客戶(hù)端通訊功能

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

關(guān)于MQTT

MQTT(消息隊(duì)列遙測(cè)傳輸)是ISO 標(biāo)準(zhǔn)(ISO/IEC PRF 20922)下基于發(fā)布/訂閱范式的消息協(xié)議。它工作在 TCP/IP協(xié)議族上,是為硬件性能低下的遠(yuǎn)程設(shè)備以及網(wǎng)絡(luò)狀況糟糕的情況下而設(shè)計(jì)的發(fā)布/訂閱型消息協(xié)議,為此,它需要一個(gè)消息中間件 。

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

百度百科

MQTT示例

注: 該示例演示統(tǒng)一使用WPF, 簡(jiǎn)單MVVM模式演示, 復(fù)制代碼需注意引用 NuGet包 GalaSoft

MQTT服務(wù)端建立:

演示界面:

演示代碼:

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

        IMqttServer mqttServer;  //MQTT服務(wù)端實(shí)例

        string message; 

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


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

        /// <summary>
        /// 客戶(hù)端實(shí)例
        /// </summary>
        public ObservableCollection<ClientInstance> ClientInsTances
        {
            get { return clientInstances; }
            set { clientInstances = value; RaisePropertyChanged(); }
        }
     //開(kāi)啟MQTT服務(wù)
        public void OpenMqttServer()
        {
            mqttServer = new MqttFactory().CreateMqttServer();
            var options = new MqttServerOptions();

            //攔截登錄
            options.ConnectionValidator = c =>
            {
                try
                {
                    Message += string.Format("用戶(hù)嘗試登錄:用戶(hù)ID:{0}\t用戶(hù)信息:{1}\t用戶(hù)密碼:{2}", c.ClientId, c.Username, c.Password) + "\r\n";
                    if (string.IsNullOrWhiteSpace(c.Username))
                    {
                        Message += string.Format("用戶(hù):{0}登錄失敗,用戶(hù)信息為空", c.ClientId) + "\r\n";

                        c.ReturnCode = MQTTnet.Protocol.MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
                        return;
                    }
                    //解析用戶(hù)名和密碼,這個(gè)地方需要改成查找我們自己創(chuàng)建的用戶(hù)名和密碼。
                    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 += "用戶(hù)名密碼錯(cuò)誤登陸失敗" + "\r\n";
                        return;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("登錄失敗:" + ex.Message);
                    c.ReturnCode = MqttConnectReturnCode.ConnectionRefusedIdentifierRejected;
                    return;
                }
            };
            //攔截訂閱
            options.SubscriptionInterceptor = async context =>
            {
                try
                {
                    Message += "用戶(hù)" + 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 += "消息服務(wù)啟動(dòng)成功:任意鍵退出" + "\r\n";
        }

        private void MqttServer_ClientConnected(object sender, MqttClientConnectedEventArgs e)
        {
            //客戶(hù)端鏈接
            Message += e.ClientId + "連接" + "\r\n";
        }

        private void ClientDisconnected(object sender, MqttClientDisconnectedEventArgs e)
        {
            //客戶(hù)端斷開(kāi)
            Message += e.ClientId + "斷開(kāi)" + "\r\n";
        }

        /// <summary>
        /// 客戶(hù)端推送信息    -  用于測(cè)試服務(wù)推送
        /// </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 客戶(hù)端登陸實(shí)例, 用于保存客戶(hù)的登陸信息,如下:

演示界面:

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

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

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

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


    }

MQTT客戶(hù)端建立:

演示代碼:

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

        IMqttClient mqttClient;  //MQTT客戶(hù)端實(shí)例

        string clientID; //機(jī)器ID


        string message;

        public string Message  //用于接收當(dāng)前 消息
        {
            get { return message; }
            set { message = value; RaisePropertyChanged(); }
        }
        //開(kāi)啟MQTT連接
        public async void SignMqttServer()
        {
            var options = new MqttClientOptionsBuilder()
             .WithClientId(clientID) //傳遞ClientID 
             .WithTcpServer("127.0.0.1", 1883)  //MQTT服務(wù)的地址
             .WithCredentials("admin", "123456") //傳遞賬號(hào)密碼
             .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 += "客戶(hù)端斷開(kāi)";
        }

        private void MqttClient_Connected(object sender, MqttClientConnectedEventArgs e)
        {
            Message += "客戶(hù)端已連接" + "\r\n";
            mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic(clientID).Build()); //關(guān)聯(lián)服務(wù)端訂閱, 用于接受服務(wù)端推送信息

        }
    }

演示界面:

實(shí)際演示效果(GIF)

到此這篇關(guān)于C#實(shí)現(xiàn)MQTT服務(wù)端與客戶(hù)端通訊功能的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#中的多線程小試牛刀

    C#中的多線程小試牛刀

    這篇文章主要給大家介紹了關(guān)于C#中多線程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • C#常用的數(shù)據(jù)格式轉(zhuǎn)換匯總

    C#常用的數(shù)據(jù)格式轉(zhuǎn)換匯總

    這篇文章介紹了C#常用的數(shù)據(jù)格式轉(zhuǎn)換,有需要的朋友可以參考一下
    2013-10-10
  • C#實(shí)現(xiàn)復(fù)制文件夾中文件到另一個(gè)文件夾的方法

    C#實(shí)現(xiàn)復(fù)制文件夾中文件到另一個(gè)文件夾的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)復(fù)制文件夾中文件到另一個(gè)文件夾的方法,實(shí)例分析了C#實(shí)現(xiàn)文件夾的查找、判斷及文件復(fù)制相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C#值類(lèi)型和引用類(lèi)型的深入理解

    C#值類(lèi)型和引用類(lèi)型的深入理解

    本篇文章主要是對(duì)C#中值類(lèi)型和引用類(lèi)型進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-01-01
  • C#迭代器及Unity協(xié)程實(shí)例解析

    C#迭代器及Unity協(xié)程實(shí)例解析

    這篇文章主要介紹了C#迭代器及Unity協(xié)程實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 詳解C#如何實(shí)現(xiàn)隱式類(lèi)型轉(zhuǎn)換

    詳解C#如何實(shí)現(xiàn)隱式類(lèi)型轉(zhuǎn)換

    Result?類(lèi)型是許多編程語(yǔ)言中處理錯(cuò)誤的常用方式,包括?C#?的?dotNext?庫(kù)。在本文中,我們將通過(guò)例子回顧?C#?中?using?語(yǔ)句和隱式類(lèi)型轉(zhuǎn)換的使用,感興趣的可以了解一下
    2023-01-01
  • WPF利用CommunityToolkit.Mvvm實(shí)現(xiàn)級(jí)聯(lián)選擇器

    WPF利用CommunityToolkit.Mvvm實(shí)現(xiàn)級(jí)聯(lián)選擇器

    這篇文章主要介紹了WPF如何利用CommunityToolkit.Mvvm實(shí)現(xiàn)級(jí)聯(lián)選擇器,文中的示例代碼講解詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定幫助,需要的小伙伴可以參考一下
    2023-12-12
  • c#批量抓取免費(fèi)代理并且驗(yàn)證有效性的實(shí)戰(zhàn)教程

    c#批量抓取免費(fèi)代理并且驗(yàn)證有效性的實(shí)戰(zhàn)教程

    突破反爬蟲(chóng)限制的方法之一就是多用幾個(gè)代理IP,下面這篇文章主要給大家介紹了關(guān)于利用c#批量抓取免費(fèi)代理并且驗(yàn)證有效性的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • TortoiseSVN使用教程

    TortoiseSVN使用教程

    TortoiseSVN 是 Subversion 版本控制系統(tǒng)的一個(gè)免費(fèi)開(kāi)源客戶(hù)端,可以超越時(shí)間的管理文件和目錄。本文給大家介紹TortoiseSVN使用教程,對(duì)tortoisesvn使用相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • C#?重寫(xiě)Notification提示窗口的示例代碼

    C#?重寫(xiě)Notification提示窗口的示例代碼

    本文主要介紹了C#?重寫(xiě)Notification提示窗口的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評(píng)論

绥阳县| 临颍县| 比如县| 通河县| 崇阳县| 迁西县| 武定县| 错那县| 密山市| 阿拉善左旗| 建水县| 图片| 罗江县| 康定县| 库伦旗| 扶沟县| 平原县| 庆城县| 汝南县| 威海市| 平和县| 全椒县| 金湖县| 琼结县| 台前县| 简阳市| 四川省| 依安县| 东城区| 措美县| 德州市| 如皋市| 江达县| 墨竹工卡县| 伊宁县| 中西区| 大新县| 罗定市| 湖口县| 福海县| 威海市|