idl文件内容:
struct HelloWorldType {
long id; // 实例ID
string msg; // 消息内容
};
DDS Proxy启动时指定的配置文件:
forward_rules = {
dds_to_mqtt = {
from_dds = “MQTTCMD/topic1”
to_mqtt = “DDS/topic1”
struct_name = “HelloWorldType”
}
mqtt_to_dds = {
from_mqtt = “DDSCMD/topic1”
to_dds = “MQTT/topic1”
struct_name = “HelloWorldType”
}
}
dds {
domain_id = 0
shared_memory = {
enable = false
log_level = info
}
}
mqtt {
connector {
server = “mqtt-tcp://127.0.0.1:1883”
proto_ver = 4
keepalive = 60s
clean_start = false
username = username
password = passwd
}
}
生成代码的命令为:
idlc -l cxx HelloWorld.idl
我发布消息的代码为:
#include “HelloWorld.hpp” // 由IDL文件生成的头文件
#include <dds/dds.hpp>
#include
#include
int main() {
dds::domain::DomainParticipant participant(0); // 域ID为0
dds::topic::Topic topic(participant, “MQTTCMD/topic1”);
dds::pub::Publisher publisher(participant);
dds::pub::DataWriter writer(publisher, topic);
HelloWorldType sample;
sample.id(1);
std::cout << "=== [Publisher] 开始发送数据 ..." << std::endl;
for (int i = 0; i < 10; ++i) {
sample.msg("Hello DDS, count: " + std::to_string(i));
writer.write(sample);
std::cout << " 发送: " << sample.msg() << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return 0;
}
编译命令为:g++ publisher.cpp HelloWorld.cpp -I/usr/local/include/ddscxx -lddscxx -lddsc -o pub
我用MQTT客户端订阅主题DDS/topic1观察现象。启动pub后,MQTT客户端没有收到消息。但是我用nanomq提供的测试工具./nanomq_cli/nanomq_cli dds pub -t “MQTTCMD/topic1” --struct “HelloWorldType” -m ‘{“id”: 1,“msg”: “1234567890”}’,MQTT客户端可以收到消息。
我又写了一个C++版本的订阅者以测试:
#include “HelloWorld.hpp”
#include <dds/dds.hpp>
#include
#include
int main() {
dds::domain::DomainParticipant participant(0);
dds::topic::Topic topic(participant, “MQTTCMD/topic1”);
dds::sub::Subscriber subscriber(participant);
dds::sub::DataReader reader(subscriber, topic);
std::cout << "=== [Subscriber] 等待数据 ..." << std::endl;
while (true) {
auto samples = reader.take(); // 读取数据
for (auto &sample : samples) {
if (sample.info().valid()) {
std::cout << " 收到: " << sample.data().msg() << std::endl;
}
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
return 0;
}
编译命令为:g++ subscriber.cpp HelloWorld.cpp -I/usr/local/include/ddscxx -lddscxx -lddsc -o sub
sub可以收到pub发布的消息。
我不知道问题出在哪里,请问NanoMQ DDS proxy是否可以和原生的CycloneDDS通信?