当前位置: 首页 > ds >正文

AUTOSAR进阶图解==>AUTOSAR_SWS_DiagnosticOverIP

AUTOSAR Diagnostic over IP (DoIP) 模块详解

基于AUTOSAR SWS DiagnosticOverIP规范

目录

  • 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: 路由已激活

状态转换:

  • 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模块将在未来的智能网联汽车中扮演更为关键的角色。

http://www.xdnf.cn/news/15912.html

相关文章:

  • 创建套接字并bind的详细过程
  • 从 Server.xml 到字节码:Tomcat 内核全景与请求旅程 10 000 字深剖
  • MinIO深度解析:从核心特性到Spring Boot实战集成
  • 数据结构与算法之美:拓扑排序
  • 外观设计模式
  • Uniapp之键盘弹窗
  • win10连接鼠标自动关闭触摸板/win10关闭触摸板(笔记本)
  • 智能合约代理与批量调用优化:最小代理与MultiCall的应用
  • android studio libs.versions.toml 配置
  • 嵌入式硬件中电感的基本原理与实现详解
  • CSS篇——第二章 六十五项关键技能(下篇)
  • Kotlin方差
  • OpenCV 官翻5 - 机器学习
  • 智能制造——解读39页汽车行业数字化工厂解决方案【附全文阅读】
  • 考研408《计算机组成原理》复习笔记,第三章(5)——磁盘存储器
  • 文生图-StoryGAN:用于故事可视化的顺序条件GAN
  • Github Actions Workflows 上传 Dropbox
  • 【C++】初识C++(2)
  • 【RK3576】【Android14】UART开发调试
  • 微信小程序入门实例_____从零开始 开发一个“旅行清单 ”微信小程序
  • 微信小程序——世界天气小助手
  • 【EMC设计基础--信号环路分析、PCB设计规则】
  • VSCode - VSCode 查找中文字符
  • LVS工作模式和算法的总结
  • 【RK3576】【Android14】SDK源码编译
  • 前端 SSE 实战应用:用最简单的方式实现实时推送
  • Android CountDownTimer
  • 深入理解Linux文件I/O:系统调用与标志位应用
  • 机器学习17-Mamba
  • c++继承详解