基于VSomeip 的dll 来开发应用程序,实现和ECU之间的交互。首先需要基于系统编译出来需dll,我这边使用的Windows 系统64位的的dll ,编译出来的dll如下图:
Windows 上的应用程序是使用QT 开发的,所以需要用到头文件,lib 和dll。头文件在源码的interface文件夹下面
在QT的 pro 文件中添加头文件和lib 的设置。
INCLUDEPATH += $$PWD/include/vsomeip/interface
LIBS += -L$$PWD/include/vsomeip/ -lvsomeip3
VSomeip dll 的使用需要先了解 config 文件:
unicast 中的ip 地址是本机的ip 这个ip和需要通信的ecu 的ip必须是可以ping 通的
multicast: 239.127.3.1 这个是sd 消息的广播地址
port: 30490 这个是 sd 消息的port
protocol: udp 这个是 someip 使用的ip协议类型
从源码中给的列子中可以看出需要设定config文件的地址
env VSOMEIP_CONFIGURATION=../../config/vsomeip-local.json VSOMEIP_APPLICATION_NAME=client-sample ./subscribe-sample
我们在QT 的使用中也就要先把相关的设置定义好:
qputenv("PATH",path.toStdString().c_str());
qputenv("VSOMEIP_CONFIGURATION",visomeipConfig.toStdString().c_str());
Path 设置好VSomeip dll和boost dll 的地址
VSOMEIP_CONFIGURATION 设置好config 文件的地址,本例中的config文件是vsomeip-local.json
工具中设置好相关的地址
自己定义一个class 来调用相关的dll
class 中首先定义一个指针 app_
private:
std::shared_ptr< vsomeip::application > app_;
初始化在类的初始化列表中:
app_(vsomeip::runtime::get()->create_application("client-sample"))
使用的名称和config文件中的对应上:
"id": "0x102e",
"name": "client-sample"
然后需要调用初始化函数和注册回调函数处理接收到的数据:
if (!app_->init()) {
LOG(INFO) << "Couldn't initialize application" ;
return false;
}
std::cout<<"get_client"<<app_->get_client()<<std::endl;
LOG(INFO) << "Client settings [protocol="
<< (use_tcp_ ? "TCP" : "UDP")
<< "]"
<< std::endl;
app_->register_state_handler(
std::bind(&subscribe::on_state, this,
std::placeholders::_1));
app_->register_message_handler(
vsomeip::ANY_SERVICE, instanceID, vsomeip::ANY_METHOD,
std::bind(&subscribe::on_message, this,
std::placeholders::_1));
app_->register_availability_handler(serviceID, instanceID,
std::bind(&subscribe::on_availability,
this,
std::placeholders::_1, std::placeholders::_2