编者按:本文来自微信公众号“曲奇泡芙”(ID:YummyCookiePuff),作者曲奇泡芙,36氪经授权发布。
“Color is a power which directly influences the soul.”
车载以太网作为主干的整车网络拓扑架构中,以太网节点(如域控制器)之间进行数据通讯需要协商使用共同的应用层协议。在车载场景中的以太网应用中,根据不同的应用特点适用不同的应用层协议,如用于ECU诊断和刷写的DoIP(Diagnostics over Internet Protocol)协议,用于消息订阅发布的MQTT(Message Queuing Telemetry Transport)协议,以及用于控制消息通讯的面向服务的SOME/IP(Scalable Service-Oriented Middleware over IP)协议等。
面向服务的架构可以将使用AUTOSAR Classic的功能ECU以及使用AUTOSAR Adaptive或其他智能操作系统的域控制器桥接起来,通过SOME/IP协议进行控制消息通讯。
SOME/IP协议于2011年由当时在BMW集团的Lars Völker设计,并于2013年纳入AUTOSAR 4.1规范。如下图,SOME/IP在以太网协议栈中处于四层协议之上,属于应用层协议,底下的传输可以使用TCP或者UDP协议。基于UDP协议的SOME/IP实现限制了单条消息长度不能超过单个UDP包的大小,为解决这个问题2016年的AUTOSAR 4.3规范中添加了SOME/IP-TP协议定义了如何在UDP上分段传输更大的SOME/IP消息。
SOME/IP定义服务的接口包含方法(Methods),事件(Events),字段(Fields)和事件组(Eventgroups),可以支持请求/响应模式的远程服务调用,也可以支持订阅/发布模式的消息通知。SOME/IP的一个主要用例是控制消息的通讯,类似于传统CAN总线架构的控制信号传输,SOME/IP在以太网上支持低延时的周期性和事件性的消息传输。
SOME/IP的数据报文格式如下图,包头部分包含服务ID,方法ID,消息体长度,客户端ID,会话ID,协议版本,消息类型等数据。
SOME/IP定义了其服务发现协议SOME/IP-SD,用于动态发现服务的提供者地址以及检查服务状态是否健康。SOME/IP-SD的消息通过UDP发送,每个设备通过在局域网中周期性的广播一条包含其提供的所有服务的OfferService消息来帮助其他设备完成服务发现(服务IP,端口等信息)。服务调用者也可以通过广播一条FindService消息来主动查询自己需要的服务。
同一个服务在车内可以有多个提供者的实例(如通过冗余实现服务的高可用),同一个服务的不同实例通过使用不同的端口来区分。服务地址动态发现相对于静态配置服务IP和端口提供了灵活性,但也相应的为初始化带来了一点延时。为了减少服务发现的延时,SOME/IP-SD定义了服务启动后的三个阶段:初始化等待阶段(Initial Wait Phase),重复阶段(Repetition Phase),正式阶段(Main Phase)。这三个阶段的起止时间以及广播间隔时间可配置,其中重复阶段通过指数递增的方式来从一个相对小的周期开始增长服务发现广播报文的间隔时间。
vsomeip 是GENIVI项目中的一个SOME/IP开源实现,基于Mozilla Public Liense v2.0协议开源,由BMW贡献。vsomeip提供了两个动态库:SOME/IP协议的实现库libvsomeip.so以及用于服务发现的库libvsomeip-sd.so。
如下图,vsomeip除了支持设备之间的SOME/IP通讯,也支持设备本地的进程间通讯,本地通讯通过unix socket完成。vsomeip的实现基于boost.asio的异步IO库。vsomeip应用通过一个Routing Manager与其他设备进行通讯,Routing Manager统一负责服务发现以及外部通讯socket的管理。一个设备上的多个vsomeip应用共用一个Routing Manager,默认第一个启动的vsomeip应用负责启动Routing Manager,也可以通过配置指定,其他应用通过proxy与Routing Manage进行通讯。
vsomeip应用可以通过json文件来进行配置,配置项包含自身IP,应用名字,负责启动Routing Manager的应用,应用日志,服务发现的广播地址,广播间隔等。
vsomeip的HelloWorld程序相对简单,感兴趣的朋友可以上github上围观。(https://github.com/GENIVI/vsomeip/tree/master/examples/hello_world)