C# M2MQTT:如何获取订阅消息以在Web应用程序的.NET中持久化(简单测试)

C# M2MQTT:如何获取订阅消息以在Web应用程序的.NET中持久化(简单测试),c#,asp.net,mqtt,C#,Asp.net,Mqtt,我目前正在使用M2MQTT开发一个客户机订户应用程序,该应用程序订阅MQTT代理(MOSQUITO)。我只是希望应用程序订阅该主题,并创建一个侦听器来捕获发送的消息(很抱歉,我不熟悉这一点,我对本地语言有点生疏) 上面是推荐的设置过程,创建一个客户端实例,注册到收到的消息,连接客户端,然后订阅代理……好吧,我明白了。我在中调用此函数: const string MQTT_BROKER_HOST_NAME = "brokernamehere.com"; protected void Pag

我目前正在使用M2MQTT开发一个客户机订户应用程序,该应用程序订阅MQTT代理(MOSQUITO)。我只是希望应用程序订阅该主题,并创建一个侦听器来捕获发送的消息(很抱歉,我不熟悉这一点,我对本地语言有点生疏)

上面是推荐的设置过程,创建一个客户端实例,注册到收到的消息,连接客户端,然后订阅代理……好吧,我明白了。我在中调用此函数:

  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;
     }
  }
如果我执行上述操作,该函数将在会话[“message”]分配上显示。我对此进行了调试,并尝试将消息分配给一个字符串变量(尝试了一个局部变量和一个全局变量;包含在分部类中),它能够将消息分配给字符串变量……但显然,它不会持久。处理按钮信号的功能很简单:

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

  }
我希望利用会话变量的持久性属性,但我想我需要的不是会话变量。在网上没有简单的例子可以说明这一点,我听说其他人也成功地做了类似的事情(见:),但这对我的问题没有什么线索

其他信息:

因此,这是测试mosquito()作为mqtt客户机发布者和代理,以及作为客户机订阅者的M2MQTT C#.NET mqtt客户机库

我以以下方式启动mosquitto应用程序:

$>mosquitto
然后我通过VisualStudio启动我的web应用程序。按照上述说明,订阅和设置的是哪一个

接下来,我将通过mosquitto启动publisher:

$>mosquitto_pub -d -t hello/world -m "HelloWorld"
同样,当我通过Visual Studio 2015进行调试时,web应用程序中的侦听器会接收到它。。。。但我无法将其分配给一个在侦听器方法(我称之为)之外持续存在的变量,如上面的MQTTMSGPPublishReceived所示。同样,这是一个完全在我的笔记本电脑上进行的简单测试


希望此附加信息能更清楚地说明我的尝试。

请指定QOS 2和测试

mosquitto_pub -d -t hello/world -m "HelloWorld" -q 2
以下是在线文档中的详细信息

QoS0,最多一次:消息最多传递一次,或者 根本不能交货。它在网络上的传输不受限制 承认。消息未被存储。如果发生以下情况,消息可能会丢失: 客户端已断开连接,或者服务器出现故障。QoS0是 最快的传输模式。它有时被称为“火与遗忘”

MQTT协议不要求服务器在服务器上转发发布 QoS0发送给客户。如果客户端在服务器运行时已断开连接 接收发布时,该发布可能会被丢弃, 取决于服务器实现

QoS1,至少一次:消息始终至少传递一次。信息技术 如果在测试之前出现故障,可能会多次交付 确认由发送方接收。必须存储该消息 在发送方本地,直到发送方收到确认 消息已由接收方发布。该消息存储在 案例必须再次发送消息

QoS2,仅一次:消息始终仅传递一次。这个 邮件必须本地存储在发件人处,直到发件人 接收消息已由发布的确认 接受者存储消息是为了防止必须发送消息 再一次。QoS2是最安全但最慢的传输模式。更多 使用复杂的握手和确认序列 用于QoS1,以确保不会出现消息重复


干杯

您的客户从谁那里接收消息?您在发送端使用的是什么。如果您能提供这些详细信息,将能够更好地为我提供帮助。我对此做了一些补充,描述了发行商和代理,它们是mosquitto mqtt的一部分。好主意,尽管我尝试将值分配给“全局”静态字符串(由于线程问题,不是最佳做法)我能够将消息打印到asp:标签上。我要试一试。谢谢
mosquitto_pub -d -t hello/world -m "HelloWorld" -q 2