自动驾驶技术栈——DoIP通信协议
一、DoIP协议简介
DoIP,英文全称是Diagnostic communication over Internet Protocol,是一种基于因特网的诊断通信协议。
DoIP协议基于TCP/IP等网络协议实现了车辆电子控制单元(ECU)与诊断应用程序之间的通信,常用于汽车行业的远程诊断、远程车辆维修、车载固件的OTA升级等场景。
DoIP协议的设计初衷是为了解决基于CAN总线的传统诊断通信在应用时出现的带宽有限、灵活性不足、不方便远程访问等问题。早期的诊断通信方式是使用CAN总线进行数据传输,将诊断服务运行在ISO-15765标准定义的DoCAN协议上,而基于ISO-13400标准的DoIP协议结合了现代车载以太网和TCP/IP协议的优势,为车载诊断通信提供了更大的吞吐量和更快的响应速度,让汽车只要连接了以太网便可以实现诊断通信。
二、DoIP协议的优点
支持身份校验和加解密功能,以防止未经授权的网络访问和数据盗窃。
硬件上采用了标准以太网设备和电缆,不需要额外接入VCI转换器,降低了硬件成本。
支持高效的海量数据处理,节省了ECU固件刷写的时间。
基于标准的TCP/IP协议进行通信,可以与其他现有的以太网协议进行集成和交互。
应用广泛,逐渐被越来越多的汽车制造商和诊断工具制造商采用,有望成为汽车行业的诊断通信标准。
采用网络编程即可实现,配置和部署灵活,支持多种应用场景。
三、DoIP协议的潜在风险
通信过程依赖以太网的传输质量,会因为网速导致诊断设备和车辆之间的响应速度变慢。
随着现代汽车的联网程度越来越高,采用DoIP协议进行通信会增加汽车遭受网络攻击的风险,即使在TCP通信阶段使用TLS加密,也存在很多安全漏洞,比如网络中的恶意代码可以伪装成DoIP网关并截获通信数据。
整个DoIP协议栈的代码是基于TCP/IP协议的API进行开发的,和大多数网络编程场景一样,会存在丢包、传输延迟等底层问题。
四、DoIP协议的分层
DoIP协议的传输层:采用TCP/UDP协议进行实现。
DoIP协议的网络层:采用IP协议进行实现。
DoIP协议的应用层or会话层:采用UDS诊断协议进行实现。
DoIP协议将标准的UDS消息封装在TCP/IP协议的数据包中,让UDS消息可以通过以太网或WLAN进行传输。
五、DoIP协议的消息体结构
DoIP报文的消息体组成:DoIP Header + DoIP Payload。
DoIP Header:主要用来区分协议的版本。
DoIP Payload:主要用来标注发送方地址SA、接收方地址TA、诊断消息体。
1.DoIP报文头部的构成:
(1).协议版本(Proto Version)
参数长度:1字节
含义:表示正在使用的 DoIP 协议版本,例如0x01、0x02、0x03。
举例:
0x00: 预留
0x01: DoIP ISO/IDS 13400-2:2010
0x02: DoIP ISO 13400-2:2012
0x03: DoIP ISO 13400-2:2019
(2).协议版本的反码(Inv Version)
参数长度:1字节
含义:表示协议版本的按位取反,例如协议版本为0x03,则此值为0xFC。
(3).载荷类型(Payload Type)
参数长度:2字节
含义:常用的载荷类型有车辆识别、诊断消息传输和路由激活等。
常见的载荷类型:
(4).载荷长度(Payload Length)
参数长度:4字节
含义:表示除去Header的长度以后,DoIP报文的数据包部分的长度。
完整的DoIP报文样例:
2.DoIP报文的消息体构成
发送方地址(Source Address)
接收方地址(Target Address)
诊断命令(UDS Message)
六、DoIP网络拓扑结构
协议文档ISO13400-2中提供的结构如下:
整车的网络拓扑分为两部分,即内部网络和外部网络。
关键元素:
1.外部测试设备(External test equipment)
OBD诊断工具或其他诊断仪,可以理解为DoIP协议中的客户端。
2.DoIP网关(DoIP Gateway)
该网关负责转发DoIP消息,为了寻址方便,DoIP网关中通常存储了ECU的地址map。
它同时连接了IP网络和非IP网络上的DoIP节点,并向这些节点转发诊断消息。
通常采用MCU设备来扮演DoIP网关角色。
3.DoIP边缘节点网关(DoIP edge node gateway)
它的功能与DoIP网关类似,它的子网上也挂载了多个ECU。
外部测试设备和DoIP边缘节点网关之间有一条称为激活线的线路,该线路可以使DoIP协议生效。
该网关是车载网络和车载外网络之间的接入点,它负责将车内网络与车外网络进行隔离,避免非法的网络访问。
通常采用MPU设备来扮演DoIP边缘节点网关角色。
4.DoIP节点(DoIP Node)
物理结构上,DoIP节点是指保持以太网连接并支持DoIP协议的ECU设备。
代码实现上,DoIP节点是指运行在ECU设备上的各种诊断应用程序。
5.网络节点(Network Node)
连接在IP网络上但没有实现DoIP协议的节点。
补充:激活线的作用是减少电磁干扰和降低网络带宽 ,在不需要诊断通信的时候,将激活线对应的电压拉低,需要诊断通信的时候,将激活线对应的电压拉高。
七、DoIP协议的通信场景
ISO-13400协议文档中介绍了多个场景,这里列举两种最常见的,帮助理解。
1.诊断仪与车辆的一对一连接,用于对特定的车辆进行诊断,排除其他设备的干扰。
2.诊断仪与车辆的一对多连接,用于同时刷写多个车辆上的ECU固件。
八、DoIP协议端口分配
1.车辆发现场景
涉及到多播通信,采用UDP通信端口,端口名是UDP_DISCOVERY,端口号是13400。
2.诊断会话场景
需要先建立连接,采用TCP通信端口,端口名是TCP_DATA,端口号是13400。
车辆发现与诊断会话的通信时序如下:
九、DoIP通信时序图
DoIP通信分为五个阶段:
step.01.建立物理连接,激活线将DoIP网关激活。
step.02.车辆发现。
step.03.选择车辆并建立TCP连接。
step.04.建立诊断会话。
step.05.诊断请求与响应。
1.会话建立时序
2.外部测试仪发起连接时的IP分配时序
参考阅读
DoIP UDS Server Demo — RAPIDSEA 1.2 documentation
DoIP vs. Traditional Protocols in Vehicle Maintenance Guide in 2025
https://embitel-stage.embdev.in/wp-content/uploads/DoIP-Factsheet-Embitel.pdf
Guide to the ISO13400 Protocol - UDS on automotive DoIP protocol
相关文章:

自动驾驶技术栈——DoIP通信协议
一、DoIP协议简介 DoIP,英文全称是Diagnostic communication over Internet Protocol,是一种基于因特网的诊断通信协议。 DoIP协议基于TCP/IP等网络协议实现了车辆电子控制单元(ECU)与诊断应用程序之间的通信,常用于汽车行业的远程诊断、远…...

C++ 与 Go、Rust、C#:基于实践场景的语言特性对比
目录 编辑 一、语法特性对比 1.1 变量声明与数据类型 1.2 函数与控制流 1.3 面向对象特性 二、性能表现对比编辑 2.1 基准测试数据 在计算密集型任务(如 10⁷ 次加法运算)中: 在内存分配测试(10⁵ 次对象创建…...
Docker 中的 DNS 解析机制
在 Docker 容器化环境中,网络连接是至关重要的,而 DNS(Domain Name System,域名系统)解析则是网络通信的基础。容器需要能够解析内部服务名称以及外部域名,以便与其他容器或外部世界进行交互。理解 Docker 如何处理 DNS 请求,可以帮助我们更好地配置和排查网络问题。 D…...
数字化工厂中央控制室驾驶舱系统 API接口文档
数字化工厂中央控制室驾驶舱系统 API接口文档 本文档详细描述了数字化工厂中央控制室驾驶舱系统的API接口规范,包括中端服务提供的数据接口和算法接口。 1. 通用规范 1.1 基础URL 后端服务: http://localhost:8000中端服务数据API: http://localhost:8001中端服…...

如何更改默认字体:ONLYOFFICE 协作空间、桌面编辑器、文档测试示例
在处理办公文件时,字体对提升用户体验至关重要。本文将逐步指导您如何在 ONLYOFFICE 协作空间、桌面应用及文档测试示例中自定义默认字体,以满足个性化需求,更好地掌控文档样式。 关于 ONLYOFFICE ONLYOFFICE 是一个国际开源项目,…...

设计模式之工厂模式(二):实际案例
设计模式之工厂模式(一) 在阅读Qt网络部分源码时候,发现在某处运用了工厂模式,而且编程技巧也用的好,于是就想分享出来,供大家参考,理解的不对的地方请多多指点。 以下是我整理出来的类图: 关键说明&#x…...

基于VeRL源码深度拆解字节Seed的DAPO
1. 背景与现状:从PPO到GRPO的技术演进 1.1 PPO算法的基础与局限 Proximal Policy Optimization(PPO)作为当前强化学习领域的主流算法,通过重要性采样比率剪裁机制将策略更新限制在先前策略的近端区域内,构建了稳定的…...

zst-2001 历年真题 软件工程
软件工程 - 第1题 b 软件工程 - 第2题 c 软件工程 - 第3题 c 软件工程 - 第4题 b 软件工程 - 第5题 b 软件工程 - 第6题 0.未完成:未执行未得到目标。1.已执行:输入-输出实现支持2.已管理:过程制度化,项目遵…...
WSL 安装 Debian 12 后,Linux 如何安装 redis ?
在 WSL 的 Debian 12 上安装 Redis 的步骤如下: 1. 更新系统包列表 sudo apt update && sudo apt upgrade -y2. 安装 Redis sudo apt install redis-server -y3. 启动 Redis 服务 sudo systemctl start redis4. 设置开机自启 sudo systemctl enable red…...
在Ubuntu系统下编译OpenCV 4.8源码
编译OpenCV 4.8源码可以为你提供更高的灵活性和优化性能,适合特定的需求。以下是详细的步骤,指导你在Ubuntu系统上编译和安装OpenCV 4.8。 1. 安装必要的依赖 首先,确保你的系统已经安装了所有必要的依赖项。 sudo apt update sudo apt in…...
Arduino快速入门
Arduino快速入门指南 一、硬件准备 选择开发板: 推荐使用 Arduino UNO(兼容性强,适合初学者),其他常见型号包括NANO(体积小)、Mega(接口更多)。准备基础元件:…...

基于WSL用MSVC编译ffmpeg7.1
在windows平台编译FFmpeg,网上的大部分资料都是推荐用msys2mingw进行编译。在win10平台,我们可以采用另一种方式,即wslmsvc 实现window平台的ffmpeg编译。 下面将以vs2022ubuntu22.04 为例,介绍此方法 0、前期准备 安装vs2022 &…...

java命令行打包class为jar并运行
1.创建无包名类: 2.添加依赖jackson 3.引用依赖包 4.命令编译class文件 生成命令: javac -d out -classpath lib/jackson-core-2.13.3.jar:lib/jackson-annotations-2.13.3.jar:lib/jackson-databind-2.13.3.jar src/UdpServer.java 编译生成class文件如下 <...

vue注册用户使用v-model实现数据双向绑定
定义数据模型 Login.vue //定义数据模型 const registerData ref({username: ,password: ,confirmPassword: })使用 v-model 实现数据模型的key与注册表单中的元素之间的双向绑定 <!-- 注册表单 --><el-form ref"form" size"large" autocompl…...
Android学习之响应式编程
本篇基于DeepSeek 搜索结果修改。 一、响应式编程基础认知 1.1 为什么需要响应式编程? 在传统的Android开发中,我们经常会遇到以下痛点: // 传统方式处理数据变化 button.setOnClickListener {// 触发网络请求fetchDataFromNetwork { res…...
如何使用极狐GitLab 软件包仓库功能托管 helm chart?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 软件包库中的 Helm charts (BASIC ALL) WARNING:Helm chart 库正在开发中,由于功能有限,尚未准备好用…...
中国古代史4
东汉 公元25年,刘秀建立东汉,定都洛阳,史称光武中兴 白马寺:汉明帝时期建立,是佛教传入中国后兴建的第一座官办寺院,有中国佛教的“祖庭”和“释源”之称,距今1900多年历史 班超—西域都护—投…...

Nacos源码—8.Nacos升级gRPC分析六
大纲 7.服务端对服务实例进行健康检查 8.服务下线如何注销注册表和客户端等信息 9.事件驱动架构源码分析 一.处理ClientChangedEvent事件 也就是同步数据到集群节点: public class DistroClientDataProcessor extends SmartSubscriber implements DistroDataSt…...
基于Vue3.0的高德地图api教程005:实现绘制线并编辑功能
文章目录 6、绘制多段线6.1 绘制多段线6.1.1 开启绘制功能6.1.2 双击完成绘制6.1.3 保存到数据库6.2 修改多段线6.2.1 点击线,进入编辑模式6.2.2 编辑线6.3 完整代码6、绘制多段线 6.1 绘制多段线 6.1.1 开启绘制功能 实现代码: const changeSwitchDrawPolyline = ()=>…...

SpringBoot 自动装配原理 自定义一个 starter
目录 1、pom.xml 文件1.1、parent 模块1.1.1、资源文件1.1.1.1、resources 标签说明1.1.1.2、从 Maven 视角:资源处理全流程 1.1.2、插件 1.2、dependencies 模块 2、启动器3、主程序3.1、SpringBootApplication 注解3.2、SpringBootConfiguration 注解3.2.1、Con…...

【C++进阶篇】多态
深入探索C多态:静态与动态绑定的奥秘 一. 多态1.1 定义1.2 多态定义及实现1.2.1 多态构成条件1.2.1.1 实现多态两个必要条件1.2.1.2 虚函数1.2.1.3 虚函数的重写/覆盖1.2.1.4 协变1.2.1.5 析构函数重写1.2.1.6 override和final关键字1.2.1.7 重载/重写/隐藏的对⽐ 1…...
Redis 基础详解:从入门到精通
在当今互联网应用开发领域,数据存储与处理的性能和效率至关重要。Redis(Remote Dictionary Server)作为一款开源的、基于内存的键值存储系统,凭借其出色的性能和丰富的功能,被广泛应用于数据库、缓存、消息中间件等场景…...
Android Studio的jks文件
在 Android Studio 中,.jks 文件是 Java KeyStore(Java 密钥库)文件的一种,用于存储和管理用于签署 Android 应用程序的数字证书和私钥。 一、.jks 文件的作用 在 Android 开发中,.jks 文件主要用于: 应用…...
互联网大厂Java面试实战:从Spring Boot到微服务的技术问答与解析
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…...

《AI大模型应知应会100篇》第60篇:Pinecone 与 Milvus,向量数据库在大模型应用中的作用
第60篇:Pinecone与Milvus,向量数据库在大模型应用中的作用 摘要 本文将系统比较Pinecone与Milvus两大主流向量数据库的技术特点、性能表现和应用场景,提供详细的接入代码和最佳实践,帮助开发者为大模型应用选择并优化向量存储解…...
HDFS客户端操作
一、命令行工具操作 HDFS 命令行工具基于 hdfs dfs 命令,语法类似 Linux 文件操作。 1. 文件操作 bash # 创建目录 hdfs dfs -mkdir /test# 递归创建多级目录 hdfs dfs -mkdir -p /test/data/logs# 上传本地文件到 HDFS hdfs dfs -put local_file.txt /test/# 从…...
MySQL--视图详解
介绍 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表(称为基表),并且是在使用视图时动态生成的。 简而言之:视图只保存了查询的…...

Java学习手册:客户端负载均衡
一、客户端负载均衡的概念 客户端负载均衡是指在客户端应用程序中,根据一定的算法和策略,将请求分发到多个服务实例上。与服务端负载均衡不同,客户端负载均衡不需要通过专门的负载均衡设备或服务,而是直接在客户端进行请求的分发…...

Docker私有仓库实战:官方registry镜像实战应用
抱歉抱歉,离职后反而更忙了,拖了好久,从4月拖到现在,在学习企业级方案Harbor之前,我们先学习下官方方案registry,话不多说,详情见下文。 注意:下文省略了基本认证 TLS加密ÿ…...
LeetCode 373 查找和最小的 K 对数字题解
LeetCode 373 查找和最小的 K 对数字题解 题目描述 给定两个以升序排列的整数数组 nums1 和 nums2,以及一个整数 k。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。请找到和最小的 k 个数对。 解题思路 最小堆优化法…...