M2MQTT:如何在.net中为Web应用程序获取一个订阅消息(简单测试)

本文关键字:一个 测试 简单 消息 获取 net 应用程序 Web 中为 M2MQTT | 更新日期: 2023-09-27 18:15:38

我目前正在使用订阅MQTT代理(蚊子)的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.
  }

现在我相信这是所有工作,MQTT连接能够得到一个消息,当我从mosquitto MQTT客户机用户发送一条消息到代理,周围的东西我包装我的脑袋有问题,我怎么能抓住消息一旦客户端用户,并让它持续下去,所以在web浏览器的用户可以按下按钮并打印消息出去,看到一个asp:标签标签?下面是我在后面的代码:

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

如果我这样做,函数在Session["message"]赋值时停止。我调试了这个,并尝试将消息分配给字符串变量(尝试了本地和全局;包含在部分类中)和,它能够将消息分配给字符串变量…但显然,它不会持续下去。处理按钮信号的函数很简单:

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

我希望使用会话变量的持久性属性,但我认为我需要其他的东西而不是会话变量。在web上没有简单的示例,我听说过其他人成功地做了类似的事情(参见:MVC应用程序中的MQTT客户端),但这对我的问题提供了一点线索。

额外的信息:

这是在测试蚊子(https://mosquitto.org/)作为mqtt客户端发布者和代理,以及客户端订阅者的M2MQTT c# . net mqtt客户端库。

我启动蚊子应用程序

$>mosquitto

然后通过Visual Studio启动我的web应用程序。它按照上面的描述进行订阅和设置

接下来我通过蚊子启动出版商:

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

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

希望这些额外的信息能让我更清楚地了解我正在做的事情。

M2MQTT:如何在.net中为Web应用程序获取一个订阅消息(简单测试)

请指定QOS 2和test.

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

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

QoS0, At most once:消息最多发送一次,或者可能发送一次根本没有交付。但它在整个网络中的传输却不是这样承认。消息不被存储。信息可能会丢失,如果客户端断开连接,或者服务器发生故障。QoS0是最快的传输方式。它有时被称为"火和遗忘"。

MQTT协议不要求服务器在QoS0到客户端。如果客户端在断开连接时,服务器接收发布,则可能丢弃该发布;

QoS1, At least once:消息总是至少传递一次。它可能会多次交付,如果有一个失败之前发送方接收确认。消息必须被存储在发送方本地,直到发送方收到确认消息已被接收方发布。消息存储在如果消息必须再次发送。

QoS2, Exactly once:消息总是准确地传递一次。的消息必须本地存储在发送方,直到发送方控件发布消息的确认接收器。存储消息以备必须发送消息时使用再一次。QoS2是最安全但最慢的传输模式。一个更使用了复杂的握手和确认顺序,以确保没有重复消息发生。

干杯!