我目前正在使用订购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 。再一次,这是一个完全在我的笔记本电脑上进行的简单测试。
希望这些额外信息可以更清楚地了解我正在尝试的内容。
答案 0 :(得分:1)
请指定QOS 2并进行测试。
mosquitto_pub -d -t hello/world -m "HelloWorld" -q 2
以下是在线文档的详细信息。
QoS0,最多一次:消息最多发送一次,或者可能 根本没有交付。它通过网络传输不是 确认。邮件未存储。如果,消息可能会丢失 客户端断开连接,或者服务器出现故障。 QoS0就是 最快的转移方式。它有时被称为"火和忘记"。
MQTT协议不要求服务器转发出版物 QoS0到客户端。如果客户端在服务器时断开连接 收到该出版物,该出版物可能会被丢弃, 取决于服务器实现。
QoS1,至少一次:消息始终至少传递一次。它 如果在之前发生故障,可能会多次发送 发件人收到确认。必须存储该消息 在发件人本地,直到发件人收到确认 消息已由接收方发布。消息存储在 必须再次发送邮件。
QoS2,恰好一次:消息始终只发送一次。该 邮件必须本地存储在发件人,直到发件人 收到消息已被发布的确认 接收器。存储消息以防必须发送消息 再次。 QoS2是最安全但最慢的传输模式。更多 使用复杂的握手和确认序列 用于QoS1以确保不会发生重复消息。
干杯!