MQTT: PUBLISH

PUBLISH

DUP flag


当客户端或者服务器第一次尝试发送一个 PUBLISH 消息的时候,DUP 应该未设置为 0。

如果 DUP 为 1, 说明服务器或者客户端正在尝试重新传输一个之前已经发送过的 PUBLISH 消息。

对于 QoS 0 的消息, DUP 应该总是为 0.

对于服务器端来说,接收到的 PUBLISH 中的消息的 DUP 值不影响服务器在分发这个消息到订阅者时的 PUBLISH 消息中的 DUP 的值,它们之间没有必然联系。 是否是 DUP,完全由当前将被发送的 PUBLISH 消息是否是一个重传的消息决定。

对于PUBLISH 消息的接收者,如果 DUP 为 1,并不代表自己之前已经收到了这个消息。


RETAIN


对于服务器,收到一个 PUBLISH消息,RETAIN 是 1,那么服务器需要保存相应的 Application Message 和 QoS 值,在接下来如果有新的配置当前主题的订阅者来到的时候,将这个消息分发给它们。

当一个新的订阅者订阅了一个主题,那么当前主题中最后一个 RETAIN 消息(如果有的话)应该被分发给当前订阅者。如果当前订阅匹配到多个主题,那么每个主题都需要做这样的检查。

如果服务器收到一个 QoS 0 的消息,但是 RETAIN 值为 0, 服务器需要丢弃当前主题中所有的 RETAIN 消息。然后将当前新的 QoS 0 消息作为当前主题的新的 RETAIN 消息,但是可以选择在任意时间丢弃这个消息。如果丢弃了这个消息,那么当前主题中将没有其他 RETAIN 消息了。

当服务器给客户端发送 PUBLISH消息时, 如果当前消息发送的原因是这个客户端刚刚订阅了一个新主题,此时 RETAIN 需要被设置为 1. 如果当前消息发送的原因是当前消息匹配了当前客户端已有的一个订阅,此时 RETAIN 需要被设置为 1(此时,即使这个PUBLISH在发送给服务器时 RETAIN 是 1)。

当服务器收到一个 RETAIN 的 PUBLISH 消息,但是这个消息的 payload 是空的时候, 它还是会像处理正常的 PUBLISH 那样将消息分发给所有订阅者。然后相同主题的 RETAIN 消息会被移除,并且接下来的订阅者将不会收到任何RETAIN消息。

“As normal” means that the RETAIN flag is not set in the message received by existing Clients. A zero byte retained message MUST NOT be stored as a retained message on the Server。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用C++ paho mqtt库中的mqtt::topic发布json对象的示例代码: ```c++ #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <json/json.h> #include "mqtt/async_client.h" using namespace std; const string ADDRESS("tcp://localhost:1883"); const string CLIENTID("AsyncPublisher"); const string TOPIC("test"); const int QOS = 1;const int TIMEOUT = 10000L; class callback : public virtual mqtt::callback { public: virtual void connection_lost(const std::string& cause) { cout << "\nConnection lost" << endl; if (!cause.empty()) cout << "\tcause: " << cause << endl; } virtual void delivery_complete(mqtt::delivery_token_ptr token) { cout << "\n\tDelivery complete for token: " << (token ? token->get_message_id() : -1) << endl; } }; int main(int argc, char* argv[]) { mqtt::async_client client(ADDRESS, CLIENTID); mqtt::connect_options connOpts; connOpts.set_keep_alive_interval(20); connOpts.set_clean_session(true); callback cb; client.set_callback(cb); try { mqtt::token_ptr conntok = client.connect(connOpts); conntok->wait_for_completion(); Json::Value root; root["name"] = "John"; root["age"] = 25; root["email"] = "john@example.com"; string json_str = root.toStyledString(); mqtt::message_ptr pubmsg = mqtt::make_message(TOPIC, json_str); pubmsg->set_qos(QOS); mqtt::delivery_token_ptr pubtok = client.publish(pubmsg); pubtok->wait_for_completion(TIMEOUT); cout << "Message '" << json_str << "' published to topic '" << TOPIC << "'" << endl; client.disconnect()->wait_for_completion(); } catch (const mqtt::exception& exc) { cerr << exc.what() << endl; return 1; } return 0; } ``` 在这个示例中,我们使用了Jsoncpp库来创建一个Json对象,并将其转换为字符串。然后,我们使用mqtt::make_message()函数创建一个mqtt::message_ptr对象,该对象包含要发布的主题和消息。最后,我们使用mqtt::async_client类的publish()函数将消息发布到主题上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VFSSoft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值