写在前面:
入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!!
1.SoAd模块作用
基于以太网的通信已经成为终端与终端之间通信的主流,汽车作为新时代的智能终端,也逐渐将以太网引入车载通信中,成为车载通信重要一环。
众所周知,动态配置以及路由是以太网核心优势,即实时通过端与端之间建立链接,就可以进行通信。
Classical AUTOSAR使用C代码实现,因为C代码的静态特性,因此基于AUTOSAR架构一定遵循静态关系概念,比如Can通信,基于AUTOSAR的can通信需要在编译前做好所有的静态配置,确定ECU与ECU之间的通信关系,在运行时严格执行。传输的数据被认为与它需要往返的源和接收一样是预先确定的。
如何将以太网通信引入AUTOSAR架构中呢?这就需要SOAD模块发挥适配器作用了。
Socket Adaptor模块旨在为TCPIP的动态配置通信概念与基于AUTOSAR的静态通信关系建立沟通的桥梁。
2.Socket Adaptor如何发挥适配器作用?
Soad的作用就是将AUTOSAR中基于回调的(Call-back Based)软件架构体系与TCP/IP世界中的基于套接字通信解耦处理。
3.SoAd与其他模块关系
- PDUR :PDUR给SOAD模块提供PDU路由功能。主要是针对需要大量自定义PDU的信号需求,比如Someip,需要PDUR将someip报文从LDCOM/COM模块与SOAD之间进行路由。
- UdpNm: UdpNm主要执行基于UDP报文的网络管理功能,因为UdpNm通过Soad模块的接口进行报文收发。
- Sd:Sd通过Soad模块接口进行服务发现报文的收发。Sd在进行服务发现处理之后,会对Soad中的Socket Connection以及Routing Group进行控制。
- Doip: Doip主要完成的是基于IP的诊断协议栈的诊断报文的处理。Doip会通过Soad的接口收发以太网诊断报文。
4.SoAd功能
Socket Adaptor从功能层面可以分为PDU接收,SocketConnection&Route管理,以及PDU发送三大功能。
4.1PDU Header处理
在Someip报文中,PDU头由8个字节组成,包括四个字节的SerivceID,Methodid,以及四个字节的实际PDU长度。该PDU Header由SoAd进行填充
如果PDU传输启用PDU Header选项(SoAdPduHeaderEnable 为真),在上层模块通过PDUR将PDU传送至SOAD后,SOAD模块需要在PDU数据之前插入配置的PDU头。
在协议栈实现中,需要在TcpIp_UdpTransmit()或TcpIp_TcpTransmit()真正将PDU传送至TCPIP模块前,在PDU前增加PDU头长度。
4.2SocketConnection
对于TCP/IP通信的抽象,SoAd定义了套接字连接。SoAd套接字连接指定本地套接字(即本地地址标识符和本地端口)和远程套接字(即远程IP地址和端口)之间的连接,以及连接参数,如传输协议、SoAd PDU报头的使用、缓冲区要求、连接设置、传输协议相关参数等。每个套接字连接都可以通过一个唯一的标识符(SoConId)进行标识。为同时支持多个通信合作伙伴,每个本地套接字,套接字具有相同连接参数的连接可以分组到套接字连接组。
- Socket操作有打开,关闭等操作。SoAd模块提供了SoAd_OpenSoCon,SoAd_CloseSoCon两个函数来进行操作。
- Open与Close是异步操作,在上层模块调用之后,需要保存Open或者Close操作,后面_MainFunction中通过SoAd_OpenSocket()函数真正打开或者关闭套接字。
- Open Socket是为了从TCPIP找到可用的套接字用于报文的发送与接收。
- Socket Open分为自动与手动两种方式。当Socket Connction所在的Group配置 SoAdSocketAutomaticSoConSetup 为TRUE 时为自动模式,否则是手动默模式。自动模式,在上电后Soad主动调用SoAd_SoCon_OpenSocketTCP() 函数为该 Socket Connction找到对应的套接字;手动模式,需要上层模块主动调用SoAd_OpenSoCon执行 Open操作。调
- 对于UDP SocketConnction 与TCP SocketConnection,Open操作会有所区别。
4.2.1Open Socket
- TCP Open:对于 TCP 连接来说, open 之后还执行TcpIp_TcpConnect 或SoAd_Tcp
Accepted。
前者是作为 client 时发起与服务器的 TCP 连接,后者是作为server接受来自于 client 的连接。
① TcpIp_TcpConnect 用于发起与服务器的 TCP 连接。调用该接口后,如果连接成功了, TcpIp 模块会调用 SoAd 的 SoAd_TcpConnected 回调函数通知 SoAd 该 TCP 连接建立成功了,此时 SoAd 需要将 socket 连接状态转换到 ONLINE 。(SoAd_SoCon_OpenSocketTcpClientGetAndConnect)
② 当 TcpIp 模块接收到一个连接请求后,就会调用 SoAd_TcpAccepted 回调函数通知到 SoAd 模块。此时 SoAd 需要从监听的 TcpIp socketId 对应 socke 连接组中选取一个 socket 连接来保存该连接(如果 SoAdSocketMsgAcceptanceFilterEnabled 为 TRUE 还需要调用 best match algorithm 选择 socket 连接),并且根据发起该连接请求的节点地址信息设置该 socket 连接的 remote address ,最后将状态转换到 ONLINE 。(SoAd_SoCon_OpenSocketTcpServerGetAndListen)
- UDP Open:在执行完SoAd_OpenSocket()后,会TCPIP中找到对应的套接字,并把Socket Connection状态转换至ONLINE。
4.2.2Close Socket
close操作主要是关闭TcpIp的socket,并将状态转换到OFFLINE。关闭TcpIp流程如下:
TCP socket :
① 调用SoAd_SoCon_closeSocketTCP()关闭socket,并且关闭由SoAd_SoCon_CloseSocket()发起时, abort参数设置为调用SoAd_SoCon_CloseSocket()时传递的值,否则abort置为FALSE
② 如果TCP socket连接组所有的socket连接被关闭了,需要调用SoAd_SoCon_CloseSocketTcpListen 关闭Listen-Socket,并且关闭由SoAd_CloseSoCon()发起时,abort参数设置为调 用SoAd_CloseSoCon()时传递的值,否则abort置为FALSE 。
UDP socket:
① 如果socket连接不是socket连接组的成员(比如socket connection group Conifgurator container 只有一个 socket 连接) ,调用SoAd_SoCon_CloseSocketUdp()关闭 socket,并且关闭由SoAd_SoCon_CloseSocket()发起时,abort参数设置为调用SoAd_SoCon_CloseSocket()时传递的值,否则abort置为FALSE.
4.3Socket状态切换
socket 连接有三个状态: ONLINE 、 OFFLINE 、 RECONNECT ,其状态转换如下图所示。
4.4PDU发送
4.4.1TCP发送
- 上层通过PDUR路由PDU后,调用Soad_IfTransmit函数,将PDU交给Soad处理之后,再通过配置的传输层协议(UDP或者TCP)使用不同的TCPIP的接口。
- 在CP以太网架构中,每一条报文中的Payload部分以PDU 的形式传递至Soad中,每个PDU 与一个PduRoute绑定。每个PduRoute中可以建立多个PduRouteDest ,PduRouteDest将链接ScoketConnection或者SocketConnectionGroup。SocketConnection中将定义发送报文需要的远端ip地址与port。
- 当上层模块调用ScoketConnection发送PDU至Soad中,该PDU所属的PduRoue将遍历每一个PduRoute Dest,将IF-PDU通过每个PduRouteDest相关的socket连接进行发送。当一个PduRoute配置多个PduRouteDest或者一个PduRouteDest索引SocketConnectionGroup且该SocketConnectionGroup 中包含多个SocketConnection时,会开启 PDUfan-out功能。 即报文将向遍历的所有的SocketConnection中的对端ip发送。
4.4.2UDP发送
4.5PDU接收
函数调用: