车载网络仿真测试工具链
去年怿星发布了首款车载网络仿真测试工具链(SolarONE仿真测试软件+ETS5系列接口卡),该产品一面世,就受到了热烈反响,不断有小伙伴在后台咨询这套工具该怎么用。今天小怿就带大家实操如何基于SolarONE软件实现SOME/IP仿真,快快跟紧小怿的步伐!
SOMEIP_SIM示例工程
首先,我们来看一下最终生成的示例工程目录结构:
01
从零开始搭建SOME/IP仿真工程
Step 1: 添加Ethernet通道
Step 2: 添加SOME/IP数据库
Step 3: 添加数据库节点
Step 4: 勾选需要仿真的服务
Step 5: 编写仿真节点脚本
Step 6: 运行工程
到这里工程就搭建完成了,是不是非常简单、高效。为了方便大家理解,我们来看一下其实现逻辑是怎样的。
02
示例工程功能及实现逻辑说明
1
Method
Arxml中定义了设置充电起始时间的方法,该方法call和return对应的参数均为“SetTimeInfoStruct”的结构体
call
retune
基于ARXML中方法的定义,实现了一个用户操作的面板,该面板的实现效果如下图:
服务提供方的python代码如下:
from solar_engine import *#获取当前工程中Ethernet第一个通道的名称network_name = get_network_name("Ethernet",0)#获取指定network_name中仿真的第一个SOME/IP Server(Provided Service Instance)servers = someip_get_servers(network_name)server = servers[0]#当server接收到method请求之后此监听器将被调用@server.on_method_request()def on_method_request(method: SOMEIPMethod):print("on_method_request:",method)#将method request中的信号值赋值给responsemethod.return_signal.SetStart_YEAR.value = method.call_signal.SetStart_YEAR.valuemethod.return_signal.SetStart_Month.value = method.call_signal.SetStart_Month.valuemethod.return_signal.SetStart_Day.value = method.call_signal.SetStart_Day.valuemethod.return_signal.SetStart_Hour.value = method.call_signal.SetStart_Hour.valuemethod.return_signal.SetStart_Minute.value = method.call_signal.SetStart_Minute.valuemethod.return_signal.SetEnd_YEAR.value = method.call_signal.SetEnd_YEAR.valuemethod.return_signal.SetEnd_Month.value = method.call_signal.SetEnd_Month.valuemethod.return_signal.SetEnd_Day.value = method.call_signal.SetEnd_Day.valuemethod.return_signal.SetEnd_Hour.value = method.call_signal.SetEnd_Hour.valuemethod.return_signal.SetEnd_Minute.value = method.call_signal.SetEnd_Minute.value#设置return_signal完毕,控制SolarONE响应method request#True代表method return;False代表method no returnmethod.reply(True)
服务消费方的python代码如下:
from solar_engine import *#获取当前工程中Ethernet第一个通道的名称network_name = get_network_name("Ethernet",0)#获取Ethernet通道上所有的SOME/IP Client (Consumed Service Instance)clients = someip_get_clients(network_name)client = clients[0]#获取指定client中仿真的第一个SOME/IP methodmethods = client.get_methods()method = methods[0]#当系统变量的值发生更改时,此监听器将会被调用#"Method_Config::method_call"与“Call”按钮绑定def on_sysvar_method_call_change(sysvar):#判断系统变量"Method_Config::method_call"是否等于1if sysvar == 1 :#设置method call signal参数与系统变量值一一对应method.call_signal.SetStart_YEAR.value = sysvar_get_u16("Method_SetTimeInfo::SetStart_Year")method.call_signal.SetStart_Month.value = sysvar_get_u8("Method_SetTimeInfo::SetStart_Month")method.call_signal.SetStart_Day.value = sysvar_get_u8("Method_SetTimeInfo::SetStart_Day")method.call_signal.SetStart_Hour.value = sysvar_get_u8("Method_SetTimeInfo::SetStart_Hour")method.call_signal.SetStart_Minute.value = sysvar_get_u8("Method_SetTimeInfo::SetStart_Minute")method.call_signal.SetEnd_YEAR.value = sysvar_get_u16("Method_SetTimeInfo::SetEnd_YEAR")method.call_signal.SetEnd_Month.value = sysvar_get_u8("Method_SetTimeInfo::SetEnd_Month")method.call_signal.SetEnd_Day.value = sysvar_get_u8("Method_SetTimeInfo::SetEnd_Day")method.call_signal.SetEnd_Hour.value = sysvar_get_u8("Method_SetTimeInfo::SetEnd_Hour")method.call_signal.SetEnd_Minute.value = sysvar_get_u8("Method_SetTimeInfo::SetEnd_Minute")#发送method请求client.call_method(method.method_id)#当接收到method response之后该函数将会被调用def on_server_response(method:SOMEIPMethod):print("IAM_SIM",method)
2
event
Arxml中定义了充电信息的事件,该事件的参数为“ChargingInfoStruct”结构体
基于ARXML中方法的事件,实现了一个用户操作的面板,该面板的实现效果如下图:
服务提供方的python代码如下:
from solar_engine import *#获取当前工程中Ethernet第一个通道的名称network_name = get_network_name("Ethernet",0)#获取指定network_name中仿真的第一个SOME/IP Server(Provided Service Instance)servers = someip_get_servers(network_name)server = servers[0]#当系统变量“Event_ChargingInformation::Event_ChargingInformation_Trigger”发生更改的时候,此监听器将会被调用def on_sysvar_ChargingInformation_Trigger_change(sysvar):if sysvar_get_u8("Event_ChargingInformation::Event_ChargingInformation_Trigger") == 1:#将用户设置的充电状态和充电时间与event信号一一对应event.signal.ChargingStatus.value = sysvar_get_u8("Event_ChargingInformation::ChargingStatus")event.signal.ChargingTime.value = sysvar_get_u16("Event_ChargingInformation::ChargingTime")#PSI发布指定event_id的事件server.publish_event(event.event_id)#计数:将发布的次数累加sysvar_set_u16("Event_ChargingInformation::Trigger_Count",sysvar_get_u16("Event_ChargingInformation::Trigger_Count")+1)
服务消费方的python代码如下:
from solar_engine import *#获取当前工程中Ethernet第一个通道的名称network_name = get_network_name("Ethernet",0)#获取Ethernet通道上所有的SOME/IP Client (Consumed Service Instance)clients = someip_get_clients(network_name)client = clients[0]#当client接收到event之后,此监听器将会被调用def on_server_notification(event:SOMEIPEvent):print("IAM_SIM:",event)if event.event_id == 53251:#计数:将接收到Event的次数进行累加sysvar_set_u16("Event_ChargingInformation::IAM_Count",sysvar_get_u16("Event_ChargingInformation::IAM_Count")+1)
总结
以上就是本次展示的内容,我们简单来做个总结吧!
在上面展示的示例工程中,我们基于SolarONE实现的method request和response的仿真、event的仿真,切换到我们实际开发或者测试的场景中,不管是验证PSI还是CSI,SolarONE都可以准确应对。
大家如果还想看SolarONE的其他功能,欢迎在评论区留言互动,我们下期继续分享!
相关 · 推荐

