一、CommonAPI简介
CommonAPI是一种针对于车载嵌入式系统应用领域的开源IPC框架。它是标准化的,能够为应用层的开发提供IPC关键基础组件。在车载应用系统中,传统的RPC或者SOAP等通信方式不能够满足快速的交互通信的需求,因此需要CommonAPI作为辅助。
CommonAPI框架支持多种通信协议,包括DBus,SomeIP以及RPC等。通过对不同的通信协议进行了封装,CommonAPI向应用层提供了一套统一的API,让开发者不必考虑底层的通信细节。
二、CommonAPI SomeIP
1、CommonAPI SomeIP的工作原理
CommonAPI使用SomeIP协议实现跨节点的通信。SomeIP是一种轻量级的信道协议,它不需要建立严格的连接状态,可以在较低的延迟下实现节点之间的数据传输。
SomeIP的实现是基于UDP协议的,不过它还采用了自己的序列化和反序列化机制,以及自己的消息格式,这些都是为了更好地适应车载嵌入式系统的应用领域。
2、CommonAPI SomeIP的使用方法
在CommonAPI SomeIP中,有两个重要的概念:提供者和消费者。提供者负责发布接口,消费者则负责调用接口。在使用CommonAPI SomeIP时,需要在提供者和消费者两端都进行相应的配置,以便进行正确的通信。
提供者端的配置包括:
CarProviderFactoryImplement carProviderFactoryImplement = new CarProviderFactoryImplement() CarProvider provider = providerFactory.createSimple(CAR_PROVIDER_EXAMPLE); provider.addBinding(factory.createBinding(provider, SOME_IP_PAYLOAD_TYPE, PROVIDER_INSTANCE_ID, protocol)); provider.offerService();
其中,CAR_PROVIDER_EXAMPLE表示接口的名称,SOME_IP_PAYLOAD_TYPE表示传输协议的数据类型,PROVIDER_INSTANCE_ID表示提供者的实例ID,protocol表示通信协议。
消费者端的配置包括:
CommonAPIProxyFactory proxyFactory = CommonAPIProxyFactory.getProxy(); ExampleProxy proxy = proxyFactory.createSimple(ExampleProxy.class, PROVIDER_INSTANCE_UUID, CarProviderDiscovery.getInstance())
其中,ExampleProxy是提供者所发布的接口,PROVIDER_INSTANCE_UUID是提供者实例的UUID,CarProviderDiscovery是提供者的发现机制,用于遍历可用的提供者。
三、CommonAPI DBus使用
1、CommonAPI DBus的工作原理
DBus是一种用于Linux系统间通信的IPC协议。它是已经被标准化的,可以在多种操作系统之间进行通信。在CommonAPI框架中,DBus被作为通信协议之一来支持。
DBus协议采用客户端/服务器模型,它定义了一组用于消息传递和通信对等体之间的接口。DBus协议允许多个应用程序在同一时间将消息发送到同一总线上,使得消息能够被异步传递。
2、CommonAPI DBus的使用方法
在使用CommonAPI DBus时,需要在提供者和消费者两端分别进行相应的配置,以便进行正确的通信。
提供者端的配置包括:
DBusRuntime dbusRuntime = DBusRuntime.getForAddress(DBUS_ADDRESS); ProviderFactory providerFactory = new ProviderFactory(dbusRuntime); CarProvider provider = providerFactory.createSingle(CarProviderImpl.class); provider.addImplementation(ExampleBinding.class, ExampleInterface.class, providerImpl); provider.offer();
其中,DBUS_ADDRESS表示DBus的地址,CarProviderImpl.class是提供者的实现类名,ExampleBinding.class和ExampleInterface.class则用于构建提供者的调用接口。
消费者端的配置包括:
DBusRuntime dbusRuntime = DBusRuntime.getForAddress(DBUS_ADDRESS); ProxyFactory proxyFactory = new ProxyFactory(dbusRuntime); T result = proxyFactory.getProxy(serviceName, path, IFACE);
其中,serviceName表示提供者的服务名,path表示DBus的路径,IFACE表示DBus的接口名。
四、CommonAPI Autosar
1、CommonAPI Autosar的工作原理
CommonAPI Autosar是对车载嵌入式系统复杂性的一种解决方案。它的目标是提供一种向上的通信协议,使车载嵌入式系统的组件间通信更加灵活、可靠。
2、CommonAPI Autosar的使用方法
在使用CommonAPI Autosar时,需要实现个性化的工作流程来适配各个组件。需要开发工程师在代码中加入执行方法,常量配置等。
五、CommonAPI代码示例
提供者代码示例:
public class ExampleProviderFactoryImpl extends CarProviderFactoryImplement { @Override public CarProvider create(final SdlChannelManager clientConnectionManager) { final CarProvider provider = providerFactory.createSimple(CAR_PROVIDER_EXAMPLE); provider.addBinding(factory.createBinding(provider, PAYLOAD_TYPE, PROTOCOL)); provider.offerService(); return provider; } } public class ExampleCar extends CarProviderImplBase { @Override public void turnOnAC(final boolean _1) { System.out.println("AC turned on: "+Boolean.toString(_1)); } } ProviderFactory factory = new ProviderFactory(DbusRuntime.getForBus("unix:path=/var/run/dbus/system_bus_socket")); final CarProviderFactoryImplement carProviderFactoryImplement = new ExampleProviderFactoryImpl(); final CarProvider provider = carProviderFactoryImplement.create(factory.createChannelManager(DbusRuntime.getForBus("unix:path=/var/run/dbus/system_bus_socket"))); ExampleCar exampleCar = new ExampleCar(); provider.addImplementation(ExampleBinding.class, ExampleInterface.class, exampleCar); provider.offer();
消费者代码示例:
CommonAPIProxyFactory proxyFactory = CommonAPIProxyFactory.getProxy(); ExampleProxy proxy = proxyFactory.createSimple(ExampleProxy.class, PROVIDER_INSTANCE_UUID, CarProviderDiscovery.getInstance()) proxy.turnOnAC(true);
六、总结
本文对CommonAPI框架进行了详细的介绍,从CommonAPI简介、CommonAPI SomeIP、CommonAPI DBus使用以及CommonAPI Autosar等多个方面进行了探讨。同时,本文还给出了提供者和消费者代码示例,以便开发人员了解CommonAPI的使用方法。在未来的车载嵌入式系统中,CommonAPI框架将有更加重要的地位,它将为车载应用的开发带来诸多便利。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/300375.html