AUTOSAR进阶图解==>AUTOSAR_SWS_DiagnosticOverIP
AUTOSAR Diagnostic over IP (DoIP) 模块详解
目录
- 1. 概述
- 2. DoIP架构
- 2.1 架构组件解释
- 2.2 代码示例
- 3. DoIP连接建立流程
- 3.1 序列图元素解释
- 3.2 代码示例
- 4. DoIP状态机
- 4.1 状态图元素解释
- 4.2 代码示例
- 5. DoIP配置结构
- 5.1 类图元素解释
- 5.2 代码示例
- 6. 总结
1. 概述
AUTOSAR Diagnostic over IP (DoIP) 模块是AUTOSAR Basic Software的一个组件,提供了基于IP网络的诊断通信功能。该模块基于ISO 13400标准,实现了通过以太网进行车辆诊断的功能。
DoIP模块负责处理以下关键诊断功能:
- 车辆识别与公告(Vehicle Identification and Announcement)
- 路由激活(Routing Activation)
- 诊断消息处理(Diagnostic Message Handling)
- 节点信息提供(Node Information)
- 保活机制(Alive Mechanism)
DoIP模块允许外部测试设备直接连接到车辆或通过网络与车辆通信,实现诊断功能。本文将详细介绍DoIP模块的架构、连接建立过程、状态机和配置结构。
2. DoIP架构
2.1 架构组件解释
组件 AUTOSAR Com Stack:
- 职责: 提供通信堆栈功能,支持DoIP通信
- 包含模块:
- PDU Router: 处理PDU路由,连接DoIP与其他通信模块
- Socket Adaptor: 提供套接字接口,负责TCP/IP通信
- TCP/IP: 处理以太网通信协议
- Diagnostic Communication Manager: 处理诊断通信
- DoIP Module: 实现ISO 13400标准的DoIP功能
组件 DoIP Module:
- 职责: 实现基于ISO 13400-2的DoIP功能
- 功能点:
- Socket Connection Management: 管理套接字连接的建立和维护
- Vehicle Identification: 实现车辆识别功能
- Routing Activation: 处理诊断路由激活
- Diagnostic Message Handling: 处理诊断消息
- DoIP Protocol Handler: 处理DoIP协议
接口 DoIP <–> SoAd:
- 提供服务: 套接字通信服务,用于传输DoIP消息
- 调用方式: DoIP通过SoAd的API发送和接收网络数据
接口 DoIP <–> PduR:
- 提供服务: 诊断消息传输服务,连接DoIP与DCM
- 调用方式: 通过标准的PDU路由API传输诊断消息
接口 DCM <–> DoIP:
- 提供服务: 诊断服务接入,连接DCM与DoIP
- 调用方式: 通过标准的诊断通信接口
2.2 代码示例
/* DoIP模块初始化函数示例 */
#define DOIP_E_OK 0x00 /* 操作成功 */
#define DOIP_E_NOT_INITIALIZED 0x01 /* 模块未初始化 */
#define DOIP_E_INVALID_PARAMETER 0x02 /* 参数无效 */
#define DOIP_ACTIVATION_LINE_ACTIVE 0x01 /* 激活线激活状态 */
#define DOIP_ACTIVATION_LINE_INACTIVE 0x00 /* 激活线非激活状态 *//* DoIP模块API */
void DoIP_Init(const DoIP_ConfigType* ConfigPtr);
Std_ReturnType DoIP_GetVersionInfo(Std_VersionInfoType* versioninfo);
void DoIP_MainFunction(void);
Std_ReturnType DoIP_ActivationLineSwitchActive(void);
Std_ReturnType DoIP_ActivationLineSwitchInactive(void);/* 示例初始化函数 */
void DoIP_Init(const DoIP_ConfigType* ConfigPtr)
{/* 参数验证 */if (ConfigPtr == NULL_PTR) {Det_ReportError(DOIP_MODULE_ID, DOIP_INSTANCE_ID, DOIP_SID_INIT, DOIP_E_INVALID_PARAMETER);return;}/* 初始化模块全局变量 */DoIP_State = DOIP_INIT;DoIP_ActivationLineStatus = DOIP_ACTIVATION_LINE_INACTIVE;/* 循环初始化TCP连接配置 */for (uint8 i = 0; i < DOIP_MAX_TCP_CONNECTIONS; i++) {DoIP_TcpConnections[i].state = DOIP_CONNECTION_CLOSED;DoIP_TcpConnections[i].socketId = INVALID_SOCKET_ID;DoIP_TcpConnections[i].activationStatus = DOIP_ROUTING_INACTIVE;DoIP_TcpConnections[i].inactivityTimer = 0;DoIP_TcpConnections[i].isActive = FALSE;}/* 设置完成状态 */DoIP_State = DOIP_INITIALIZED;
}
3. DoIP连接建立流程
3.1 序列图元素解释
参与者:
- External Tester: 外部测试设备,用于与车辆进行诊断通信
- Vehicle Network: 车辆网络,连接外部测试设备和车辆内部网络
- TCP/IP: 处理TCP/IP通信协议
- SoAd: Socket Adapter模块,提供套接字通信服务
- DoIP Module: DoIP模块,处理诊断通信
- Activation Line Controller: 激活线控制器,控制DoIP模块的激活状态
操作组 Activation Line Status Change:
- 目的: 激活DoIP功能,启用诊断通信
- 关键消息:
DoIP_ActivationLineSwitchActive()
: 当激活线变为活动状态时调用,开始DoIP服务
操作组 Vehicle Announcement:
- 目的: 向网络广播车辆存在信息
- 关键消息:
DoIP_SoConModeChg(SOAD_SOCON_ONLINE)
: 当套接字连接状态变为在线时触发车辆公告
操作组 Tester Connection Establishment:
- 目的: 建立外部测试设备与DoIP的连接
- 关键消息:
- TCP Connection Request: 外部测试设备发起连接请求
DoIP_SoConModeChg(SOAD_SOCON_ONLINE)
: 通知DoIP模块连接已建立
操作组 Routing Activation:
- 目的: 激活特定的诊断路由路径
- 关键消息:
- Routing Activation Request: 外部测试设备发送路由激活请求
DoIP_SoAdTpCopyRxData()
: 接收路由激活数据- Process Routing Activation: DoIP模块处理路由激活请求
- Routing Activation Response: 响应路由激活请求
3.2 代码示例
/* DoIP激活线状态改变处理函数 */
Std_ReturnType DoIP_ActivationLineSwitchActive(void)
{Std_ReturnType result = E_OK;uint16 soConId;/* 检查模块状态 */if (DoIP_State != DOIP_INITIALIZED) {Det_ReportError(DOIP_MODULE_ID, DOIP_INSTANCE_ID, DOIP_SID_ACTIVATIONLINESWITCHACTIVE, DOIP_E_NOT_INITIALIZED);return E_NOT_OK;}/* 更新激活线状态 */DoIP_ActivationLineStatus = DOIP_ACTIVATION_LINE_ACTIVE;/* 处理所有TCP连接 */for (uint8 i = 0; i < DOIP_MAX_TCP_CONNECTIONS; i++) {/* 获取套接字连接ID */if (SoAd_GetSoConId(DoIP_TcpConnections[i].rxPduId, &soConId) == E_OK) {/* 如果需要请求IP地址分配 */if (DoIP_TcpConnections[i].requestAddressAssignment == TRUE) {/* 请求IP地址分配 */SoAd_RequestIpAddrAssignment(soConId, NULL_PTR, 0, NULL_PTR, TCPIP_IPADDR_ASSIGNMENT_ALL);}/* 打开套接字连接 */if (SoAd_OpenSoCon(soConId) != E_OK) {result = E_NOT_OK;}}}/* 处理所有UDP连接 */for (uint8 i = 0; i < DOIP_MAX_UDP_CONNECTIONS; i++) {/* 类似处理... */}return result;
}/* DoIP套接字连接模式改变回调函数 */
void DoIP_SoConModeChg(SoAd_SoConIdType SoConId, SoAd_SoConModeType Mode)
{uint8 connectionIndex;/* 找到对应的连接 */if (DoIP_FindConnectionBySoConId(SoConId, &connectionIndex) == E_OK) {if (Mode == SOAD_SOCON_ONLINE) {/* 套接字连接在线 */DoIP_TcpConnections[connectionIndex].state = DOIP_CONNECTION_ONLINE;/* 如果是车辆公告UDP连接,发送车辆公告消息 */if (DoIP_TcpConnections[connectionIndex].connectionType == DOIP_VEHICLE_ANNOUNCEMENT_CONNECTION) {DoIP_SendVehicleAnnouncement(connectionIndex);}} else {/* 套接字连接离线 */DoIP_TcpConnections[connectionIndex].state = DOIP_CONNECTION_CLOSED;}}
}
4. DoIP状态机
4.1 状态图元素解释
状态 DOIP_UNINIT:
- 描述: DoIP模块的未初始化状态,此时模块功能不可用
- 转换条件: 上电后系统处于此状态,通过调用
DoIP_Init()
进入初始化状态
状态 DOIP_INIT:
- 描述: DoIP模块的初始化状态,模块正在进行初始化
- 转换条件: 初始化完成后自动转换到激活线非活动状态
状态 DOIP_ACTIVATION_LINE_INACTIVE:
- 描述: 激活线非活动状态,套接字连接关闭,不处理通信
- 转换条件: 调用
DoIP_ActivationLineSwitchActive()
转换到激活线活动状态
状态 DOIP_ACTIVATION_LINE_ACTIVE:
- 描述: 激活线活动状态,可以建立和维护套接字连接
- 转换条件: 调用
DoIP_ActivationLineSwitchInactive()
返回到激活线非活动状态 - 子状态:
- Socket Connection Management: 管理套接字连接状态
- Socket Connection Closed: 套接字连接关闭
- Socket Connection Open: 套接字连接打开
- Waiting for Vehicle Announcement: 等待车辆公告
- Socket Connection Online: 套接字连接在线
- Tester Connection Management: 管理测试设备连接状态
- Inactive: 连接不活动
- Routing Inactive: 路由未激活
- Routing Active: 路由已激活
- Socket Connection Management: 管理套接字连接状态
状态转换:
- DOIP_UNINIT → DOIP_INIT: 通过
DoIP_Init()
函数调用 - DOIP_INIT → DOIP_ACTIVATION_LINE_INACTIVE: 初始化完成
- DOIP_ACTIVATION_LINE_INACTIVE → DOIP_ACTIVATION_LINE_ACTIVE: 通过
DoIP_ActivationLineSwitchActive()
函数调用 - DOIP_ACTIVATION_LINE_ACTIVE → DOIP_ACTIVATION_LINE_INACTIVE: 通过
DoIP_ActivationLineSwitchInactive()
函数调用
4.2 代码示例
/* DoIP模块状态类型定义 */
typedef enum {DOIP_UNINIT = 0x00, /* 未初始化状态 */DOIP_INIT = 0x01, /* 初始化状态 */DOIP_INITIALIZED = 0x02 /* 已初始化状态 */
} DoIP_StateType;/* DoIP激活线状态类型定义 */
typedef enum {DOIP_ACTIVATION_LINE_INACTIVE = 0x00, /* 激活线非活动状态 */DOIP_ACTIVATION_LINE_ACTIVE = 0x01 /* 激活线活动状态 */
} DoIP_ActivationLineStatusType;/* DoIP连接状态类型定义 */
typedef enum {DOIP_CONNECTION_CLOSED = 0x00, /* 连接关闭状态 */DOIP_CONNECTION_OPEN = 0x01, /* 连接打开状态 */DOIP_CONNECTION_WAITING_VA = 0x02, /* 等待车辆公告状态 */DOIP_CONNECTION_ONLINE = 0x03 /* 连接在线状态 */
} DoIP_ConnectionStateType;/* DoIP路由激活状态类型定义 */
typedef enum {DOIP_ROUTING_INACTIVE = 0x00, /* 路由未激活状态 */DOIP_ROUTING_ACTIVE = 0x01 /* 路由已激活状态 */
} DoIP_RoutingActivationStatusType;/* 状态变量 */
static DoIP_StateType DoIP_State = DOIP_UNINIT;
static DoIP_ActivationLineStatusType DoIP_ActivationLineStatus = DOIP_ACTIVATION_LINE_INACTIVE;/* DoIP主函数,周期性调用 */
void DoIP_MainFunction(void)
{if (DoIP_State != DOIP_INITIALIZED) {/* 模块未初始化,不做处理 */return;}/* 根据激活线状态处理 */if (DoIP_ActivationLineStatus == DOIP_ACTIVATION_LINE_ACTIVE) {/* 处理TCP连接 */DoIP_HandleTcpConnections();/* 处理UDP连接 */DoIP_HandleUdpConnections();/* 处理车辆公告 */DoIP_HandleVehicleAnnouncement();} else {/* 激活线非活动状态,忽略所有通信 */}
}
5. DoIP配置结构
5.1 类图元素解释
类 DoIP:
- 功能: DoIP模块的主配置类,包含模块级配置参数
- 关键属性:
DoIPDevErrorDetect
:- 描述: 开发错误检测开关
- 类型: boolean
- 取值范围: true/false
- 默认值: false
- 约束: 生产环境通常关闭
DoIPVersionInfoApi
:- 描述: 版本信息API开关
- 类型: boolean
- 取值范围: true/false
- 默认值: false
- 约束: 控制
DoIP_GetVersionInfo()
函数的可用性
DoIPMainFunctionPeriod
:- 描述: 主函数调用周期(秒)
- 类型: float
- 取值范围: 大于0的浮点数
- 默认值: 0.01 (10毫秒)
- 约束: 必须与调度器配置匹配
DoIPMaxTesterConnections
:- 描述: 最大测试设备连接数
- 类型: integer
- 取值范围: 1-255
- 默认值: 无默认值,必须配置
- 约束: 受资源限制约束
类 DoIPTcpConnection:
- 功能: 配置TCP连接参数
- 关键属性:
DoIPTcpSoAdTxPduRef
:- 描述: SoAd TX PDU引用
- 类型: reference
- 约束: 必须引用有效的SoAd PDU
DoIPTcpRxBufferSize
:- 描述: 接收缓冲区大小(字节)
- 类型: integer
- 取值范围: 大于0
- 约束: 必须足够大以接收最大诊断消息
类 DoIPRoutingActivation:
- 功能: 配置路由激活参数
- 关键属性:
DoIPSourceAddress
:- 描述: 源地址
- 类型: integer
- 取值范围: 0-0xFFFF
- 约束: 必须唯一
DoIPRoutingActivationAuthenticationRequired
:- 描述: 是否需要认证
- 类型: boolean
- 取值范围: true/false
- 默认值: false
- 约束: 如果为true,必须提供认证回调
关系 DoIP–>DoIPChannel:
- 描述: DoIP模块包含1个或多个通道配置
关系 DoIP–>DoIPTester:
- 描述: DoIP模块可以配置0个或多个测试设备
5.2 代码示例
/* DoIP模块配置类型定义 */
typedef struct {boolean DoIPDevErrorDetect; /* 开发错误检测开关 */boolean DoIPVersionInfoApi; /* 版本信息API开关 */float DoIPMainFunctionPeriod; /* 主函数调用周期(秒) */uint8 DoIPGIDSize; /* 组ID大小 */uint8 DoIPEIDSize; /* 实体ID大小 */boolean DoIPPowerModeStatusCallbackEnabled; /* 电源模式状态回调使能 */uint8 DoIPMaxTesterConnections; /* 最大测试设备连接数 *//* 其他参数... *//* 引用其他配置结构 */const DoIPChannel_ConfigType* DoIPChannels; /* 通道配置 */uint8 DoIPChannelCount; /* 通道数量 */const DoIPTcpConnection_ConfigType* DoIPTcpConnections; /* TCP连接配置 */uint8 DoIPTcpConnectionCount; /* TCP连接数量 */const DoIPUdpConnection_ConfigType* DoIPUdpConnections; /* UDP连接配置 */uint8 DoIPUdpConnectionCount; /* UDP连接数量 */const DoIPUdpVA_ConfigType* DoIPUdpVAConnections; /* UDP车辆公告连接配置 */uint8 DoIPUdpVAConnectionCount; /* UDP车辆公告连接数量 */const DoIPRoutingActivation_ConfigType* DoIPRoutingActivations; /* 路由激活配置 */uint8 DoIPRoutingActivationCount; /* 路由激活数量 */const DoIPTester_ConfigType* DoIPTesters; /* 测试设备配置 */uint8 DoIPTesterCount; /* 测试设备数量 */
} DoIP_ConfigType;/* TCP连接配置类型定义 */
typedef struct {const ComStackType DoIPTcpSoAdTxPduRef; /* SoAd TX PDU引用 */const ComStackType DoIPTcpSoAdRxPduRef; /* SoAd RX PDU引用 */uint16 DoIPTcpTxBufferSize; /* 发送缓冲区大小 */uint16 DoIPTcpRxBufferSize; /* 接收缓冲区大小 */boolean DoIPRequestAddressAssignment; /* 是否请求地址分配 */
} DoIPTcpConnection_ConfigType;/* 路由激活配置类型定义 */
typedef struct {uint8 DoIPRoutingActivationNumber; /* 路由激活编号 */boolean DoIPRoutingActivationAuthenticationRequired; /* 是否需要认证 */boolean DoIPRoutingActivationConfirmationRequired; /* 是否需要确认 */uint16 DoIPSourceAddress; /* 源地址 */uint16 DoIPTargetAddress; /* 目标地址 */DoIPRoutingActivationAuthenticationCallback DoIPRoutingActivationAuthenticationCallbackRef; /* 认证回调引用 */DoIPRoutingActivationConfirmationCallback DoIPRoutingActivationConfirmationCallbackRef; /* 确认回调引用 */
} DoIPRoutingActivation_ConfigType;/* 配置示例 */
const DoIPTcpConnection_ConfigType DoIPTcpConnectionsConfig[1] = {{.DoIPTcpSoAdTxPduRef = DOIP_TX_PDU_ID,.DoIPTcpSoAdRxPduRef = DOIP_RX_PDU_ID,.DoIPTcpTxBufferSize = 4096,.DoIPTcpRxBufferSize = 4096,.DoIPRequestAddressAssignment = TRUE}
};const DoIPRoutingActivation_ConfigType DoIPRoutingActivationsConfig[1] = {{.DoIPRoutingActivationNumber = 0,.DoIPRoutingActivationAuthenticationRequired = FALSE,.DoIPRoutingActivationConfirmationRequired = FALSE,.DoIPSourceAddress = 0x0E80,.DoIPTargetAddress = 0x1010,.DoIPRoutingActivationAuthenticationCallbackRef = NULL_PTR,.DoIPRoutingActivationConfirmationCallbackRef = NULL_PTR}
};const DoIP_ConfigType DoIPConfig = {.DoIPDevErrorDetect = TRUE,.DoIPVersionInfoApi = TRUE,.DoIPMainFunctionPeriod = 0.01f,.DoIPGIDSize = 4,.DoIPEIDSize = 4,.DoIPPowerModeStatusCallbackEnabled = FALSE,.DoIPMaxTesterConnections = 5,.DoIPTcpConnections = DoIPTcpConnectionsConfig,.DoIPTcpConnectionCount = 1,.DoIPRoutingActivations = DoIPRoutingActivationsConfig,.DoIPRoutingActivationCount = 1/* 其他配置... */
};
6. 总结
本文详细介绍了AUTOSAR DoIP模块的核心功能和结构。DoIP模块作为AUTOSAR通信堆栈的重要组成部分,基于ISO 13400标准实现了通过以太网进行车辆诊断的功能。通过本文的图表和解释,可以全面了解DoIP模块的以下关键方面:
-
架构设计:DoIP模块作为AUTOSAR通信堆栈的一部分,与PDU路由器、套接字适配器和TCP/IP模块协同工作,提供基于IP的诊断通信功能。
-
连接建立流程:从激活线状态变化开始,通过车辆公告、连接建立到路由激活的完整流程,确保诊断通信的正确建立。
-
状态机:DoIP模块的状态转换机制,从未初始化到初始化,以及激活线活动和非活动状态的处理,确保模块在各种条件下的正确行为。
-
配置结构:丰富的配置选项,包括TCP连接、UDP连接、路由激活和测试设备配置,使DoIP模块能够适应各种应用场景。
DoIP模块为AUTOSAR架构中的诊断通信提供了强大而灵活的解决方案,支持现代汽车电子系统的远程诊断和维护需求。通过标准化的接口和协议,DoIP有助于提高诊断效率,简化诊断工具与车辆的集成。
本文详细介绍了AUTOSAR DoIP模块的核心功能和结构。DoIP模块作为AUTOSAR通信堆栈的重要组成部分,基于ISO 13400标准实现了通过以太网进行车辆诊断的功能。通过本文的图表和解释,可以全面了解DoIP模块的以下关键方面:
-
架构设计:DoIP模块作为AUTOSAR通信堆栈的一部分,与PDU路由器、套接字适配器和TCP/IP模块协同工作,提供基于IP的诊断通信功能。
-
连接建立流程:从激活线状态变化开始,通过车辆公告、连接建立到路由激活的完整流程,确保诊断通信的正确建立。
-
状态机:DoIP模块的状态转换机制,从未初始化到初始化,以及激活线活动和非活动状态的处理,确保模块在各种条件下的正确行为。
-
配置结构:丰富的配置选项,包括TCP连接、UDP连接、路由激活和测试设备配置,使DoIP模块能够适应各种应用场景。
DoIP模块为AUTOSAR架构中的诊断通信提供了强大而灵活的解决方案,支持现代汽车电子系统的远程诊断和维护需求。通过标准化的接口和协议,DoIP有助于提高诊断效率,简化诊断工具与车辆的集成。
随着车联网技术的发展,基于IP的诊断通信将变得越来越重要,DoIP模块将在未来的智能网联汽车中扮演更为关键的角色。