SOMEIP¶
目的¶
本文档旨在通过一个SOMEIP示例工程的配置,向用户展示SOMEIP的集成过程。
通过阅读本文档,用户可以了解ORIENTAIS配置工具的配置过程,以及如何应用配置工具生成的配置文件。
为了让用户更清晰的了解工具的使用,所用的配置均逐一手动完成。用户在了解了配置的基本过程后,可以快速完成配置。
缩写词和术语¶
缩写词/术语 |
描述 |
SoAd |
Socket Adapter 将socket的数据和PDU进行转换 |
Sd |
Service Discovery 服务发现模块 |
SOMEIP |
Scalable service-Oriented MiddlewarE over IP 可扩展的面向服务的IP中间件 |
RTE |
Runtime Enviroment 虚拟运行唤醒 |
SWC |
Software Component 软件组件 |
参考文档¶
[1] 参考手册_Sd.pdf
[2] 参考手册_SomeIpTp.pdf
[3] 参考手册_SomeIpXf.pdf
协议栈集成¶
新建ORIENTAIS工程¶
安装ORIENTAIS Manager软件,Install SnapShot后双击Controller列名称打开软件。
图 新建工程-1
菜单栏File🡪New🡪Project,新建工程
图 新建工程-2
在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next
图 新建工程-3
在弹出的窗口中输入工程名,选择Finish
图 新建工程-4
在弹出的窗口中选择Yes。
图 新建工程-5
在工程的[Bsw_Builder]项目上右键,选择New ECU Configuration
图 新建工程-6
在弹出的窗口中输入一个ECU名,然后选择Next
图 新建工程-7
在弹出的窗口中勾选需要添加的模块,点击Finish。
图 新建工程-8
新建完成的工程如下所示,步骤7中添加的模块已经被加入到工程中。
图 新建工程-9
配置文件生成¶
模块配置¶
模块的具体配置,取决于具体的项目需求。SOMEIP各模块配置项的详细介绍,参见《参考手册_Sd.pdf》、《参考手册_SomeIpTp.pdf》、《参考手册_SomeIpXf.pdf》。
配置代码生成¶
功能集成¶
代码集成¶
协议栈代码包括两部分:项目提供的协议栈源码和ORIENTAIS Studio配置生成代码。SOMEIP集成包括SOMEIP源码(SD、SomeipXf)。
用户须将协议栈源码和章节(配置代码生成)生成的配置源代码添加到集成开发工具的对应文件夹。协议栈集成的文件结构,见章节(源代码集成)。
Note
协议栈集成之前,用户须确保已经有基础工程,以及以太网通信协议栈已集成,且本协议栈相关的其他协议栈能正常工作。
集成注意事项¶
对于集成过程中,协议栈特殊要求和用户经常出现的问题,归类总结形成下表。用户需逐一排查表中的约束项,以避免集成问题出现。
表 SOMEIP集成约束清单
编号 |
类别 |
约束限制 |
1 |
堆栈 |
用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间。 |
2 |
头文件 |
|
3 |
初始化 |
SOMEIP协议栈的初始化顺序为:EthIf_Init, TcpIp_Init, SoAd_Init,SomeIpXf_Init,Sd_Init。 |
4 |
周期函数 |
EthSM_MainFunction,EthIf_MainFunctionState,Sd_MainFunction, ComM_MainFunction_<ComMChannel_ETH>需要被周期性任务函数调用。 |
配置过程¶
集成目标¶
本手册会以以下参数作为示例,进行集成演示。
参数 |
值 |
SdServerService实例参数 |
SdServerServiceId:0x1 SdServerServiceInstanceId:0x1 SdServerServiceMajorVersion:1 SdServerServiceMinorVersion:1 |
SdServerTimer时间参数 |
SdServerTimerInitialOfferDelayMax:0.1 SdServerTimerInitialOfferDelayMin:0.0 SdServerTimerInitialOfferRepetitionBaseDelay:0.03 SdServerTimerInitialOfferRepetitionsMax:3 SdServerTimerOfferCyclicDelay:1.0 SdServerTimerRequestResponseMaxDelay:0.5 SdServerTimerRequestResponseMinDelay:0.0 SdServerTimerTTL:300 |
Socket信息 |
Sd单播本地:172.31.30.78/ UDP/30490 Sd多播本地:239.192.255.250/ UDP/30490 AddMethod本地:172.31.30.78/ TCP/12310 AddMethod远端:172.31.30.80/ TCP/0(端口号为通配符) |
序列化参数 |
加法运算请求参数: typedef struct { uint16 number_a; uint16 number_b; } AddMethodReq; 加法运算结果参数: typedef uint32 AddMethodResp; |
模块配置¶
EcuC模块配置¶
双击EcuC模块,打开EcuC模块配置界面。
在EcucConfigSets栏目上右键新建 EcucConfigSet。
再在EcucPduCollections上右键新建EcucPduCollection。配置PduIdTypeEnum为UINT16,PduLengthTypeEnum为UINT32。
图 EcuC 模块配置-1
在EcucPduCollection上右键,选择Pdu,生成一个Pdu的配置界面。
图 EcuC 模块配置-2
配置4个PDU用于加法运算服务的收发,pdu长度为500, SoAd_SdInstance0_AddMethodReq、LdCom_SdInstance0_AddMethodReq、SoAd_SdInstance0_AddMethodResp、LdCom_SdInstance0_AddMethodResp;
配置3个PDU用于用于SD模块的单/多播收发,pdu长度1400, SdInstance0_Unicast_Rx、SdInstance0_Multicast_Rx、SdInstance0_Tx。
图 EcuC 模块配置-3
ECUC模块配置完成,在模块上右键,选择校验。
图 EcuC 模块配置-4
查看校验窗口,校验提示窗口没有错误信息,即校验通过。
图 EcuC 模块配置-5
Tcpip模块配置¶
SoAd模块配置¶
配置SoAdGeneral,配置调度周期0.005S,Socket最大个数4和SocketGroup的最大个数10。
图 SoAd模块配置-1
配置SoAdBswModules,本例中需关联SD和PDUR,所以新建两个模块并配置SoAdBswModuleRef关联对应模块。
图 SoAd 模块配置-2
配置SoAdSocketGroup,Sd和AddMethod Server各配置一个
图 SoAd 模块配置-3
图 SoAd 模块配置-4
#. 配置SoAdSocketConnectionGroup;Sd采用多播/单播收发,需要配置2个Socket,分别用于单播发送/多播发送/单播接收和多播接收;AddMethod Server是TCP Server,需要配置一个Socket。
Sd模块配置¶
Ldcom模块配置¶
PduR模块配置¶
Xfrm模块配置¶
新建DataTypeDescription,并配置序列化使用的参数类型和结构体。
图 Xfrm模块配置-1
图 Xfrm模块配置-2
图 Xfrm模块配置-3
图 Xfrm模块配置-4
图 Xfrm模块配置-5
打开TransformationSet页面,新建并配置一个SOMEIP序列化使用的TransformationTechnology。
图 Xfrm模块配置-6
新建一个SOMEIPTransformationDescription,配置序列化的字节对齐方式以及数据大小端类型。
图 Xfrm模块配置-7
打开BufferProperty,配置序列化报文HeaderLenght长度为16bits。
图 Xfrm模块配置-8
打开SomeIpXfPublic,新建并配置两个SOMEIPTransformationlSignaProp。
图 Xfrm模块配置-9
图 Xfrm模块配置-10
新建并配置两个ClientServerInterface。
图 Xfrm模块配置-11
图 Xfrm模块配置-12
新建并配置两个SomeIpXfConfig。
图 Xfrm模块配置-13
图 Xfrm模块配置-14
在TransformationSet页面,新建并配置两个Transformations,以生成对应的序列化/反序列化函数。
图 Xfrm模块配置-15
图 Xfrm模块配置-16
校验后提示窗口没有错误信息,即校验通过。
源码集成¶
项目交付给用户的工程结构如下:
Config目录,这个目录用来存放基础软件配置工具生成的配置文件,SOMEIP有关的配置文件放在该文件夹中。
模块相关的静态源代码,存放在各个模块的文件夹下。
调度集成¶
将章节(模块配置及代码生成)生成的配置文件复制到Config文件夹中。
添加初始化函数和周期调用函数。
Note
本示例中, SOMEIP初始化的代码和启动通信的代码置于main.c文件,并不代表其他项目同样适用于将其置于main.c文件中。
1#include "Timer.h"
2#include "Led.h"
3#include "Mcal_User.h"
4#include "UserTimer.h"
5#include "Dio.h"
6#include "ComM.h"
7#include "ComM_Internal.h"
8#include "Can.h"
9#include "E2EXf.h"
10#include "CanNm.h"
11#include "EthIf.h"
12#include "EthSM.h"
13#include "TcpIp.h"
14#include "SoAd.h"
15#include "LdCom.h"
16#include "TestCase.h"
17#include "Wdg.h"
18#include "WdgM.h"
19#include "Mcu.h"
20#include "ringbuf.h"
21#include "Sd.h"
22// SOMEIP协议栈相关头文件
23#include "SomeIpXf.h"
24
25int main(void)
26{
27 eth_ringbuf_init(&g_EthRingBufManager, &g_EthRxPduBuf, ARRAR_SIZE(g_EthRxPduBuf));
28 McalUser_Init();
29
30 // 初始化核心通信模块
31 PduR_Init(&PduR_PBConfigData);
32 ComM_Init(&ComM_Config);
33
34 EthIf_Init(&EthIf_ConfigData);
35 EthSM_Init();
36 TcpIp_Init(&TcpIp_Config);
37 SoAd_Init(&SoAd_Config);
38 LdCom_Init(&LdCom_InitCfgSet);
39 SomeIpXf_Init(&SomeIpXf_Config); // 初始化SOMEIP适配层
40 Sd_Init(&Sd_Config);
41
42 // 使能ETH通信通道并请求全通信模式
43 ComM_ChComAllow(ComMUser_ETH, TRUE);
44 ComM_RequestComMode(ComMUser_Eth, COMM_FULL_COMMUNICATION);
45
46 while (1)
47 {
48 // 1ms周期任务:处理以太网状态机
49 if (UserTimer_GetFlag1ms())
50 {
51 EthSM_MainFunction();
52 UserTimer_ClrFlag1ms();
53 }
54
55 // 2ms周期任务:处理以太网接口状态
56 if (UserTimer_GetFlag2ms())
57 {
58 EthIf_MainFunctionState();
59 UserTimer_ClrFlag2ms();
60 }
61
62 // 5ms周期任务:处理TCP/IP和Socket适配
63 if (UserTimer_GetFlag5ms())
64 {
65 ethif_read_buf();
66
67 TcpIp_MainFunction();
68 SoAd_MainFunction();
69 ComM_MainFunction(ComMUser_Eth);
70
71 UserTimer_ClrFlag5ms();
72 }
73
74 // 10ms周期任务:发送测试PDU和服务发现
75 if (UserTimer_GetFlag10ms())
76 {
77 TestCase_Send_EthPdu();
78 Sd_MainFunction(); // 服务发现模块周期处理
79
80 UserTimer_ClrFlag10ms();
81 }
82 }
83}
SomeIpXf相关的代码示例需要在LdCom添加函数实现:
1#include "SomeIpXf.h"
2
3/* 实现一个加法运算服务 */
4void LdComRxInd_SdInstance0_AddMethodReq(const PduInfoType* PduInfoPtr)
5{
6 if ((NULL_PTR != PduInfoPtr) && (NULL_PTR != PduInfoPtr->SduDataPtr))
7 {
8 AddMethodReq request; // 定义加法请求结构体
9 Rte_Cs_TransactionHandleType TransactionHandle;
10
11 // 解析SOMEIP请求数据
12 if (E_OK == SomeIpXf_Inv_AddMethodReq(&TransactionHandle, PduInfoPtr->SduDataPtr, PduInfoPtr->SduLength, &request))
13 {
14 uint8 data[128]; // 响应数据缓冲区
15 uint32 sum = request.number_a + request.number_b; // 执行加法运算
16 uint16 length = 0;
17
18 // 构建SOMEIP响应数据
19 if (E_OK == SomeIpXf_AddMethodResp(&TransactionHandle, data, &length, &sum))
20 {
21 PduInfoType pdu; // 定义PDU结构体
22
23 pdu.SduLength = length; // 设置响应数据长度
24 pdu.SduDataPtr = data; // 指向响应数据缓冲区
25 pdu.MetaDataPtr = NULL_PTR; // 无元数据
26
27 // 发送SOMEIP响应
28 LdCom_Transmit(SdInstance0_AddMethodResp, &pdu);
29 }
30 }
31 }
32}
33
34// 响应发送完成回调
35void LdComTxConf_SdInstance0_AddMethodResp(void)
36{
37 // 可添加发送完成后的处理逻辑
38}
验证结果¶
使用wireshark监控Offer Service正常多播发送,符合集成目标。
图 验证结果-1
使用调试助手,发送多播/单播 Find Service报文,都可以接收到单播的Offer Service报文,控制器返回正确,符合预期目标。
图 验证结果-2
#. 使用调试助手,连接AddMthod TCPserver,发送加法运算请求报文,控制器返回正确运算结果,符合预期目标。