架构设计与落地)
文章目录本地FastDDS远端MQTT转发多主机数据隔离架构设计与落地一、架构核心设计贴合你的多主机/QtC场景1. 整体架构图文字版2. 核心模块职责二、数据隔离的双层实现核心需求落地1. 本地层FastDDS Domain ID 物理隔离2. 远端层MQTT主题ACL 逻辑隔离1MQTT主题命名规则统一格式强制隔离2MQTT Broker ACL权限强化隔离三、架构优缺点1. 核心优势2. 潜在劣势与解决方案四、QtC落地实现要点核心代码框架1. 中转站核心代码FastDDS接收MQTT转发2. 本地EXE代码仅需FastDDS无需关心MQTT3. 配置文件config.ini跨主机仅需修改此文件五、最终建议1. 架构选型结论2. 落地优先级3. 替代方案对比仅作参考本地FastDDS远端MQTT转发多主机数据隔离架构设计与落地一、架构核心设计贴合你的多主机/QtC场景该架构的核心是**“单主机FastDDS域隔离 中转站统一转发 MQTT主题/ACL远端隔离”**每台主机部署一个“FastDDS-MQTT中转站”作为本地FastDDS和远端MQTT的唯一桥梁既保留FastDDS本地自动配置的优势又通过MQTT实现跨主机/远端通信同时保障多主机数据隔离。1. 整体架构图文字版┌────────────────────────────────────────────── 主机A ──────────────────────────────────────────────┐ │ ┌─────────┐ ┌─────────┐ ┌──────────────────────────────────────────────┐ │ │ │本地EXE 1│ │本地EXE 2│ │ FastDDS-MQTT 中转站 │ │ │ │(FastDDS)│◄──►│(FastDDS)│◄──►│ [FastDDS模块] [MQTT模块] [隔离管控] │◄─────┐ │ │ └─────────┘ └─────────┘ └──────────────────────────────────────────────┘ │ │ │ ▲ │ │ │ │本地 FastDDSDomain ID 100 │ │ └────────────────────────────────────┴────────────────────────────────────────────────┘ │ │ ┌────────────────────────────────────────────── 主机B ──────────────────────────────────────────────┐ │ ┌─────────┐ ┌─────────┐ ┌──────────────────────────────────────────────┐ │ │ │本地EXE 1│ │本地EXE 2│ │ FastDDS-MQTT 中转站 │ │ │ │(FastDDS)│◄──►│(FastDDS)│◄──►│ [FastDDS模块] [MQTT模块] [隔离管控] │◄─────┐ │ │ └─────────┘ └─────────┘ └──────────────────────────────────────────────┘ │ │ │ ▲ │ │ │ │本地 FastDDSDomain ID 101 │ │ └────────────────────────────────────┴────────────────────────────────────────────────┘ │ │ ▼ ▼ ┌───────────────────────────────────────────────────────────────────────────────────────────────────┐ │ 远端 MQTT BrokerEMQ X / 阿里云 IoT │ │ 主题隔离 ACL 权限实现多主机数据隔离 │ └───────────────────────────────────────────────────────────────────────────────────────────────────┘2. 核心模块职责模块核心职责本地EXEFastDDS仅接入本机专属FastDDS域发布/订阅数据无需关心MQTT享受FastDDS自动发现/配置的优势主机内FastDDS域每台主机分配唯一Domain ID如主机A100主机B101本地FastDDS仅发现同域节点实现本地数据物理隔离FastDDS-MQTT中转站1. 本机FastDDS域的“超级节点”订阅本地所有FastDDS Topic接收所有EXE数据2. 数据转换将FastDDS的CDR格式转为MQTT可传输的ProtoBuf/JSON3. MQTT转发按“主机标识Topic”规则发布到远端Broker4. 反向转发接收远端MQTT数据转换为FastDDS格式发布到本机域5. 隔离管控严格按权限订阅/发布MQTT主题禁止跨主机越权远端MQTT Broker1. 主题隔离按“主机标识”划分MQTT主题空间2. ACL权限限制每个中转站仅能访问自身主机的主题二、数据隔离的双层实现核心需求落地多主机数据隔离需从“本地物理隔离”和“远端逻辑隔离”两层入手缺一不可1. 本地层FastDDS Domain ID 物理隔离核心逻辑FastDDS的Domain ID是节点分组的核心标识不同Domain ID的节点无法互相发现、通信实现“本机数据不跨域”落地配置为每台主机分配唯一的Domain ID范围0-232避免冲突写入中转站的配置文件如domain_id100本地所有EXE和中转站均使用该Domain ID创建FastDDS参与者跨主机的FastDDS数据完全隔离即使网络互通也无法访问中转站是本机域内唯一能与MQTT交互的节点本地EXE无MQTT权限杜绝EXE直接访问远端数据。2. 远端层MQTT主题ACL 逻辑隔离1MQTT主题命名规则统一格式强制隔离定义全局唯一的主题格式将“主机标识”作为主题前缀确保不同主机的数据不会混流/host/{主机唯一标识}/{数据类型}/{FastDDS Topic名}示例主机A标识device001的北斗数据/host/device001/sensor/BeidouData主机B标识device002的USBL数据/host/device002/sensor/USBLData中转站自动拼接规则读取本机配置的host_id将本地FastDDS Topic转换为上述MQTT主题无需手动修改代码。2MQTT Broker ACL权限强化隔离在MQTT Broker推荐EMQ X中配置ACL规则限制每个中转站的MQTT客户端仅能访问自身主机的主题# EMQ X ACL配置示例 allow device001 publish /host/device001/# allow device001 subscribe /host/device001/# allow device002 publish /host/device002/# allow device002 subscribe /host/device002/# deny all publish # deny all subscribe #效果主机A的中转站只能发布/订阅/host/device001/下的主题无法访问主机B的主题即使知道主题名也会被Broker拒绝。三、架构优缺点1. 核心优势优势维度具体价值本地通信体验完全复用FastDDS的自动发现/配置/序列化本地EXE仅需订阅Topic即可通信无需手动配置地址/序列化数据隔离安全性双层隔离Domain ID物理隔离MQTT主题/ACL逻辑隔离多主机数据完全隔离避免越权访问远端通信适配性MQTT穿透性强跨网段/公网/防火墙部署成本远低于FastDDS的跨网段DS服务器QtC适配性FastDDS和Qt MQTT模块Qt5.10原生支持均可集成到Qt项目跨平台Win/Linux/macOS编译灵活性本地保留FastDDS的实时性5-10ms远端用MQTT降低部署复杂度兼顾实时性和易用性2. 潜在劣势与解决方案劣势解决方案中转站单点风险1. 中转站进程加入心跳检测本地EXE监控异常则自动重启2. 关键主机可部署双中转站MQTT Broker做主备切换数据转换成本封装通用转换模块FastDDS IDL生成的类 ↔ ProtoBuf/JSON一次性封装后所有主机复用MQTT延迟较高100-200ms1. MQTT Broker就近部署如与主机同区域2. 配置MQTT QoS0实时性优先3. 高频数据压缩后传输配置项较多统一配置文件管理将Domain ID、host_id、MQTT Broker地址等写入config.ini所有模块读取配置无需修改代码四、QtC落地实现要点核心代码框架1. 中转站核心代码FastDDS接收MQTT转发#includeQCoreApplication#includeQSettings#includeQMqttClient#includefastdds/dds/domain/DomainParticipantFactory.hpp#includeUnifiedDataPubSubTypes.h// FastDDS IDL生成的类// 全局配置从config.ini读取QSettingssettings(config.ini,QSettings::IniFormat);intdomainIdsettings.value(fastdds/domain_id).toInt();QString hostIdsettings.value(mqtt/host_id).toString();QString mqttBrokersettings.value(mqtt/broker).toString();intmqttPortsettings.value(mqtt/port).toInt();// FastDDS数据监听类classFastDDSListener:publicDataReaderListener{public:voidon_data_available(DataReader*reader)override{UnifiedData data;SampleInfo info;if(reader-take_next_sample(data,info)RETCODE_OKinfo.valid_data){// 1. FastDDS数据转换为ProtoBuf或JSONstd::string serializedData;data.SerializeToString(serializedData);// 2. 拼接MQTT主题/host/device001/sensor/UnifiedDataQString mqttTopicQString(/host/%1/sensor/%2).arg(hostId).arg(data.topic_name());// 3. MQTT发布QMqttClient*clientqobject_castQMqttClient*(parent());client-publish(mqttTopic,QByteArray(serializedData.c_str(),serializedData.size()));}}};intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);// 1. 初始化FastDDS本机Domain ID DomainParticipant*participantDomainParticipantFactory::get_instance()-create_participant(domainId,PARTICIPANT_QOS_DEFAULT);UnifiedDataPubSubType type;participant-register_type(type);Topic*topicparticipant-create_topic(UnifiedData,type.get_type_name(),TOPIC_QOS_DEFAULT);Subscriber*subscriberparticipant-create_subscriber(SUBSCRIBER_QOS_DEFAULT);FastDDSListener listener;DataReader*readersubscriber-create_datareader(topic,DATAREADER_QOS_DEFAULT,listener);// 2. 初始化MQTT客户端 QMqttClient mqttClient;mqttClient.setHostname(mqttBroker);mqttClient.setPort(mqttPort);mqttClient.setClientId(hostId);// MQTT客户端ID主机标识便于Broker ACL管控mqttClient.connectToHost();// 绑定FastDDS监听器的父对象为MQTT客户端便于转发listener.setParent(mqttClient);// 3. MQTT接收远端数据转发到本地FastDDS connect(mqttClient,QMqttClient::messageReceived,[](constQByteArraymsg,constQMqttTopicNametopic){// 仅处理本机主题避免跨主机数据if(!topic.name().startsWith(QString(/host/%1/).arg(hostId)))return;// MQTT数据转换为FastDDS格式发布到本机域UnifiedData data;data.ParseFromArray(msg.data(),msg.size());DataWriter*writerparticipant-create_datawriter(topic,DATAWRITER_QOS_DEFAULT);writer-write(data);});// 订阅本机MQTT主题mqttClient.subscribe(QMqttTopicFilter(QString(/host/%1/#).arg(hostId)));returna.exec();}2. 本地EXE代码仅需FastDDS无需关心MQTT#includeQCoreApplication#includeQSettings#includefastdds/dds/domain/DomainParticipantFactory.hpp#includeUnifiedDataPubSubTypes.hintmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);// 读取本机Domain ID与中转站一致QSettingssettings(config.ini,QSettings::IniFormat);intdomainIdsettings.value(fastdds/domain_id).toInt();// FastDDS初始化仅需3步自动发现中转站DomainParticipant*participantDomainParticipantFactory::get_instance()-create_participant(domainId,PARTICIPANT_QOS_DEFAULT);UnifiedDataPubSubType type;participant-register_type(type);Topic*topicparticipant-create_topic(UnifiedData,type.get_type_name(),TOPIC_QOS_DEFAULT);// 发布数据自动发现本机域内的订阅者无需指定地址Publisher*publisherparticipant-create_publisher(PUBLISHER_QOS_DEFAULT);DataWriter*writerpublisher-create_datawriter(topic,DATAWRITER_QOS_DEFAULT);UnifiedData data;data.set_topic_name(UnifiedData);data.set_content(本地EXE的北斗数据);writer-write(data);returna.exec();}3. 配置文件config.ini跨主机仅需修改此文件[fastdds] domain_id 100 # 主机A100主机B101以此类推 [mqtt] host_id device001 # 主机唯一标识 broker 47.96.38.26 # MQTT Broker公网IP port 1883五、最终建议1. 架构选型结论该架构本地FastDDS远端MQTT双层隔离是你场景的最优解满足“本地EXE仅订阅即可通信”复用FastDDS自动配置/发现的优势降低本地EXE开发成本满足“多主机数据隔离”Domain ID物理隔离MQTT主题/ACL逻辑隔离安全性可控跨平台适配FastDDS和Qt MQTT均支持Win/Linux/macOS配置文件统一管理部署灵活成本平衡本地实时性FastDDS 远端易用性MQTT比纯FastDDS跨网段部署成本低比纯MQTT本地通信实时性高。2. 落地优先级先完成单主机验证部署中转站本地EXE测试FastDDS本地通信MQTT转发配置Broker ACL规则验证多主机数据隔离封装通用转换模块FastDDS↔ProtoBuf所有主机复用增加中转站容灾、数据压缩、心跳检测等优化。3. 替代方案对比仅作参考方案隔离性本地体验远端部署成本实时性适配性本地FastDDS远端MQTT高优低中高优纯FastDDS跨网段高优高需DS集群高中纯MQTT本地远端中差手动配置低中中综上该架构完美适配你的核心需求本地FastDDS简化配置、远端MQTT降低部署成本、双层隔离保障多主机数据安全且完全兼容QtC跨平台开发体系。