zoukankan      html  css  js  c++  java
  • C# MQTT M2MQTT

    MQTT 入门介绍

    MQTT是基于二进制消息的发布/订阅编程模式的消息协议

    实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

    MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

    • (1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
    • (2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

    MQTT协议中定义了一些方法(也被称为动作),来于表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。主要方法有:

    • (1)Connect。等待与服务器建立连接。
    • (2)Disconnect。等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话。
    • (3)Subscribe。等待完成订阅。
    • (4)UnSubscribe。等待服务器取消客户端的一个或多个topics订阅。
    • (5)Publish。MQTT客户端发送消息请求,发送完成后返回应用程序线程。

    服务质量(Quality of Service,QoS)
    MQTT 定义了三种客户端与代理服务器之间消息到达的难度

    0:broker/client 之间消息传一次,并不确认传到没有,消息可能丢失
    1:broker/client 之间消息至少一次,带确认消息的传输,可能重复收到
    2:broker/client 之间消息仅有一次,利用四次握手进行确认,网络延迟可能会增加

    ##主题
    MQTT是通过主题对消息进行分类的,本质上就是一个UTF-8的字符串,不过可以通过反斜杠表示多个层级关系。主题并不需要创建,直接使用就是了。

    主题还可以通过通配符进行过滤。其中,+可以过滤一个层级,而*只能出现在主题最后表示过滤任意级别的层级。举个例子:

    • building-b/floor-5:代表B楼5层的设备。
    • +/floor-5:代表任何一个楼的5层的设备。
    • building-b/#:代表B楼所有的设备。

    注意,MQTT允许使用通配符订阅主题,但是并不允许使用通配符广播。 

     

    运用M2MQTT实现 

    //创建客户端实例  
    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   
    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 + "
    "); 
    // 发布消息到主题 "/home/temperature" 消息质量为 2,不保留   
    client.Publish("/home/temperature", Encoding.UTF8.GetBytes("hello"), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);  

     

    M2MQTT类库说明

    MqttClient主要事件

    1.ConnectionClosed

        客户端与服务端断开时触发

    2.MqttMsgPublished

        消息发布成功后触发

    3.MqttMsgSubscribed

        客户端订阅Topic成功后触发

    4.MqttMsgPublishReceived

        客户端收到来自服务端的消息后触发

    5.MqttMsgUnsubscribed

        客户端成功取消订阅后触发

    MqttClient主要方法

    1.连接MQTT服务器

        Connect(string clientId);
        Connect(string clientId, string username, string password);
        Connect(string clientId, string username, string password, bool cleanSession, ushort keepAlivePeriod);
        Connect(string clientId, string username, string password, bool willRetain, byte willQosLevel, bool willFlag, string willTopic, string willMessage, bool cleanSession, ushort keepAlivePeriod);

    clientId :当前客户端的ID,相同ID的客户端连接服务器可能会产生异常,不同的客户端,应保证其ID不同。

    username:如果服务器开启了身份授权,此处为账号

    password:如果服务器开启了身份授权,此处为密码

    willFlag:表示如果客户机不是发送DISCONNECT消息中断时,比如IO错误等,如果将此位置为1,要求重传。并且WillQos和WillRetain也要设置,消息体中的Topic和MessageID也要设置。

    willRetain(遗嘱保留位):该位必须与遗嘱标志位状态相同(同为0 或者同为1)

    willQosLevel:如果遗嘱标志被设置为 0,遗嘱 QoS 也必须设置为 0。 如果遗嘱标志被设置为 1,遗嘱 QoS 的值可以等于 0,1,2。

    willTopic(遗嘱主题):如果遗嘱标志被设置为 1,异常断开时响应的主题

    willMessage(遗嘱消息):如果遗嘱标志被设置为 1,异常断开时给遗嘱主题发送该消息

    cleanSession:

        0表示如果订阅的客户机断线了,那么要保存其要推送的消息,如果其重新连接时,则将这些消息推送。
        1表示消除,表示客户机是第一次连接,消息所以以前的连接信息。
    /:用来表示层次,比如a/b,a/b/c。
    #:表示匹配>=0个层次,比如a/#就匹配a/,a/b,a/b/c。
    单独的一个#表示匹配所有。
    不允许 a#和a/#/c。
    +:表示匹配一个层次,例如a/+匹配a/b,a/c,不匹配a/b/c。
    单独的一个+是允许的,a+不允许,a/+/b不允许
     
  • 相关阅读:
    Java实现蓝桥杯突击战
    Java实现蓝桥杯突击战
    Java实现蓝桥杯勇者斗恶龙
    Java实现蓝桥杯勇者斗恶龙
    利用cmake来搭建开发环境
    cmake总结
    cmake手册详解----转
    Boost::filesystem 使用小笔记
    Boost学习之可移植路径操作--filesystem
    C++ 檔案、資料夾、路徑處理函式庫:boost::filesystem
  • 原文地址:https://www.cnblogs.com/michellexiaoqi/p/11677167.html
Copyright © 2011-2022 走看看