当前位置: 首页 > news >正文

自动驾驶(八十六)---------通信中间件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方法进行消息传递。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#测试控制台程序调用Quartz.NET的基本用法
  • OpenCV 卷积 Robert算子,Laplance算子,Sobel算子,Canny边缘检测原理
  • 【DVWA靶场】Web安全之(布尔值/延时型)SQL盲注(超详细教程)
  • Android RSA 加解密
  • stm32F1xx时钟配置分析总结
  • linux快速入门-学习笔记
  • Adobe“加速”创意人士开启设计新篇章
  • MongoDB教程(二十二):MongoDB固定集合
  • [k8s源码]8.deltaFIFO
  • Vue Router基础
  • BSV区块链在人工智能时代的数字化转型中的角色
  • 【快速实践 OpenCV morphology】形态学操作:腐蚀、膨胀、开运算、闭运算
  • 无人机飞行姿态俯仰、横滚、偏航、油门详解
  • vite+react+ts+Rust来进行前后端web开发(hello world)
  • 后端返回一个图片链接,前端如何实现下载功能?
  • 《Java编程思想》读书笔记-对象导论
  • 【剑指offer】让抽象问题具体化
  • Angular 2 DI - IoC DI - 1
  • Docker下部署自己的LNMP工作环境
  • Druid 在有赞的实践
  • node-glob通配符
  • 前端面试之闭包
  • 让你的分享飞起来——极光推出社会化分享组件
  • 我看到的前端
  • 协程
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 阿里云服务器如何修改远程端口?
  • ​Java并发新构件之Exchanger
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • "无招胜有招"nbsp;史上最全的互…
  • # 数据结构
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #if 1...#endif
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (0)Nginx 功能特性
  • (2020)Java后端开发----(面试题和笔试题)
  • (2022 CVPR) Unbiased Teacher v2
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (javascript)再说document.body.scrollTop的使用问题
  • (Qt) 默认QtWidget应用包含什么?
  • (笔记)M1使用hombrew安装qemu
  • (二)丶RabbitMQ的六大核心
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (计算机网络)物理层
  • (四)c52学习之旅-流水LED灯
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 托管代码与非托管代码
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NET成年了,然后呢?
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递