VSOMEIP双机通信

介绍下demo怎么写的还有双机通信怎么实现


文章目录

  • VSOMEIP双机通信
  • 编写配置环境
  • 双机通信
  • 代码详解
    • server.cpp
    • client.cpp
  • 总结

编写配置环境

由于VSOMEIP是个库,所以和其他的库一样用就行了。

首先创建demo目录
这里创建的是vsomeip_demo文件夹

里面创建个server端的cpp和client端的cpp,这里只是编译,不用在两个电脑上分别创建。

建个build,用于存放json配置文件,和CmakeList生成的Makefile等东西。

其中CakeList.txt就是cmake的文件,代码如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)set (CMAKE_CXX_FLAGS "-g -std=c++0x")set (vsomeip_DIR /home/xiong/work/VSOMEIP/source/vsomeip-master)set (Boost_INCLUDE_DIR /home/xiong/work/VSOMEIP/install/boost_1_72_0/include)find_package (vsomeip3 REQUIRED)
find_package( Boost 1.72 COMPONENTS system thread log REQUIRED )include_directories (${Boost_INCLUDE_DIR}${VSOMEIP_INCLUDE_DIRS}
)add_executable(service service.cpp)
add_executable(client client.cpp)
target_link_libraries(service vsomeip3 ${Boost_LIBRARIES})
target_link_libraries(client vsomeip3 ${Boost_LIBRARIES})

没多少代码,就是添加几个库的路径,添加源文件,能过够让编译器找到对应的库和源文件,这个路径需要改成对应电脑的路径。

然后再build里面编译cmake …
结果如下:

这里auto.sh和vsoemip.json是为了配置放的,其他都是cmake生成的。

然后make一下:

然后就生成了server和client两个可执行文件

现在运行./server的话会出现:

其根本原因是没有库的路径到指定环境变量LD_LIBRARY_PATH中,我又不想永久写到配置文件中,本来想打算写个sh添加以下,后面发现sh好像export不了,没办法只能把sh里面的东西复制出来到终端执行:

如果想添加到配置文件的话把LD_LIBRARY_PATH添加以下就好了,添加完之后就能正常运行了。

双机通信

双机通信就配置以下vsomeip.json文件就好了,这里我用的是单播进行的通信,这个是server端的,另一台电脑上IP反过来写就行,然后APP的名字和routing名字这些配置改一下就行。

{"unicast" : "192.168.0.10","applications" : [{"name" : "Hello","id" : "0x1313"}],"routing" : "Hello","service-discovery" :{"enable" : "true","mode" : "unicast","unicast" : ["192.168.0.11"],"multicast" : "224.224.224.245","port" : "30490","protocol" : "udp","initial_delay_min" : "10","initial_delay_max" : "100","repetitions_base_delay" : "200","repetitions_max" : "3","ttl" : "3","cyclic_offer_delay" : "2000","request_response_delay" : "1500"}
}

配置文件没啥好讲的就是配置以下自己的ip,配置一下app的ID和name,然后配一下SD的参数,设成单播,至于SD报文的重复的base时间这些参数就按照这个设置就行,改不改的不要太离谱就行。

配完make一下生成的两个可执行文件分别放到对应IP的两台主机上进行运行,就可以双机通信了。

代码详解

server.cpp

#include <iomanip>
#include <iostream>
#include <sstream>#include <vsomeip/vsomeip.hpp>#define SAMPLE_SERVICE_ID 0x1234
#define SAMPLE_INSTANCE_ID 0x5678
#define SAMPLE_METHOD_ID 0x0421std::shared_ptr<vsomeip::application> app;void on_message(const std::shared_ptr<vsomeip::message> &_request) {std::cout << "asdfghjkl" << std::endl;std::shared_ptr<vsomeip::payload> its_payload = _request->get_payload();vsomeip::length_t l = its_payload->get_length();// Get payloadstd::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 responsestd::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();
}

没有helloworld那么麻烦,在主函数里面就是注册了一个app,然后init一下,注册一个收到request的回调函数on_message,然后就offer_service跟start,就开启各种线程服务启动了。

client.cpp

#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 0x0421std::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::cout << "sdsdsdsdsdsdsdsdsdsds" << std::endl;std::shared_ptr<vsomeip::payload> its_payload = _response->get_payload();vsomeip::length_t l = its_payload->get_length();// Get payloadstd::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();
}

client.cpp流程大体和server端一样,就是多注册了几个函数用于request服务,检测服务是否可用等函数,然后开了个线程来发送request数据,最后start,实现一个SOMEIP中最简单的request/response交互流程,有时间的可以抓包看一下报文。

总结

最近出差多没时间总结,现在把之前双机通信的案例总结一下,后面关于多播的就不写了都是一样的。

VSOMEIP双机通信相关推荐

  1. 怎么用matlab建立双机系统,基于MATLAB的双机通信的实现

    第 卷第 期< 年 月 华 东 交 通 大 学 学 报 」 飞 朗 而 , 文章编号 一 以刀 能 一 以巧 一 基 于 的双机通信 的实现 曹青松 , 周继 惠 , 熊国 良 华东交通大学 机 ...

  2. 计算机dos通讯,PC双机通信DOS

    <PC双机通信DOS>由会员分享,可在线阅读,更多相关<PC双机通信DOS(64页珍藏版)>请在人人文库网上搜索. 1.1 第第9 9章章 串行通信接口串行通信接口 主要内容: ...

  3. 双机通信c语言程序,上传一个自己编写的I2C双机通信程序

    本帖最后由 micro_听海 于 2012-11-24 19:58 编辑 这几天一直在搞AVR的twi(twi就是i2c)双机通信程序,使用的是两块arduino开发板.因为最总要这个通信程序最总是要 ...

  4. RS-232实现双机通信

    目录 一. RS-232串行通信接口标准 二. USB转TTL实现双机通信 1. 接线操作 2. 使用串口调试助手进行双机通信 三. 总结 四. 参考来源 一. RS-232串行通信接口标准 串行数据 ...

  5. 51单片机实现的双机通信设计仿真

    基于51单片机的双机通信仿真设计 目录 一.题目要求 二.硬件设计说明 三.功能说明 四.软件设计说明 附:[Proteus仿真+keil代码+分析文档.rar](https://download.c ...

  6. 【嵌入式】STM32实现SPI双机通信的一些细节(2)片选总结

    [嵌入式]STM32实现SPI双机通信的一些细节(2)SPI软硬件片选总结 SPI片选总结 坑爹的手册示意图 理想中的硬件片选 主机软件片选就对了 从机硬件片选 从机软件片选 代码 主机软件片选SPI ...

  7. 在学习c51单片机实验七(双机通信及pcb设计)操作Keil uVision4和protus的时候遇到的两个坑

    第一个问题,这个问题用keil编程经常遇到 特别是懒的时候,对于新手,每次用一个工程文件,因为创建不熟练,就容易出现这个问题 Build target 'Target 1' linking... ** ...

  8. 【STM32H7教程】第94章 STM32H7的SPI总线应用之双机通信(DMA方式)

    完整教程下载地址:链接 第94章       STM32H7的SPI总线应用之双机通信(DMA方式) 本章节为大家讲解SPI DMA方式双机通信. 目录 94.1 初学者重要提示 94.2 SPI D ...

  9. 单片机双机通信c语言实验心得,80C51单片机双机通信与多机通信的使用方法

    80C51单片机之间的串行通信主要可分为双机通信和多机通信,本节举例说明双机通信与多机通信的使用方法. 1.双机通信硬件电路如果两个80C51单片机系统距离较近,那么就可以将它们的串行口直接相连,实现 ...

最新文章

  1. java接口的定义及使用细节
  2. boost::container模块实现检查相等的容器的测试程序
  3. 关于spring-mvc.xml的mvc:resources元素浅析。
  4. Java柏林算法,柏林噪音 - 我做错了什么?
  5. 【Redis】13.Redis服务器配置redis.conf
  6. 面向对象编程从骨子里就有问题——看看名人大家是如何吐槽面向对象的
  7. MySQL性能,杀疯了
  8. 定值保险计算举例_机动车辆保险的一些购买原则181536312
  9. pythonlist循环添加元素_list.append()在for循环中每次添加的都是最后的一个元素汗血宝马...
  10. (六)api网关服务 zuul-过滤器
  11. Android、iOS、和Web如何做灰度发布?
  12. 未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“***Form.resources”正确嵌入或链接到程序集“***”。。。
  13. 就我不坑2 nyoj(简单模拟)
  14. android音效插件,ViPER4 音效插件
  15. 微信大数据解析不一样的人生,你被戳中了吗……
  16. 让工控机通过笔记本的Wifi实现上网
  17. 【MySQL】根据数据表中日期字段查询某个月每一天的数据量?查询数据表中所有日期每天的数据量?近三天每天数据量?
  18. JS数组常用方法练习题
  19. where 引导从句
  20. SAP 基于收货的发票校验 GR-Based IV

热门文章

  1. 使用Hadoop同步Neo4j数据(亿级)
  2. Web前端入门(六)表格
  3. stdcall 以及 其他的dll调用方式
  4. 大学期末搜题公众号推荐
  5. 2016全国大学生信息安全竞赛-web-WriteUp
  6. 吴恩达刚刚注册了一个微信公众号,明天发布新书中文版!
  7. c语言100行程序代码带解释,【申精】掉字母游戏VC源代码,共100行,带注释(加绘图库写的)...
  8. HTTP错误代码详解
  9. 腾讯面试题:有了二叉查找树、平衡树为啥还需要红黑树?
  10. Thinkphp command使用