1someip基础知识
关于SOME/IP的理解_AgingMoon的博客-CSDN博客_someip
2.vsomeip 安装使用
[someip专题]vsomeip使用以及代码解析1_AgingMoon的博客-CSDN博客
3.hello world代码解析
代码下载,大家请参考 ,以下则直接说明每个文件,每个函数,作用,共同记录学习GitHub - COVESA/vsomeip: An implementation of Scalable service-Oriented MiddlewarE over IP
hello world这个案例,主要演示客户端向服务端发送一个请求,服务端接收到请求后,在后面追加一个 "hello",客户端接收到响应后,打印响应的消息 “”hello world“”
3.1 hello_world_client_main.cpp
该文件核心是 创建了一个main的进程,main进程中主要初始化了 一个 hello_world_client的对象,并针对该对象初始化,和运行,那么接下来,核心是查看 hello_world_client这个类做了些啥。
int main(int argc, char **argv)
{
(void)argc;
(void)argv;
hello_world_client hw_cl;
#ifndef VSOMEIP_ENABLE_SIGNAL_HANDLING
hw_cl_ptr = &hw_cl;
signal(SIGINT, handle_signal);
signal(SIGTERM, handle_signal);
#endif
if (hw_cl.init()) {
hw_cl.start();
return 0;
} else {
return 1;
}
}
3.2 hello_world_client.hpp
文件中构建了一个客户端的类,该客户端的someip 协议信息如下
- service_id = 0x1111
- service_instance_id =0x2222
- service_method_id = 0x3333
构造函数
构造函数中通过vSomeIP协议栈中的runtime,创建了一个应用,针对vSomeIP详细内容,在后续文章中解析,此处我们进一步说明客户端类的做法。
初始化函数
主要做了四件事,应用初始化,注册状态回调函数,注册消息响应回调函数,注册服务可用回调函数。
- 应用初始化:主要加载启动时指定的配置文件,加载对应的插件库,初始化routing配置
- 注册状态回调函数:主要用于服务在routing中注册成功后的操作;
- 注册消息响应回调函数:用于处理从服务端发来的消息响应;
- 服务可用回调函数:service端在offer server操作成功后,通知client端,最终就调用到了这个函数。
启动函数
启动对应的线程,包括主线程 io线程 maindispatch线程s top_thread线程 Routing线程
状态处理函数
客户端在runtime中被成功注册后,则请求服务;
可用回调函数
客户端识别到 相关服务可用,则会向服务端发送 “”world” 字符串给 服务端
消息回调函数
客户端接收到服务端的响应后,获取接收的消息,并打印 “Received: ”内容,同时结束
结束函数
针对的初始化阶段的操作进行类似于卸载的工作,首先是stop_offer_service,然后unregister我们初始化注册的message_handler和state_handler.
3.3 hello_world_service_main.cpp
和客户端一样,服务端的主函数中,主要申请了一个hello_world_service 对象,同时进行初始化启动。
3.4 hello_world_service.hpp
同样,服务端的类中,也申请了一个someip协议内容相同的类
- service_id = 0x1111
- service_instance_id =0x2222
- service_method_id = 0x3333
构造函数
构造函数也是通过runtime 创建了一个app对象
初始化函数
主要进行应用初始化,注册消息回调,注册状态回调
消息回调函数
接收到客户端的请求后,追加“hello”字符串,并将消息发送给客户端,同时结束应用。
状态回调函数
在runtime注册成功后,服务端开始对外提供服务。
停止函数
主要是等待消息发送后,通知结束,进行服务提供的体制,以及一些反注册操作。
接下来,进一步解析说明使用到的 runtime application 消息的发送和请求,服务的提供和终止等操作。