首页 > 系统相关 >vsomeip部署在Linux

vsomeip部署在Linux

时间:2023-04-12 23:01:51浏览次数:37  
标签:service 部署 app payload SAMPLE Linux ID vsomeip


1.环境准备

  • Ubuntu 18.04.6 LTS
  • c++编译器
  • 编译用的cmake
  • 相关的库
sudo apt-get install libboost-system1.55-dev libboost-thread1.55-dev libboost-log1.55-dev
sudo apt-get install source-highlight doxygen graphviz
sudo apt-get --no-install-recommends install asciidoc

2.源码下载

git clone https://github.com/COVESA/vsomeip.git

3.源码编译

cd vsomeip
$ mkdir build
$ cd build
$ cmake -DENABLE_SIGNAL_HANDLING=1 ..
$ make
$ make install

具体可以参照源码当中的REAMD文件

vsomeip部署在Linux_自动驾驶

vsomeip部署在Linux_网络_02

vsomeip部署在Linux_车载通信_03

安装相关的vsomeip头文件和依赖库.so

vsomeip部署在Linux_车载通信_04

4.创建相关测试文件

4.1 创建server 测试文件

  • 创建一个someip-example文件目录
  • 在里面添加一个sevice_example.cpp文件添加
#include <vsomeip/vsomeip.hpp>


std::shared_ptr<vsomeip::application> app;

int main()
{
    app = vsomeip::runtime::get()->create_application("world");

    app->init();

    app->start();

    return 0;
}

简单代码

  • 在sevice_example.cpp同目录下添加一个CMakeLists.txt文件
  • 编写CMakeLists.txt编译选项内容如下
cmake_minimum_required (VERSION 3.10.2)

project (vSomeIPServiceExample)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

find_package(Threads REQUIRED)

include_directories("/usr/local/include/")
link_directories("/usr/local/lib")

include_directories(${VSOMEIP_INCLUDE_DIRS})
include_directories(${Boost_INCLUDE_DIR})

find_package(vsomeip3 REQUIRED)

add_executable(service-example ../sevice_example.cpp)
target_link_libraries(service-example vsomeip3 pthread)
  • 执行make 编译可执行程序service-example

vsomeip部署在Linux_Someip部署_05

4.2 创建client 测试文件

  • 添加测试源文件client_example.cpp
  • 添加cmake内容编译client_example源文件

vsomeip部署在Linux_客户端_06

  • 执行make编译可执行程序

vsomeip部署在Linux_Someip部署_07

4.3 执行程序

  • server端启动

vsomeip部署在Linux_网络_08

  • client端启动

vsomeip部署在Linux_自动驾驶_09

  • server接收到client端连接

vsomeip部署在Linux_车载通信_10

4.4 提供Request/Response 功能

  • server添加代码
#include <iomanip>
#include <iostream>
#include <sstream>
#include <vsomeip/vsomeip.hpp>

#define SAMPLE_SERVICE_ID 0x1234
#define SAMPLE_INSTANCE_ID 0x5678
#define SAMPLE_METHOD_ID 0x0421

 

std::shared_ptr<vsomeip::application> app;

 
void on_message(const std::shared_ptr<vsomeip::message> &_request) {

    std::shared_ptr<vsomeip::payload> its_payload = _request->get_payload();
    vsomeip::length_t l = its_payload->get_length();

    // Get payload
    std::stringstream ss;
    for (vsomeip::length_t i=0; i<l; i++) {
    ss  << std::setw(2) << std::setfill('0') << std::hex
        << (int)*(its_payload->get_data()+i) << " ";

    }

 
    std::cout << "SERVICE: Received message with Client/Session ["
    << std::setw(4) << std::setfill('0') << std::hex << _request->get_client() << "/"
    << std::setw(4) << std::setfill('0') << std::hex << _request->get_session() << "] "
    << ss.str() << std::endl;

// Create response
    std::shared_ptr<vsomeip::message> its_response = vsomeip::runtime::get()->create_response(_request);
    its_payload = vsomeip::runtime::get()->create_payload();
    std::vector<vsomeip::byte_t> its_payload_data;
    for (int i=9; i>=0; i--) {
        its_payload_data.push_back(i % 256);
    }
    its_payload->set_data(its_payload_data);
    its_response->set_payload(its_payload);
    app->send(its_response);

}

 

int main() {

    app = vsomeip::runtime::get()->create_application("World");
    app->init();
    app->register_message_handler(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, SAMPLE_METHOD_ID, on_message);
    app->offer_service(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID);
    app->start();

    return 0;

}

服务端提供 message_handler 和 offer 功能。

register_message_handler函数在 someip/application.hpp 中的定义描述为:

virtual void register_message_handler(service_t _service,
instance_t _instance, method_t _method,
message_handler_t _handler) = 0;
//为指定的 method 或 event 注册处理程序。用户应用程序必须调用此方法来为其注册回调。
//每个服务(SERVICE)、实例(INSTANCE)、方法/事件(METHOD)组合只能注册一个处理程序。

offer_service函数在 \vsomeip-master\interface\vsomeip\application.hpp 中的定义描述为:

virtual void offer_service(service_t _service, instance_t _instance,
major_version_t _major = DEFAULT_MAJOR, minor_version_t _minor =
DEFAULT_MINOR) = 0;

//参数 _service:service标识符;
//参数 _instance:提供的服务实例的实例标识符;
//参数 _major:主服务版本号(默认为0);
//参数 _minor:次服务版本号(默认为0)。

offer_service 函数的作用是将service 注册到 vsomeip 路由组件上,从而使感兴趣的客户端可以看到该服务,因此用户应用程序必须为它提供的每个 service 调用offer_service这个方法。根据配置,service有两种模式,一种是只能在内部网络中可用的,另一种是在内部和外部均可使用。为了向外部网络提供服务, 配置中必须包含提供服务实例的端口,如果没有提供这样的端口配置,服务在设备外部是不可见的。

  • client添加代码
#include <iomanip>
#include <iostream>
#include <sstream> 
#include <condition_variable>
#include <thread>
#include <vsomeip/vsomeip.hpp>

 

#define SAMPLE_SERVICE_ID 0x1234
#define SAMPLE_INSTANCE_ID 0x5678
#define SAMPLE_METHOD_ID 0x0421


std::shared_ptr< vsomeip::application > app;
std::mutex mutex;
std::condition_variable condition;

 
void run() {

    std::unique_lock<std::mutex> its_lock(mutex);

    condition.wait(its_lock);
    std::shared_ptr< vsomeip::message > request;

    request = vsomeip::runtime::get()->create_request();
    request->set_service(SAMPLE_SERVICE_ID);
    request->set_instance(SAMPLE_INSTANCE_ID);
    request->set_method(SAMPLE_METHOD_ID);

    std::shared_ptr< vsomeip::payload > its_payload = vsomeip::runtime::get()->create_payload();
    std::vector< vsomeip::byte_t > its_payload_data;

    for (vsomeip::byte_t i=0; i<10; i++) {

        its_payload_data.push_back(i % 256);

    }

    its_payload->set_data(its_payload_data);
    request->set_payload(its_payload);
    app->send(request);

}

 

void on_message(const std::shared_ptr<vsomeip::message> &_response) {

    std::shared_ptr<vsomeip::payload> its_payload = _response->get_payload();
    vsomeip::length_t l = its_payload->get_length();

    // Get payload
    std::stringstream ss;

    for (vsomeip::length_t i=0; i<l; i++) {
        ss << std::setw(2) << std::setfill('0') << std::hex
        << (int)*(its_payload->get_data()+i) << " ";

    }

    std::cout << "CLIENT: Received message with Client/Session ["
    << std::setw(4) << std::setfill('0') << std::hex << _response->get_client() << "/"
    << std::setw(4) << std::setfill('0') << std::hex << _response->get_session() << "] "
    << ss.str() << std::endl;

}

 

void on_availability(vsomeip::service_t _service, vsomeip::instance_t _instance, bool _is_available) {

    std::cout << "CLIENT: Service ["
    << std::setw(4) << std::setfill('0') << std::hex << _service << "." << _instance
    << "] is "
    << (_is_available ? "available." : "NOT available.")
    << std::endl;
    condition.notify_one();

}

 

int main() {

    app = vsomeip::runtime::get()->create_application("Hello");
    app->init();
    app->register_availability_handler(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, on_availability);
    app->request_service(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID);
    app->register_message_handler(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, SAMPLE_METHOD_ID, on_message);
    std::thread sender(run);
    app->start();

}

与服务端的代码一样,在客户端代码中我们也需要调用 register_message_handler 注册一个消息处理程序,用来接收服务器对客户端请求的响应。原则上,创建请求消息非常容易。只需通过调用 create_request() 获取请求对象,设置 service ID、instance ID 和 method ID,并在最后将序列化的数据写入payload。在上面这个示例中,我们将 0 到 9 的值写入有效负载(std::vector< vsomeip::byte_t >)。

上述代码中出现 “std::thread sender(run);” 的原因是:当我们尝试将请求从客户端发送给服务时,遇到了一个小问题。在发送消息之前必须启动应用程序(app->start()),因为我们需要一个正在运行的事件循环来处理消息。但是该方法 app->start() 不会返回,因为它内部有正在运行的事件循环。因此,就需要启动一个线程(run),并在此线程中等待 availability 回调的返回,然后再调用app->send(request)。

vsomeip部署在Linux_车载通信_11

vsomeip部署在Linux_车载通信_12

标签:service,部署,app,payload,SAMPLE,Linux,ID,vsomeip
From: https://blog.51cto.com/u_15059356/6186349

相关文章

  • Linux tcpdump命令
    Linuxtcpdump命令非常强大的工具,只有root账号可以使用,是安全和黑客入侵必备工具tcpdump:verboseoutputsuppressed,use-v[v]...forfullprotocoldecodelisteningoneth0,link-typeEN10MB(Ethernet),snapshotlength262144bytes22:29:28.233024IP119.91.211.2......
  • Linux wall命令
    Linuxwall命令用于发送信息,登录人员都能看到,是不是看到有点入侵聊天的影子Linuxwall命令会将讯息传给每一个mesg设定为yes的上线使用者。当使用终端机介面做为标准传入时,讯息结束时需加上EOF(通常用Ctrl+D)。使用权限:所有使用者。语法wall[message]实例传讯......
  • Linux traceroute命令
    Linuxtraceroute命令Linuxtraceroute命令用于显示数据包到主机间的路径。traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置。语法traceroute[-dFlnrvx][-f<存活数值>][-g<网关>...][-i<网络界面>][-m<存活数值>][-p<通信端口>][-s<来源地......
  • Linux ping 命令
    Linuxping命令命令和netstat命令一样重要,常用语检测域名是否通。出海部署的同学,经常使用的命令。pingwww.huawei.comLinuxping命令用于检测主机。执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作......
  • #yyds干货盘点#Linux显示或管理路由表
    【功能说明】route命令可以显示或管理Linux系统的路由表,route命令设置的路由主要是静态路由。【路由的概念】计算机与计算机之间的数据传输必须得经由网络,而网络可以通过直接连接两台计算机的方式或者是以一个或一个以上的节点来构成。数据传输首先会通过源主机传送到一个网络节点,......
  • Linux telnet命令
    Linuxtelnet命令telnet192.168.0.16379运维人员常用命令,不幸的是可能很多OS上并没有需要手工安装,甚至离线安装Linuxtelnet命令用于远端登入。执行telnet指令开启终端机阶段作业,并登入远端主机。语法telnet[-8acdEfFKLrx][-b<主机别名>][-e<脱离字符>][-k<域名>][-l<......
  • Linux fdisk 命令
    Linuxfdisk命令此命令暂时记录,项目中经常用来挂载数据盘Linuxfdisk是一个创建和维护分区表的程序,它兼容DOS类型的分区表、BSD或者SUN类型的磁盘列表。语法fdisk[必要参数][选择参数]必要参数:-l列出素所有分区表-u与-l搭配使用,显示分区数目选择参数:-s<......
  • 63、K8S-使用K8S部署Prometheus、grafana
    Kubernetes学习目录1、准备工作1.1、教程Github地址https://github.com/prometheus-operator/kube-prometheus.git1.2、下载编写好的yamlwgethttps://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.12.0.tar.gz1.3、解压项目代码tarxvfkub......
  • linux Ubantu系统连不上蓝牙解决办法
    修改蓝牙控制模式在/etc/bluetooth/main.conf中设置ControllerMode=bredr打开文件进行修改sudovim/etc/bluetooth/main.conf修改ControllerMode=bredr 解决问题。......
  • Cesium离线部署的正确方法
    网上相关文章比较杂,有的说要改源码,其实不用,都试了一遍发现这样才对varmyProviderViewModel=newCesium.ProviderViewModel({name:"天地图地形",tooltip:"",iconUrl:"Widgets/Images/ImageryProviders/naturalEarthII.png",c......