SOME/IP是Scalable service-Oriented MiddlewarE over IP (SOME/IP)的缩写,基于IP的可扩展面向服务的中间件。广泛应用于汽车行业嵌入式通信。 它是基于服务的,服务可以由0个或多个Event,Method,Field组成。
Event是一种单向的数据传输,在数据发生变化时由服务端发给客户端,或者周期发送。
Method是一个被调用的方法。是由客户端调用,在服务端实现的方法。
Field表示一个状态,因此有Getter,Setter方法(Menthod),有Notify(Event)。
本篇主要介绍SOME/IP的消息格式,是《通信易懂唠唠SOME/IP》专栏的一篇,其他SOME/IP相关内容可关注专栏的其他文章。
一 SOME/IP报文格式
1.1 SOME/IP header
SOME/IP header的格式如下图
- Message ID (Service ID/Method ID) [32 Bits]
包括service id和Method id两部分,各占16 bit,用来唯一的标志RPC调用或者通知事件。
MethodID的最高位0表示是method,最高位是1代表event
- Length [32 Bits]
包含从Request ID开始直到SOME/IP消息结束的字节长度。
- Request ID (Client ID/Session ID) [32 Bits]
Request ID由Client ID和Session ID两部分组成,各占16bits
Client ID用来区分不同应用,Session ID用来区分来自同一个发送者的不同消息或请求,从0-0xff循环递增。
Client ID和Session ID一起组成RequestID,就可以多个应用并行使用相同的method,event或者getter,setter接口。
怎么理解呢?比如,在一个系统上,可能应用A和B都要请求同一个method,且请求多次。每个应用每次携带的method 参数不同,负责SOME/IP协议栈就要发出Request ID不同的多个请求。 假设分下面四条请求
应用A发出的请求1 clientid=0x0001,sessionid=0x0001
应用A发出的请求2 clientid=0x0001,sessionid=0x0002
应用A发出的请求1 clientid=0x0002,sessionid=0x0001
应用A发出的请求2 clientid=0x0002,sessionid=0x0002
对于Provider返回Response时会复制Request里面的RequestID,那协议栈在收到Response时就可以根据RequestID把不同的Response结果给不同的应用:clientid=0x0001,sessionid=0x0001是应用A第一次请求的结果,clientid=0x0001,sessionid=0x0002是应用A第二次请求的结果,clientid=0x0002,sessionid=0x0001是应用B第一次请求的结果,clientid=0x0002,sessionid=0x0002是应用B第二次请求的结果。
- Protocol Version [8Bits]
协议版本号。对于SOME/IP header 的不兼容的变化,版本号应该增加。
- Interface Version [8 Bits]
Service Interface主版本号
- Message Type [8 Bits]
Message Type用来区分不同的消息类型,取值见下表。
0x00 期望有应答的请求。
0x01 不需要应答的请求,又叫Fire&Forget消息。
在我们的实际应用中,设计的method,要么是0x00类型,要么是0x01。比如一个执行加法的Method,请求会带两个参数,希望Response里面携带计算结果,就是一个Request。还有一些method不关心执行结果,不需要应答,就可以设计成fire&forget。
0x02 是NOTIFICATION,单向通信的Event就是这个类型。
最后几个TP前缀都是针对长度大于1392bytes的大包数据类型的。
- Return Code [8 Bits]
Return Code用来标记请求是否被成功处理。只有RESPONSE和ERROR的消息的Return Code有效,其他类型的消息ReturnCode设置成E_OK(0x00)。
Return Code的允许的值如下表。
- Payload [variable size]
序列化之后的实际要传送的数据,由Event的数据元素或method的参数组成。
二 举例
SOMEIP报文的例子
- 例子一 event(Message type=0x02)
- 例子二 method(客户端请求Message type=0x00,Provider应答0x80)
Request消息
上一条Request对应的Response的消息