ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SOME/IP 详解

SOME/IP 详解 前言从事汽车电子的童鞋们一定接触过SOME/IP这个概念。它是汽车电子领域广泛使用的车载以太网通信中间件协议。目录一、概念及定位二、SOME/IP协议架构1) 分层架构2) Client-Server模型三、协议格式四、服务发现机制(SD)五、代码示例一、概念及定位SOME/IP是一种基于IP的、可扩展的、面向服务(SOA)的中间件协议。它与传统的面向信号通信如CAN总线有所不同SOME/IP采用的是按需发送的模式只有在接收方需要数据时才发送数据而不是像传统CAN通信那样周期性地持续往总线上发送信号。这种按需发送的设计旨在提高网络带宽利用率降低不必要的总线负载。二、SOME/IP协议架构1) 分层架构SOME/IP并非一个孤立的协议它是构建在完整的通信协议栈之上的应用层协议。根据OSI七层模型SOME/IP处于第5层会话层之上属于应用层的范畴。它依赖于传输层协议TCP/UDP和网络层协议IP来进行数据的传输。同时在AUTOSAR架构中SOME/IP协议栈的实现涉及到多个模块的协同工作包括PduR协议数据路由、Com通信管理、SoAdSocket抽象与连接管理以及SD服务发现等模块2) Client-Server模型SOME/IP采用客户端/服务器Client/Server的架构一个节点可以同时充当Client和Server角色。在这种架构下提供功能服务的一方称为服务提供者Server而使用功能服务的一方称为服务消费者Client。Client-Server模型典型的应用场景是远程过程调用RPC即 Client调用Server的方法并获得结果。三、协议格式SOME/IP报文以一个固定格式的头部开始(16字节)-------------------------------- | Message ID (32 bit) | -------------------------------- | Length (32 bit) | | (Header 8 bytes Payload 长度) | -------------------------------- | Request ID (32 bit) | -------------------------------- | Protocol Ver | Interface Ver | Message Type (8 bit) | | (8 bit) | (8 bit) | | -------------------------------- | Return Code (8 bit) | Reserved | | | (8 bit, 0x00) | --------------------------------其中Message Type有多种类型能够满足不同的通信场景Message Type类型名称描述0x00REQUEST请求消息Client发送给Server的请求期待Server响应。0x01REQUEST_NO_RETURN请求但不期待响应的请求Fire ForgetClient发送请求后不要求Server返回响应。0x02NOTIFICATION通知消息Server主动发送给订阅了某事件或字段的Client的消息。0x80RESPONSE响应消息Server对Client请求的响应报文包含Return Code和可能的返回数据。0x81ERROR错误消息Server向Client指示请求处理失败或发生了某些错误。0x20TP_REQUEST传输协议请求用于协商底层的传输协议参数如最大TP段大小。0x21TP_REQUEST_NO_RETURN传输协议请求但不期待响应用于协商参数。0x22TP_NOTIFICATION传输协议通知用于Server主动通知Client参数变更。0xA0TP_RESPONSE传输协议响应Client对TP协商请求的响应。0xA1TP_ERROR传输协议错误Server向Client指示TP协商失败。四、服务发现机制(SD)Service Discovery(SD是SOME/IP协议栈中用于实现服务发现和管理的核心机制。通过SDClient可以动态地查找网络中可用的服务实例并订阅感兴趣的事件或字段Server可以发布自身提供的服务并对订阅请求进行管理。它的Message ID固定为0xFFFF8100高16位为0xFFFF低16位为0x8100一般使用UDP端口号30490进行通信。SD机制的大致流程如下ECU A服务端 ECU B客户端 │ │ ├── Offer Service [0x8100] ──────→│ 广播/组播宣告服务可用 │ │ │←─── Find Service [0x8100] ──────│ 客户端主动寻找服务 │ │ ├←─ Subscribe Eventgroup ────────→│ 客户端订阅事件组 │─── Subscribe ACK ──────────────→│ 确认订阅如果需要取消订阅Client可以发送Stop Subscribe Eventgroup消息取消订阅Server停止对该Client发送对应的事件通知。SD的主要报文类型如下类型值作用Find Service0x00客户端寻找服务Offer Service0x01服务端宣告服务Stop Offer0x01 TTL0 (TTL生存时间)停止提供服务Subscribe0x06订阅事件组Subscribe ACK0x07确认订阅Stop Subscribe0x06 TTL0取消订阅五、代码示例我们来看一下vsomeip库相关的代码部分。服务端#include vsomeip/vsomeip.hpp #define SERVICE_ID 0x1234 #define INSTANCE_ID 0x5678 #define METHOD_ID 0x0421 class ServiceExample { std::shared_ptrvsomeip::application app_; public: void init() { app_ vsomeip::runtime::get()-create_application(Service); app_-init(); // 提供服务 app_-register_message_handler(SERVICE_ID, INSTANCE_ID, METHOD_ID, [this](const std::shared_ptrvsomeip::message request) { // 处理请求 auto response vsomeip::runtime::get()-create_response(request); // ... 填充 payload app_-send(response); }); app_-offer_service(SERVICE_ID, INSTANCE_ID); app_-start(); } };客户端class ClientExample { std::shared_ptrvsomeip::application app_; public: void init() { app_ vsomeip::runtime::get()-create_application(Client); app_-init(); // 注册可用回调 app_-register_availability_handler(SERVICE_ID, INSTANCE_ID, [this](vsomeip::service_t, vsomeip::instance_t, bool available) { if (available) { send_request(); } }); app_-request_service(SERVICE_ID, INSTANCE_ID); app_-start(); } void send_request() { auto req vsomeip::runtime::get()-create_request(); req-set_service(SERVICE_ID); req-set_instance(INSTANCE_ID); req-set_method(METHOD_ID); // ... 填充 payload app_-send(req); } };【上述代码中涉及了C11的一些新特性智能指针、lambda表达式等感兴趣的童鞋可以参考作者之前的文章做深入了解】
返回列表