前言
本文主要对SOME/IP协议相关知识进行了汇总,仅作为自学使用,以方便后续查漏补缺。
中间件
中间件的任务
-
实现软件组件之间的数据交换。
-
确保需要交换的数据在网络中透明的传输。
SOME/IP协议
SOME/IP(Scalable Service-Oriented Middleware over IP),一种面向服务的汽车通信中间件解决方案。即位于 IP 协议层以上的一种面向服务的可扩展的中间件。
- 可扩展
some/ip能够实现不同硬件平台、不同操作系统以及不同应用软件的异构设备之间的可扩展性和互操作性。 - 面向服务
是与传统汽车电子行业中面向信号通信(CAN/LIN)相对应的一个概念。面向服务通信,仅当客户端请求或服务器通知特定订阅者时,才在客户端和服务器之间交换数据。确保了不会浪费带宽,且仅在需要时通信。区别:- 面向信号
- 对信号进行传输。
- 是一种根据发送者需求实现的通信过程,当发送者发现信号值变化了或发送周期到了,就会发送信息,不考虑接收者是否有需求。
- 面向服务
- 对服务中的信息进行传输。
- 仅在接收者需要时才发送数据。
- 优点:总线上不会出现过多不必要的数据,从而降低负载。
- 面向信号
- 位于IP协议层之上
汽车以太网协议栈可划分为五层:物理层、数据链路层、网络层、传输层、应用层。SOME/IP是一种应用层协议。 - SOME/IP作为一种中间件
负责组织传输复杂数据,并约定软件组件之间的函数调用(RPC)。 - SOME/IP-SD
是SOME/IP中的服务发现机制。通过SOME/IP-SD,someip可以确定服务是否可用,客户端可以通过someip-sd来查找服务的地址、判断服务的可用性、订阅事件组。
SOMEIP通信机制
- 为应用程序提供抽象的面向服务的接口。因此,应用程序不需要处理IP地址和端口,而只需要处理服务。
- Server端提供了一个实现服务接口的服务实例;Client端则通过someip方式使用服务实例。
四种通信模式
- Request & Response(双向方法)
- 客户端方式请求,服务端回复响应,有问有答。
- Fire & Forget(单向方法)
- 客户端方式请求,服务端不需要响应,只问不答。
- Event(事件)
- 客户端首先使用SD订阅某一事件组(Event Grounp),当事件组中包含的事件发生后,服务端就会自动给客户端方式相关的通知(Notification),Notification消息不需要接收方进行回复。
- 注:someip协议中的Event总是分组在一个Grounp中,因此只能订阅Event Grounp,而不是Event本身。
- Fields(字段)
- 表示可以远程访问的属性,即客户端可以远程访问服务端中的变量。
- 可以通过Get方法获取Field值、Set方法设置Field的值。
四种通信模式区别
- Field:持续存在的变量,可以在任何时刻获取,如:车速、环境温度
- Event:事件没有发生就不存在,如:发生碰撞、出现故障。
SAMEIP协议报文格式
- 应用层发送的数据按照someip格式打包后,传递到下层的TCP/IP或UDP/IP层,再进行逐层打包和封装,最终在物理层通过比特流的形式进行传输。
- 报文格式:消息头(Header)+数据段(Payload)
SAMEIP-SD协议报文格式
- SAMEIP-SD依赖于SAMEIP,SAMEIP本身支持TCP和UDP通信,但SAMEIP-SD只能通过UDP进行传输。
- SAMEIP-SD主要用于
- 定位服务实例
- 检测服务实例是否在运行
- 实现发布/订阅
- SAMEIP-SD是在SAMEIP数据报文的基础上进行了扩展,增加了Entry、Option等字段。
- Entry:同步服务实例的状态和发布/订阅的管理;
- Options:用于传输Entries的附加信息
Wireshark 解析 SOME/IP 协议报文
- 打开录制的ELF格式的报文,等待加载完成;
- 报文默认显示的是UDP报文
- 右键任意一个UDP的报文,点击Decode as,然后在Current栏选择SOME/IP,可识别出someip格式
- 根据过滤规则,过滤想要查看的报文
- 示例:对比查看CANoe和Wireshark显示的报文
- 示例:对比查看CANoe和Wireshark显示的报文