@[toc]

介绍

在这里插入图片描述

本软件包在 RT-Thread 上实现 ISO 14229(UDS)协议栈及典型服务端示例,并配套 SocketCAN 客户端,覆盖会话控制、安全访问、参数读写、通信控制、IO 控制、远程控制台、文件传输等核心诊断能力,面向汽车电子与工业控制场景的远程诊断、运维和固件分发需求。

历史与背景

  • 诞生动机:典型整机通常只有一个 CAN 接口对外,而内部往往存在多个 MCU 子节点。惯用的串口 Debug 控制台在售后排查阶段接线和调试成本高。通过在 CAN 上提供标准 UDS 诊断与控制台能力,可复用现有 CAN 口完成日志、调试与控制权接管,降低现场维护难度。
  • 重要里程碑:覆盖 ISO 14229 主流服务(0x10/0x11/0x22/0x27/0x28/0x2E/0x2F/0x31/0x34/0x36/0x37/0x38/0x3E),提供 RT-Thread 服务端示例、服务注册框架与 SocketCAN 客户端目录结构,形成可直接验证的端到端链路。
  • 社区与应用:面向 RT-Thread 生态,适配汽车 ECU 与工业控制设备的诊断、运维、升级需求;示例展示了在实际板卡上集成 CAN、GPIO、定时器和线程的路径。

核心原理与设计

  • 分层架构:底层为 RT-Thread CAN 驱动与 ISO-TP 传输;协议核心 iso14229_rtt.c/iso14229.c;服务层提供各类 UDS 服务;应用/示例层负责业务绑定与控制权切换。
  • 服务注册与裁剪:通过 rtt_uds_env_t 挂载/卸载服务节点,启动集中注册,停止集中卸载,便于按需裁剪与资源回收。
  • 硬件抽象与控制权管理:LED IO 示例实现应用值与 UDS 接管状态的切换,确保诊断控制与应用控制互斥且可恢复。
  • 线程与队列配置:示例线程栈 4096B、优先级 2,队列深度 32,平衡实时性与内存占用,适合 STM32H750 等中等资源 MCU。
  • CAN 收发路径:启动时绑定自定义 RX 回调,诊断帧直达 UDS 栈,其余帧按通信控制状态决定是否交由应用;停止时恢复原回调,保证与其他协议栈共存。
  • 客户端设计:SocketCAN 客户端包含核心模块、服务客户端和交互式 Shell,覆盖所有配套命令,便于端到端调试与自动化验证。
  • DTC 服务缺失说明:当前未提供 0x19 诊断故障码(DTC)服务。原因是本包聚焦通用诊断控制、传输与远程运维场景,不绑定特定 OEM/行业的 DTC 数据模型,避免引入专用存储格式与校准流程;如需 DTC,建议在现有框架上按项目策略扩展专用节点。

使用场景

  • 汽车 ECU 诊断与刷写:会话控制、安全解锁、下载与传输组合形成刷写链路。
  • 工业控制远程维护:通过 0x2F/0x28/0x31 实现 IO 接管、通信屏蔽和远程命令执行,缩短排障时间。
  • 固件/文件分发:0x34/0x36/0x37/0x38 适配 FOTA 或参数包下发,结合安全访问保护敏感操作。
  • 不推荐场景:极小资源且无 CAN 控制器的裸机场景,或缺乏 RT-Thread 多任务/定时器支撑的环境应选择轻量通道;需要标准化 DTC 流程的项目需自行扩展 0x19 服务。

对比分析

  • 与私有 CAN 诊断协议对比:UDS 提供标准化服务集合,降低自定义协议维护成本;实现复杂度与栈内存占用略高,可通过服务裁剪与线程/队列参数调整平衡资源。
  • 与仅刷写工具链对比:除刷写外,UDS 还提供通信控制、IO 控制和远程控制台,支持更丰富的运维;需在启动/停止时绑定与恢复回调以保障与其他协议栈隔离。
  • 性能与资源:ISO-TP 引入轻量流控开销;示例 4096B 栈、32 深度队列适合中等资源 MCU,若需更高吞吐可增大消息池并优化过滤器。
  • 启动速度与隔离级别:MSH 命令即时启动/停止 UDS 栈,恢复原回调确保与既有协议共存;客户端命令行直接运行,启动开销低。

基于RT-Thread操作系统的ISO 14229 (Unified Diagnostic Services, UDS) 诊断工具实现,包含服务端(server)和客户端(client)两部分。服务端运行在嵌入式设备上,通过CAN总线与客户端通信,实现了多种UDS诊断服务,方便对嵌入式设备进行远程诊断和控制。

本项目旨在为RT-Thread用户提供一套完整的UDS诊断解决方案,不仅可以直接使用,也可以作为学习UDS协议和开发自定义诊断功能的参考。

主要特点

  • 基于RT-Thread操作系统,充分利用其多任务和设备驱动框架
  • 实现了常用的UDS诊断服务,满足大部分诊断需求
  • 提供跨平台的Linux客户端,方便与服务端进行交互
  • 模块化设计,易于扩展新的UDS服务
  • 包含丰富的示例代码,帮助用户快速上手

应用场景

  • 汽车电子ECU诊断
  • 工业控制器远程维护
  • 嵌入式设备固件升级
  • 设备状态监控和故障排查

2. 功能特性 (Features)

服务端特性 (Server Features)

  • 基于RT-Thread的多任务架构,保证系统稳定性和实时性
  • 完整的ISO 14229 UDS协议栈实现
  • 支持多种UDS诊断服务,包括会话控制、安全访问、参数读写等
  • 灵活的服务注册机制,便于扩展新功能
  • 与RT-Thread CAN设备驱动无缝集成
  • 支持CAN总线通信控制,可动态启用/禁用消息收发

客户端特性 (Client Features)

  • 基于Linux平台,使用SocketCAN进行CAN通信
  • 提供命令行交互界面,支持命令历史和自动补全
  • 实现了与服务端配套的UDS服务客户端功能
  • 支持文件上传下载功能
  • 支持远程控制台命令执行
  • 具备完善的错误处理和日志显示功能

通信特性 (Communication Features)

  • 基于ISO TP (ISO 15765-2)的CAN总线数据传输协议
  • 支持大数据块传输,适用于文件传输等场景
  • 具备流量控制机制,保证通信稳定性
  • 支持功能寻址和物理寻址两种通信方式

3. 支持的UDS服务 (Supported UDS Services)

本项目实现了以下ISO 14229标准定义的UDS服务:

Service ID Name Description
0x10 Diagnostic Session Control 控制诊断会话模式(默认/扩展会话/编程会话)
0x11 ECU Reset 执行ECU复位操作
0x22 Read Data By Identifier 读取数据标识符对应的参数值
0x27 Security Access 安全访问服务,用于解锁高级诊断功能
0x28 Communication Control 控制通信行为(启用/禁用消息收发)
0x2E Write Data By Identifier 写入数据标识符对应的参数值
0x2F Input/Output Control 控制输入输出信号的行为
0x31 Routine Control 控制例程的启动、停止和结果查询
0x34 Request Download 请求下载数据到ECU
0x36 Transfer Data 传输数据块
0x37 Request Transfer Exit 结束数据传输
0x38 Request File Transfer 请求文件传输
0x3E Tester Present 测试仪在线保持

这些服务涵盖了UDS协议的核心功能,能够满足大多数诊断应用场景的需求。


4. 系统架构 (System Architecture)

整体架构图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+------------------+        CAN Bus        +------------------+
| | <=================> | |
| Linux Client | | RT-Thread Server |
| | | |
+------------------+ +------------------+
| |
| SocketCAN | RT-Thread CAN Driver
| |
v v
+------------------+ +------------------+
| UDS Client Stack | | UDS Server Stack |
| (iso14229.c) | | (iso14229_rtt.c) |
+------------------+ +------------------+
| |
| Application Layer | Application Layer
v v
+------------------+ +------------------+
| Client Services | | Server Services |
| (services/) | | (service/) |
+------------------+ +------------------+

服务端架构

服务端基于RT-Thread操作系统,采用分层架构设计:

  1. 硬件抽象层:RT-Thread CAN设备驱动
  2. 传输层:ISO TP协议实现
  3. 协议层:ISO 14229核心协议栈 (iso14229_rtt.c)
  4. 服务层:各种UDS服务的具体实现 (service/)
  5. 应用层:用户自定义的应用逻辑 (rtt_uds_example.c)

客户端架构

客户端基于Linux平台,同样采用分层架构设计:

  1. 硬件抽象层:SocketCAN接口
  2. 传输层:ISO TP协议实现
  3. 协议层:ISO 14229核心协议栈 (iso14229.c)
  4. 服务层:各种UDS服务的客户端实现 (services/)
  5. 应用层:命令行交互界面和用户命令处理 (core/, main.c)

5. 代码结构 (Code Structure)

服务端代码结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server_demo/
├── examples/ # 示例应用
│ └── rtt_uds_example.c # RT-Thread UDS服务端示例
├── service/ # UDS服务实现
│ ├── rtt_uds_service.h # 服务定义宏和API
│ ├── service_0x10_session.c # 0x10会话控制服务
│ ├── service_0x11_reset.c # 0x11 ECU复位服务
│ ├── service_0x22_0x2E_param.c # 0x22/0x2E参数读写服务
│ ├── service_0x27_security.c # 0x27安全访问服务
│ ├── service_0x28_comm.c # 0x28通信控制服务
│ ├── service_0x2F_io.c # 0x2F输入输出控制服务
│ ├── service_0x31_console.c # 0x31远程控制台服务
│ └── service_0x36_0x37_0x38_file.c # 0x36/0x37/0x38文件传输服务
├── iso14229_rtt.c # UDS协议核心实现(RT-Thread版)
├── iso14229_rtt.h # UDS协议核心头文件
└── rtt_uds_config.h # RT-Thread平台配置文件

客户端代码结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
client_demo/
├── core/ # 核心模块
│ ├── client.h # 客户端公共头文件
│ ├── client_config.c/h # 客户端配置管理
│ ├── client_shell.c/h # 命令行交互界面
│ ├── cmd_registry.c/h # 命令注册管理
│ ├── response_registry.c/h # 响应注册管理
│ └── uds_context.c/h # UDS上下文管理
├── services/ # UDS服务客户端实现
│ ├── client_0x10_session.c # 0x10会话控制客户端
│ ├── client_0x11_reset.c # 0x11 ECU复位客户端
│ ├── client_0x22_0x2E_param.c # 0x22/0x2E参数读写客户端
│ ├── client_0x27_security.c # 0x27安全访问客户端
│ ├── client_0x28_comm.c # 0x28通信控制客户端
│ ├── client_0x2F_io.c # 0x2F输入输出控制客户端
│ ├── client_0x31_console.c # 0x31远程控制台客户端
│ └── client_0x36_0x37_0x38_file.c # 0x36/0x37/0x38文件传输客户端
├── utils/ # 工具模块
│ ├── linenoise.c/h # 命令行编辑库
│ └── utils.c/h # 通用工具函数
├── main.c # 主程序入口
└── Makefile # 构建脚本

6. 硬件要求 (Hardware Requirements)

服务端 (Server Side)

  • 运行RT-Thread操作系统的嵌入式开发板
  • 至少具备一个CAN控制器的硬件接口
  • 连接CAN收发器(如TJA1050、SN65HVD230等)
  • 用于LED控制示例的GPIO引脚(可选)

客户端 (Client Side)

  • 运行Linux操作系统的主机(物理机或虚拟机)
  • 支持SocketCAN的CAN接口适配器
    • USB转CAN适配器(如USBCAN-I、USBCAN-II)
    • PCIe CAN接口卡
    • 具备CAN控制器的开发板(如树莓派配合MCP2515)
  • CAN总线连接线缆和终端电阻

7. 快速开始 (Getting Started)

服务端设置 (Server Setup)

  1. 配置

    • 在 RT-Thread 的 menuconfig 中启用该软件包:
    1
    2
    3
    4
    5
    RT-Thread online packages  --->
    peripherals packages --->
    [*] Enable iso14229 (UDS) library --->
    (32) Event Dispatch Table Size
    [*] Enable UDS server example application
  2. 集成库文件

    • server_demo目录下的源文件添加到您的RT-Thread项目中
    • 确保项目配置中启用了CAN设备驱动支持
  3. 编译和烧录

    • 使用RT-Thread支持的工具链编译项目
    • 将生成的固件烧录到目标硬件
  4. 运行示例

    • 通过串口终端连接到设备控制台
    • 启动UDS服务端示例:
      1
      msh />uds_example start can1

客户端设置 (Client Setup)

  1. 配置SocketCAN

    • 在Linux主机上启用并配置CAN接口:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 加载CAN模块(如果需要)
      sudo modprobe can
      sudo modprobe can_raw
      sudo modprobe vcan # 用于虚拟CAN测试

      # 配置物理CAN接口(以1Mbps为例)
      sudo ip link set can0 up type can bitrate 1000000

      # 或创建虚拟CAN接口用于测试
      sudo ip link add dev vcan0 type vcan
      sudo ip link set up vcan0
  2. 编译客户端

    • 进入client_demo目录
    • 修改Makefile中的交叉编译工具链路径(如果需要)
    • 执行编译命令:
      1
      2
      make                    # 交叉编译(默认)
      make NATIVE=1 # 本地编译用于测试
  3. 运行客户端

    • 执行生成的客户端程序:
      1
      2
      ./client -i can0 -s 7E8 -t 7E0  # 使用can0接口
      ./client -i vcan0 # 使用虚拟CAN接口

8. 使用方法 (Usage)

服务端使用 (Server Usage)

通过RT-Thread的MSH命令行界面控制UDS服务端:

1
2
3
4
5
6
7
8
# 启动UDS服务端
msh />uds_example start can1

# 停止UDS服务端
msh />uds_example stop can1

# 查看已注册的服务
msh />uds_list

服务端启动后将在指定的CAN接口上监听诊断请求,并根据配置提供相应的服务功能。

客户端使用 (Client Usage)

客户端提供交互式命令行界面,支持多种诊断命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 启动客户端(默认使用can1接口)
$ ./client

# 启动客户端并指定接口和地址
$ ./client -i vcan0 -s 7E8 -t 7E0

# 进入交互界面后的常用命令:
UDS> help # 显示帮助信息
UDS> session 03 # 切换到扩展会话
UDS> security 01 # 执行安全访问(级别01)
UDS> wdbi 0001 01 # 写入DID 0001值为01
UDS> io 0100 03 01 00 00 # 控制IO(强制红色LED)
UDS> sy local_file.bin # 上传文件到服务端
UDS> ry remote_file.bin # 从服务端下载文件
UDS> rexec ps # 在服务端执行命令
UDS> cd / # 切换服务端目录
UDS> lls # 列出本地文件
UDS> exit # 退出客户端

9. 服务详解 (Service Details)

0x10 会话控制 (Diagnostic Session Control)

控制ECU的诊断会话模式,不同会话模式具有不同的安全级别和功能访问权限:

  • 默认会话 (0x01):基本诊断功能
  • 编程会话 (0x02):用于程序刷写
  • 扩展会话 (0x03):访问更多诊断功能

0x27 安全访问 (Security Access)

通过种子-密钥机制保护敏感诊断功能:

  1. 客户端请求特定安全级别的种子
  2. 服务端返回随机种子值
  3. 客户端根据算法计算密钥
  4. 客户端发送密钥进行验证
  5. 验证通过后解锁对应的安全级别

0x2F 输入输出控制 (Input/Output Control)

控制ECU的数字量输入输出信号:

  • 强制控制 (Short Term Adjustment):临时改变IO状态
  • 返回控制 (Return Control):恢复IO控制权给应用程序
  • 冻结状态 (Freeze Current State):锁定当前IO状态
  • 复位默认 (Reset To Default):恢复IO到默认状态

0x31 远程控制台 (Remote Console)

通过UDS服务在服务端执行命令行指令,实现远程控制功能:

  • 执行任意MSH命令
  • 获取命令执行结果
  • 支持目录切换和文件浏览

0x36/0x37/0x38 文件传输 (File Transfer)

完整的文件传输功能,支持上传和下载:

  1. 0x38 Request File Transfer:协商文件传输参数
  2. 0x36 Transfer Data:传输文件数据块
  3. 0x37 Request Transfer Exit:结束传输并校验完整性

10. 示例和日志 (Examples and Logs)

典型交互日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 客户端启动
$ ./client -i vcan0
[Config] IF: vcan0 | SA: 0x7E8 | TA: 0x7E0 | FUNC: 0x7DF

[Shell] Interactive Mode Started. Type 'help' or 'exit'.

UDS>

# 切换到扩展会话
UDS> session 03
[I] (940) Session: Requesting Session Control: 0x03
[+] Switching Session Done.
[I] (950) Session: Session Switched Successfully (0x03)

# 执行安全访问
UDS> security 01
[I] (1020) Sec: Starting Security Access (Level 0x01)...
[+] Requesting Seed Done.
[I] (1030) Sec: Seed: 0x12345678 -> Key: 0xB791F3D5
[+] Verifying Key Done.
[I] (1040) Sec: Security Access Granted!

# 控制LED
UDS> io 0100 03 01 00 00
[I] (1120) IO Ctrl: Sending IO Control: DID=0x0100 Param=0x03
[+] Requesting Done.

# 上传文件
UDS> sy test.txt
[*] Uploading 'test.txt' (1024 bytes)...
[+] Requesting Done.
[=>] 1024/1024 bytes
[+] Finishing Done.
[+] Upload Complete.

# 执行远程命令
UDS> rexec ps
[I] (1250) Console: Remote Exec: 'ps'
msh />ps
thread pri status sp stack size max used left tick error
------ ---- ------- ---------- ---------- ------ ---------- ---
tidle 31 ready 0x00000048 0x00000100 28% 0x0000000b 000
timer 4 suspend 0x00000068 0x00000200 16% 0x00000009 000
main 10 running 0x00000070 0x00000800 11% 0x0000000b 000
uds_sr 2 suspend 0x00000070 0x00001000 13% 0x00000014 000

11. 开发指南 (Development Guide)

添加新的UDS服务

  1. 在服务端:

    • service/目录创建新的服务实现文件
    • 实现服务处理函数
    • 注册服务节点到UDS环境
  2. 在客户端:

    • services/目录创建客户端实现文件
    • 实现命令处理函数
    • 注册命令到命令管理系统

配置说明

客户端Makefile中的关键配置:

1
2
3
# ISO-TP流控参数优化,提高传输效率
CFLAGS += -DISOTP_FC_BS=0 # 块大小设为0(无流控)
CFLAGS += -DISOTP_FC_STMIN=0 # 最小间隔时间为0

为什么 CAN 总线需要 UDS/控制台能力

  • 单口多节点的现场可维护性:整机仅有单个 CAN 外接口但内部多 MCU。提供 UDS 诊断和 CAN 控制台可避免拆机接串口,直接复用现有 CAN 口完成日志、调试与控制权接管,降低售后排障成本。
  • 标准化诊断语义:UDS 服务统一会话、安全、参数、文件与 IO 控制语义,减少自定义协议带来的互通与维护成本。
  • 可靠的分段传输:ISO-TP 在 8 字节帧限制下提供分段与流控,支撑文件与固件分发。
  • 安全与隔离:0x27 安全访问与 0x28 通信控制限制未授权操作,减少对主业务的干扰。
  • 控制台优势:0x31 远程控制台允许远程执行命令、收集日志和调试脚本,无需物理接入,显著降低停机与运维成本。

总结

  • 关键特性:RT-Thread 原生适配的 UDS 协议栈、完整服务列表(不含 DTC,原因见上)、可裁剪注册框架、示例级硬件抽象与控制权管理、SocketCAN 客户端控制台、文件/固件分发链路与远程运维能力。
  • 学习建议:阅读 README 了解服务与架构,编译运行示例,观察启动/停止、CAN 回调与服务挂载流程;用客户端控制台覆盖会话、安全、IO、文件、远程控制台全链路测试;根据目标 MCU 资源调整线程栈、队列深度和服务裁剪,优化 CAN 过滤与优先级配置,并按项目需求自定义 0x19 DTC 扩展。

12. 相关链接