自动驾驶(八十六)---------通信中间件Fdbus

        最近在对接各供应商的SOA软件架构和舱驾融合方案,发现无论是在智驾底软,还是智驾和座舱的通信,基本都是采用了fdbus的通信方案,因此总结一下Fdbus的相关内容。本文分为以下三部分介绍Fdbus:1. 什么是Fdbus,它和SOMEIP的区别是什么?2. Fdbus通信机制,Protobuf的关系。 3. 给出一个本地通信代码示例,以及应用层如何调用接口实现通信。

1. 什么是Fdbus

        Fdbus 全称 Fast Distributed Bus,提供IPC+RPC功能。适用于多种OS,FDBus 的设计目标是提供高性能、低延迟和低资源开销的消息传递机制。它支持多种传输协议和底层网络架构,使得开发者可以在不同平台和环境中使用同一套接口进行通信,简化了跨平台开发的复杂性。

  • 高性能和低延迟:FDBus 的轻量级设计和高效的消息传递机制,确保了低延迟和高吞吐量,适用于对实时性要求高的应用场景。

  • 跨平台支持:FDBus 支持多种操作系统和硬件平台,包括 Windows、Linux 和嵌入式系统。开发者可以在不同平台之间无缝迁移,降低开发成本和时间。

  • 模块化和可扩展性:FDBus 的模块化设计使得系统可以根据需要进行扩展和定制。开发者可以根据具体需求,添加或修改功能模块,增强系统的灵活性。

  • 易于集成:FDBus 提供了简单易用的 API,方便与现有系统进行集成。开发者可以快速上手,并在现有项目中加入 FDBus 的消息传递功能。

  • 可靠性和安全性:FDBus 通过多种机制保证消息传递的可靠性和安全性,如消息确认、重传机制和加密通信,确保了数据传输的可靠性和安全性。

        基于以上原因,FDBus在域控中成为了关键通信机制,实现不同功能域之间的高效数据交换和协同工作。SOMEIP也是自动驾驶中另一种重要的通信方式,以下是 FDBus 和 SOME/IP 的主要区别:

  • 设计理念不同:FDBus注重轻量级、灵活性和高性能,适用于各种嵌入式和分布式系统。SOME/IP:侧重于服务导向的通信,适用于复杂的汽车电子系统,支持服务发现和描述。

  • 协议层次不同:FDBus在传输层之上提供消息传递机制,可以基于不同的底层网络协议(如 TCP、UDP 等)进行通信。SOME/IP基于 IP 协议,提供服务发现、服务描述和服务调用机制,适用于服务导向的通信模式。

  • 复杂度和资源开销:FDBus轻量级设计,资源开销低,适用于资源受限的嵌入式系统。SOME/IP提供丰富的服务导向功能,适用于复杂系统,但相对复杂度和资源开销较高

2. Fdbus通信机制

        Fdbus主要组件分为:

  • FDBus Context:FDBus的上下文管理器,负责管理整个消息传递系统的生命周期。它初始化并启动消息处理线程,管理消息队列和事件循环。

  • FDBus Server:服务器端组件,负责接收客户端的连接和消息请求,并处理这些请求。服务器通过绑定特定的URL来暴露服务,等待客户端连接。

  • FDBus Client:客户端组件,负责连接到指定的服务器URL,并发送消息请求。客户端可以订阅服务器的特定消息,以便接收通知或广播消息。

  • FDBus Message:消息对象,封装了要传递的数据和元信息。消息可以在客户端和服务器之间传递,并且可以携带负载数据。

  • FDBus Event:事件对象,表示特定的事件或通知。事件可以从服务器广播到多个客户端,或者在客户端之间传播。

        通信之前需要建立客户端和服务端的通信,要建立通讯需要指定IP和端口,FDBus使用URL来标识通信端点,URL的格式通常为fdbus://[IP地址]:[端口号]/[服务名]。服务器通过绑定特定的URL来暴露服务,客户端通过连接特定的URL来访问服务。

        综上,Fdbus通信的步骤为:

  • URL解析:客户端和服务器在启动时,会解析指定的URL,提取出IP地址、端口号和服务名等信息。
  • 连接管理:客户端根据解析出的IP地址和端口号,尝试与服务器建立连接。一旦连接建立,客户端和服务器之间就可以通过消息进行通信。
  • 消息路由:FDBus在内部维护一个消息路由表,映射每个服务名到相应的处理函数。消息到达服务器后,会根据服务名查找对应的处理函数,并调用该函数处理消息。
  • 消息创建:客户端或服务器创建一个FDBus消息对象,封装要传递的数据。

  • 消息发送:客户端调用invoke方法,将消息发送到服务器。服务器接收到消息后,调用相应的处理函数。

  • 消息处理:服务器处理消息,根据消息类型和内容执行相应的操作,然后创建一个回复消息对象。

  • 消息回复:服务器调用reply方法,将回复消息发送回客户端。客户端接收到回复消息后,调用相应的回调函数处理回复数据。

  • 事件广播:服务器可以创建事件对象,并调用broadcast方法,将事件广播给所有订阅该事件的客户端。

        Protocol Buffers(Protobuf)是Google开发的一种高效、可扩展的序列化协议。它用于结构化数据的序列化和反序列化,广泛应用于数据存储和网络通信。

  • 序列化:将数据结构转换为二进制格式,以便高效传输。
  • 反序列化:将二进制格式的数据还原为原始数据结构。

3. 本地通信代码示例

        服务器端代码(server.cpp)        

#include <common_base/fdbus.h>
#include <iostream>class MyServer : public CBaseServer
{
public:MyServer(const char *name) : CBaseServer(name) {}protected:void onOnline(FdbSessionId_t sid, bool is_first) override{std::cout << "Client connected: " << sid << std::endl;}void onOffline(FdbSessionId_t sid, bool is_last) override{std::cout << "Client disconnected: " << sid << std::endl;}void onInvoke(CBaseJob::Ptr &msg_ref) override{std::cout << "Received message from client." << std::endl;CFdbMessage *msg = msg_ref.get();msg->reply();}
};int main(int argc, char **argv){FDB_CONTEXT->start();MyServer server("MyServer");// 绑定到实际的IP地址和端口server.bind("fdbus://192.168.1.100:9001/my_server"); // 替换为服务器的实际IP地址server.enable();std::cout << "Server started. Waiting for clients..." << std::endl;FDB_CONTEXT->run();return 0;
}

        客户端代码(server.cpp)        

#include <common_base/fdbus.h>
#include <iostream>class MyClient : public CBaseClient
{
public:MyClient(const char *name) : CBaseClient(name) {}protected:void onOnline(FdbSessionId_t sid, bool is_first) override{std::cout << "Connected to server: " << sid << std::endl;CFdbMessage *msg = new CFdbMessage();invoke(msg, 0, "Hello, Server!");}void onOffline(FdbSessionId_t sid, bool is_last) override{std::cout << "Disconnected from server: " << sid << std::endl;}void onReply(CBaseJob::Ptr &msg_ref) override{std::cout << "Received reply from server." << std::endl;}
};int main(int argc, char **argv)
{FDB_CONTEXT->start();MyClient client("MyClient");// 连接到实际的IP地址和端口client.connect("fdbus://192.168.1.100:9001/my_server"); // 替换为服务器的实际IP地址std::cout << "Client started. Connecting to server..." << std::endl;FDB_CONTEXT->run();return 0;
}

        上层应用可以利用FDBus提供的消息传递机制进行通信。应用可以创建自己的消息类型,通过FDBus的invokereplybroadcast方法进行消息传递。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

169. 多数元素【 力扣(LeetCode) 】

一、题目描述 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 二、测试用例 示例 1&#xff1a; 输入&#xff1a;nums [3,2,…

结合el-upload上传组件,验证文件格式及大小

结合el-upload上传组件&#xff0c;验证文件格式及大小 效果如下&#xff1a; 代码如下&#xff1a; upgradeFirmwareInfo.vue页面 <template><div><el-dialog title"新增固件升级包" :visible.sync"dialogFormVisible"top"7vh&qu…

PyTorch深度学习实战——使用深度Q学习进行Pong游戏

PyTorch深度学习实战——使用深度Q学习进行Pong游戏 0. 前言1. 结合固定目标网络的深度 Q 学习模型1.1 模型输入1.2 模型策略2. 实现深度 Q 学习进行 Pong 游戏相关链接0. 前言 我们已经学习了如何利用深度 Q 学习来进行 Gym 中的 CartPole 游戏。在本节中,我们将研究更复杂的…

广州机房服务器搬迁布线方案

友力科技&#xff08;广州&#xff09;有限公司&#xff0c;专业从事数据中心机房建设、改造和搬迁工程。友力科技&#xff08;广州&#xff09;有限公司提供的服务内容包括但不限于&#xff1a;原数据中心设备下架准备、沿途运输、新数据中心上架运行、数据迁移等。 友力科技…

初识Java(三)

一、类和对象 Java语言是面向对象语言&#xff0c;通过对象与对象之间的交互&#xff0c;完成一个一个的任务。 例&#xff1a;要盖出一间房子&#xff0c;要有一张图纸。 类就好比是那张图纸&#xff0c;对象就好比是那一间房子。 房子是根据图纸盖出来的&#xff0c;对象…

【实在RPA案例集】实在智能助力中国烟草11省40余家多场景自动化!

近年来&#xff0c;为深入贯彻行业数字化转型战略部署和发展新质生产力体制机制&#xff0c;诸多省市烟草公司及中烟公司大力推进烟草行业数字化转型&#xff0c;然而烟草行业在数字化转型过程中始终存在一个核心痛点&#xff0c;即数据整合的复杂性、系统间的兼容性问题&#…

LabVIEW汽车动态信号模拟系统

随着汽车工业的快速发展&#xff0c;对汽车电子控制单元&#xff08;ECU&#xff09;的测试与仿真需求日益增加。开发了一种基于LabVIEW软件开发的汽车动态信号模拟系统&#xff0c;该系统能有效模拟ECU在实车环境下的工作状态&#xff0c;为ECU的开发和测试提供了一个高效、经…

函数式编程范式

文章目录 函数式编程范式不可变性&#xff08;Immutable&#xff09;纯函数&#xff08;Pure Functions&#xff09;函数作为一等公民&#xff08;First-Class Functions&#xff09;高阶函数&#xff08;Higher-Order Functions函数组合&#xff08;Function Composition&…

bug bug bug

importError: DLL load failed while importing _multiarray_umath: 找不到指定的模块。 Traceback (most recent call last): File "D:\yolov8_about\ultralytics-main3\trainCPU.py", line 4, in <module> from ultralytics import YOLO File "…

python项目通过docker部署到Linux系统并实现远程访问

背景需求&#xff1a;在Windows系统编写了简单的python代码&#xff0c;希望能通过docker打包到Linux Ubuntu系统中&#xff0c;并运行起来&#xff0c;并且希望在本地Windows系统中能通过postman访问。 目录 一、原本的python代码 二、创建一个简单的Flask应用程序 三、创…

基于深度学习的内容推荐

基于深度学习的内容推荐系统通过分析用户行为、内容特征以及用户与内容之间的交互数据&#xff0c;自动向用户推荐他们可能感兴趣的内容。这类系统在新闻、视频、音乐、社交媒体等平台中广泛应用。以下是对这一领域的系统介绍&#xff1a; 1. 任务和目标 内容推荐系统的主要任…

js求和reduce使用方法

1.使用循环结构&#xff08;如for循环&#xff09;进行累加 let sum 0; for (let i 1; i < 100; i) {sum i; } console.log(sum); // 输出5050 2.使用Array.prototype.reduce方法进行数组元素求和&#xff1a; const numbers [1, 2, 3, 4, 5]; const sum numbers.re…

MySQL 查询 limit 100000000, 10 和 limit 10 速度一样快吗?

MySQL 查询 limit 100000000, 10 和 limit 10 速度一样快吗&#xff1f; MySQL内部分为server层和存储引擎层。一般情况下存储引擎都用innodb。 server层有很多模块&#xff0c;其中需要关注的是执行器是用于跟存储引擎打交道的组件。 执行器可以通过调用存储引擎提供的接口&…

整合StarRocks更新表全部知识点

总结StarRocks更新表的全部内容的集合&#xff08;V3.2版本&#xff09; 一、基本功能 聚合函数replace的聚合表主键被主键表替代采用Merge-On-Read的策略&#xff0c;读取时需要在线Merge多个版本的数据文件&#xff0c;谓词和索引无法下推至底层数据&#xff0c;会严重影响…

LeetCode:对称的二叉树(C语言)

1、问题概述&#xff1a;给一个二叉树&#xff0c;看是否按轴对称 2、示例 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 3、分析 &#xff08;1&a…

解决 Android 应用安装错误:INSTALL_FAILED_BAD_PERMISSION_GROUP

解决 Android 应用安装错误&#xff1a;INSTALL_FAILED_BAD_PERMISSION_GROUP 在开发 Android 应用时&#xff0c;我们有时会遇到安装错误。这篇文章将讨论一种常见的错误&#xff1a;INSTALL_FAILED_BAD_PERMISSION_GROUP&#xff0c;并介绍解决方法。 问题描述 在尝试安装…

Go实用技巧

Golang实用技巧 Golang实用技巧 Context 1. 为了gorouines更可靠&#xff0c;避免实用context.Background()2. 不幸得是&#xff0c;context.Value 不是我们的朋友3. 使用context.WithoutCancel 保持 context 活跃 Context 1. 为了gorouines更可靠&#xff0c;避免实用con…

教学用MQTT工具的思考

前言 我在《智能物联网应用设计》课程中有个实验就是学习MQTT的使用&#xff0c;目前使用的是以下几个工具&#xff1a; 客户端使用MQTTX本地服务器使用的是mosquitto 云端服务器采用的巴法云协议分析软件采用的是Wireshark 这里Wireshark基本没有啥可以替代的&#xff0c;而…

Vue3 study

Vue3 工程 创建 还是能像 vue2 一样通过 vue-cli 创建&#xff0c;即 vue create projectName 但是官方更推荐 vite 创建&#xff0c;即 npm create vuelatest&#xff0c;然后从项目名开始配置 总结&#xff1a;入口在 index.html&#xff0c;它会引入 main.ts&#xff0c;…

Win11 操作(四)g502鼠标连接电脑不亮灯无反应

罗技鼠标连接电脑不亮灯无反应 前言 罗技技术&#x1f4a9;中&#x1f4a9;&#xff0c;贴吧技术神中神&#xff01; 最近买了一个g502&#xff0c;结果买回来直接插上电脑连灯都不亮&#xff0c;问了一下客服。客服简单的让我换接口&#xff0c;又是下载ghub之类的&#xf…