doip 源码_DoIP—协议框架

DoIP协议(Diagnostic On IP---ISO 13400)定义将IP技术运用到车载网络诊断范畴的通信规则。其中包括两层含义:

1、 将IP技术应用到车载网络中,需满足车规需求;

2、 在诊断范畴,DoIP协议定义了从物理层(Physical Layer)到应用层(Application Layer)搭建“通信桥梁”的规则(此处可类似CAN总线的TP层协议ISO 15765-2);

将上述概念映射到OSI计算机七层模型:

DoIP所在的位置位于七层模型中第三层和第四层。如图所示,其中运用到的IP协议:TCP/IP协议、UDP协议。整个ISO 13400-2协议中定义的内容是规定了搭建“通信渠道”(Tester与ECU之间的通信渠道)的规则。TLS是2020版DoIP协议新增添的内容,主要目的是为了保证通信数据的安全性。此内容稍后会在公众号上以专门一篇文章来描述其具体内容。

本文将对整个“通信桥梁”的搭建过程做一个概述性的描述(微信公众号上接下来会更新“通信桥梁”搭建每一步的详细分析),具体步骤如下:

1) 物理连接(Physically connection);

2) 车辆声明(Vehicle Discovery);

3) 通信建立(Connection Establishment);

4) 诊断通信(Diagnostic Communication);

1、 物理连接:

首先从功能视角来看车内网络与车身外网络:

车外客户端(Test equipment)用相应的接口卡

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import socket import struct # DOIP服务器地址和端口号 DOIP_SERVER_IP = "192.168.0.1" DOIP_SERVER_PORT = 13400 # DOIP消息类型 DOIP_TYPE_ROUTING_ACTIVATION_REQUEST = 0x0000 DOIP_TYPE_ROUTING_ACTIVATION_RESPONSE = 0x0001 DOIP_TYPE_DIAGNOSTIC_MESSAGE = 0x8001 # 构造DOIP连接请求消息 def build_doip_activation_request(): msg = bytearray.fromhex("000000150200000000000000000000000000000000000000") return msg # 解析DOIP连接响应消息 def parse_doip_activation_response(msg): activation_status = struct.unpack(">H", msg[4:6])[0] return activation_status # 构造DOIP诊断消息 def build_doip_diagnostic_message(sid, data): msg = bytearray() msg.extend(struct.pack(">H", DOIP_TYPE_DIAGNOSTIC_MESSAGE)) msg.extend(struct.pack(">H", len(data) + 4)) msg.extend(struct.pack(">H", sid)) msg.extend(data) return msg # 连接DOIP服务器并发送消息 def send_doip_message(msg): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.connect((DOIP_SERVER_IP, DOIP_SERVER_PORT)) sock.sendall(msg) # 接收DOIP服务器响应消息 response = sock.recv(1024) print("Received:", response.hex()) # 关闭连接 sock.close() return response # 激活诊断 def activate_diagnostic(): msg = build_doip_activation_request() response = send_doip_message(msg) activation_status = parse_doip_activation_response(response) if activation_status == 0: print("Diagnostic activated") else: print("Diagnostic activation failed") # 发送诊断服务 def send_diagnostic_service(sid, data): msg = build_doip_diagnostic_message(sid, data) response = send_doip_message(msg) # 处理诊断服务响应 # ... # 示例:发送读取故障码服务 def read_dtc(): sid = 0x03 data = bytearray.fromhex("01") send_diagnostic_service(sid, data) # 激活诊断 activate_diagnostic() # 发送诊断服务 上面的代码 处理诊断回复的时候,如果回复超过1024字节 该怎么办,请优化代码
06-04

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值