怎样给公司产品做网站东莞网站推广营销
- 作者: 五速梦信息网
- 时间: 2026年03月21日 06:46
当前位置: 首页 > news >正文
怎样给公司产品做网站,东莞网站推广营销,内网网站如何建设方案,佛山竞价账户托管系列文章目录 【Python搞定车载自动化测试】系列文章目录汇总 文章目录 系列文章目录#x1f4af;#x1f4af;#x1f4af; 前言#x1f4af;#x1f4af;#x1f4af;一、环境搭建1.软件环境2.硬件环境 二、目录结构三、源码展示1.诊断基础函数方法2.诊断业务函数方法…系列文章目录 【Python搞定车载自动化测试】系列文章目录汇总 文章目录 系列文章目录 前言一、环境搭建1.软件环境2.硬件环境 二、目录结构三、源码展示1.诊断基础函数方法2.诊断业务函数方法3.27服务安全解锁4.自动测试用例5.配置参数 四、日志和报告1.测试日志2.测试报告 五、完整源码链接 前言 在之前的专栏【如何学习CAN总线测试】中介绍了如何通过CAPL语言实现UDS诊断测试但CAPL语言依赖于Vector CANoe设备随着智能电动汽车行业的发展目前使用Python语言实现自动化测试的需求越来越广本章节主要介绍如何使用Python语言基于Pytest自动化框架来实现UDS诊断自动化测试。 首先回顾一下UDS诊断基础知识 统一诊断服务Unified Diagnostic Services简称UDS。是ISO 15765和ISO 14229定义的一种汽车通用诊断协议位于OSI模型中的应用层它可在不同的汽车总线例如CAN、LIN、Flexray、Internet、K-line上实现是当前汽车领域广泛使用的一种车载诊断协议标准。 UDS协议的应用层定义是ISO 14229-1目前大部分汽车厂商均采用UDS on CAN的诊断协议。 根据UDS的诊断协议汽车上的控制系统需要根据规则化的诊断协议进行故障记录和处理最终体现为诊断故障代码Diagnostic Trouble CodeDTC的方式。例如网络通信丢失的故障诊断机制 自动变速箱控制单元Transmission Control UnitTCU和制动防抱死系统Antilock Brake SystemABS是CAN车载网络上的两大电子控制单元这2个ECU要通过CAN网络进行大量的信息交互。但是由于电磁干扰、串扰、静电等外界干扰或电子控制单元本身控制策略引起的通信停止等原因2个电子控制单元之间可能会出现通信丢失的现象。 控制系统需要将故障信息例如通信丢失故障信息诊断出来以处理通信被破坏时出现丢失帧的故障现象并记录为DTC。一旦某一控制系统如TCU监测到一段规定的时间内并没有接收到ABS发来的通信数据便将此DTC记录下来。外部诊断设备通过规则的诊断通信与控制系统建立诊断通信连接并选择相应的诊断方式。例如读取故障信息服务时就会将此故障信息读出并在诊断仪中显示出来。 UDS诊断服务共分为六大单元 1、诊断和通信管理功能单元Diagnostic and Communication Management \(10 - 诊断会话控制DiagnosticSessionControl \)11 - 电控单元复位ECUReset \(27 - 安全访问SecurityAccess \)28 - 通讯控制CommunicationControl \(3E - 待机握手TesterPresent \)83 - 访问时间参数AccessTimingParameter \(84 - 安全数据传输SecuredDataTransmission \)85 - 诊断故障码设置控制ControlDTCSetting \(86 - 事件响应ResponseOnEvent \)87 - 链路控制LinkControl 2、数据传输功能单元Data Transmission \(22 - 通过ID读数据ReadDataByldentifier \)23 - 通过地址读内存ReadMemoryByAddress \(24 - 通过ID读比例数据ReadScalingDataByidentifier \)2A - 通过周期ID读取数据ReadDataUyPeriodicidentifier \(2C - 动态定义标识符DynamicallyDefineDataldentifier \)2E - 通过ID写数据WriteDataByldentifier \(3D - 通过地址写内存WriteMemoryByAddress 3、存储数据传输功能单元Stored Data Transmission \)14 - 清除诊断信息ClearDiagnosticInformation \(19 - 读取故障码信息ReadDTCInformation 4、输入输出控制功能单元Input Output Control \)2F - 通过标识符控制输入输出InputOutputControlByIdentifier 5、例行程序功能单元Remote Activation of Routine \(31 - 例行程序控制RoutineControl 6 、传下载功能单元Upload Download \)34 - 请求下载RequestDownload \(35 - 请求上传RequestUpload \)36 - 数据传输TransferData \(37 - 请求退出传输RequestTransferExit \)38 - 请求文件传输RequestFileTransfer 一、环境搭建 1.软件环境 Python版本python3.9 第三方库 pip install allure-pytest2.13.5 pip install can-isotp2.0.4 pip install python-can4.3.1 pip install udsoncan1.23.0 allure安装allure工具并设置环境变量https://github.com/allure-framework/allure2/releases 2.硬件环境 支持CAN设备硬件接口 https://python-can.readthedocs.io/en/stable/configuration.html 二、目录结构 dll目录存放27服务安全解锁DLL文件同CANoe中使用的DLL文件。 public_method目录存放公共函数方法和27安全解锁工具。 test_case目录存放python自动化测试用例。 update目录存放升级包和效验文件。 config.py文件CAN相关配置参数。 run.py文件运行入口文件。 三、源码展示 1.诊断基础函数方法 base_can.py文件主要封装了CAN初始化、诊断配置、诊断请求、诊断响应基础方法源码如下 class CanBus:def init(self, interface: str None, channel: int None, bitrate: int None, fd: bool None,data_bitrate: int None, can_filters: CanFilters None, *args, **kwargs):self.interface interfaceself.channel channelself.bitrate bitrateself.fd fdself.data_bitrate data_bitrateself.can_filters can_filterstry:self.bus can.interface.Bus(channelself.channel, interfaceself.interface, app_nameCANoe,bitrateself.bitrate, fdself.fd, data_bitrateself.data_bitrate,can_filtersself.can_filters, *args, **kwargs)except Exception as e:raise Exception(初始化失败%s % e)else:print(初始化成功)def diag_congfig(self, tx: int, rx: int, addressingmodeisotp.AddressingMode.Normal_11bits):诊断配置函数:param tx: 诊断请求ID功能寻址、物理寻址:param rx: 诊断响应ID:return:self.isotp_params {stmin: 20, # 流控帧间隔时间blocksize: 8, # 流控帧单包大小0表示不限制tx_padding: 0, # 当 notNone表示用于填充发送的消息的字节。rx_flowcontrol_timeout: 1000, # 在停止接收和触发之前等待流控制帧的毫秒数rx_consecutive_frame_timeout: 1000, # 在停止接收和触发 a 之前等待连续帧的毫秒数}try:self.tp_addr isotp.Address(addressing_modeaddressingmode, txidtx, rxidrx) # 网络层寻址方案tp_stack isotp.CanStack(busself.bus, addressself.tp_addr, paramsself.isotp_params) # 网络/传输层IsoTP 协议self.conn PythonIsoTpConnection(tp_stack) # 应用层和传输层之间的接口except Exception as e:print(UDS配置失败:%s % e)return self.conndef diag_request(self, request_command: str, request_data_log_flagTrue):诊断请求requestPdu binascii.a2b_hex(request_command.replace( , ))if not self.conn.is_open():self.conn.open()try:self.conn.send(requestPdu)except Exception as e:print(诊断请求失败:%s % e)else:req_info request_command request_command.replace( , )for i in range(len(request_command)):if i len(request_command) / 2:breakreq_info request_command[2 * i:2 * i 2] if request_data_log_flag:print(诊断请求%s % req_info)def diag_respond(self, timeout11):诊断响应try:respPdu self.conn.wait_frame(timeouttimeout1)except Exception as e:print(e)else:if respPdu is None:return Noneresp1 respPdu.hex().upper()resp2 for i in range(len(resp1)):if i ! 0 and i % 2 0:resp2 resp2 resp1[i]print(诊断响应%s % resp2)return resp22.诊断业务函数方法 fun_can.py主要二次封装UDS诊断函数包括27安全解锁34服务、36服务、诊断78响应处理、UDS诊断测试、CRC效验等函数源码如下 import binascii import os import subprocess import timeimport pytestfrom config import Parameter from public_method.base_can import CanBusclass CanMethod(CanBus):def init(self, config):self.interface config[can][interface]self.channel config[can][channel]self.bitrate config[can][bitrate]self.fd config[can][canfd]self.data_bitrate config[can][data_bitrate]self.addressingmode config[can][addressing_mode]self.tx config[can][physics_id_default]self.rx config[can][response_id_default]CanBus.init(self, interfaceself.interface, channelself.channel, bitrateself.bitrate, fdself.fd,data_bitrateself.data_bitrate, )self.diag_congfig(addressingmodeself.addressingmode, txself.tx, rxself.rx)self.sign_nrc78 0def diag_get_seed(self, req_data27 01):27服务获取种子并解析self.diag_request(req_data)try:uds_res_data self.conn.specific_wait_frame(timeout2)while uds_res_data[0] 0x7F and uds_res_data[2] 0x78:print(已收到 %d bytes : [%s] % (len(uds_res_data), binascii.hexlify(uds_res_data)))uds_res_data self.conn.specific_wait_frame(timeout3)resp1 uds_res_data.hex().upper()resp2 for i in range(len(resp1)):if i ! 0 and i % 2 0:resp2 resp2 resp1[i]print(诊断响应%s % resp2)except:print(响应数据失败)else:seed []res_seed resp2.split( )[2:]for i in range(len(res_seed)):seed.append(eval(0x res_seed[i]))print(seed%s % seed)return seeddef get_key_level(self, seed):dll_security_unlock.exe工具解锁语法dll_security_unlock.exe –dll_path dome.dll –seed [11,22,33,44] –seedsize 4 –level 1 –keysize 4–dll_path DLL路径–seed 请求种子–seedsize 种子长度–level 安全级别–keysize 秘钥长度seed str(seed).replace( , )tool os.path.join(os.path.dirname(file), dll_security_unlock.exe)cmd {} –dll_path {} –seed {}.format(tool, os.path.join(os.path.dirname(os.path.dirname(file)), rdll\dome.dll), seed)key subprocess.getoutput(cmd)return keydef unlock_level(self):27安全解锁seed self.diag_get_seed(req_data27 01)if seed is not None:if seed ! 0 and len(seed) 1:key self.get_key_level(seed)print(key %s % key)req_data 27 02 %s % keyself.diag_request(req_data)self.uds_respond_0x78()time.sleep(0.1)else:print(seed响应不正确)def diag_send(self, req_data3E 80):发送诊断请求不断言诊断响应self.diag_request(req_data)response self.uds_respond_0x78()time.sleep(0.1)return responsedef diag_send_exp(self, req_data3E 80, expNone):发送诊断请求并断言诊断响应self.diag_request(req_data)result self.diag_test_response_judge(expexp)time.sleep(0.1)return resultdef diag_send_0x34(self, req_data34 00 44, address00 00 00 00, size0, expNone):刷写时使用请求传输升级包print(传输包大小 %s % size)self.diag_request(req_data address {:08X}.format(size))self.diag_test_response_judge(expexp)time.sleep(0.1)def diag_send_0x36(self, req_data36, trans_size255, path, expNone):36服务传包total_size os.path.getsize(path)print(size %s % total_size)with open(path, rb) as f:file_read f.read()print(CRC %s % {:02X}.format(binascii.crc32(file_read)))file_byte []for i in range(len(file_read)):file_byte.append({:02X}.format(file_read[i]))sequence 1transmitted_size 0try:status Truewhile status:trans_data for i in range(trans_size):if transmitted_size total_size:trans_data trans_data file_byte[transmitted_size]transmitted_size transmitted_size 1else:status Falsebreakprint(data_num%s % transmitted_size)self.diag_request(request_commandreq_data {:02X}.format(sequence) trans_data,request_data_log_flagFalse,)print(req_data {:02X}.format(sequence) …)self.__diag_test_response_judge(expexp)sequence 1if sequence 256:sequence 0finally:print(36传输结束)def diag_crc32(self, req_data31 01 02 02, path, expNone):刷写时使用CRC32校验size os.path.getsize(path)print(size %s % size)with open(path, rb) as f:file_read f.read()crc32 {:08X}.format(binascii.crc32(file_read))print(crc 32 %s % crc32)self.diag_send_exp(req_datareq_data crc32, expexp)def __diag_session_mode(self, session):诊断会话模式if session 01:self.diag_send(req_data10 01)elif session 03:self.diag_send(req_data10 03)elif session 02:self.diag_send(req_data10 03)self.unlock_level()self.diag_send(req_data10 02)def uds_respond_0x78(self, timeout12):78响应处理response self.diag_respond(timeout1timeout1)if response is not None:try:response2 response.replace( , )cyc 0while response2[:2] 7F and response2[4:6] 78:self.sign_nrc78 1response self.diag_respond(timeout1timeout1)if response is not None:response2 response.replace( , )cyc 1if cyc 20:breakexcept Exception as e:print(异常:%s % e)return responsedef diag_test_response_judge(self, expNone):断言响应结果与预期结果是否一致response self.uds_respond_0x78()response_return responseif (exp is not None) (response is not None):exp exp.replace( , ).upper()exp2 for i in range(len(exp)):if i ! 0 and i % 2 0:exp2 exp2 exp[i]exp exp2if len(exp) len(response):response response[0: len(exp)]if response exp:return response_returnelse:print(诊断结果与预期结果不匹配)pytest.fail(诊断结果与预期结果不匹配)def diag_test(self, session01, req_dataNone, expNone):诊断测试:param session: 执行前会话模式01默认会话02编程会话03扩展会话:param req_data:请求数据:param exp:预期结果:return:self.diag_session_mode(sessionsession)if req_data is not None:self.diag_request(req_data)self.__diag_test_response_judge(expexp)uds CanMethod(Parameter.config) 3.27服务安全解锁 dll_security_unlock.exe文件可实现DLL安全解锁使用方法如下 语法 举例dll_security_unlock.exe –dll_path dome.dll –seed [11,22,33,44] –seedsize 4 –level 1 –keysize 4 –dll_path DLL路径 –seed 请求种子 –seedsize 种子长度 –level 安全级别 –keysize 秘钥长度 4.自动测试用例 test_uds.py主要是自动化测试用例举例包括10服务测试、11服务测试、14服务测试、19服务测试、22服务测试、28服务测试、31服务测试、85服务测试等源码如下 import allurefrom public_method.fun_can import udsclass TestDiag:allure.title(诊断测试10服务)def test_diag_0x10(self):print(#####诊断测试10服务#####)uds.diag_test(session, req_data10 01, exp50 01)allure.title(诊断测试11服务)def test_diag_0x11(self):print(#####诊断测试11服务#####)uds.diag_test(session, req_data11 01, exp51 01)allure.title(诊断测试14服务)def test_diag_0x14(self):print(#####诊断测试14服务#####)uds.diag_test(session03, req_data14 C0 00 00, exp54 C0)allure.title(诊断测试19服务)def test_diag_0x19(self):print(#####诊断测试59服务#####)uds.diag_test(session, req_data19 01 09, exp59 01 09)allure.title(诊断测试22服务)def test_diag_0x22(self):print(#####诊断测试22服务#####)uds.diag_test(session03, req_data22 60 D7, exp62 60 D7)allure.title(诊断测试28服务)def test_diag_0x28(self):print(#####诊断测试28服务#####)uds.diag_test(session03, req_data28 03 01, exp68 03)allure.title(诊断测试31服务)def test_diag_0x31(self):print(#####诊断测试31服务#####)uds.diag_test(session03, req_data31 01 E0 F5, exp71 01 E0 F5)allure.title(诊断测试85服务)def test_diag_0x85(self):print(#####诊断测试85服务#####)uds.diag_test(session03, req_data85 01, expC5 01)5.配置参数 config主要配置CAN和诊断相关的参数 interface配置can设备类型支持python-can三方库的设备 channel通道 bitrate波特率 addressing_mode数据比特率 physics_id_default物理寻址 response_id_default响应寻址 class Parameter():CAN参数配置config {can: {interface: vector,channel: 0,bitrate: 500000,data_bitrate: 2000000,canfd: False, # 是否canfdaddressing_mode: 0,physics_id_default: 0x56A,response_id_default: 0x56B,function_id_default: 0x56C,}}四、日志和报告 1.测试日志 2.测试报告 五、完整源码链接 如下载源码链接失效请将购买专栏截图和用户名截图通过CSDN私信发送给博主博主更新源码链接 链接https://pan.baidu.com/s/1EIx0upnVz-ZiudXE9Ki8Bg 提取码4kdj
- 上一篇: 怎样防止网站被黑赣州企业做网站
- 下一篇: 怎样给建设的网站提意见柳州购物网站开发设计
相关文章
-
怎样防止网站被黑赣州企业做网站
怎样防止网站被黑赣州企业做网站
- 技术栈
- 2026年03月21日
-
怎样凡科建设网站电商产品推广方案
怎样凡科建设网站电商产品推广方案
- 技术栈
- 2026年03月21日
-
怎样发掘网站建设的客户西安网站建设itcandy
怎样发掘网站建设的客户西安网站建设itcandy
- 技术栈
- 2026年03月21日
-
怎样给建设的网站提意见柳州购物网站开发设计
怎样给建设的网站提意见柳州购物网站开发设计
- 技术栈
- 2026年03月21日
-
怎样给网站换空间校园网站建设和管理工作制度
怎样给网站换空间校园网站建设和管理工作制度
- 技术栈
- 2026年03月21日
-
怎样给网站做关键词优化比优化更好的词是
怎样给网站做关键词优化比优化更好的词是
- 技术栈
- 2026年03月21日
