# fake_uds_server **Repository Path**: dujunqiu/fake_uds_server ## Basic Information - **Project Name**: fake_uds_server - **Description**: 用python写的一个虚拟的UDS服务端 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-12-04 - **Last Updated**: 2025-02-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 本文档介绍的是基于python写的一个模拟UDS服务端程序,通过python代码使用UDS诊断请求的应答及流控等信息; ## 1:数据流程说明 ```sh 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设备; ``` ```mermaid flowchart LR TBOX设备 -->|1.CAN| CAN分析仪 CAN分析仪 -->|2.USB| PC电脑 PC电脑 -->|3.API| fake_uds_server fake_uds_server --> |4.API|PC电脑 PC电脑 -->|5.USB| CAN分析仪 CAN分析仪 -->|6.CAN| TBOX设备 ``` ## 2:开发环境配置 客户端设备:测试使用OBU_C800,其它支持发起UDS诊断请求的设备即可; CAN分析仪:目前适配的是创芯科技的 CANalyst-II ![image-20241204173842443](doc/user_guide.assets/image-20241204173842443.png) PC电脑:已安装 CANalyst-II 设备的驱动,能正常通过上位机收发CAN数据; fake_uds_server: python代码编写的 模拟UDS服务端设备,需要支持python3.8以上; ## 3:开发环境验证 **CAN分析仪验证**:能够正常通过 CANPro上位机收发CAN数据 ![image-20241204175450037](doc/user_guide.assets/image-20241204175450037.png) **fake_uds_server验证** 1-python3.8版本以上即可 ```sh # 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接收到数据说明正常; ```sh # 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 代码结构说明 ```sh ├─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 代码流程讲解 ```python # 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() ``` ```python # 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进行处理的 ```python # 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诊断响应数据 ```sh 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要求中超时机制和各种逻辑处理也没有关注 目前只是作为一个服务端进行测试,采用固定应答数据;