[someip专题]vsomeip使用以及代码解析1

目录

1. someip基础知识

2.vsomeip 准备工作

2.1 vsomeip 源码下载

2.2 依赖项下载

3.vsomeip 编译

4. vsomeip helloworld使用


本文在linux ubuntu 18.04版本上进行运行。

1. someip基础知识

参考 关于SOME/IP的理解_AgingMoon的博客-CSDN博客_someip

2.vsomeip 准备工作

2.1 vsomeip 源码下载

GitHub - COVESA/vsomeip: An implementation of Scalable service-Oriented MiddlewarE over IP

2.2 依赖项下载

vsomeip 主要依赖boost库,因此需要下载boost,同时采用g++ cmake进行编译。

  • A C++11 enabled compiler like gcc >= 4.8 is needed.
  • vsomeip uses CMake as buildsystem.
  • vsomeip uses Boost >= 1.55:
sudo apt-get install libboost-system-dev libboost-thread-dev libboost-log-dev
sudo apt-get install asciidoc source-highlight doxygen graphviz
sudo apt-get install gcc g++ make

3.vsomeip 编译

进入vsomeip 目录

mkdir build
cd build
cmake ..
make

此处会编译出vsomeip库

 接着,我们可以使用其中的Hello world 案例来进一步进行编译使用;

cmake --build . --target hello_world
cd ./examples/hello_world/
make

编译完成后,在目录下生成两个可执行文件 hello_world_client  和 hello_world_service

接着就可以继续执行Helloworld程序了。

4. vsomeip helloworld使用

在执行前,先将 配置 json文件拷贝到执行目录下

 启动服务端

VSOMEIP_CONFIGURATION=./helloworld-local.json \
VSOMEIP_APPLICATION_NAME=hello_world_service \
./hello_world_service

 启动客户端

VSOMEIP_CONFIGURATION=./helloworld-local.json \
VSOMEIP_APPLICATION_NAME=hello_world_client \
./hello_world_client

[info] Using configuration file: ../helloworld-local.json
[debug] Routing endpoint at /tmp/vsomeip-0
[info] Service Discovery disabled. Using static routing information.
[debug] Application(hello_world_service, 4444) is initialized.
[debug] Application/Client 5555 got registered!

 [info] Using configuration file: ../helloworld-local.json
[debug] Connecting to [0] at /tmp/vsomeip-0
[debug] Listening at /tmp/vsomeip-5555
[debug] Application(hello_world_client, 5555) is initialized.
Sending: World
Received: Hello World

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是一个简单的 SomeIP 示例代码,用于发送和接收一条消息: ```c++ #include <iostream> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8080 #define SOMEIP_HEADER_LENGTH 12 using namespace std; // SomeIP header结构体 struct SomeIPHeader { uint16_t message_id; uint8_t length; uint8_t protocol_version; uint8_t interface_version; uint8_t message_type; uint8_t return_code; uint8_t flags; uint32_t reserved; }; int main() { int sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { cerr << "Failed to create socket." << endl; return -1; } // 构造服务器地址 struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); server_addr.sin_port = htons(SERVER_PORT); // 构造SomeIP消息 SomeIPHeader header; memset(&header, 0, sizeof(header)); header.message_id = htons(0x1234); header.length = 4; header.protocol_version = 1; header.interface_version = 1; header.message_type = 1; header.return_code = 0; header.flags = 0; header.reserved = 0; char message[SOMEIP_HEADER_LENGTH + header.length]; memcpy(message, &header, SOMEIP_HEADER_LENGTH); memcpy(message + SOMEIP_HEADER_LENGTH, "test", header.length); // 发送SomeIP消息 ssize_t send_len = sendto(sock, message, SOMEIP_HEADER_LENGTH + header.length, 0, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (send_len < 0) { cerr << "Failed to send SomeIP message." << endl; close(sock); return -1; } cout << "SomeIP message sent." << endl; // 接收SomeIP消息 char recv_buf[1024]; struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); ssize_t recv_len = recvfrom(sock, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&client_addr, &client_addr_len); if (recv_len < 0) { cerr << "Failed to receive SomeIP message." << endl; close(sock); return -1; } // 解析SomeIP消息 SomeIPHeader *recv_header = (SomeIPHeader *)recv_buf; uint16_t message_id = ntohs(recv_header->message_id); uint8_t length = recv_header->length; char payload[length]; memcpy(payload, recv_buf + SOMEIP_HEADER_LENGTH, length); cout << "SomeIP message received. ID: " << message_id << ", Payload: " << string(payload, length) << endl; close(sock); return 0; } ``` 注意事项: - SomeIP 头部长度为12字节。 - 在发送消息之前,需要构造 SomeIP 消息头部和消息负载。 - 发送和接收消息时,需要指定服务器地址和端口号。 - 接收到的消息需要按照 SomeIP 消息头部指定的长度进行解析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值