M2MQTT:如何在.NET中为Web应用程序保留订阅消息(简单测试)

时间:2016-10-30 21:02:57

标签: c# asp.net mqtt

我目前正在使用订购MQTT代理(mosquitto)的M2MQTT开发客户端订户应用程序。我只是希望应用程序订阅该主题,并创建一个捕获所发送消息的监听器(对不起,我是新手,我对白话有点生疏)。

  protected void MqttProcessing()
  {
     // create client instance 
     MqttClient client = new MqttClient(MQTT_BROKER_HOST_NAME);

     // 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[] { "hello/world" }, new byte  
     {MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });

  }

以上是建议的设置过程,用于创建客户端实例,注册收到的消息,连接客户端,然后订阅代理....好吧我明白了。我把这个函数称为:

  const string MQTT_BROKER_HOST_NAME = "brokernamehere.com";
  protected void Page_Load(object sender, EventArgs e)
  {
     MqttProcessing();// call to the MQTT client setup steps.
  }

现在我相信这一切都正常工作,当我从我的mosquitto MQTT客户端订阅者向经纪人发送消息时,MQTT连接能够收到消息,我遇到的问题包括:如果消息到达客户端订阅者并且它仍然存在,我该如何获取消息,以便Web浏览器中的用户可以按下按钮并打印消息并在asp:label标签中查看它?以下是我背后的代码:

  void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
  {
     try
     {
        Session["message"] = "Received = " + 
        Encoding.UTF8.GetString(e.Message) + " on topic " + e.Topic;
     }
     catch(HttpException ex)
     {
        Session["message"] = "ERROR:" + ex.Message;
     }
  }

如果我执行上述操作,会话["消息"]分配功能barfs。我调试了这个并尝试将消息分配给字符串变量(尝试了本地和全局;包含在分部类中)和 它能够将消息分配给字符串变量

  protected void GetMQTT_Click(object sender, EventArgs e)
  {    
        MessContentLabel.Visible = true; 
        MessContentLabel.Text = Convert.ToString(Session["message"]);

  }

我希望使用Session变量持久性属性,但我认为我需要的不是Session变量。在网上没有简单的例子,我听说过其他人成功地做了类似事情(参见:MQTT client in MVC application),但这没有提供我的问题的线索。

附加信息:

所以这是测试mosquitto(https://mosquitto.org/)作为mqtt客户端发布者和代理,以及M2MQTT C#.NET mqtt客户端库的客户端用户。

我启动了mosquitto应用程序

$>mosquitto

然后我通过Visual Studio启动我的Web应用程序。如上所述进行订阅和设置

接下来,我通过mosquitto启动出版商:

$>mosquitto_pub -d -t hello/world -m "HelloWorld"

同样,当我通过Visual Studio 2015进行调试时,Web应用程序中的侦听器会收到它....但我无法将其分配给一个在(我称之为)侦听器方法(?)之外的变量,如上所示 MqttMsgPublishReceived 。再一次,这是一个完全在我的笔记本电脑上进行的简单测试。

希望这些额外信息可以更清楚地了解我正在尝试的内容。

1 个答案:

答案 0 :(得分:1)

请指定QOS 2并进行测试。

mosquitto_pub -d -t hello/world -m "HelloWorld" -q 2

以下是在线文档的详细信息。

  

QoS0,最多一次:消息最多发送一次,或者可能   根本没有交付。它通过网络传输不是   确认。邮件未存储。如果,消息可能会丢失   客户端断开连接,或者服务器出现故障。 QoS0就是   最快的转移方式。它有时被称为"火和忘记"。

     

MQTT协议不要求服务器转发出版物   QoS0到客户端。如果客户端在服务器时断开连接   收到该出版物,该出版物可能会被丢弃,   取决于服务器实现。

     

QoS1,至少一次:消息始终至少传递一次。它   如果在之前发生故障,可能会多次发送   发件人收到确认。必须存储该消息   在发件人本地,直到发件人收到确认   消息已由接收方发布。消息存储在   必须再次发送邮件。

     

QoS2,恰好一次:消息始终只发送一次。该   邮件必须本地存储在发件人,直到发件人   收到消息已被发布的确认   接收器。存储消息以防必须发送消息   再次。 QoS2是最安全但最慢的传输模式。更多   使用复杂的握手和确认序列   用于QoS1以确保不会发生重复消息。

干杯!