最近在研究Qt中MQTT的使用,遇到一个棘手的问题,就是如何判断发布者或订阅者掉线的问题; 根据经验首先想到的肯定是心跳包,但是mqtt在物联网领域已有了很深的造诣,这点我都能想到的问题,开发者肯定考虑到了啊,经过找api,发现了willMessage, 遗嘱消息,顾名思义,不就是断气前的遗嘱吗?于是方向有了,就是用遗嘱消息。
一、使用总结
探索过程总是艰难的,就不赘述了,直接讲设置遗嘱消息的步骤
- 根据MQTT的Qt接口中提到的,必须在断开连接的状态下设置遗嘱属性,也就意味着
在连接前就要设置好遗嘱消息
,估计是避免你刚连接上就嗝屁了,很有道理,考虑很周到。
同时,查看了qt官方提供的mqtt源码,证明了上述观点。其在连接时,就判断并设置好了遗嘱。
分析到此为止,最终代码就不言而喻了:
//...
m_client->setHostname("http://localhost");
m_client->setPort(1883);
m_client->setWillTopic("jd/device/dead");
m_client->setWillMessage("byebye");
m_client->setWillQoS(1);
m_client->setWillRetain(false);
m_client->connectToHost();
// ...
二、注意事项
从mqtt-5.0规范中截取的一张图:
从上图中可以看到,只有在非正常断开连接时,才会触发遗嘱消息
。
也就意味着调用disconnectFromHost()
方法是不会触发此遗嘱消息的。
在mqtt-v3.xx规范中并没有提到,也可能是我没有看到,殊途同归,应该是一致的。
想想也有道理,正常死亡,自己是有机会去立遗嘱的;当非正常死亡,你的生前遗嘱就生效了。