Client-Side API
SomeIpAddConsumedEventGroup
函数
语法
dword SomeIpAddConsumedEventGroup(dword csiHandle, dword eventGroupId);
功能
该函数用于向由 SomeIpCreateConsumedServiceInstance 创建的消费型服务实例(Consumed Service Instance)添加事件组(Event Group)。
事件组内的对象可通过以下方式注册:
- 事件(Events):
SomeIpCreateEventConsumer - 字段(Fields):
SomeIpCreateFieldConsumer
可通过 SomeIpRemoveConsumedEventGroup 函数移除事件组。
参数
csiHandle:消费型服务实例的句柄。eventGroupId:事件组的标识符。
返回值
0:发生错误,可通过SomeIpGetLastError函数获取错误信息。>0:创建的消费型事件组的句柄。
可用性
- 版本:8.1 及以上
- 限制:仅适用于仿真/测试环境
示例
c
void Initialize()
{
DWORD aep; // 应用端点句柄
DWORD csi; // 消费型服务实例句柄
DWORD ceg; // 消费型事件组句柄
DWORD cev; // 消费型事件句柄
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(17, 50002);
// 创建服务实例
csi = SomeIpCreateConsumedServiceInstance(aep, 10, 1);
// 创建事件组
ceg = SomeIpAddConsumedEventGroup(csi, 1);
// 创建事件消费者
cev = SomeIpCreateEventConsumer(csi, 32770, "CallbackEvent1");
}
void CallbackEvent1(DWORD cevHandle, DWORD messageHandle)
{
// 事件触发时调用此函数,可在此处处理参数
}
SomeIpCallMethod
函数
语法
LONG SomeIpCallMethod(dword methodHandle);
功能
通过向服务器发送请求来发起方法调用。方法所属的服务必须已通过"提供服务"(Offer Service)消息提供,且仍有效,才能成功调用。
背景
成功调用方法需获取提供服务的远程地址和端口,这些信息通过"提供服务"消息传递。
参数
methodHandle:由SomeIpCreateMethodCall创建的方法调用句柄。
返回值
0:函数执行成功。>0:错误代码。
可用性
- 版本:8.1 及以上
- 限制:仅适用于仿真/测试环境
示例
假设方法已在 CANoe 配置的 FIBEX 数据库中定义,方法 ID 为 31,包含两个输入参数 Member_value1 和 Member_value2,以及一个返回参数 Result。
c
variables
{
DWORD gMc; // 全局方法调用句柄
}
void Initialize()
{
DWORD aep; // 应用端点句柄
DWORD csi; // 消费型服务实例句柄
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(0x11, 50002);
// 创建服务实例
csi = SomeIpCreateConsumedServiceInstance(aep, 11, 1);
// 创建方法调用
gMc = SomeIpCreateMethodCall(csi, 31, "OnMethodResponse");
}
on key 's'
{
// 按下 's' 键时调用方法
// 设置方法的两个输入参数
SomeIpSetValueDWord(gMc, "Member_value1", 11);
SomeIpSetValueDWord(gMc, "Member_value2", 22);
// 调用方法
SomeIpCallMethod(gMc);
}
void OnMethodResponse(dword methodCallHandle, dword messageResponseHandle)
{
DWORD res; // 返回参数值
// 获取返回参数
res = SomeIpGetValueDWord(messageResponseHandle, "Result");
write("方法调用返回值: %d", res);
}
SomeIpCreateConsumedServiceInstance
函数
语法
c
dword SomeIpCreateConsumedServiceInstance(dword aepHandle, dword serviceId, dword instanceId); // 形式1
dword SomeIpCreateConsumedServiceInstance(dword aepHandle, dword serviceId, dword instanceId, dword majorVersion, dword minorVersion); // 形式2
功能
创建消费型服务实例,并将其添加到由 SomeIpOpenLocalApplicationEndpoint 创建的应用端点(Application Endpoint)。
可向服务实例分配以下对象:
- 事件组(Event Groups):
SomeIpAddConsumedEventGroup - 事件(Events):
SomeIpCreateEventConsumer - 字段(Fields):
SomeIpCreateFieldConsumer - 方法(Methods):
SomeIpCreateMethodCall
可通过 SomeIpReleaseConsumedServiceInstance 删除服务实例。
参数
aepHandle:应用端点句柄。serviceId:服务标识符。instanceId:实例标识符。majorVersion:服务接口主版本号(形式2)。minorVersion:服务接口次版本号(形式2)。
返回值
0:发生错误,可通过SomeIpGetLastError获取错误信息。>0:创建的消费型服务实例句柄。
可用性
- 版本:8.1 及以上(形式1);8.5 SP4 及以上(形式2)
- 限制:仅适用于仿真/测试环境
示例
c
void Initialize()
{
DWORD aep; // 应用端点句柄
DWORD csi; // 消费型服务实例句柄
DWORD ceg; // 消费型事件组句柄
DWORD cev; // 消费型事件句柄
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(17, 50002);
// 创建服务实例
csi = SomeIpCreateConsumedServiceInstance(aep, 10, 1);
// 创建事件组
ceg = SomeIpAddConsumedEventGroup(csi, 1);
// 创建事件消费者
cev = SomeIpCreateEventConsumer(csi, 32770, "CallbackEvent1");
}
void CallbackEvent1(DWORD cevHandle, DWORD messageHandle)
{
// 事件触发时调用此函数,可在此处处理参数
}
SomeIpCreateEventConsumer
函数
语法
dword SomeIpCreateEventConsumer(dword csiHandle, dword eventId, CHAR onEventCallback[]);
功能
向由 SomeIpCreateConsumedServiceInstance 创建的消费型服务实例添加事件消费者(Event Consumer)。收到匹配事件时,将调用指定的回调函数。
可通过 SomeIpRemoveEventConsumer 移除事件消费者。
参数
csiHandle:消费型服务实例句柄(由SomeIpCreateConsumedServiceInstance创建)。eventId:事件标识符。onEventCallback:收到匹配事件时调用的回调函数名(参见<OnSomeIpEventReceived>)。
返回值
0:发生错误,可通过SomeIpGetLastError获取错误信息。>0:创建的事件消费者句柄。
可用性
- 版本:8.1 及以上
- 限制:仅适用于仿真/测试环境
示例
c
void Initialize()
{
DWORD aep; // 应用端点句柄
DWORD csi; // 消费型服务实例句柄
DWORD ceg; // 消费型事件组句柄
DWORD cev; // 消费型事件句柄
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(17, 50002);
// 创建服务实例
csi = SomeIpCreateConsumedServiceInstance(aep, 10, 1);
// 创建事件组
ceg = SomeIpAddConsumedEventGroup(csi, 1);
// 创建事件消费者
cev = SomeIpCreateEventConsumer(csi, 32770, "CallbackEvent1");
}
void CallbackEvent1(DWORD cevHandle, DWORD messageHandle)
{
// 事件触发时调用此函数,可在此处处理参数
}
SomeIpCreateFieldConsumer
函数
语法
dword SomeIpCreateFieldConsumer(dword csiHandle, long notificationId, long getterId, long setterId, char onFieldNotificationCallback[]);
功能
向由 SomeIpCreateConsumedServiceInstance 创建的消费型服务实例添加字段消费者(Field Consumer)。收到匹配的字段通知时,将调用指定的回调函数(参见 <OnSomeIpFieldNotification>)。
可通过 SomeIpRemoveFieldConsumer 移除字段消费者。
参数
csiHandle:消费型服务实例句柄(由SomeIpCreateConsumedServiceInstance创建)。notificationId:字段通知标识符。若字段不支持通知,需设为-1。getterId:字段获取方法(Getter)标识符。调用 Getter 前需通过SomeIpCreateMethodCall创建方法,并使用SomeIpCallMethod调用。若不支持 Getter,设为-1。setterId:字段设置方法(Setter)标识符。调用 Setter 前需通过SomeIpCreateMethodCall创建方法,并使用SomeIpCallMethod调用。若不支持 Setter,设为-1。onFieldNotificationCallback:收到字段通知消息时调用的回调函数。
返回值
0:发生错误,可通过SomeIpGetLastError获取错误信息。>0:创建的字段消费者句柄。
可用性
- 版本:8.1 SP2 及以上
- 限制:仅适用于仿真/测试环境
示例
假设字段已在 CANoe 配置的 FIBEX 数据库中定义,通知 ID 为 30,Getter ID 为 31,Setter ID 为 32,数据类型为标准类型(如 UINT8)。
c
variables
{
DWORD gMcGetter; // Getter 方法调用句柄
DWORD gMcSetter; // Setter 方法调用句柄
}
void Initialize()
{
CONST DWORD FieldNotificationID = 30;
CONST DWORD FieldGetterID = 31;
CONST DWORD FieldSetterID = 32;
DWORD aep; // 应用端点句柄
DWORD csi; // 消费型服务实例句柄
DWORD ceg; // 消费型事件组句柄
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(17, 50002);
// 创建服务实例
csi = SomeIpCreateConsumedServiceInstance(aep, 12, 1);
// 创建事件组
ceg = SomeIpAddConsumedEventGroup(csi, 300);
// 创建字段消费者及 Getter/Setter 方法调用
SomeIpCreateFieldConsumer(csi, FieldNotificationID, FieldGetterID, FieldSetterID, "OnFieldNotification");
gMcGetter = SomeIpCreateMethodCall(csi, FieldGetterID, "OnFieldGetterResponse");
gMcSetter = SomeIpCreateMethodCall(csi, FieldSetterID, "OnFieldSetterResponse");
}
void OnFieldNotification(DWORD pfHandle, DWORD messageHandle)
{
write("收到字段通知");
// 处理逻辑
}
void OnFieldGetterResponse(dword methodCallHandle, dword messageResponseHandle)
{
write("收到 Getter 响应");
// 处理逻辑
}
void OnFieldSetterResponse(dword methodCallHandle, dword messageResponseHandle)
{
write("收到 Setter 响应");
// 处理逻辑
}
on key 'g'
{
// 调用 Getter 方法
SomeIpCallMethod(gMcGetter);
}
on key 's'
{
// 设置字段值(标准类型无需路径)
SomeIpSetValueDWord(gMcSetter, "", 200);
// 调用 Setter 方法
SomeIpCallMethod(gMcSetter);
}
SomeIpCreateMethodCall
函数
语法
c
dword SomeIpCreateMethodCall(dword csiHandle, dword methodId, char onSomeIpMethodResponse[]); // 形式1
dword SomeIpCreateMethodCall(dword csiHandle, dword methodId); // 形式2
dword SomeIpCreateMethodCall(dword csiHandle, dword methodId, char onSomeIpMethodResponse[], char onSomeIpMethodError[]); // 形式3
功能
为消费者创建方法调用。通过函数返回值,可使用 SomeIpSetValue... 设置方法参数,再通过 SomeIpCallMethod 调用方法。
注意
- 形式1:异步调用,客户端调用后不会阻塞等待响应。SOME/IP IL 不支持同步调用。
- 形式2:适用于服务端创建方法时使用
fireAndForget参数的场景(参见SomeIpAddMethod)。 - 可通过
SomeIpRemoveMethodCall移除方法调用。
参数
csiHandle:消费型服务实例句柄(由SomeIpCreateConsumedServiceInstance创建)。methodId:方法标识符。onResponseCallback:收到响应时调用的回调函数(参见<OnSomeIpMethodResponse>)。onErrorCallback:收到 SOME/IP 错误消息时调用的回调函数(参见<OnSomeIpMethodError>)。
返回值
0:发生错误,可通过SomeIpGetLastError获取错误信息。>0:方法调用句柄。
可用性
- 版本:8.1(形式1、2);14(形式3)
- 限制:仅适用于仿真/测试环境
示例
假设方法已在 CANoe 配置的 FIBEX 数据库中定义,方法 ID 为 31,包含两个输入参数 Member_value1 和 Member_value2,以及一个返回参数 Result。
c
variables
{
DWORD gMc; // 全局方法调用句柄
}
void Initialize()
{
DWORD aep; // 应用端点句柄
DWORD csi; // 消费型服务实例句柄
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(0x11, 50002);
// 创建服务实例
csi = SomeIpCreateConsumedServiceInstance(aep, 11, 1);
// 创建方法调用
gMc = SomeIpCreateMethodCall(csi, 31, "OnMethodResponse");
}
on key 's'
{
// 按下 's' 键时调用方法
// 设置输入参数
SomeIpSetValueDWord(gMc, "Member_value1", 11);
SomeIpSetValueDWord(gMc, "Member_value2", 22);
// 调用方法
SomeIpCallMethod(gMc);
}
void OnMethodResponse(dword methodCallHandle, dword messageResponseHandle)
{
DWORD res; // 返回参数值
// 获取返回值
res = SomeIpGetValueDWord(messageResponseHandle, "Result");
write("方法调用返回值: %d", res);
}
SomeIpReleaseConsumedServiceInstance
函数
语法
LONG SomeIpReleaseConsumedServiceInstance(dword csiHandle);
功能
删除由 SomeIpCreateConsumedServiceInstance 创建的消费型服务实例。服务实例关联的对象(事件组、事件、字段、方法)将随实例一同删除。若重新创建服务实例,需重新创建所有对象。
参数
csiHandle:待删除的消费型服务实例句柄。
返回值
0:函数执行成功。>0:错误代码。
可用性
- 版本:8.1 及以上
- 限制:仅适用于仿真/测试环境
示例
c
on key 'c'
{
DWORD aep; // 应用端点句柄
DWORD csi; // 消费型服务实例句柄
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(17, 50002);
// 创建服务实例
csi = SomeIpCreateConsumedServiceInstance(aep, 10, 1);
// ... 执行操作 ...
// 释放服务实例
SomeIpReleaseConsumedServiceInstance(csi);
// ... 应用端点可继续使用 ...
}
版本 :14 SP2
© Vector Informatik GmbH
SomeIpRemoveConsumedEventGroup
函数
从已消费的服务实例中移除事件组。该事件组需通过 SomeIpAddConsumedEventGroup 预先添加。
移除事件组时,分配给该组的事件、字段和方法不会被删除。
语法
capl
LONG SomeIpRemoveConsumedEventGroup( dword cevgHandle );
参数
cevgHandle:已消费事件组的句柄。
返回值
- 0:函数执行成功
-
0:错误代码
可用性
- 版本:8.1 及以上
- 限制:仅适用于仿真/测试环境
示例
capl
on key 'c'
{
DWORD aep; // 应用端点句柄
DWORD csi; // 已消费服务实例句柄
DWORD ceg; // 已消费事件组句柄
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(17, 50002);
// 创建服务实例
csi = SomeIpCreateConsumedServiceInstance(aep, 10, 1);
// 创建事件组
ceg = SomeIpAddConsumedEventGroup(csi, 1);
// ... 执行其他操作
// 移除已消费事件组
SomeIpRemoveConsumedEventGroup(ceg);
// ... 应用端点和服务实例仍可继续使用
}
SomeIpRemoveEventConsumer
函数
从已消费的服务实例中移除事件。该事件需通过 SomeIpCreateEventConsumer 预先添加。
移除后,SomeIpCreateEventConsumer 注册的回调函数将不再被调用。
语法
capl
dword SomeIpRemoveEventConsumer( dword cevHandle );
参数
cevHandle:待移除事件的句柄(参见SomeIpCreateEventConsumer)。
返回值
- 0:函数执行成功
-
0:错误代码
可用性
- 版本:8.1 及以上
- 限制:仅适用于仿真/测试环境
示例
capl
on key 'c'
{
DWORD aep; // 应用端点句柄
DWORD csi; // 已消费服务实例句柄
DWORD ceg; // 已消费事件组句柄
DWORD cev; // 已消费事件句柄
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(17, 50002);
// 创建服务实例
csi = SomeIpCreateConsumedServiceInstance(aep, 10, 1);
// 创建事件组
ceg = SomeIpAddConsumedEventGroup(csi, 1);
// 创建事件消费者
cev = SomeIpCreateEventConsumer(csi, 32770, "CallbackEventA1");
// ... 执行其他操作
// 移除事件消费者
SomeIpRemoveEventConsumer(cev);
// ... 应用端点、服务实例和事件组仍可继续使用
}
SomeIpRemoveFieldConsumer
函数
从已消费的服务实例中移除字段。该字段需通过 SomeIpCreateFieldConsumer 预先添加。
移除后,SomeIpCreateFieldConsumer 注册的回调函数将不再被调用。
语法
capl
long SomeIpRemoveFieldConsumer( dword cfHandle );
参数
cfHandle:SomeIpCreateFieldConsumer创建的字段句柄。
返回值
- 0:函数执行成功
-
0:错误代码
可用性
- 版本:8.1 SP2 及以上
- 限制:仅适用于仿真/测试环境
示例
capl
variables
{
CONST DWORD FieldNotificationID = 30; // 字段通知ID
CONST DWORD FieldGetterID = 31; // 字段获取方法ID
CONST DWORD FieldSetterID = 32; // 字段设置方法ID
DWORD aep; // 应用端点句柄
DWORD csi; // 已消费服务实例句柄
DWORD ceg; // 已消费事件组句柄
DWORD cfHandle; // 已消费字段句柄
DWORD gMcGetter; // 获取方法调用句柄
DWORD gMcSetter; // 设置方法调用句柄
}
on start()
{
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(17, 50002);
// 创建服务实例
csi = SomeIpCreateConsumedServiceInstance(aep, 12, 1);
// 创建事件组
ceg = SomeIpAddConsumedEventGroup(csi, 300);
// 创建字段消费者及对应的获取/设置方法
cfHandle = SomeIpCreateFieldConsumer(csi, FieldNotificationID, FieldGetterID, FieldSetterID, "OnFieldNotification");
gMcGetter = SomeIpCreateMethodCall(csi, FieldGetterID, "OnFieldGetterResponse");
gMcSetter = SomeIpCreateMethodCall(csi, FieldSetterID, "OnFieldSetterResponse");
}
// 字段通知回调
void OnFieldNotification(DWORD pfHandle, DWORD messageHandle)
{
write("字段通知已接收");
// ... 处理通知
}
// 获取方法响应回调
void OnFieldGetterResponse(dword methodCallHandle, dword messageResponseHandle)
{
write("字段获取响应已接收");
// ... 处理响应
}
// 设置方法响应回调
void OnFieldSetterResponse(dword methodCallHandle, dword messageResponseHandle)
{
write("字段设置响应已接收");
// ... 处理响应
}
on key 'g'
{
// 调用获取方法
SomeIpCallMethod(gMcGetter);
}
on key 's'
{
// 设置字段值(通用数据类型无需路径)
SomeIpSetValueDWord(gMcSetter, "", 200);
// 调用设置方法
SomeIpCallMethod(gMcSetter);
}
on key 'r'
{
// 移除字段消费者
SomeIpRemoveFieldConsumer(cfHandle);
}
SomeIpRemoveMethodCall
函数
从已消费的服务实例中移除方法调用。该方法需通过 SomeIpCreateMethodCall 预先添加。
移除后,方法句柄失效,无法再通过 SomeIpCallMethod 调用。
语法
capl
LONG SomeIpRemoveMethodCall( dword methodHandle );
参数
methodHandle:方法句柄。
返回值
- 0:函数执行成功
-
0:错误代码
可用性
- 版本:8.1 及以上
- 限制:仅适用于仿真/测试环境
示例
假设方法存在于 CANoe 配置的 FIBEX 数据库中,方法 ID 为 31,含两个输入参数 Member_value1、Member_value2 和返回参数 Result。
capl
variables
{
DWORD gMc; // 全局方法调用句柄
}
on key 'e'
{
DWORD aep; // 应用端点句柄
DWORD csi; // 已消费服务实例句柄
// 打开应用端点
aep = SomeIpOpenLocalApplicationEndpoint(0x11, 50002);
// 创建服务实例
csi = SomeIpCreateConsumedServiceInstance(aep, 11, 1);
// 创建方法调用
gMc = SomeIpCreateMethodCall(csi, 31, "OnMethodResponse");
// 设置输入参数并调用方法
SomeIpSetValueDWord(gMc, "Member_value1", 11);
SomeIpSetValueDWord(gMc, "Member_value2", 22);
SomeIpCallMethod(gMc);
}
on key 'r'
{
// 移除方法调用
SomeIpRemoveMethodCall(gMc);
}
// 方法响应回调
void OnMethodResponse(dword methodCallHandle, dword messageResponseHandle)
{
DWORD res; // 返回参数值
// 获取返回参数
res = SomeIpGetValueDWord(messageResponseHandle, "Result");
write("方法调用返回值: %d", res);
}