ISO 14229简介

ISO 14229简介[TOC]本文主要内容来自:https://zhuanlan.zhihu.com/p/37310388#简介ISO14229是汽车行业诊断通信协议,也称为UDS(UnifiedDiagnosticService)统一诊断服务。是由ISO14230-3和ISO15765-3衍生而来。

大家好,欢迎来到IT知识分享网。

目录
  • 简介
  • UDS服务
    • 寻址
    • UDS 26种服务
    • NRC 消极应答
    • $10诊断会话控制
      • $3E待机握手
      • $27安全访问
      • $22通过ID读数据
      • $2E根据标识符写数据
      • $19 读DTC
    • DTC状态位
    • $14 清除DTC
    • $2F IO控制(InputOutputControlByIdentifier)
    • 6种模式的配置
    • 抑制肯定应答指示位的配置
  • UDS应用设备
  • 参考

本文主要内容来自:https://zhuanlan.zhihu.com/p/37310388

简介

ISO 14229是汽车行业诊断通信协议,也称为UDS(Unified Diagnostic Service)统一诊断服务。是由ISO 14230-3和ISO 15765-3衍生而来。

ISO 14229规定了诊断工具与ECU的诊断协议,基于服务的。
ISO 14229简介
from 恒润科技公开资料

UDS服务

UDS本质上是一些列服务的集合,包含6大类,26种。每种服务都有自己的ID,称为SID。

SID:Service Identifier,诊断服务ID。UDS本质是一种请求/应答(request/response)的交互协议:诊断仪(Tester)ECU发送请求,请求用SID标识,且SID处于该应用层数据的第一个byte。
如果积极应答(positive response),首字节回复[SID + 0x40],如请求0x10(诊断会话控制),积极应答0x50;请求0x22,积极应答0x62。
如果消极应答(Negative Response),首字节回复0x7F,第二个字节回复刚才请求的SID,第三个字节是NRC(否定应答码),表示否定的依据。

寻址

UDS寻址分为两种模式:
1)物理寻址,即点对点、一对一,只能访问单个ECU节点,诊断CAN ID通常由车厂分配;
2)功能寻址,即广播、一对多,根据功能的不同进行访问,能访问多个ECU节点,对于标准帧来说,CNA ID是0x7DF。

UDS 26种服务

6大类,常用15种。粗略可分为权限控制、读取数据/信息、写入数据/信息、通信控制、功能控制。

大类 SID(Hex) 诊断服务名 服务Service 子功能
诊断和通信管理 10 诊断会话控制 Diagnostic Session Control
11 ECU复位 ECU Reset
27 安全访问 Security Access
28 通讯控制 Communication Control
3E 待机握手 Tester Present
83 访问时间参数 Access Timing Transmission
84 安全数据传输 Secured Data Transmission
85 控制DTC的设置 Control DTC Setting
86 事件响应 Response On Event
87 链路控制 Link Control
数据传输 22 通过ID读数据 Read Data By Identifier
23 通过地址读取内存 Read Memory By Address
24 通过ID读比例数据 Read Scaling Data By Identifier
2A 通过周期ID读取数据 Read Data By Periodic Identifier
2C 动态定义标识符 Dynamically Define Data Identifier
2E 通过ID写数据 Write Data By Identifier
3D 通过地址写内存 Write Memory By Address
存储数据 14 清除诊断信息 Clear Diagnostic Information
19 读取故障码信息 Read DTC Information
输入输出控制 2F 通过ID控制输入输出 Input Output Control By Identifier
例行程序 31 例行程序控制 Routine Control
上传、下载 34 请求下载 Request Download
35 请求上传 Request Upload
36 数据传输 Transfer Data
37 请求退出传输 Request Transfer Exit
38 请求文件传输 Request File Transfer

UDS请求命令4种构成方式:
1)SID
2)SID + SF(Sub-function)
3)SID + DID(Data Identifier)(读写用)
4)SID + SF + DID

具体可以查看对应服务说明。

NRC 消极应答

NRC:Negative Response Code(否定应答码)。如果ECU拒绝一个请求,做出消极应答,会在第三字节回复NRC。不同NRC有不同含义。

应答码定义列表:

Byte Value(Hex) 应答码定义
00 正面响应
01 – 0F 保留
10 普通拒绝(内部错误,故障代码复位、例行事务未完成等)
11 不支持的服务
12 不支持子功能或无效的格式
13 不正确的消息长度或无效格式
14 要生成的响应超过底层网络层可用的最大字节数:1)响应消息超过底层协议允许的最大大小;2)响应消息超出为此目的分配的服务器缓冲区大小
15-20 保留
21 系统忙(需要外部设备重复请求)
22 条件不正确/请求序列错误(发动机运行,例行事务不正常,错误的数据格式标识符,数据上传未完成,Flash操作的例行事务错误)
23 保留
24 请求序列错误
25 已收到请求但无法执行,因为请求所需子网组件在指定时间内无响应
26 请求的操作不会执行,DTC故障条件(至少有一个TestFailed,Pending,Confirmed或TestFailedSinceLastClear的DTC状态位已发生)已发生
27-30 保留
31 请求超出范围(选择的标识符不支持,无效的内存地址请求)
33 安全访问被拒绝
34 保留
35 无效的密钥
36 超出可尝试的次数
37 请求时间延时未到期
38-4F 扩展数据链接安全性保留了该值的范围
50 – 6F 保留
70 上传/下载被终止
71 暂停传送
72 传送终止
74 – 77 保留
78 请求正常接受,应答未决定
79 -7D 保留
7E 当前活动会话不支持请求的子功能
7F 在当前激活的诊断模式下,不支持该服务
注:80-FF定义参见ISO14229-1-2013表A.1

特殊NRC:0x78,requestCorrectlyReceived-ResponsePending(RCRRP,请求已被正确接收-回复待定)。该NRC表示请求消息已被正确接收,请求消息中所有参数都是有效的,但要执行的操作还没完成,Server端还没准备好接收另一个请求。一旦请求的服务已经完成,服务器应该发送一个积极的响应或消极的响应,响应代码应与0x78不同。

当使用此NRC时,服务器(被测ECU)应始终发送最终响应(不论积极应答,还是消极应答),与suppress-PosRspMsgIndicationBit值(抑制肯定响应位)或NRCs(SNS 、SFNS、SNSIAS、SFNSIAS和ROOR)对功能寻址的处理请求的响应抑制要求无关。也就是说,什么情况下,功能寻址是不需要给出否定响应的呢?如果被测ECU需要回复上面5个NRC(SRC 0x11、SFNS 0x12、SNSIAS 0x7E、SFNSIAS 0x7F和ROOR 0x31)时,不需要回复否定响应。

$10诊断会话控制

$10包含3个子功能,对应3种诊断会话模式:
1)01: 标准诊断模式(默认);
2)02: ECU编程会话模式;
3)03: ECU扩展诊断模式。

为什么设计3个会话模式?
因为权限。默认会话权限最小,可操作的服务少;扩展模式通常用于解锁高权限诊断服务,如写入数据/参数、读写诊断码;编程模式用于解锁bootloader相关诊断服务,即程序烧录。

如果进入一个非默认会话状态,一个定时器会运转,如果一段时间内没有请求,那么到时间后,诊断退回到默认会话01(标准会话模式)。$3E服务,可以使得诊断保持在非默认状态。

下面是一张权限表格,描述了APP Code(应用程序代码)、Boot Code(引导程序代码)不同服务所需会话模式。

Service ID
服务ID
Diagnostic Services Name
诊断服务名称
App Code Boot Code
Default(01) Programming(02) Extended(03) Default(01) Programming(02) Extended(03)
0x10 DiagnosticSessionControl
诊断模式控制
M M M M M N/A
0x11 EcuReset
ECU复位
M N/A M M M N/A
0x27 SecurityAccessr安全访问 N/A N/A M(仅物理) N/A M(仅物理) N/A
0x28 CommunicationControl
通信控制
N/A N/A M M M N/A
0x3E TestPresent
诊断设备在线
M N/A M M M N/A
0x85 ControlDTCSetting
控制DTC设置
N/A N/A M N/A N/A N/A
0x22 ReadDataByID
根据标识符读数据
M N/A M M M N/A
0x2E WriteDataByID
通过标识符写入数据
N/A N/A M(仅物理) N/A M(仅物理) N/A
0x14 ClearDiagnosticInformation
清除诊断信息
M N/A M N/A N/A N/A
0x19 ReadDTCInformation
读取DTC信息
M N/A M N/A N/A N/A
0x2F InputOutputControlByID
输入输出控制
N/A N/A M(仅物理) N/A N/A N/A
0x31 RoutineControl
例程控制
N/A N/A M(仅物理) N/A M(仅物理) N/A
0x34 RequestDownload
请求下载
N/A N/A N/A N/A M(仅物理) N/A
0x36 TransferData
发送资料
N/A N/A N/A N/A M(仅物理) N/A
0x37 RequestTransferExit
请求退出发送
N/A N/A N/A N/A M(仅物理) N/A
注意:M = Mandatory(强制的),N/A = Not applicable(不适用),仅物理代表仅适用于物理寻址

如果进入了一个非默认会话状态,一个定时器将会运转。如果一段时间内没有请求,那么到时间后,诊断退回到默认会话模式(01)。$3E服务可以使诊断保持在非默认状态。

$3E待机握手

$3E服务用于向服务器指示诊断仪仍然连接在网络上,之前已经激活的诊断服务功能仍然保持激活状态。

// 服务器(ECU)接收
02 3E 00 55 55 55 55 55
// 服务器积极应答
02 7E 00 AA AA AA AA AA

$27安全访问

ECU中有很多数据是车厂独有的,不希望开放给所有人,需要做一个保密设定。我们在读取一些特殊数据时,要先进行安全解锁。ECU上电后,处于锁定状态(Locked),通过$27服务+子服务+钥匙,可以进行解锁。

解锁序列:

// Tester -> ECU
Request for Seed: 27 2n-1, n=1 // 2n-1是子服务
// ECU -> Tester
Seed: 67 2n-1
// Tester -> ECU
Send Key: 27 2n k1 // 2n是子服务
// ECU Compare Key k2 if (Key ke1 == Key k2) then unlock ECU
// ECU -> Tester
Unlocked: 67 2n

$22通过ID读数据

请求格式: 22 + DID(Data Identifier,通常2byte)
应答格式积极:62 + DID + Data

示例:

// 请求
03 22 F1 86 AA AA AA AA
// 应答
04 62 F1 86 01 AA AA AA

这里DID=F186,应答的Data=01。

DID有一部分被ISO 14229-1规定了,如0xF186表示当前诊断会话,0xF187表示车厂备件号,0xF188表示车厂ECU软件号,0xF189表示车厂ECU软件版本号。详见ISO 14229-1表C.1

$2E根据标识符写数据

与$22读数据服务相对,$2E用于写数据。
请求格式:2E + DID + Data
积极应答格式:6E + DID

写数据,通常需要权限,在APP下,需要进入扩展模式;Boot下,需要进入编程模式。

$19 读DTC

19服务是核心诊断服务,是UDS的重心。

DTC(diagnostic trouble code,故障码):如果系统检测到一个错误,将其存储为DTC。DTC通常表现为:一个明显的故障;通讯信号丢失;排放相关的故障;安全相关的错误等。DTC可以揭示错误的位置、类型。DTC通常占用3byte,OBD II占用2byte。

故障码包括4大类,分别是PCBU:P代表powertrain动力系统,C代表Chassis底盘,B代表Body车身,U代表network通信系统。一个DTC信息占用4byte:3byte DTC + 1byte DTC状态。

DTC信息格式:

┌──────────────────────────────────────────────────────────────────────┐
│                           DTC information                            │
├──────────────────────────────────────────────────────┬───────────────┤
│                           DTC                        │               │
├─────────────────┬──────────────────┬─────────────────┤   DTCStatus   │
│  DTCHightByte   │  DTCMiddleByte   │   DTCLowByte    │               │
├─────────────────┼──────────────────┼─────────────────┼───────────────┤
│     byte1       │      byte2       │      byte3      │     byte4     │
└─────────────────┴──────────────────┴─────────────────┴───────────────┘

在乘用车中,byte1前两个bit,用00/01/10/11,分别表示P/C/B/U(动力/底盘/车身/网络)中的一个,之后6bit是数字,合在一起形如“C01”。

例如,故障码U0167,该OBD故障码适用于所有汽车制造商:

故障码 U0167
中文定义 与汽车防盗控制模块通讯丢失
英文定义 Lost Communication With Vehicle Immobilizer Control Module
范畴 网络通讯系统
背景知识 防盗控制模块的作用是保证汽车仅在专用钥匙存在,并且跟它各类部件相匹配的时候才会允许汽车启动。

注:这是ISO15031中的故障码,与UDS中故障码在长度上有一定的不同

DTC状态位

下面是statusOfDTC(DTC状态)描述:

statusOfDTC字段名 位# 描述
testFailed 0 DTC在请求时不再失败
testFailedThisOperationCycle 1 DTC从未在当前操作周期中失败
pendingDTC 2 DTC在当前或之前的运行周期中失败
confirmedDTC 3 DTC在请求时未得到确认
testNotCompletedSinceLastClear 4 自上次代码清除以来,DTC测试已完成
testFailedSinceLastClear 5 自上次代码清除以来,DTC测试至少失败了一次
testNotCompletedThisOperationCycle 6 DTC测试完成了这个操作周期
warningIndicatorRequested 7 服务器不请求warningIndicator处于活动状态

$19有28个子服务(sub-function),常用的有(参考ISO 14229-1-2013表269):

  • 01 读取与状态mask匹配的DTC数量(reportNumberOfDTCByStatusMask),后面参数是DTC状态掩码,例如01表示想读当前故障,08表示想读历史故障,09表示当前故障和历史故障都想读。

示例:

// 请求
19 01 09 // 读取当前故障和历史故障的数量
// 积极应答
59 01 09 01 00 01 // 09: 本ECU所支持的掩码; 01: DTC的格式(ISO14229-1为01); 00 01: 目前满足条件的DTC数量
  • 02 读取与状态mask匹配的DTC列表及其状态(reportDTCByStatusMask),后面参数是DTC状态掩码,含义同子功能01。

每个故障码都会对应一个1byte的DTC status,该status与 DTCStatusMask进行按位与操作后,如果非0,证明匹配;如果为0,证明不匹配。因此,可能存在一个匹配的DTC列表及其状态。

示例:

// 请求
19 02 09
// 积极应答
59 02 09 XX XX XX 01 // XX XX XX: DTC, 由车厂定义; 01: 表示当前故障
  • 03 检索DTCSnapshot记录标识(reportDTCSnapshotIdentification)

客户端可以通过该子功能服务,来检索所有捕获的DTCSnapshot记录的DTCSnapshot记录标识(ID)信息。服务器应返回所有存储的DTCSnapshot记录的DTCSnapshot记录ID信息列表。

单个DTCSnapshot记录 = DTCRecord(DTC编号(高,中,低字节))和DTCSnapshot记录号

如果为单个DTC存储多个DTCSnapshot记录,则服务器应在每次出现的响应中放置一个项目,每次使用不同的DTCSnapshot记录号(用于稍后检索记录数据)。

注:服务器可以为单个DTC存储多个DTCSnapshot记录,以跟踪每次DTC出现的情况,如电机短路故障,DTCSnapshot记录可以是电源电压值 + 负载电流。要支持的DTCSnapshot记录及其数量,应由系统供应商/车辆制造商定义。

DTCSnapshot记录标识信息应在客户端成功执行ClearDiagnosticInformation请求时清除。车辆制造商有责任在发生内存溢出(存储的DTC和DTCSnapshot数据在服务器中完全占用存储空间)时,指定删除存储的DTC和DTCSnapshot数据的规则。

  • 04 读取快照信息(reportDTCSnapshotRecordByDTCNumber),也叫冻结帧

DTCSnapshot记录数据以及DTCSnapshot记录号(Number)由客户端定义。服务器收到请求后,搜索支持的DTC与客户指定的DTCMaskRecord(包含DTC编号(高,中,低字节))完全匹配。客户请求中提供的DTCSnapshotRecordNumber参数应指定一个特定的DTCSnapshot记录数据被请求的DTC的出现。

注意:DTCSnapshotRecordNumber不共享与DTCStoredDataRecordNumber相同地址空间。

如果服务器支持为单个DTC存储多个DTCSnapshot记录(支持此功能由系统供应商/车辆制造商定义),则建议服务器还实施reportDTCSnapshotIdentification子功能参数(子功能=03)。建议客户在通过reportDTCSnapshotRecordByDTCNumber请求特定的DTCSnapshotRecordNumber之前,首先请求使用子函数参数reportDTCSnapshotIdentification存储的DTCSnapshot记录的标识。

还建议支持子函数reportDTCSnapshotRecordIdentification,以便客户会直接识别存储的DTCSnapshot记录,而不是通过解析服务器的所有存储的DTC来确定是否存储DTCSnapshot记录。

系统供应商/车辆制造商有责任确定在此类服务器内捕获的DTCSnapshot记录,是否将与故障发生信息相关的数据存储为ECU文档的一部分。

如果客户端定义的DTCMaskRecord和DTCSnapshotRecordNumber参数(DTCSnapshotRecordNumber≠0xFF)已被识别出故障,则服务器将返回单个预定义的DTCSnapshotRecord以响应客户端的请求,以及DTC号和statusDTC。
请求消息:
ISO 14229简介

思考:DTCSnapshot记录号与DTCSnapshotRecordNumber,有何不同?

思考:子功能03与04,有何区别?
03指定服务器将所有DTCSnapshot数据记录标识(DTC编号和DTCSnapshot记录编号)传送给客户端;而04 指定服务器将与客户端定义的DTC编号和DTCSnapshot记录编号(所有记录为0xFF)关联的DTSCnapshot记录传输到客户端。

06 读取扩展信息(reportDTCExtDataRecordByDTCNumber)。

0A 读取ECU支持的所有DTC列表及其状态(reportSupportedDTC)

检索服务器支持的所有DTC的状态。请求中应包含DTCStatusAvailabilityMask,提供DTC状态位掩码功能。服务器应向客户端发送支持的所有DTC和相应状态位列表。

$19服务几个常用的请求参数:

请求数据参数名 参数定义
DTCStatusMask DTC状态掩码
含8bit DTC状态位。该字节用于请求消息中,允许客户端请求状态与DTCStatusMask相匹配的DTC的DTC信息。
DTCMaskRecord DTC掩码记录,3byte:DTCHighByte,DTCMiddleByte,DTCLowByte。表示服务器支持的特定诊断故障码的唯一标识号。
其定义允许多种编码DTC信息的方法,如ISO 15031-6,ISO 14229,SAE J1939-73,ISO 11992-4等。
DTCSnapshotRecordNumber 1byte,指示通过reportDTCSnapshotByDTCNumber子函数为客户机定义的DTCMaskRecord请求的特定DTCSnapshot数据记录的编号。
DTCSnapshot数据记录号:
0x00 应保留用于立
法目的;
0x01-0xFE 可用于车辆制造商的特定用途;
0xFF 请求服务器立即报告所有存储的DTCSnapshot数据记录。
DTCStoredDataRecordNumber 1byte,指示通过reportDTCStoreDataByRecordNumber子函数请求的特定DTCStoredDataRecord的编号。
0x00 应保留用于立法目的;
0x01-0xFE 可用于车辆制造商特定用途;
0xFF 请求服务器立即报告所有存储的DTCStoreData数据记录。

常用应答数据参数:

应答参数名 描述
DTCAndStatusRecord DTC及状态记录
允许支持多种DTC信息格式,如ISO_14229-1_DTC,SAE_J2012-DA_DTCFormat_00,SAE_J1939-73_DTC等。
通常由4byte组成:DTCHighByte,DTCMiddleByte,
DTCLowByte,statusOfDTC。
其中,前面3byte(DTCHighByte,DTCMiddleByte,DTCLowByte)称为DTC编号。不同的格式,对应不同的编码。
DTCRecord DTC记录
包含一个或多个DTCHighByte,DTCMiddleByte,DTCLowByte的分组。
StatusOfDTC 特定的DTC状态
DTCStatusAvailabilityMask 1byte,位定义与statusOfDTC相同,代表服务器支持的状态位。服务器不支持的必须设置为’0’,每个支持的位由’1’表示。
DTCFormatIdentifier 1byte,定义了服务器报告的DTC格式。给定服务器只能支持一个DTCFormatIdentifier。
0x00 SAE_J2012-DA_DTCFormat_00(ISO 15031-6定义)
0x01 ISO_14229-1_DTCFormat
(ISO 14229-1定义)
0x02 SAE_J1939-73_DTCFormat(SAE J1939-73定义)
0x03 ISO_11992-4_DTCFormat(ISO 11992-4定义)
0x04 SAE_J2012-DA_DTCFormat_04(ISO 27145-2定义)
0x05-0xFF 保留
DTCCount 2byte,响应reportNumberOfDTCByStatusMask或reportNumberOfMirrorMemoryDTC请求而发送的参数。
DTCSnapshotRecordNumber 客户端在reportDTCSnapshotRecordByDTCNumber请求中指定的DTCSnapshotRcoerdNumber参数的回显,或存储的DTCSnapshot记录的实际DTCSnapshotRecordNumber。
DTCSnapshotRecordNumberOfIdentifiers 1byte,显示紧随其后的DTCSnapshotRecord中等dataIdentifiers的数量。应用值0x00指示相应的DTCSnapshotRecord中包含未定义数量的dataIdentifiers(如,>255个dataIdentifiers)。
DTCSnapshotRecord 包含系统故障发生时刻的数据值快照
DTCStoreDataRecord 包含从系统故障发生时起的数据值的冻结帧
DTCStoreDataRecordNumber 客户端在reportDTCStoredDataByRecordNumber请求中指定的DTCStoredDataRecrodNumber参数的回显,或存储的DTCStoredDataRecord的实际DTCStoreDataRecordNumber。
DTCStoredDataRecordNumberOfIdentifiers 1byte,显示紧随其后的DTCStoredDataRecord中的dataIdentifiers的数量。

$14 清除DTC

清除(复位)DTC格式,可以改变DTC的状态。DTC状态中8bit,除bit4,bit6外,均会被清0。bit4表示自上次代码清除以来,DTC测试已完成(testNotCompletedSinceLastClear);bit6表示DTC测试完成了这个操作周期(testNotCompletedThisOperationCycle)。

该服务包含一个参数groupOfDT,占3byte,指示DTC组(例如,动力总成,车身,底盘)或要清除的特定DTC。3个FF代表清除所有DTC状态位。

groupOfDTC定义如下:
ISO 14229简介

$2F IO控制(InputOutputControlByIdentifier)

该服务通过DID(数据标识符)来进行输入信号的替换,和控制零部件负载输出。

请求消息格式:0x2F + 2byte DID(MSB + LSB)+ 1byte InputOutputControlParameter
如下表所示:
ISO 14229简介

DID全称数据标识(dataIdentifier),部分由ISO规定,部分由车厂定义,可参考各家车厂提供的总线诊断规范;InputOutputControlParameter可以看做是IO控制类型,分为4类:
1)00 控制权还给ECU,returnControlToECU;
2)01 重置为默认值,resetToDefault;
3)02 冻结当前的状态,freezeCurrentState;
4)03 短暂接管控制权,shortTermAdjustment。

如果控制类型是00~02,则请求报文4byte;如果控制类型是03,则请求报文5byte,第5byte是控制代码,可以是数字量,如01:开,00:关;也可以是模拟量,如空调风门的开度。

6种模式的配置

非默认会话在实际应用中,分为编程会话(Programming Diagnostic session)和扩展会话(Extended Diagnostic session)。UDS实际应用中,需要对26种服务根据不同会话、寻址模式的支持度进行配置,共6种模式:
物理寻址+默认会话,物理寻址+编程会话、物理寻址+扩展会话、功能寻址+默认会话、功能寻址+编程会话、功能寻址+扩展会话。

至此,可以设计出一个26行、6列的表格(通常由车厂诊断设计规范提供):

SID 物理寻址 功能寻址 默认会话 编程会话 扩展会话

抑制肯定应答指示位的配置

抑制肯定应答指示位(Suppress Positive Response Message Indication Bit)顾名思义,用来抑制积极应答的。该配置指示对方静默,不需要肯定应答。该位的位置与子服务在同一byte(应用层数据第二字节),为bit7。

例如,SID=0x10,子服务0x01,如果抑制肯定应答,子服务对应字节改为0x81。这样,ECU收到该请求后,就不会回复肯定应答了。

UDS应用设备

最出名的是Vector的VN1630/1640+CANoe软件。Vector家产品特点:好用,节省开发时间,价格昂贵,不适用于小厂或大规模采购。

其他很多厂商如Kvaser、ZLG等能提供低成本、小体积、驱动简单、开放文档的设备,适用于UDS二次开发。

参考

UDS诊断入门
[Automotive Wiki ISO_14229]https://automotive.wiki/index.php/ISO_14229
画图

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30093.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信