集成方式,demo见附件
可参考【探索 MQTT 5.0 新特性:基于 MQTTX CLI 的使用示例 | EMQ】
问题记录
1. ROS集成构建问题:如下图,少了依赖库导致未定义的符号
2. 订阅失败:原因
virtual bool Connect() {
m_quic_client.set_callbacks(this);
Property cp;
cp.append_u32(MAXIMUM_PACKET_SIZE, 120)
.append_u32(SESSION_EXPIRY_INTERVAL, 120)
.append_u16(RECEIVE_MAXIMUM, 120)
.append_u32(MAXIMUM_PACKET_SIZE, 120);
// .append_u16(TOPIC_ALIAS_MAXIMUM, 120);
m_cmsg.client_id(m_topic)
.user_name("emqx")
.password("emqx1234")
.clean_session(false)
.keep_alive(60)
.proto_version(5)
.will_topic("abc")
.will_msg((uint8_t*)"abc", 3)
.property(cp);
try {
ROS_INFO("CAICloudMqttOverQuic::Connecting to MQTT server: %s: %s", m_server_address.c_str(), m_port.c_str());
m_quic_client.connect(m_cmsg);
ROS_INFO("CAICloudMqttOverQuic::Connected to MQTT server success!");
// 这几行代码导致订阅失败
Property pp;
std::string payload = GetMacAddr("eth0") + " online!";
pp.append_strpair(USER_PROPERTY, "key", "val");
pp.append_u16(TOPIC_ALIAS, 10);
m_pmsg.dup(false)
.payload((uint8_t *)payload.c_str(), payload.length())
.property(pp)
.qos(2);
m_quic_client.publish(m_pmsg);
ROS_INFO("CAICloudMqttOverQuic::pub to topic success!");
}
catch (const mqtt::exception& ex) {
ROS_ERROR("CAICloudMqttOverQuic::Failed to connect to MQTT server: %s", ex.what());
Close();
return false;
}
SubMessage::topics topics = {
{m_topic, 2}
};
m_smsg.topic_with_qos(topics);
m_quic_client.subscribe(m_smsg);
ROS_INFO("CAICloudMqttOverQuic::subscribe topic [%s] success!", m_topic.c_str());
return true;
}
3. 这个接口处理注意,非栈内存 无需额外内存拷贝
4. 工程上使用,下行(服务到客户端消息被丢掉)
原因是客户端设置了收发报文大小:
5. Warning! msg lost due to busy socket---待更新
6. 客户端默认接收报文大小是多少?---待更新
7. connect链接阻塞一直不返回---目标ip是外网ip,域控连不了外网