精华内容
下载资源
问答
  • m2mqtt
    万次阅读
    2019-07-16 12:07:45

    1.MQTTnet开源库,https://github.com/chkr1011/MQTTnet

    MQTTnet.dll 2.8.5 下载

    链接:https://pan.baidu.com/s/1BjQ41vOqQ6-JoY06m2uN4Q 
    提取码:a18s 
    (此版本示例:https://download.csdn.net/download/uaime/11359429 我尝试升级版本,很多方法不支持,没耐心看文档)

    知识点(关于MQTT的详细说明 http://x5zj.com/?p=42

    2.服务器端和客户端(看上实例下载)

    服务器端和客户端两个,他们需要保持长连接,主要是通过订阅和发布来进行消息的传递交换。

    MQTT 服务端主要用于与多个客户端保持连接,并处理客户端的发布和订阅等逻辑。一般很少直接从服务端发送消息给客户端(可以使用 mqttServer.Publish(appMsg); 直接发送消息),多数情况下服务端都是转发主题匹配的客户端消息,在系统中起到一个中介的作用。

    而客户端主要是通过向服务端订阅它感兴趣(主题)的消息,另一些客户端向服务端发布(主题)消息,服务端将订阅和发布的主题进行匹配,并将消息转发给匹配通过的客户端。

    3连接,通信

    (1)服务器端启动服务:

     public static IMqttServer mqttServer = null; //创建对象

    // 配置一个mqtt服务.
    var optionsBuilder = new MqttServerOptionsBuilder()
    //连接记录数,默认 一般为2000
    .WithConnectionBacklog(2000)
    //服务器连接端口
    .WithDefaultEndpointPort(port)
    //连接验证器
    .WithConnectionValidator(ValidatingMqttClients())
    //持续会话
    .WithPersistentSessions()

    ;
    // 建立一个MQTT服务.
    mqttServer = new MqttFactory().CreateMqttServer();
    mqttServer.ApplicationMessageReceived += MqttServer_ApplicationMessageReceived;
    mqttServer.ClientSubscribedTopic += MqttServer_ClientSubscribedTopic;
    mqttServer.ClientUnsubscribedTopic += MqttServer_ClientUnsubscribedTopic;
    mqttServer.ClientConnected += MqttServer_ClientConnected;
    mqttServer.ClientDisconnected += MqttServer_ClientDisconnected;

    //启动mqtt服务
    await Task.Run(async () => { await mqttServer.StartAsync(optionsBuilder.Build()); });

     

    (2)客户端

    与服务器端连接

    连接语句:

     private IMqttClient mqttClient = null; //客户端对象

    //实例化 创建客户端对象
    var Factory = new MqttFactory();
    mqttClient = Factory.CreateMqttClient();
    mqttClient.ApplicationMessageReceived += MqttClient_ApplicationMessageReceived;
    mqttClient.Connected += MqttClient_Connected;
    mqttClient.Disconnected += MqttClient_Disconnected;

    //调用异步方法连接到服务端

    await mqttClient.ConnectAsync(option());

    option的信息设置:

    public IMqttClientOptions option()
    {
    //连接到服务器前,获取所需要的MqttClientTcpOptions 对象的信息
    var options = new MqttClientOptionsBuilder()
    .WithClientId(ClientId)                    // clientid是设备id
    .WithTcpServer(IP, Port)              //onenet ip:183.230.40.39    port:6002
    .WithCredentials(UserName,pwd)      //username为产品id       密码为鉴权信息或者APIkey
    //.WithTls()//服务器端没有启用加密协议,这里用tls的会提示协议异常
    .WithCleanSession(false)
    .WithKeepAlivePeriod(TimeSpan.FromSeconds(2000))
    .Build();
    return options;
    }

    服务端支持 ClientConnectedClientDisconnected 和 ApplicationMessageReceived 事件,分别用来检查客户端连接、客户端断开以及接收客户端发来的消息。

    客户端支持 ConnectedDisconnected 和 ApplicationMessageReceived 事件,用来处理客户端与服务端连接、客户端从服务端断开以及客户端收到消息的事情。

    通过 mqtt接入onenet,其实也就是把onenet 平台当做mqtt broker,连接上稍作改变就可以了。


    客户端(接收服务推送)封装类参考:

    MQQT服务的源码,下载源码地址:https://github.com/mqtt/mqtt.github.io/wiki/libraries

    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);
            }
        }

    C#mqtt库M2Mqtt的使用方法

    目前最好用的C#库是 eclipse出的M2Mqtt库,

    主页链接: http://www.eclipse.org/paho/clients/dotnet/

    项目的地址是 https://github.com/eclipse/paho.mqtt.m2mqtt

    使用方式是在vs 的命令中输入 Install-Package M2Mqtt
     

    ... 
     
    // create client instance 
    MqttClient client = new MqttClient(IPAddress.Parse(MQTT_BROKER_ADDRESS)); //注意是域名哦不支持IP
     
    string clientId = Guid.NewGuid().ToString(); 
    client.Connect(clientId); 
     
    string strValue = Convert.ToString(value); 
     
    // publish a message on "/home/temperature" topic with QoS 2 
    client.Publish("/home/temperature", Encoding.UTF8.GetBytes(strValue), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false); 
    然而,却存在一个坑, MQTT_BROKER_ADDRESS 不能用IP地址,而要用域名,用IP地址会出现在Connect这一步连接失败。

     

    放一个示例,可以直接使用的。

    https://sdk.bce.baidu.com/console-sdk/mqtt-net.rar?responseContentDisposition=attachment

    这个是百度云mqtt物接入的一个例子,用的是mqtt协议,下载后,把域名改一下,就可以用了。

    mqtt服务器可以采用http://mosquitto.org/download/ 实现的mosquitto服务器。

    Source

    Older downloads are available at https://mosquitto.org/files/

    Windows

     

    组件下载:M2Mqtt.Net.dll (v4.3.0最新版 2019.7.16本地生成)

    链接:https://pan.baidu.com/s/1lacs13v9nde8d2wrj2oU4g 
    提取码:l8cg 


    相关代码摘要:

    //创建客户端实例(两种方式选择,否则出错,域名需转换)
    MqttClient client = new MqttClient(IPAddress.Parse(MQTT_BROKER_ADDRESS)); //主机为IP时
    MqttClient client = new MqttClient(MQTT_BROKER_ADDRESS); //当主机地址为域名时
     
    // 注册消息接收处理事件,还可以注册消息订阅成功、取消订阅成功、与服务器断开等事件处理函数
    client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; 
     
    //生成客户端ID并连接服务器
    string clientId = Guid.NewGuid().ToString(); 
    client.Connect(clientId); 
     
    // 订阅主题"/home/temperature" 消息质量为 2 
    // 三种参数:0 至多1次,1 至少1次,2 只有1次 (好像3保留)
    client.Subscribe(new string[] { "/home/temperature" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); 
     
    ... 
     
    void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) 
    { 
    //处理接收到的消息
    string msg = System.Text.Encoding.Default.GetString(e.Message);
            textBox1.AppendText("收到消息:" + msg + "\r\n");
    } 
    
    
    //**************************************************************
    
    // 发布消息到主题 "/home/temperature" 消息质量为 2,不保留 
    client.Publish("/home/temperature", Encoding.UTF8.GetBytes("hello"), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false); 

    客户端代码参考2

    服务端搭建:apache-apollo-***-windows,下载链接:http://activemq.apache.org/apollo/download.html

    解压:在 apache-apollo    bin文件夹中,作如下操作:

    输入:apollo.cmd create test 创建虚拟test服务器主机,在该文件夹下会生成一个test目录
    进入 apache-apollo-1.7.1\bin\test\bin文件,开启服务器。
    进入test目录下etc文件夹中,找到apollo.xml
    打开浏览器:输入http://127.0.0.1:61680,任意一个都可以,即可进入管理的web界面,账户:admin ,密码:password
    测试连接,打开mqtt用户客户端,查看服务器显示情况
     

    using MQTTnet;
    using MQTTnet.Core;
    using MQTTnet.Core.Client;
    using MQTTnet.Core.Packets;
    using MQTTnet.Core.Protocol;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
     
    namespace mqtt_client
    {
        public partial class Form1 : Form
        {
            private MqttClient mqttClient = null;
            public Form1()
            {
                InitializeComponent();
                Task.Run(async () => { await ConnectMqttServerAsync(); });
            }
            private async Task ConnectMqttServerAsync()
            {
                if (mqttClient == null)
                {
                    mqttClient = new MqttClientFactory().CreateMqttClient() as MqttClient;
                    mqttClient.ApplicationMessageReceived += MqttClient_ApplicationMessageReceived;
                    mqttClient.Connected += MqttClient_Connected;
                    mqttClient.Disconnected += MqttClient_Disconnected;
                }
     
                try
                {
                    var options = new MqttClientTcpOptions
                    {
                        Server = "127.0.0.1",
                        Port=61613,
                        ClientId = Guid.NewGuid().ToString(),
                        UserName = "admin",
                        Password = "password",
                        CleanSession = true
                    };
     
                    await mqttClient.ConnectAsync(options);
                }
                catch (Exception ex)
                {
                    Invoke((new Action(() =>
                    {
                        textBox2.AppendText($"连接到MQTT服务器失败!" + Environment.NewLine + ex.Message + Environment.NewLine);
                    })));
                }
            }
            private void MqttClient_Connected(object sender, EventArgs e)
            {
                Invoke((new Action(() =>
                {
                    textBox2.AppendText("已连接到MQTT服务器!" + Environment.NewLine);
                })));
            }
     
            private void MqttClient_Disconnected(object sender, EventArgs e)
            {
                Invoke((new Action(() =>
                {
                    textBox2.AppendText("已断开MQTT连接!" + Environment.NewLine);
                })));
            }
     
            private void MqttClient_ApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e)
            {
                Invoke((new Action(() =>
                {
                    textBox2.AppendText($">> {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}{Environment.NewLine}");
                })));
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                string topic = textBox1.Text.Trim();
     
                if (string.IsNullOrEmpty(topic))
                {
                    MessageBox.Show("订阅主题不能为空!");
                    return;
                }
     
                if (!mqttClient.IsConnected)
                {
                    MessageBox.Show("MQTT客户端尚未连接!");
                    return;
                }
     
                mqttClient.SubscribeAsync(new List<TopicFilter> {
                    new TopicFilter(topic, MqttQualityOfServiceLevel.AtMostOnce)
                });
     
                textBox2.AppendText($"已订阅[{topic}]主题" + Environment.NewLine);
                textBox1.Enabled = false;
                button1.Enabled = false;
     
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                string topic = textBox4.Text.Trim();
     
                if (string.IsNullOrEmpty(topic))
                {
                    MessageBox.Show("发布主题不能为空!");
                    return;
                }
     
                string inputString = textBox3.Text.Trim();
                var appMsg = new MqttApplicationMessage(topic, Encoding.UTF8.GetBytes(inputString), MqttQualityOfServiceLevel.AtMostOnce, false);
                mqttClient.PublishAsync(appMsg);
     
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                Sunisoft.IrisSkin.SkinEngine skin = new Sunisoft.IrisSkin.SkinEngine
                {
                    SkinFile = @"./RealOne.ssk"
                };
            }
        }
    }

     

    参考资料:

    https://github.com/mqtt/mqtt.github.io/wiki/libraries 

    https://github.com/leytton/m2mqtt (此项目下载后依赖项很多出问题,尝试修改没弄成)

    仅部分内容摘自网络整理而成,如有侵权请联系删除。

    更多相关内容
  • M2Mqtt.Net.dll

    2019-11-25 11:05:36
    在.net 2.0框架下使用m2mqtt的dll,在xp sp1 系统下可使用推送功能。需要安装.net 2.0 用法参考https://blog.csdn.net/leytton/article/details/51896738
  • C#语言,编写MQTT客户端,连接到实验3的MQTT服务器上,发布一个主题,并且订阅主题。
  • paho.mqtt.m2mqtt

    2021-05-03 21:02:03
    M2Mqtt 适用于.Net和WinRT的MQTT客户端库 项目介绍 M2Mqtt是MQTT客户端,可用于所有.Net平台(.Net Framework,.Net Compact Framework和.Net Micro Framework)和WinRT平台(Windows 8.1,Windows Phone 8.1和...
  • M2Mqtt.Net.dll C#库文件

    2017-04-11 18:28:44
    用于MQTT通信的C#客户端
  • Test_M2MQTT.rar

    2021-06-22 08:56:25
    很好的MQTT测试程序,使用M2MQTT库,VS开发。
  • M2Mqtt.zip【c#编程库】

    2019-04-26 11:38:21
    M2Mqtt.zip https://www.nuget.org/packages/M2Mqtt/
  • M2Mqtt_Unity3D

    2019-01-20 21:40:11
    Unity3D可用的C#编程MQTT客户端库文件,在unity项目目录下的Assets目录下新建 Plugins 文件夹,并将 M2Mqtt.dll 和 M2Mqtt.pdb 两个文件放入其中即可完成导入
  • M2Mqtt.NetCF39.dll_mqtt_

    2021-10-02 04:42:58
    M2Mqtt with OpenSSL support for you Project
  • c# M2Mqtt 3.5最低版本

    2019-05-05 18:18:11
    在官网上下载的M2Mqtt文件类,3.5不能用,编译过后或是使用.csproj,只有一个4.5的能用,经过整理及测试通过后,发布一个3.5版本,可以直接拿过来编译用。
  • M2Mqtt.Net.zip

    2020-01-15 18:30:04
    最近发现很多人评论说上传的MQTT3.5不能用,上次版本是从官网上直接下来的,最近直接从我正在做的项目当中直接摘出来的MQTT上传上来,vs2008可以直接加载直接,里面有断网重连机制,但具体方法需要在外部事件当中...
  • 我这边直接把我试验代码贴上来 using uPLibrary.Networking.M2Mqtt; using uPLibrary.Networking.M2Mqtt.Messages; 后端是tcp协议,默认就是1883端口,就不用改, public class HomeController : Controller { ...

    配置emqx服务端

    1.首先下载emqx服务端。https://www.emqx.io/cn/downloads#broker,下载broker就行。

    2.解压,cd到bin目录下,然后敲命令

    emqx start

    注意在这之前最好保证下面这些端口不被占用。否则你还要emqx restart重启。

    尤其是8081端口,冲突概率很高,Url not found 这个错就是因为这个端口冲突所致。

    start之后不会有显示成功的状态显示,没其他提示就是成功。

    3.之后进入http://localhost:18083/ 默认用户名是admin,密码public。

    首次进入设置里面可以将语言改成“中文”。

    到这里mqtt服务基本是部署好了。开始编写客户端代码

    开始写客户端代码

    新建一个web项目,或者winform项目都行。

    nuget里面搜 M2Mqtt。(为什么选这个呢,因为这个对.net环境几乎没有依赖,任何版本的.net都能运行。好多其他的Mqttnet什么的都要求core才行)

    安装完后github(https://github.com/eclipse/paho.mqtt.m2mqtt,如果连接没了就自己在github上搜m2mqtt)上面有源码和案例,粘下来几段开始试验。

    我这边直接把我试验代码贴上来

    using uPLibrary.Networking.M2Mqtt;
    using uPLibrary.Networking.M2Mqtt.Messages;

    后端是tcp协议,默认就是1883端口,就不用改, 

    public class HomeController : Controller
        {
            string MQTT_BROKER_ADDRESS = "192.168.0.10";
            public string recive_message { get; set; }
            public ActionResult Index()
            {
                // create client instance 
                MqttClient client = new MqttClient(IPAddress.Parse(MQTT_BROKER_ADDRESS));
    
                // 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/temperature" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); 
     
    
    
                return View();
            }
    
            void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
            {
                recive_message = System.Text.Encoding.UTF8.GetString(e.Message);
                // handle message received 
            }
    
    
            public JsonResult post(string message)
            {
                MqttClient client = new MqttClient(IPAddress.Parse(MQTT_BROKER_ADDRESS));
    
                string clientId = Guid.NewGuid().ToString();
                client.Connect(clientId);
    
                // publish a message on "/home/temperature" topic with QoS 2 
                client.Publish("/home/temperature", Encoding.UTF8.GetBytes(message), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
    
                return Json(true);
            }
        }

    这个类库太精简了,精简到看方法名称就知道这个是干嘛的了。真的不用再去讲解这个类库怎么用了。

    后端(winform)接收发送消息到这就差不多了。

    下面开始前端(web)接受发送消息。

    前端我们添加引用(https://github.com/eclipse/paho.mqtt.javascript)  官方说明文档:https://www.eclipse.org/paho/files/jsdoc/Paho.MQTT.Client.html  js下载地址:https://www.eclipse.org/downloads/download.php?file=/paho/releases/1.0.3/paho.javascript-1.0.3.zip

    <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.js" type="text/javascript"></script>

     然后加下面这段代码,也是人家官网抄的,前端是走的websocket协议,所以是8083端口。

    // Create a client instance
                client = new Paho.MQTT.Client("127.0.0.1", 8083, "clientId");
    
                // set callback handlers
                client.onConnectionLost = onConnectionLost;
                client.onMessageArrived = onMessageArrived;
    
                // connect the client
                client.connect({ onSuccess: onConnect });
    
    
                // called when the client connects
                function onConnect() {
                    // Once a connection has been made, make a subscription and send a message.
                    console.log("onConnect");
                    client.subscribe("/home/temperature");
                    message = new Paho.MQTT.Message("Hello");
                    message.destinationName = "World";
                    client.send(message);
                }
    
                // called when the client loses its connection
                function onConnectionLost(responseObject) {
                    if (responseObject.errorCode !== 0) {
                        console.log("onConnectionLost:" + responseObject.errorMessage);
                    }
                }
    
                // called when a message arrives
                function onMessageArrived(message) {
                    console.log("onMessageArrived:" + message.payloadString);
                }

    到这调吧调吧基本就都通了。。。

    最后

    最后我补充一下emqx和 咱们 写好的客户端 联调测试的方法。

     

    显示 当前状态: 已连接 就对了

    然后

    订阅完成,

    代码写完了,就可以各种进行收发测试了。

    展开全文
  • C#使用M2Mqtt库进行MQTT简单通讯M2Mqtt库资源MQTT连接MQTT主题发布--发消息MQTT订阅主题--收消息小工具界面 M2Mqtt库资源 一开始有查找Mqttnet的源码,但是比较乱,编译不过去,后来选择了M2Mqtt。源码清晰简洁,...

    M2Mqtt库资源

    一开始有查找Mqttnet的源码,但是比较乱,编译不过去,后来选择了M2Mqtt。源码清晰简洁,使用靠谱。
    1、M2Mqtt 下载代码自己生成一下就可以在BIN文件夹里面找到相关的库。
    2、在NuGet库里面直接查找M2Mqtt也可以安装库。

    MQTT连接

    public MqttClient mqttClient { get; set; }
    private static string EMQX_BROKER_IP = "192.168.10.165";
    private static int EMQX_BROKER_PORT = 1884;
    // 建立MQTT连接
    private void mqttConnect()
            {
                EMQX_CLIENT_ID = Guid.NewGuid().ToString();
                try
                {
                    //建立连接
                    mqttClient = new MqttClient(EMQX_BROKER_IP, EMQX_BROKER_PORT, false, null, null, MqttSslProtocols.TLSv1_2);
                    //下面这种方法是个坑,并不能正常访问到MQTT服务器
                    // mqttClient = new MqttClient(IPAddress.Parse(EMQX_BROKER_IP));
                    mqttClient.Connect(EMQX_CLIENT_ID);
                    mqttClient.MqttMsgPublishReceived += Client_MqttMsgPublishReceived;
                    connectbtn.BackColor = Color.Green;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                
            }
            //这段定义了收到消息之后做什么事情
            private void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
            {
                string topic = e.Topic.ToString();
                string message = System.Text.Encoding.Default.GetString(e.Message);
                //同时订阅两个或者以上主题时,分类收集收到的信息
                if (topic == subscribetopictxt.Text)
                {
                    messageArray.Add(message);
                }
                if (topic == subscribetopictxt1.Text)
                {
                    messageArray1.Add(message);
                }
                //reciveTopic.Text = topic;
                //reciveMessagetxt.Text = message;
    
            }
    

    MQTT主题发布–发消息

    public void publishTopic(string currentTopic, string content)
            {            
                if (mqttClient != null && !string.IsNullOrEmpty(currentTopic) && !string.IsNullOrEmpty(content))
                {
                    mqttClient.Publish(currentTopic, System.Text.Encoding.UTF8.GetBytes(content), qos, true);
                }
            }
    

    MQTT订阅主题–收消息

     private void subscribebtn_Click(object sender, EventArgs e)
            {
                mqttClient.Subscribe(new string[] { subscribetopictxt.Text }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
    
            }
    

    小工具界面

    在这里插入图片描述
    同时发布了两个主题,然后订阅两个主题。分别收两个主题的消息并显示出来。
    收到消息后存起来,显示的时候另外起定时器去扫才能正常显示。

    展开全文
  • M2Mqtt.dll

    2016-11-21 11:17:48
    C# 调用M2Mqtt.DLL
  • MQTT是一种适用于物联网的,稳定的,可靠的通信协议。本篇主要介绍如何使用C#订阅mqtt消息,接收和处理mqtt消息。

    MQTT简介

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

    MQTT消息有三种质量等级

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

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

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

    • 具体使用还要看消息中间件是否支持3种质量等级

    使用 M2Mqtt 订阅 mqtt消息

    1. 新建C#工程,添加M2Mqtt程序包并引用添加M2Mqtt程序包
    2. 使用M2Mqtt订阅消息
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net;
    using uPLibrary.Networking.M2Mqtt;
    using uPLibrary.Networking.M2Mqtt.Messages;
    
    
    namespace Get_MQTT
    {
        class Program
        {
            static void Main(string[] args)
            {
                // MQTT的主题 topic
                string topic = "/mqtt/test";
                // MQTT服务器IP地址
                string host = "127.0.0.1";
                int serverPort = 1883;
                // 实例化Mqtt客户端 
                MqttClient client = new MqttClient(host, Convert.ToInt32(serverPort), false, null, null, MqttSslProtocols.TLSv1_2);
    
                // 注册接收消息事件 
                client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
    
                string clientId = Guid.NewGuid().ToString();
                client.Connect(clientId);
    
                // 订阅主题 "/mqtt/test", 订阅质量 QoS 2 
                client.Subscribe(new string[] { topic }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
            }
    
            static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
            {
                // 打印从订阅的Topic发布端收到的消息
                Console.WriteLine(string.Format("subscriber,topic:{0},content:{1}", e.Topic, Encoding.UTF8.GetString(e.Message)));
            }
    
        }
    }
    
    

    使用中会遇到的问题

    M2Mqtt使用起来看似很简单,但是这只是一个接收消息的例程,实际使用过程中可能还会出现端口变更,连接异常等等问题。
    M2Mqtt GitHub地址:https://github.com/eclipse/paho.mqtt.m2mqtt

    如果觉得M2Mqtt不够灵活的话,还可以使用 MqttLib

    展开全文
  • M2Mqtt断网重连

    千次阅读 2019-06-12 09:38:18
    在使用M2Mqtt.dll这个控件时候,对于断网后,按照网上的说法,是处于broken状态,而且这个状态基本是不会主动改变的,在连接后,还是不能重新收发数据,而且这个控件当中,Ping检索是使用的1分钟检索一次,再次内部...
  • C#mqtt库M2Mqtt的使用

    万次阅读 2019-02-01 23:32:16
    目前最好用的C#库是 eclipse出的M2Mqtt库,主页链接:http://www.eclipse.org/paho/clients/dotnet/ 项目的地址是...Install-Package M2Mqtt 项目主页上介绍看起来很简单 ... /...
  • C#使用M2MQTT快速实现MQTT通信

    千次阅读 2019-07-11 15:53:50
    最近项目需要用到消息的订阅发布,因此使用了MQTT方式实现。 首先,在项目中引入MMQTT包: 1.在官网下载MMQTT包(此处用的4.3.0.0版本),将包copy到项目的libs文件夹中 2.在项目的“引用”那里右键,“添加引用”,...
  • 找了好久,才找到这个好用的,分享给大家,同时自己也MARK一下
  • C# MQTT M2MQTT

    2022-04-21 21:49:48
    MQTT M2MQTT[MQTT 入门介绍](https://www.runoob.com/w3cnote/mqtt-intro.html)[MQTT QoS等级](https://blog.csdn.net/solo_jm/article/details/103402309)主题运用M2MQTT实现M2MQTT类库说明MqttClient主要方法MQTT...
  • MQTT学习(四)--使用m2mqtt在Unity3D中实现MQTT客户端

    千次阅读 热门讨论 2018-12-15 18:58:04
    在前面的几篇文章中分别在桌面客户端和Web客户端中实现了MQTT协议的功能,为了丰富MQTT协议的使用场景,本篇文章就来尝试如何在Unity3D中实现MQTT协议的部分功能。 1.需求分析 ...
  • M2MQTT客户端MqttClient异常问题解决

    千次阅读 2018-09-27 00:01:11
    最近做一个物联网设备模拟器,C#+net4.5,采用M2Mqtt.Net.dll开发库,从VS2017工具nuget安装。服务器采用EMQ 2.3.11稳定版。 计划是一个c#winform应用程序,批量模拟多个物联网数据采集器上传数据到服务器。1分钟...
  • MQTT communication client sample using c#
  • C# MQTT客户端--M2MQTT

    万次阅读 2017-09-06 19:23:11
    m2mqtt库:https://github.com/eclipse/paho.mqtt.m2mqtt m2mqtt手册:https://m2mqtt.wordpress.com/using-mqttclient/ m2mqtt下载:https://www.nuget.org/packages/M2Mqtt/ 准备 本客户端使用VS2015进行开发...
  • M2MQTT 使用方式

    千次阅读 2018-01-05 23:09:30
    导入文件 ...using uPLibrary.Networking.M2Mqtt; using uPLibrary.Networking.M2Mqtt.Messages; 初始化 //DMS.Init() //默认地址也是mqtt.dms.aodianyun.com DMS.Init("mqtt.dms.aodianyun.com");
  • MQTT协议 C#客户端(基于M2MQTT)

    万次阅读 热门讨论 2016-07-13 12:14:41
    1、引入M2MQTT的dll库文件 点击此处下载M2Mqtt.Net.dll 2、建立客户端连接并订阅 //创建客户端实例 MqttClient client = new MqttClient(IPAddress.Parse(MQTT_BROKER_ADDRESS)); //主机为IP时 MqttClient ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 639
精华内容 255
关键字:

m2mqtt