自学内容网 自学内容网

基于python写的一个模拟UDS服务端应答程序

本文档介绍的是基于python写的一个模拟UDS服务端应答程序,通过python代码使用UDS诊断(ISO 14229-1)请求的应答及多帧和流控等信息, 简单实现0x10,0x11,0x14,0x19,0x22,0x27,0x28,0x2E等多个SID;

1:数据流程说明

1:TBOX设备通过CAN总线将UDS诊断请求发送给CAN分析仪
2:CAN分析仪通过USB总线将UDS诊断请求发送给PC;
3:fake_uds_server 通过CAN分析仪的API接口读取UDS诊断请求(ISO 14229-1);内部进行逻辑处理;
4:fake_uds_server 通过API接口进行 UDS诊断应答;
5:PC电脑将UDS诊断应答通过USB线发送给CAN分析仪;
6:CAN分析仪通过CAN总线,将 UDS诊断应答发送给TBOX设备;
1.CAN
2.USB
3.API
4.API
5.USB
6.CAN
TBOX设备
CAN分析仪
PC电脑
fake_uds_server

2:开发环境配置

客户端设备:测试使用OBU_C800,其它支持发起UDS诊断请求的设备即可;

CAN分析仪:目前适配的是创芯科技的 CANalyst-II

在这里插入图片描述

PC电脑:已安装 CANalyst-II 设备的驱动,能正常通过上位机收发CAN数据;

fake_uds_server: python代码编写的 模拟UDS服务端设备,需要支持python3.8以上;

3:开发环境验证

CAN分析仪验证:能够正常通过 CANPro上位机收发CAN数据

在这里插入图片描述

fake_uds_server验证

1-python3.8版本以上即可

# python版本验证
PS D:\2_gitlab\fake_uds_server> python -V
Python 3.12.7

2-python进行CAN数据收发验证

1:CANPro上位机已关闭;

2:CAN分析仪的CAN1和CAN2已短接;

3:执行 “python3 .\python3.8.py”, CAN1发送OK, CAN2接收到数据说明正常;

# python进行CAN数据收发验证
PS D:\2_gitlab\fake_uds_server\src> python3 .\python3.8.py
../config/ControlCAN.dll
start VCI_OpenDevice ok   

start can1 VCI_InitCAN ok 

start can1 VCI_StartCAN ok

start can2 VCI_InitCAN ok 

start can2 VCI_StartCAN ok

can1 send ok

CAN2 rx ok ID:0x1 DataLen:0x8 Data:[1, 2, 3, 4, 5, 6, 7, 8] 

# 如果测试发现没有以上日志,请参考创芯科技官方文档
https://www.zhcxgd.com/h-col-114.html

4:fake_uds_server代码讲解

4.1 代码结构说明

├─config
│      ControlCAN.dll# 创芯科技CAN分析仪的依赖库
├─doc
│  │  user_guide.md# 用户说明文档
└─src
    │  can_device.py# CAN数据收发接口
    │  main.py# 入口函数
    │  python3.8.py# 自发自收测试程序
    │  uds_analyse.py# UDS数据解析及应答接口
    │  uds_timer.py# UDS定时器

4.2 代码流程讲解

# main.py  代码初始化和调度执行,设置CAN通道和波特率
if __name__ == "__main__":
    # 初始化一下定时器
    uds_timer.init_timer()
    # 要设置一下CAN通道和波特率
    can_device.init_can_config(0, 500)
    can_device.run_read_can_data()

    can_device.close_can_device()
    
# can_device.py
'''
说明: CAN初始化配置
参数: channel-CAN通道,配置为0或1
      baud-波特率,配置为250或500
'''
def init_can_config(channel, baud):

'''
说明: CAN数据发送接口
参数: can_id -- 发送数据的CAN-ID
      data_len -- 发送数据的长度
      data -- 发送数据的内容
'''
def write_can_device_data(can_id, data_len, data):

# 循环读取数据
def run_read_can_data():
    ...
# 读取到数据之后调用UDS解析接口
    uds_analyse.analyse_can_data(rx_vci_can_obj.STRUCT_ARRAY[i])

uds_analyse 解析的数据是参考 ISO14229-1进行处理的

# uds_analyse.py

# 定义一下UDS的CAN-ID
CLIENT_CAN_ID=0x123     # 客户端发起诊断请求的CAN-ID
SERVER_CAN_ID=0x456     # 服务端响应应答的CAN-ID

# 0x10应答 诊断会话控制
def service_10_SessionControl(param):
    # 把数据固定进行应答
    ack_can_data=[0x06, 0x50, param, 0x13, 0x88, 0x13, 0x88, 0xFF]
    can_device.write_can_device_data(SERVER_CAN_ID, 8, ack_can_data)

'''
说明: 解析接收到的CAN数据帧
参数: frame -- .dll动态库的CAN数据结构
'''
def analyse_can_data(frame):
    if can_id == CLIENT_CAN_ID:
        # 匹配不同的SID调用不同的UDS应答函数
        match sid_name:
            case 0x10:
                service_10_SessionControl(third_byte)
            case ...

4.3 代码执行和日志记录

[RX]是 fake_uds_server 接收的UDS诊断请求数据

[TX]是 fake_uds_server 应答的UDS诊断响应数据

PS D:\2_gitlab\fake_uds_server\src> python .\main.py
start uds server channel=0 baud=500

start VCI_OpenDevice ok

start can1 VCI_InitCAN ok

start can1 VCI_StartCAN ok

run_read_can_data channel=0
timeout now=2024-12-04 18:18:18
[RX] tick=1733304868.198987 can ID: 0x123, DLC: 8, Data: 02 10 03 aa aa aa aa aa
[TX] tick=1733304868.199183 can ID: 0x456, DLC: 8, Data: 06 50 03 13 88 13 88 ff
timeout now=2024-12-04 17:34:31
[RX] tick=1733304873.201040 can ID: 0x123, DLC: 8, Data: 02 11 03 aa aa aa aa aa
[TX] tick=1733304873.201246 can ID: 0x456, DLC: 8, Data: 03 51 03 0a ff ff ff ff
timeout now=2024-12-04 17:34:36
[RX] tick=1733304878.211084 can ID: 0x123, DLC: 8, Data: 04 14 ff ff 33 aa aa aa
[TX] tick=1733304878.211290 can ID: 0x456, DLC: 8, Data: 01 54 ff ff ff ff ff ff
timeout now=2024-12-04 17:34:41
# 服务端应答多帧
[RX] tick=1733304883.221074 can ID: 0x123, DLC: 8, Data: 05 19 42 33 08 1e aa aa
[TX] tick=1733304883.221074 can ID: 0x456, DLC: 8, Data: 10 0b 59 42 33 ff 1f 04
[RX] tick=1733304883.231862 can ID: 0x123, DLC: 8, Data: 30 00 0a aa aa aa aa aa
[TX] tick=1733304883.231862 can ID: 0x456, DLC: 8, Data: 21 01 30 13 00 0e ff ff
timeout now=2024-12-04 17:34:46
[RX] tick=1733304888.229985 can ID: 0x123, DLC: 8, Data: 03 22 f4 01 aa aa aa aa
[TX] tick=1733304888.230168 can ID: 0x456, DLC: 8, Data: 07 62 f4 01 0a 0e ff ff
timeout now=2024-12-04 17:34:51
[RX] tick=1733304893.241174 can ID: 0x123, DLC: 8, Data: 02 27 01 aa aa aa aa aa
[TX] tick=1733304893.241174 can ID: 0x456, DLC: 8, Data: 06 67 01 01 02 03 04 ff
timeout now=2024-12-04 17:34:56
[RX] tick=1733304898.240082 can ID: 0x123, DLC: 8, Data: 03 28 03 01 aa aa aa aa
[TX] tick=1733304898.240296 can ID: 0x456, DLC: 8, Data: 02 68 03 ff ff ff ff ff
timeout now=2024-12-04 17:35:01
# 客户端设置多帧参数--VIN
[RX] tick=1733304903.248199 can ID: 0x123, DLC: 8, Data: 10 14 2e f1 90 57 30 4c
[TX] tick=1733304903.249197 can ID: 0x456, DLC: 8, Data: 30 00 0a ff ff ff ff ff
[RX] tick=1733304903.750738 can ID: 0x123, DLC: 8, Data: 21 30 30 30 30 34 33 4d
[RX] tick=1733304903.750738 can ID: 0x123, DLC: 8, Data: 22 42 35 34 31 33 32 36
[TX] tick=1733304903.751527 can ID: 0x456, DLC: 8, Data: 03 6e f1 90 ff ff ff ff
timeout now=2024-12-04 17:35:06
[RX] tick=1733304908.259058 can ID: 0x123, DLC: 8, Data: 04 31 01 02 01 aa aa aa
[TX] tick=1733304908.259058 can ID: 0x456, DLC: 8, Data: 05 71 01 02 01 32 ff ff
timeout now=2024-12-04 17:35:11
# 客户端发起多帧请求
[RX] tick=1733304913.268080 can ID: 0x123, DLC: 8, Data: 10 0b 34 00 44 01 02 03
[TX] tick=1733304913.268294 can ID: 0x456, DLC: 8, Data: 30 00 0a ff ff ff ff ff
[RX] tick=1733304913.769363 can ID: 0x123, DLC: 8, Data: 21 04 66 77 88 99 aa aa
[TX] tick=1733304913.769688 can ID: 0x456, DLC: 8, Data: 04 74 20 11 22 ff ff ff
timeout now=2024-12-04 17:35:16
[RX] tick=1733304918.271725 can ID: 0x123, DLC: 8, Data: 01 37 aa aa aa aa aa aa
[TX] tick=1733304918.271725 can ID: 0x456, DLC: 8, Data: 01 77 ff ff ff ff ff ff
timeout now=2024-12-04 17:35:21
[RX] tick=1733304923.280624 can ID: 0x123, DLC: 8, Data: 02 3e 00 aa aa aa aa aa
[TX] tick=1733304923.280624 can ID: 0x456, DLC: 8, Data: 02 7e 00 ff ff ff ff ff
timeout now=2024-12-04 17:35:26
[RX] tick=1733304928.289496 can ID: 0x123, DLC: 8, Data: 02 85 02 aa aa aa aa aa
[TX] tick=1733304928.290494 can ID: 0x456, DLC: 8, Data: 02 c5 02 ff ff ff ff ff

问题点

1:目前还没有适配UDS的传输层

所以遇到多帧数据,需要手动解析及应答;可参考 0x19, 0x2E, 0x34

2:UDS要求中超时机制和各种逻辑处理也没有关注

目前只是作为一个服务端进行测试,采用固定应答数据;

最后附上源代码路径 fake_uds_server


原文地址:https://blog.csdn.net/dujunqiu/article/details/144255919

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!