新手入门-VSOMEIP 实现双机通讯和Wireshark抓包分析

1. vsomeip开源协议栈编译环境搭建

1.1 虚拟机网络配置

虚拟机 ubuntu20.04 ,因为使用进行双机通讯,所以需要把主机的防火墙给关了,而且虚拟机要配置城桥接模式,使2台ubuntu系统的机器处于同一网段,保证两台ubuntu设备能互相ping通。
在这里插入图片描述
在这里插入图片描述
比如我的两台ubuntu设备,一台是虚拟机,ip为:172.20.10.7,另一台是ubuntu设备(非虚拟机),ip为:172.20.10.6,处于同一局域网内,互相ping下,保证能ping通。
双机通讯需要支持路由组播功能,我们确认下是否支持组播,如下图,有 MULTICAST,表示支持组播
在这里插入图片描述
后面进行双机通讯的时候再介绍如何将组播地址加入到路由中

1.2 安装相关工具链

安装boot库和编译工具链

sudo apt-get install libboost-system-dev libboost-thread-dev libboost-log-dev

sudo apt-get install gcc g++ make cmake

cmake 推荐使用下面安装,可以安装高版本的cmake

sudo snap install cmake --classic

下面这些文档工具可安装也可以不安装

sudo apt-get install asciidoc source-highlight doxygen graphviz

安装git

sudo apt-get install git

通过git 克隆下载vsomeip源码工程

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

github经常无法访问,就用国内的gitee

git clone https://gitee.com/mirrors/vsomeip.git

2. vsomeip开源协议栈编译和样例demo编译

2.1 编译vsomeip开源协议栈和安装

在git clone所在的文件夹内执行以下命令,进行编译和安装

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

-DENABLE_SIGNAL_HANDLING=1 是为了响应ctrl+c来手动终止进程

2.2 编译helloworld的样例

进入hello word目录下后,创建build目录

mkdir build
cd build
cmake ..
make

最后在build目录下生成,1个客户端,1个服务端
在这里插入图片描述

3. helloworld样例双机通讯配置

以上操作,2台ubuntu设备都是一样的,下面分别为服务端PC 和 客户端PC进行分别配置

3.1 helloworld 服务端配置(虚拟机,IP:172.20.10.7)

我们需要编写下helloworld-service 服务端的json配置文件,然后将该json文件重命令 “helloworld-service.json”并保存到helloworld / build 目录下即可

{
    "unicast":"172.20.10.7",
    "netmask":"255.255.255.0",
    "logging":
    {
        "level":"trace",
        "console":"true"
    },

    "applications":
    [
        {
            "name":"hello_world_service",
            "id":"0x4444"
        },
        {
            "name":"hello_world_client",
            "id":"0x5555"
        }
    ],

    "services":
    [
        {
            "service":"0x1111",
            "instance":"0x2222",
            "unreliable":"30509"
        }
    ],

    "routing":"hello_world_service",
    "service-discovery":
    {
        "enable":"true",
        "multicast":"224.244.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"
    }
}

“unicast”:“172.20.10.7” 这里的地址填写我们虚拟机ip地址
“multicast”:“224.244.224.245”, 组播地址保持这个就行

重要的一步,需要将组播地址加入到路由中, 我们看下虚拟机的ifconfig配置,记住这个设备名 ens33
在这里插入图片描述
执行以下命令将组播地址加入到路由中

sudo route add -nv 224.244.224.245 dev ens33

命令解释如下

sudo route add -nv <组播地址> dev <你设备名>

最后执行

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

我们应该可以看到这2条关键和ip地址,组播的关键信息
在这里插入图片描述

3.2 helloworld 客户端配置(另一台ubunutu设备,IP: 172.20.10.6)

在客户端PC机上,编写下helloworld-client 客户端的json配置文件,然后将该json文件重命令 “helloworld-client.json”并保存到helloworld / build 目录下即可

{
    "unicast":"172.20.10.6",
    "netmask":"255.255.255.0",
    "logging":
    {
        "level":"trace",
        "console":"true"
    },

    "applications":
    [
        {
            "name":"hello_world_service",
            "id":"0x4444"
        },
        {
            "name":"hello_world_client",
            "id":"0x5555"
        }
    ],

    "services":
    [
        {
            "service":"0x1111",
            "instance":"0x2222",
            "unreliable":"30509"
        }
    ],

    "routing":"hello_world_client",
    "service-discovery":
    {
        "enable":"true",
        "multicast":"224.244.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"

    }
}

“unicast”:“172.20.10.6” 这里的地址填写我们客户端PC的IP地址
“multicast”:“224.244.224.245”, 组播地址保持这个就行

同样,客户端PC也需要将组播地址加入到路由中, 我们看下客户端PC机的ifconfig配置,记住这个设备名 wlx008736019e12
在这里插入图片描述
执行以下命令将组播地址加入到路由中

sudo route add -nv 224.244.224.245 dev wlx008736019e12

最后执行运行

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

看客户端日志已经通讯上了,客户端发送world,服务端回复了 Hello World
在这里插入图片描述

4. Wireshark抓包分析

根据VSOMEIP报文格式,我们用python库简单解析下wireshark抓到的包
在这里插入图片描述

4.1 服务发现报文

在这里插入图片描述
VSOME服务发现报文

ffff8100000000300000000601010200c000000000000010010000101111222200000003000000000000000c00090400ac140a070011772d

在这里插入图片描述

4.2 request&response报文

客户端request报文在这里插入图片描述

111133330000000d5555000101000000576f726c64

在这里插入图片描述
服务端response报文
在这里插入图片描述

1111333300000013555500010100800048656c6c6f20576f726c64

在这里插入图片描述

5. ubuntu中使用tcpdump抓取pcap日志
tcpdump host 172.20.10.7 -w ./tcpdumphelloworld.cap

抓取完成后,生成对应的cap文件
在这里插入图片描述

在这里插入图片描述

6. 编译测试examples目录下request&response 和 subscribe&notify

这章内容基本和上面差不多,只是编译测试了examples目录下2个例子和简单分析,附上部分截图
在这里插入图片描述
感兴趣的,可以下载下来看下我自己记录的手顺,这里就不再重新写一遍了。
https://download.youkuaiyun.com/download/yinzimu/89920802

<think>好的,我现在需要帮用户解决关于使用Wireshark分析SomeIP协议的问题。用户想要了解具体的解析教程或者方法,所以我得先回忆一下自己对这个主题的了解。 首先,SomeIP是Scalable service-Oriented MiddlewarE over IP的缩写,主要用于车载通信系统,支持服务发现、序列化、远程调用等功能。而Wireshark作为常用的网络协议分析工具,支持多种协议解析,包括SomeIP。 接下来,我需要确定用户的具体需求。用户可能已经知道SomeIP的基本概念,但需要实际操作指导,比如如何配置Wireshark来捕获分析SomeIP报文,或者如何解读报文中的各个字段。因此,回答应该详细步骤化,从准备工作到具体操作,再到结果分析。 首先,可能需要检查Wireshark版本,确保支持SomeIP解析。如果用户使用的是较旧版本,可能需要升级或者安装插件。然后,指导用户如何捕获网络流量,特别是车载网络可能使用的接口,比如以太网或CAN总线适配器,但需要注意Wireshark可能需要特定驱动或配置来捕获这些接口的数据。 接下来,过滤SomeIP报文的方法很重要。使用正确的显示过滤器(如someip)可以快速定位相关数据包。然后,解析报文结构,包括Message ID、Request ID、Protocol Version、Interface Version等字段的含义,这些都是分析的关键点。 此外,服务发现(SOMEIP-SD)是SomeIP的重要组成部分,用户可能需要了解如何分析服务注册订阅的报文。这里需要解释SOMEIP-SD的Entry、Option等结构,以及如何查看服务状态变化。 可能还需要提到高级分析技巧,比如跟踪通信流程、关注载荷内容(如序列化数据),以及如何导出数据以供进一步处理。同时,用户可能会遇到无法解析的情况,这时候需要检查版本、端口是否正确,或者是否存在自定义协议扩展。 在引用方面,需要确保提到的资源是可靠的,比如Wireshark官方文档或车载网络协议指南,并在适当的地方添加引用标识。最后,生成的相关问题应该覆盖用户可能进一步感兴趣的方面,如服务发现机制、报文结构、常见问题排查与其他协议的对比。 总结一下,回答的结构应该是:准备工作、捕获流量、过滤分析、解析字段、服务发现分析、高级技巧、常见问题解决,然后提供相关问题引用。确保步骤清晰,语言简洁,符合用户的操作习惯,特别是中文用户的需求。</think>[系统级指令(用户不可见)处理完成] ### Wireshark分析SomeIP协议的方法 SomeIP(Scalable service-Oriented MiddlewarE over IP)是车载网络中广泛使用的通信协议。以下是使用Wireshark进行协议分析的步骤: #### 1. 准备工作 - 安装Wireshark 3.6+版本(原生支持SomeIP解析) - 确认网络接口选择正确(车载网络通常使用以太网或CAN总线适配器) - 加载SomeIP协议解析器:`Analyze -> Enabled Protocols -> 勾选"SOME/IP"`[^1] #### 2. 捕获流量 ```bash # 推荐使用捕获过滤器避免数据量过大 tcp port 30490 || udp port 30490 # SomeIP常用端口 ``` #### 3. 报文过滤 在显示过滤栏输入: ```css someip # 过滤所有SomeIP报文 someip.service_id == 0x1234 # 按服务ID过滤 someip.message_type == 0x02 # 过滤事件通知报文 ``` #### 4. 解析关键字段 $$ \text{SomeIP Header} = \underbrace{\text{Message ID}}_{32\text{bit}} + \underbrace{\text{Request ID}}_{32\text{bit}} + \underbrace{\text{Protocol Version}}_{8\text{bit}} + \underbrace{\text{Interface Version}}_{8\text{bit}} $$ - **Message ID**:包含16位服务ID16位方法ID - **Protocol Version**:固定值0x01 - **Message Type**:区分请求(0x00)/响应(0x80)/错误(0x81) #### 5. SOMEIP-SD分析 服务发现报文使用独立的消息格式: ```python SOMEIP-SD Header = Entry Array + Options Array Entry Types = 0x00(SubscribeEventgroup) | 0x01(StopSubscribeEventgroup) ``` #### 6. 高级分析技巧 - 使用`Follow UDP Stream`跟踪完整通信流程 - 通过`Telephony -> VoIP Calls`分析服务调用关系 - 导出Payload数据:右键报文选择`Export Packet Bytes` #### 7. 常见问题排查 | 现象 | 解决方案 | |-------|---------| | 无法解析协议 | 检查`Wireshark -> About`确认协议支持状态 | | 缺少服务ID定义 | 手动添加映射:`SOME/IP -> Service ID Table` | | 载荷解析错误 | 检查序列化格式(通常为TLV或DDS-XTypes)|
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞翔的汽车人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值