C#创建MQTT客户端接收服务器信息

版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/HorseRoll/article/details/80363958

服务端下载地址:https://download.csdn.net/download/horseroll/11012231

MQTT是什么?

MQTT (Message Queue Telemetry Transport),翻译成中文就是,遥测传输协议,其主要提供了订阅/发布两种消息模式,更为简约、轻量,易于使用,特别适合于受限环境(带宽低、网络延迟高、网络通信不稳定)的消息分发,属于物联网(Internet of Thing)的一个标准传输协议。

 

为什么使用MQTT 协议?

MQTT(英语全称,Message Queue Telemetry Transport),中文翻译过来就是遥测传输协议:其主要提供订阅/发布模式,更为简约、轻量,易于使用,针对受限环境(带宽低、网络延迟高、网络通信不稳定),属于物联网(Internet of Thing)的一个传输协议。设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如,但不仅限于此:

  • 特别适合于网络代价昂贵,带宽低、不可靠的环境。

  • 能在处理器和内存资源有限的嵌入式设备中运行。

  • 使用发布/订阅消息模式,提供一对多的消息发布,从而解除应用程序耦合。

  • 使用 TCP/IP 提供网络连接。

  • 提供Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。

对消息中间件,估计大家不得不关心的就是消息的可靠性,也就是消息的发布服务质量,可喜的是,MQTT支持三种消息发布服务质量(QoS):

  • “至多一次”(QoS==0),消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。

  • “至少一次”(QoS==1),确保消息到达,但消息重复可能会发生。

  • “只有一次”(QoS==2),确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。

如何使用MQTT?

演示新建一个MQTT客户端来接收服务器端发送的信息

1.首先在程序中程序集中引用M2Mqtt,在NUGET程序包管理器搜索M2Mqtt即可

2.新建MqttClientService类

public class MqttClientService
    {
        private static volatile MqttClientService _instance = null;

        private static readonly object LockHelper = new object();

        /// <summary>
        /// 创建单例模式
        /// </summary>
        /// <param name="ipAddress"></param>
        /// <returns></returns>
        public static MqttClientService CreateInstance(string ipAddress)
        {
            if (_instance == null)
            {
                lock (LockHelper)
                {
                    if (_instance == null)
                        _instance = new MqttClientService(ipAddress);
                }
            }
            return _instance;
        }

        /// <summary>
        /// 实例化订阅客户端
        /// </summary>
        public MqttClient SubscribeClient { get; set; }


        public Action<Object, MqttMsgPublishEventArgs> ClientPublishReceivedAction { get; set; }

        public MqttClientService(string ipAddress)
        {
            // create client instance 
            SubscribeClient = new MqttClient(IPAddress.Parse(ipAddress));

            // register to message received 
            SubscribeClient.MqttMsgPublishReceived += client_MqttMsgPublishReceived;

            string clientId = Guid.NewGuid().ToString();

            SubscribeClient.Connect(clientId);

            // subscribe to the topic "/home/temperature" with QoS 2 
            SubscribeClient.Subscribe(new string[] { "avatar/uploaded" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
        }

        void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
        {
            // handle message received 
            ClientPublishReceivedAction.Invoke(sender, e);
        }

        public void client_MqttMsgPublish(string publishString)
        {
            SubscribeClient.Publish("avatar/signed", Encoding.UTF8.GetBytes(publishString), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
        }
    }

3.在主程序中进行新建客户端,对服务端进行连接,新建监听事件

private void Form1_Load(object sender, EventArgs e)
        {
            // create client instance 
            //MqttClient client = new MqttClient(IPAddress.Parse("192.168.0.23"));
            MqttClient client = new MqttClient("m2m.eclipse.org");
            // register to message received 
            client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;

            string clientId = Guid.NewGuid().ToString();
            client.Connect(clientId);

            // subscribe to the topic "/home/temperature" with QoS 2 
            client.Subscribe(new string[] { "home/garden/fountain2" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
        }
        static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
        {
            // handle message received 
            byte[] b = e.Message;
            string str = System.Text.Encoding.Default.GetString(b);
        }

 

展开阅读全文

没有更多推荐了,返回首页