CAPL语言中SomeIP无参Getter请求序列化失败问题求助
我没有arXML文件,因此手动定义了SomeIP方法实现,客户端和服务端代码如下:
客户端代码
variables { DWORD gMc; // global method call handle } on start { Initialize(); } void Initialize() { DWORD aep; // Application Endpoint handle DWORD csi; // consumed Service Instance handle // open Application Endpoint aep = SomeIpOpenLocalApplicationEndpoint(IP_Endpoint(TCP:192.168.0.1:50001)); // create Service Instance csi = SomeIpCreateConsumedServiceInstance(aep,0x8001,1); // create method call gMc = SomeIpCreateMethodCall(csi,0x0001,"OnMethodResponse"); } on key 'A' { // call the getter SomeIpCallMethod(gMc); } void OnMethodResponse(dword methodCallHandle, dword messageResponseHandle ) { write("method resp"); }
服务端代码
variables { DWORD gPm; // global method call handle } on start { Initialize(); } void Initialize() { DWORD aep; // Application Endpoint handle DWORD psi; // provided Service Instance handle // open Application Endpoint aep = SomeIpOpenLocalApplicationEndpoint(IP_Endpoint(TCP:192.168.0.2:50002)); // create Service Instance psi = SomeIpCreateProvidedServiceInstance(aep,0x8001,1); // add method gPm = SomeIpAddMethod(psi,1,"OnMethodRequest"); } void OnMethodRequest(dword methodHandle,dword messageHandle,dword messageResponseHandle) { write("method req"); }
报错信息
[E] [Program / Model] 46-0503 Error in node << default >> in SomeIP_IL.dll: message with id 0x80010001 could not be serialized
已知消息初始化函数SomeIpSetData(dword messageHandle, dword dataLength, byte data[] ),但该Getter方法无参数,负载长度为0,无法使用该函数,求解决方法。
针对无参Getter方法的序列化问题,可尝试以下方案:
强制调用空负载初始化
尝试调用SomeIpSetData时传入长度0和空指针,部分SomeIP实现允许这种合法的空负载初始化:SomeIpSetData(messageHandle, 0, NULL);可在客户端调用
SomeIpCallMethod前,或服务端处理请求时执行该操作,让序列化逻辑识别这是合法的空消息。添加占位参数绕过长度限制
给Getter方法添加一个无意义的占位参数(比如1字节的0值),让负载长度不为0,同时不影响业务逻辑:
客户端调用时设置占位数据:byte dummyData[1] = {0}; SomeIpSetData(messageHandle, 1, dummyData);服务端处理时直接忽略该参数即可。
检查方法定义的无参标记配置
手动创建方法时,查看所用SomeIP库的API文档,确认是否存在标记方法为无参数的配置选项。例如在创建方法时传入对应标志位:// 客户端示例(假设存在SOMEIP_METHOD_NO_PARAMS标志) gMc = SomeIpCreateMethodCall(csi,0x0001,"OnMethodResponse", SOMEIP_METHOD_NO_PARAMS); // 服务端示例 gPm = SomeIpAddMethod(psi,1,"OnMethodRequest", SOMEIP_METHOD_NO_PARAMS);显式标记无参后,序列化层会自动处理空负载逻辑。
手动构造符合协议的空负载
如果上述方法无效,可直接通过底层API设置消息的负载长度字段为0,跳过SomeIpSetData调用,构造符合SomeIP协议规范的空负载消息。
内容的提问来源于stack exchange,提问作者yi ti

