1. DoIP协议基础:DoIP标准概述、物理层与传输层、TCP/UDP端口分配、车辆发现与路由激活

好,咱们开始第一讲。DoIP,全称是Diagnostic over Internet Protocol。说白了,就是把传统的车载诊断协议(比如UDS)搬到以太网上跑。你想想看,以前修车得拿根线插到OBD口上,现在呢?通过IP网络就能远程刷写ECU,甚至做OTA升级。这就是DoIP的价值所在。

1.1 DoIP标准概述

DoIP的核心标准是ISO 13400。这个标准分了好几个部分,我挑重点说。ISO 13400-1讲的是物理层和数据链路层,说白了就是告诉你用什么样的网线、什么样的连接器。ISO 13400-2是传输层和应用层,定义了怎么封装诊断消息、怎么建立连接。ISO 13400-3是基于IEEE 802.3的物理层规范,嗯,这个咱们后面细说。

我个人习惯把DoIP理解成「UDS over TCP/IP」。UDS本身是应用层的诊断协议,DoIP只是给它换了个传输通道。原来UDS走CAN总线,现在走以太网。但要注意,DoIP不是简单地把CAN报文封装成IP包,它有一套完整的会话管理和连接机制。

核心要点:DoIP = UDS诊断 + TCP/IP网络 + 车辆发现机制。三者缺一不可。

1.2 物理层与传输层

物理层这块,DoIP支持两种介质:100BASE-TX(就是咱们常见的百兆以太网)和1000BASE-T(千兆)。不过我在实际项目中,绝大多数场景用的都是百兆。为什么?因为车载环境对成本敏感,百兆够用了。你想想看,刷写一个ECU的固件,几十兆字节的数据,百兆带宽完全能应付。

传输层用的是TCP和UDP。这里有个关键点:诊断数据走TCP,车辆发现和状态通告走UDP。为什么这么设计?TCP可靠,保证诊断指令不丢包;UDP轻量,适合广播和组播。我在项目中遇到过一个问题:有人把诊断数据也走UDP,结果刷写过程中丢包了,ECU变砖。嗯,这个坑我替你们踩过了。

协议 端口 用途
UDP 13400 车辆发现、状态通告
TCP 13400 诊断数据、路由激活

我的经验:端口13400是IANA分配给DoIP的官方端口。别乱改,否则测试设备可能认不出来。

1.3 TCP/UDP端口分配

刚才说了,UDP和TCP都用13400端口。但具体怎么用,有讲究。

UDP这边,车辆会周期性地发送车辆公告消息(Vehicle Announcement)。这个消息包含车辆的基本信息,比如VIN、逻辑地址、DoIP版本等。诊断仪收到这个消息,就知道网络上有辆车可以连。

TCP这边,诊断仪主动发起连接。连接建立后,第一件事就是做路由激活(Routing Activation)。这个后面会细讲。连接建立后,所有的诊断请求和响应都通过这个TCP连接传输。

我记得有一次调试,发现诊断仪连不上车辆。查了半天,原来是防火墙把13400端口给封了。所以啊,做DoIP开发,第一件事就是确认网络环境允许13400端口通信。

1.4 车辆发现与路由激活

车辆发现,说白了就是「车在哪?」。DoIP用了两种方式:

  • 主动发现:诊断仪发送一个UDP广播消息(Vehicle Identification Request),所有支持DoIP的车辆都会回复。
  • 被动发现:车辆自己周期性地发送UDP广播(Vehicle Announcement),告诉网络「我在这儿」。

我个人更推荐被动发现。为什么?因为主动发现需要诊断仪知道网络上有车,而被动发现是车辆主动上报,更符合车载网络的实际情况。你想想看,车辆启动后,它自己就知道该上线了。

路由激活是建立诊断会话的关键步骤。诊断仪连上TCP后,发送一个路由激活请求(Routing Activation Request)。这个请求里包含诊断仪的源地址和激活类型。车辆收到后,会检查这个请求是否合法。如果合法,就回复一个路由激活响应,然后双方进入诊断模式。

注意:路由激活只能做一次。如果连接断开,必须重新建立TCP连接才能再次激活。我曾经见过有人试图在同一个TCP连接上重复激活,结果车辆直接拒绝服务。

嗯,这里有个细节。路由激活请求里有个字段叫「激活类型」。常见的类型有:

  • 0x01:默认激活(普通诊断)
  • 0x02:安全激活(需要认证)
  • 0x03:编程激活(用于刷写)

做OTA升级时,我们通常用0x03。因为刷写ECU需要更高的权限和更长的超时时间。

1.5 避坑指南

最后,分享几个我踩过的坑:

  • 超时设置:DoIP的TCP连接有超时机制。如果诊断仪长时间不发消息,车辆会自动断开。我建议把超时时间设成5秒以上,否则刷写大文件时容易断连。
  • 并发连接:DoIP标准允许最多同时连接2个诊断仪。但实际项目中,我建议只允许1个。为什么?因为多个诊断仪同时刷写同一个ECU,会出乱子。
  • VIN匹配:车辆发现消息里的VIN必须和实际车辆一致。我曾经见过有人测试时忘了改VIN,结果诊断仪连上了隔壁工位的车。嗯,那场面挺尴尬的。

好了,第一讲就到这里。DoIP的基础概念其实不难,关键是理解「为什么这么设计」。下一讲,咱们会深入DoIP的报文格式和状态机,到时候会更有意思。