我们上一篇文章提到,DoIP报头中有两字节的数据类型(Payload Type),代表DoIP报文类型,本文就来详细介绍一下每一种报文类型。

标准中对报文类型的定义如下:

数据类型分为三部分,标绿的是节点管理报文,标黄的是状态信息获取报文,标蓝的是诊断报文。

1. 节点管理报文

节点管理报文的作用主要是获取DoIP节点的信息、建立连接、保持连接等。

① 0x0000:Generic DoIP header negative acknowledge

当DoIP节点收到的DoIP报文的报头不符合规则时,返回该数据类型的报文。该报文的数据部分只包含1字节的否定响应码(Generic DoIP header NACK code),用来指示错误原因,定义如下:


上表中,Required action表示DoIP节点在发送完该否定响应报文后应该采取的动作,是忽略该报文还是关闭套接字。

该报文可使用上文所述的三种端口类型作为目的端口,具体使用哪种取决于DoIP请求使用的哪种端口。

② 0x0001:Vehicle identification request message

该类型报文可以用来请求网络中DoIP节点的车辆信息,诊断设备用UDP报文向网络中发送该报文,来获取被诊断节点的VIN、GID、EID、逻辑地址等信息。

该报文中只包含DoIP报头,没有数据。

该报文的目的端口为UDP_DISCOVERY

③ 0x0002:Vehicle identification request message with EID

该类型报文的作用和上面的一样,只是在请求报文的数据中搭载了6字节EID,可请求指定EID的DoIP节点的其它车辆信息,用于被诊断节点的EID已知的情况。

EID是DoIP节点的唯一识别标识符,一般会被设置为该节点的MAC地址。

该报文的目的端口为UDP_DISCOVERY

④ 0x0003:Vehicle identification request message with VIN

该类型报文原理同上,只是在报文数据中搭载的不是EID,而是17字节的VIN,用于DoIP节点的VIN已知的情况下,请求指定VIN的DoIP节点的其它信息。

该报文的目的端口为UDP_DISCOVERY

⑤ 0x0004:Vehicle announcement/Vehicle identification response message

从名称中可以看出,该类型的报文有两种用途,第一个用途是以上三种报文的响应报文(Vehicle identification response message),当诊断节点发送了以上三种车辆信息请求报文后,符合条件的DoIP节点将会返回该响应报文,报文数据部分的格式如下:


报文数据共33字节,包含:

  • 17字节的VIN
  • 2字节逻辑地址,该逻辑地址用于诊断,后文详述
  • 6字节EID
  • 6字节GID:同一辆车上多个DoIP节点可以编为一组,用GID来标识这一组的DoIP节点。
  • 1字节Further action required:该字节用来表示在数据传输过程中是否需要额外的操作,如是否启用安全机制,定义如下:
  • 1字节VIN/GID sync. status:该字节用来表示车内的DoIP节点是否已经完成了VIN或GID的同步(如何同步后文详述)。定义如下;

    作为车辆信息响应报文使用时,该报文的目的端口为UDP_TEST_EQUIPMENT_REQUEST

该报文的第二个用途是作为车辆声明报文(Vehicle announcement),标准规定,当一个DoIP节点成功获取到IP地址后,应在500ms内发送3条车辆声明报文,向网络中的所有DoIP节点广播自己的车辆信息,这时数据部分的定义和上面相同,发送时使用UDP,IP地址设置为255.255.255.255。实际应用过程中发送时间和发送报文数目可能会根据实际情况有所调整。

作为车辆声明报文使用时,该报文的目的端口为UDP_DISCOVERY

⑥ 0x0005:Routing activation request

在车辆发现阶段结束后,外部诊断设备已确定对哪个DoIP节点进行诊断,也获取了必要的信息,这时就需要发送路由激活请求报文,在诊断设备和被诊断的DoIP节点间建立起TCP连接,以便于发送诊断数据(诊断报文都是用TCP来发送的)。

路由激活请求报文由外部诊断设备发送,目的端口为TCP_DATA,源端口可动态定义。报文的数据格式如下:


数据共11字节,包含以下内容:

  • 源地址(SourceAddress):外部诊断设备的逻辑地址,与诊断通信中的逻辑地址相同。这个逻辑地址用于对某个特定的DoIP节点进行寻址,与UDSonCAN中的CAN ID是类似的概念,是在网络架构设计阶段就分配好的。标准中的范围划分如下图所示,其中红色框内的范围用于诊断设备的逻辑地址,0x0E00-0x0E7F用于OBD诊断,0x0E80-0x0EFF用于增强型诊断。蓝色框内的逻辑地址用于DoIP节点,与UDSonCAN类似,节点的逻辑地址有两个,一个是物理逻辑地址,在0x0001-0x0DFF或0x1000-0x7FFF范围内,另一个是功能寻址,是0xE000。

  • 激活类型(activation type):用于诊断设备通知被诊断DoIP节点进入哪种类型的诊断状态。定义如下:

  • 剩余字节为保留或自定义字段,一般没有作用。

⑦ 0x0006:Routing activation response

DoIP节点收到诊断设备的路由激活请求报文后,建立TCP连接,并返回该路由激活响应报文,源端口为TCP_DATA,目的端口为诊断设备动态定义的端口。路由激活响应报文的数据格式如下:

响应中的参数定义如下:

  • 诊断设备逻辑地址(Logical address of the external test equipment):就是路由激活请求报文中的诊断设备逻辑地址。
  • DoIP节点逻辑地址(Logical address of the responding DoIP entity):也就是我们上文说的DoIP节点物理逻辑地址。
  • 路由激活响应码(Routing activation response code):1字节,用来表示TCP连接建立是否成功,以及不成功的原因。定义如下表所示,Required Action栏展示了DoIP节点在返回响应后应该采取的操作。
  • 其余字段为预留或自定义字段,不常用。

⑧ 0x0007:Alive check request

诊断仪在线检查报文,用于DoIP节点检查诊断设备是否还处于连接状态。该报文由DoIP节点在与诊断设备建立了TCP连接后用TCP_DATA端口发送,不携带DoIP数据,报文中只有DoIP报头。

⑨ 0x0008:Alive check response

诊断设备在收到DoIP节点发送的诊断仪在线检查请求报文后,发送该响应报文,数据中携带两字节的诊断设备逻辑地址:

此外,诊断设备也可以在没有收到请求报文的情况下向DoIP节点发送该响应报文,以通知DoIP节点诊断设备仍然在线。

2. 状态信息获取报文

① 0x4001:DoIP entity status request

该报文可以被诊断设备用来请求DoIP节点的状态,报文数据段没有数据。

② 0x4002:DoIP entity status response

该报文是上一个报文的响应报文,DoIP节点用该响应报文来向诊断设备发送状态信息。报文的数据段定义如下:

③ 0x4003:Diagnostic power mode information request

该报文可以被诊断设备用来请求DoIP节点的电源模式信息,报文数据段没有数据。

④ 0x4004:Diagnostic power mode information response

该报文是上一个报文的响应报文,DoIP节点用该响应报文来向诊断设备发送电源模式信息,来告知诊断设备当前节点是否允许进行诊断。报文的数据段定义如下:

3. 诊断报文

诊断报文有三个: 0x8001-0x8003:Diagnostic Message and Positive/Negetive Acknowledgment
我们先把三个放在一起看。DoIP诊断通信流程和CAN不一样,CAN是一条诊断请求对应一条诊断响应,但DoIP遵循如下流程:

诊断设备发送一条诊断请求(0x8001-Diagnostic Message),该请求中搭载了UDS诊断数据,DoIP节点收到后先对DoIP报头、诊断数据长度等做判断,先返回一个DoIP层的响应,如果各个条件都满足,则返回肯定响应(0x8002-Diagnostic message positive acknowledgment),否则返回否定响应(0x8003-Diagnostic message negative acknowledgment)。

当DoIP节点返回肯定响应后,再将诊断请求报文中搭载的UDS诊断信息上报给UDS应用程序进行处理,处理完成后,不论是UDS肯定响应还是UDS否定响应,都用诊断报文(0x8001-Diagnostic Message)将UDS诊断响应数据发送给诊断设备。至此一次诊断数据交互才完成

流程示意图如下图所示:


我们再分别来看一下三种诊断报文的数据段定义。

① 诊断报文(0x8001-Diagnostic Message)


包含两字节诊断报文发送方源逻辑地址,和两字节接收方目的逻辑地址,以及UDS诊断数据。UDS诊断数据可以是UDS请求,也可以是UDS肯定响应和否定响应。

以下是一条包含UDS诊断请求数据的DoIP诊断报文示例:

② 诊断肯定响应报文(0x8002-Diagnostic message positive acknowledgment)


同样包含发送方和接收方的逻辑地址,还有一字节响应码,以及诊断请求报文中的诊断数据,以便于分析原因。响应码应置为0x00,具体定义如下:

③ 诊断否定响应报文(0x8003-Diagnostic message negative acknowledgment)


与肯定响应报文的区别就是响应码变成了否定响应码,用来指示否定响应的原因,定义如下:

DoIP(二)——报文类型相关推荐

  1. STP的BPDU报文类型

    STP的BPDU报文类型一共有两种,分别是配置BPDU报文(BPDU报文中的BPDU类型值为0x00)和TCN BPDU报文(BPDU报文中的BPDU类型值为0x80),下面为大家详解介绍这两种类型B ...

  2. ISIS路由协议详解(特征、与OSPF对比、拓扑结构、专业术语、路由器分类、网络类型、DIS、报文类型及抓包、邻居关系、路由渗透、路由过载OL位、ISIS认证分类、ISIS管理标签以及各种实验等)

    IS-IS特征: Isis:中间系统到中间系统 链路状态路由协议 IGP协议 SPF算法 ISIS采用TLV结构,因此扩展性很好(为支持新的协议和特性,只需要扩展新的TLV或子TLV:可以轻松扩展支持 ...

  3. ICMP协议 详解,ICMP协议的功能及实现原理,ICMP协议报文类型。

    「作者主页」:士别三日wyx 「作者简介」:CSDN top100.阿里云博客专家.华为云享专家.网络安全领域优质创作者 「专栏简介」:此文章已录入专栏<计算机网络零基础快速入门> ICM ...

  4. P3项目全球模板狗血设置之二 --- 移动类型523收货不能自动创建批次号

    P3项目全球模板狗血设置之二 --- 移动类型523收货不能自动创建批次号 在P3项目中,因项目实施范围限制等诸多原因,对于工厂的自制品,在SAP系统上使用MIGO + 523 移动类型组合来完成收货 ...

  5. ICMP诊断报文类型

    表7.3 ICMP诊断报文类型 类型 描述 0 回应应答(Ping应答,与类型8的Ping请求一起使用) 3 目的不可达 4 源消亡 5 重定向 8 回应请求(Ping请求,与类型8的Ping应答一起 ...

  6. ospf hello时间和dead_深入理解OSPF协议----第二讲:OSPF报文类型

    各位小伙伴们:大家好,!今天让我们来继续一起聊聊OSPF协议:通过上一节的介绍,我们已经知道OSPF路由设备之间交流的是LSA(链路状态通告),并不是路由表:后续几节想给大家讲讲OSPF邻居之间是如何 ...

  7. CANOpen报文类型

    CANOpen应用层协议细化了CAN总线协议中关于标识符的定义.定义标准报文的11比特标识符中高4比特为功能码,后7比特为节点号,重命名为通讯对象标识符(COB-ID). 功能码将所有的报文分为7个优 ...

  8. C++11/14学习(二)类型推导

    C++11/14学习(二)类型推导 C++11 引入了 auto 和 decltype 这两个关键字实现了类型推导,让编译器来操心变量的类型. 这使得 C++ 也具有了和其他现代编程语言一样,某种意义 ...

  9. snmp基本介绍--理解OID/MIB/snmp报文类型/snmp版本

    简单网络管理协议(SNMP-Simple Network Management Protocol) 是一个与网络设备交互的简单方法.一个网络设备以守护进程的方式运行SNMP代理,该守护进程能够响应来自 ...

  10. MQTT 控制报文类型、功能及格式(报文结构) - 第2章

    目录 2.1 MQTT 控制报文的结构 2.2 固定报头 2.2.1 控制报文的类型 2.2.2 控制报文类型的标志位 2.2.3 剩余长度 2.3 可变报头 2.4 有效载荷 2.1 MQTT 控制 ...

最新文章

  1. [Step By Step]使用SLT工具从SAP导入数据到SAP HANA
  2. Google Chrome的CSS hack写法
  3. 常用的js验证数字,电话号码,传真,邮箱,手机号码,邮编,日期
  4. jvm:运行时数据区--方法返回地址
  5. Oracle编程入门经典 第1章 了解Oracle
  6. MyBatis入门和全局配置文件介绍
  7. 你根本不懂rebase-使用rebase打造可读的git graph
  8. 面试官是怎样高效面试的(面试官的“套路”
  9. Grunt 之通配符
  10. JavaScript面向对象 - 严格模式
  11. 【优化算法】Tent映射的混合灰狼优化算法【含Matlab源码 1570期】
  12. WPF编程宝典(Pro wpf in c# 2012)(文摘)
  13. lzg_ad:XPE中EWF组件
  14. 《无痛苦N-S方程笔记》第二章知识点框架
  15. Hart/Hart-IP协议 介绍、分析和应用
  16. matlab freqz half,[转载]Matlab freqz函数使用
  17. 网络安全攻防实验室通关教程-基础篇
  18. 汉字显示原理 GB2312 编码
  19. [AHOI2007]密码箱
  20. 【开发心得】微信网页应用授权登录

热门文章

  1. opencv 0x00007FF986D04ED9 处(位于 ConsoleApplication2.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception
  2. 新CEO能使诺基亚起死回生吗?
  3. HTML和Jsp 页面使用 shiro标签备忘录
  4. 欧瑞变频器800参数设置_ACS800系列变频器的参数及设置
  5. 教你图片批量重命名编号,不要括号
  6. 网页游戏脱机脚本制作视频教程
  7. 重读模电教材一_童诗白、华成英
  8. 现代通信原理思维导图--第三章 随机过程
  9. java爬虫 webcollector_Java爬虫-WebCollector | 学步园
  10. 用R语言下载任意地区DEM数据