SOME/IP

SOME/IP背景

SOME/IP的全称是Scalable service-Oriented MiddlewarE over IP,为基于IP的可扩展的面向服务的中间件,由宝马的Lars Völker博士在2011年设计并提出。SOME/IP是车载网络的通信中间件,位于应用程序和传输层之间,可以为控制器提供一种面向服务的通信方式,适配多种操作系统(如FreeRTOS、RTA-OS、QNX、Linux、Android等),甚至在没有操作系统的嵌入式设备上也可以使用。

什么是SOME/IP?

SOME/IP是定义在传输层之上的一种面向服务的中间件协议. 是汽车以太网面向服务架构的SOA的重要内容.
在这里插入图片描述

在这里插入图片描述
SOME/IP功能:

  1. 序列化
  2. RPC远程调用
  3. 服务发现SD
  4. 发布 / 订阅
  5. SOME/IP传输协议

1. 序列化

SOME/IP协议对序列化的解释为数据在PDU(Protocol Data Units 协议数据单元), 展开来说就是将不同的数据结构转换为可在网络中传输的形式, 或者说是数据在网络上传输的封装和排列规则. 发送规则将数据一种特定的规则进行序列化, 接受方将数据以同样的规则进行反序列化, 从而得到发送方到接受方所发送的所有数据. 这部分定义既包含了报文头部也包含了载荷数据, 不仅定义了头部的格式 各字段的长度和含义, 还定义了各种数据结构在有效载荷中的排列规则. 在这里插入图片描述

2. RPC 远程调用

通过RPC来请求其他主机上面的服务, 基于Request / Response的模式来实现. 客户端发起请求, 服务端接受请求并处理, 并将结果返回给客户端. (当我们在调用服务的时候, 就像直接调用本地的服务一样)
在SOME/IP中除了同步的调用方式, 还支持异步调用的Fire/Forget, 客户端发起请求后,不需要等待服务器的处理请求, 可以直接执行后面的代码, 同时服务器也不需要返回结果在这里插入图片描述

3. 服务发现

SOME/IP SD可以认为是SOME/IP协议的核心, 提供了一种可以动态的发现和获取服务的状态的机制. 所谓的面向服务的通信: 首先要知道哪些可以提供服务, 并且需要知道哪些服务的状态和提供方, 然后才可以使用和消费这个服务.

4. 发布 / 订阅功能

SOME/IP只会在需要的时候才发送数据, 这主要是通过发布 / 订阅的机制来实现的. 客户端在发现想要使用的服务后, 会对服务进行订阅, 当条件满足后, 服务器会将客户端所需要的服务发送出去.

5. SOME/IP 传输协议

主要解决了数据有可能被分片的问题. 在网络中, 数据都是通过IP协议传输的, 由于数据链路层MTU的限制, 导致可能会出现IP分片. 由于IP分片存在诸多的问题, 为了防止IP出现分片, 设计了SOME/IP TP(传输协议)

IP分片的问题

IP分片虽然能解决MTU限制, 但存在以下限制:

  • 重组开销大: 接受端需缓存所有分片, 直到最后一个分片到达, 消耗内存和计算资源
  • 分片丢失影响整体: 任一IP分片丢失会导致整个数据包无法重组, 需全部重传

所以有了SOME/IP在应用层实现分片和重组, 规避了IP分片, 在应用层自定义重传逻辑…

服务

服务是SOME/IP的核心,服务端提供服务,客户端使用服务.服务由零个或多个方法(Method)、事件(Event)以及字段(Fields)组成.

方法(Method)

客户端调用服务端的代码. 有两种形式:

  • Request & Response:常规的客户端请求,服务端响应
  • Fire & Forget(Request_NoReturn):单向客服端请求,服务端不响应
    在这里插入图片描述

事件(Event)

客户端向服务端订阅事件组EventGroup,当事件组有更新的时候,服务端发布消息,通知所有订阅的客户端
在这里插入图片描述

字段(Field)

方法和事件的组合,提供Getter/Setter两个方法用于去获取和设置字段,以及Notification事件,当字段值发生变化的时候,服务端发布消息,通知订阅的客户端在这里插入图片描述

消息格式

TCP/UDP 的 Payload 部分,由 SOME/IP Header 和 SOME/IP Payload 组成在这里插入图片描述
在这里插入图片描述
各字段含义如上图,其中 Message Type 取值及含义如下表:

服务发现主要用于

  • 定位服务实例
  • 检测服务实例状态是否在运行
  • 发布/订阅行为管理
    SOME/IP SD 也是 SOME/IP 消息,遵循 SOME/IP 消息格式,有固定的 Message ID、Request ID 以及 Message Type 等。并对 SOME/IP Payload 进行了详细的定义。
    在这里插入图片描述
    参考博客
SOME/IP(Scalable service-Oriented MiddlewarE over IP)是一种用于汽车行业的通信协议,它允许在基于IP网络中实现服务导向的通信。SOME/IP的设计目的是为了支持现代车辆内部不同ECU(Electronic Control Units)之间的复杂通信需求,使得软件组件能够以一种灵活的方式进行交互[^1]。 ### SOME/IP协议特性 - **服务发现**:SOME/IP本身并不提供服务发现机制,因此引入了SOME/IP-SD(Service Discovery)协议来处理服务的发布和订阅。这使得客户端能够动态地了解到网络中可用的服务。 - **事件组**:SOME/IP-SD还定义了事件组的概念,用于管理一组相关的事件。当类型字段为0x06或0x07时,表示使用的是SOME/IP-SD事件组类型格式[^2]。 - **服务条目类型**:除了事件组外,SOME/IP-SD还包括服务条目类型,用于描述服务的具体信息。这些条目可以通过特定的格式来识别[^2]。 ### SOME/IP网络配置中的应用 在网络配置方面,SOME/IP协议通常运行在以太网之上,利用标准的IP网络基础设施。这意味着它可以与其他基于IP的应用程序无缝集成,并且可以利用现有的网络管理工具和服务。 对于IP地址的分配,车辆内部网络可能会采用静态配置或者通过DHCP(Dynamic Host Configuration Protocol)动态分配IP地址。随着车辆网络复杂性的增加,采用更智能的IP地址管理和网络配置策略变得尤为重要。 ### SOME/IPIP地址管理 由于SOME/IP是基于IP的协议,因此其正常运作依赖于正确的IP地址配置。每个参与SOME/IP通信的节点都需要有一个唯一的IP地址。此外,还需要正确配置子网掩码、默认网关以及DNS服务器等参数,以便于跨网络通信。 在实际部署中,可能需要考虑如何自动配置这些网络参数,特别是在大规模部署或频繁变化的环境中。例如,在车辆启动时,可以通过预设的配置文件或者通过与其他车载系统的交互来自动获取必要的网络设置。 ### 示例代码 下面是一个简单的示例代码,展示了一个基本的SOME/IP服务端点的创建过程。请注意,这个例子非常简化,并不包含完整的SOME/IP实现细节: ```cpp #include <someip/someip.hpp> // 创建一个SOME/IP服务实例 someip::service::service_id_t service_id = 0x1234; someip::instance::instance_id_t instance_id = 0x5678; someip::eventgroup::eventgroup_id_t eventgroup_id = 0x90AB; // 初始化SOME/IP服务 someip::service service(service_id, instance_id); // 添加一个事件组到服务中 service.add_eventgroup(eventgroup_id); // 启动服务 service.start(); // 服务开始监听并响应客户端请求 while (true) { // 主循环处理事件... } ``` 这段代码展示了如何初始化一个SOME/IP服务,并添加一个事件组。实际的服务实现会更加复杂,包括处理方法调用、处理事件订阅以及发送和接收数据等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值