SOME/IP协议详解_someip

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

        SOME/IP全称Scalable service-Oriented Middleware over IP是目前汽车行业实现SOA架构最核心的通信协议。SOME/IP协议以服务为单位管理整车信息服务可以包含各种可调用方法Method和事件通知组EventGroup通过Service Interface将信息进行传递共享按需分配服务。SOME/IP位于OSI七层模型的5-7层需要运行于TCP/IP协议栈之上即所有的SOME/IP报文都是IP报文都是TCP/UDP报文。

       在以CAN总线为主的车载网络中通信过程是面向信号的除了诊断通信之外。这是一种根据发送者需求实现的通信过程当发送者发现信号的值变化了或者发送周期到了就会发送信息而不考虑接收者是否有需求。而SOME/IP则不同它是在接收方有需求的时候才发送这种方法的优点在于总线上不会出现过多不必要的数据从而降低负载。

1 ServiceDiscovery是SOME/IP实现服务信息共享的核心机制。

FindService由Client端启动时发出查找所需的服务。

OfferService由Server端发出通告所提供的服务。

SOME/IP协议栈在进行启动时会进入三个阶段。分别是Initial Wait Phase、Repetition Phase、Main Phase。

Initial Wait Phase

在SOME/IP协议栈启动初始进入Initial Wait Phase该阶段仅在ECU内部进行初始化不进行对外通信不会有任何SOME/IP报文发出。

Repetition Phase

协议栈内部初始化完成之后进入Repetition Phase该阶段处于发出快发阶段。对于Server端将开始发送OfferService报文发送机制为周期倍增模式直至达到REPETITIONS_MAX次数然后进入Main Phase。
对于Client端将开始发送FindService报文查找所需服务发送机制同样是周期倍增模式直至达到REPETITIONS_MAX次数然后进入Main Phase若Client端在此阶段查找到所需服务则立即跳转入Main Phase。

Main Phase

进入Main Phase后Client端不再发送FindService但Server端以CYCLIC_OFFER_DELAY继续发送OfferService直至ECU休眠或关机。

<1> OfferService的TTL字段可以为0此时表示StopOfferService。
<2> FindService的InstanceID字段为0xFFFF时有特殊含义表示查找该Service的所有服务实例。
<3>MajorVersion必须完全一致才兼容MinorVersion向后兼容。
<4>FindService报文一般不携带节点信息.
<5>FindService报文包含的信息为所需的服务ID和服务实例ID。
<6>FindService报文以组播形式在局域网内进行服务搜索。
<7>OfferService报文必须携带节点信息。
<8>OfferService报文包含的信息为所提供的服务ID和服务实例ID。
<9>OfferService报文以组播形式在局域网内进行服务多播。
<10>收到FindService包含的服务是己身提供服务时Server端应第一时间进行OfferService应答。
 

2 subscribe服务订阅及ack

订阅发生在Main PhaseClient端在收到所需服务的OfferService之后判断该服务是否包含所需的事件组若包含则向该OfferService包含的节点信息发送Subscribe报文。当Server端收到订阅请求之后若服务有效应理解发送SubscribeACK进行应答订阅TCP服务需要先建立TCP连接。
 

<1>Subscribe以单播形式发送。
<2>Subscribe必须携带Client端的节点信息节点信息数量大于0小于3在Endpoint中指明Client的Transport Protocol、Port以及Transport Protocol。
<3>Subscribe报文TTL等于0时表示StopSubscribe。
<4>Subscribe报文订阅的最小单位时是事件组。
<5>Initial Data Requested Flag [1 bit]请求发送initial Event的标志位。当前业内不使用
<6>Counter [uint4]:用于区分相同用户相同事件组的订阅加一累计。当前业内不使用
<7>SubscribeACK以单播形式发送。
<8>SubscribeACK只有在包含多播事件组时才会包含Endpoint信息其中包含Multicast Transport Protocol和PortTransport Protocol默认为UDP。
<9>SubscribeACK报文TTL等于0时表示SubscribeNACK即拒绝订阅。
<10>若要订阅TCP服务需要先建立TCP连接。
 

3 Service Interface

Service Interface是各个SWC交换服务信息的媒介应用层通过发送和解析Service Interface来实现信息传递、远程调用算法、远程控制硬件和信息读取。Service Interface共分为四种每种的使用场景各不相同分别是R&R Method、F&F Method、Event和Field。


1 R&R Method全称Request&Response Method工作机制为请求应答机制。当Client搜索到所需服务后在服务的有效生存时间内Client端根据功能需求发出Request对于R&R MethodServer端必须给予Response应答若Request存在差错如Service ID无法识别、Interface Version不正确、数据格式不正确等等Server端需要进行Error应答并指明错误信息。
R&R Method用于短数据的传输、远程算法的调用、远程设备的控制等等场景。

R&R Method报文包含的关键信息有

Service ID——所请求的服务
Method ID——所请求的方法
Length——这里的Length指从Length字段的下一个字节起始的SOME/IP报文字节数
Interface Version——接口版本号
Message Type——消息类型。


对于R&R Method其Method ID的第一个bit必须为零且0不能作为Method ID因此其取值范围为0x0001-0x7FFF另R&R Method的充要标志是Message Type为0。ReturnCode用于Error信息的错误指示。

2 F&F Method全称Fire&Forget Method工作机制为请求应答机制。当Client搜索到所需服务后在服务的有效生存时间内Client端根据功能需求发出Request对于F&F MethodServer端不能够给予Response应答若Request存在差错如Service ID无法识别、Interface Version不正确、数据格式不正确等等Server端也不需要进行Error应答。
F&F Method一般用于不需要Response答复执行结果的场景比如需要Server发送某一个Event若执行成功Client会收到Event因此不需要Response答复此场景设计一个F&F Method即可。

F&F Method报文格式包含的关键信息有

    Service ID——所请求的服务
    Method ID——所请求的方法
    Length——这里的Length指从Length字段的下一个字节起始的SOME/IP报文字节数
    Interface Version——接口版本号
    Message Type——消息类型。

对于F&F Method其Method ID的第一个bit同样必须为零且0不能作为Method ID因此其取值范围为0x0001-0x7FFF另F&F Method的充要标志是Message Type为1。ReturnCode为0。

3 Event用于Server端向已定阅的Client端发送通知一般用于状态值的通知或触发性事件的通知。发送模式一般分为On Change和Cycle两种可以根据功能进行TCP发送、UDP单播发送和UDP多播发送。
在这里插入图片描述

Event报文格式包含的关键信息有

    Service ID——该通知所归属的服务
    Event ID——该通知的编号
    Length——这里的Length指从Length字段的下一个字节起始的SOME/IP报文字节数
    Interface Version——接口版本号
    Message Type——消息类型。

对于Event其Event ID的第一个bit必须为1且0x8000不能作为Method ID因此其取值范围为0x8001-0xFFFE(0xFFFF没有见过使用SOME/IP中全F常表示特殊含义了解的朋友可以分享一下)另Event的重要标志是Message Type为2。ReturnCode为0。

4 Field在报文结构上就是由Method和Event组成所以报文结构不在赘述Field接口更侧重于域值的管理对于AUTOSAR架构而言在系统配置中单独设立了一个接口用于Field的配置对于Linux常用的vsomeip协议栈而言Field的发送可以直接通过调用Method和Event的发送和解析接口实现Field暴露的服务接口由Notifier、Getter、Setter三种如下

         Notifier通知Server的Client订阅了服务后第一时间主动向其发送数据。

         Getter获取由Client向Server请求数据。

         Setter设置由Client修改Server的数据。

4.1 Notifier报文是Event格式用于服务器端对域值的主动通知在网络中传输时与Event报文没有区别尽在内部软件层面存在接口区分。推荐使用On Change模式进行发送。

4.2 Getter报文使用R&R Method格式用于Client端主动获取域值Server端收到Getter请求后应使用Getter Response将当前域值发送给Client端Getter请求报文一般不携带参数。

4.3 Setter报文使用R&R Method格式用于Client端主动更改域值Server端收到Getter请求后应使用Setter Response将更新后的域值发送给Client端Setter请求报文必须携带参数。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6