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

浅浅学:DoIP工作流程及基于DoIP的诊断/刷写工具

注:阅读本文需要对UDS及BootLoader有一定了解,基础内容不做赘述。

在汽车"新四化"浪潮的推动下,智能座舱、自动驾驶、车路协同等创新技术正加速重构行业格局。随着车载ECU数量突破百个量级,软件代码量呈指数级增长——高端车型软件规模已超2亿行代码,软件成本占比超过40%。在此背景下,车载系统的迭代效率与用户体验直接挂钩,使得整车OTA(Over-The-Air)升级从技术亮点演变为刚需能力。

传统CAN/LIN总线受限于带宽瓶颈(CAN通常仅1Mbps),在面对动辄数百MB的OTA固件包传输时已显乏力。以太网凭借其100Mbps/1Gbps的高吞吐量、低延迟特性,成为新一代EE架构的核心骨干网。值得注意的是,当诊断协议从CAN总线迁移至以太网时,沿用三十余年的UDS(Unified Diagnostic Services)诊断框架面临协议栈重构的挑战——原有基于CAN标识符的寻址方式需要转换为IP地址通信,传输层协议也需要适配TCP/IP网络特性。

正是这种"传统诊断服务"与"新型车载网络"的融合需求,催生了DoIP(Diagnostic communication over Internet Protocol)协议。作为ISO 13400国际标准,DoIP不仅实现了UDS诊断服务在以太网环境中的无缝移植,更通过IP分片机制支持超大诊断数据包的可靠传输,为智能化时代的车辆诊断、远程刷写、安全监控等场景提供了关键基础设施。

本文主要包含两部分:

1  DoIP在整车网络中扮演的角色和工作过程

2  基于DoIP开发的诊断工具

 

1 DoIP在整车网络中扮演的角色和工作过程。

1.1 DoIP架构

        如下图所示,作为车载以太网诊断的核心中间件,DoIP(Diagnostic over IP)本质上构建了UDS(ISO 14229)诊断服务与TCP/IP网络协议栈之间的桥梁。其核心任务是将应用层的UDS诊断报文封装为符合IP网络传输的数据包(封包),并在接收端反向解析出原始UDS指令(解包)。这一过程通过三级协议栈协同实现:

  1. 应用层‌:UDS服务单元(如0x22读数据、0x22读数据、0x31例行控制)以APDU(Application Protocol Data Unit)形式存在
  2. DoIP适配层‌:添加DoIP报文头(Header)+ 地址扩展字段(Addressing),构成DoIP PDU
  3. 传输层‌:通过TCP(面向连接)或UDP(广播发现)协议承载,最终映射至以太网物理帧

1.2 DoIP 报文类型及格式

每个DoIP报文由 ‌协议头(Header)‌ 与 ‌有效载荷(Payload)‌ 构成,格式如下:

字节偏移字段名长度(Byte)说明
0-1Protocol Version2协议版本标识(0x01: DoIPv1, 0x02: DoIPv2),第2字节为取反值(0xFE~0xFF)
2~3Payload Type2载荷类型编码(如0x8001: 诊断消息,0x0005: 路由激活响应)
4~7Payload Length4载荷数据长度(单位:字节),大端序存储
8~9Source Address2源地址,类比CAN上的诊断请求ID
10~11Target Address2目标地址,类被CAN上的诊断响应ID
12~NPayload Data变长实际传输内容(诊断场景下包含UDS报文)

 

DoIP载荷类型根据信息内容分组为:节点管理( 0x0XXX)、车辆信息 0x4XXX)和
诊断( 0x8XXX)。具体类型参考如下导图。

 

1.3 DoIP 节点类型

基于以太网的车载总线下,可以分成以下几个节点类型

  1. Off-Board Tester
  • 应用场景:工程开发/售后服务/产线检测
  • 核心功能:通过DoIP协议实现外部设备与车载系统的诊断通信
  1. On-Board Tester
  • 应用场景:FOTA升级/远程诊断/近场诊断
  • 核心功能:作为车载终端执行DoIP通信协议
  1. DoIP Edge Node(边缘路由节点)
  • 核心职责:作为协议转发枢纽
  • 工作流程:接收->解析->路由来自客户端DoIP实体的诊断请求
  1. DoIP In-Vehicle Node(车载处理节点)
  • 核心职责:诊断请求终端处理器
  • 通信链路:专责处理来自Edge Node的DoIP协议通信
  1. Non-DoIP ETH Node(非协议适配节点)
  • 技术特征:采用CAN/CANFD等传统总线协议
  • 通信机制:通过网关实现协议转换(DoIP与传统总线间的报文转译)

该架构通过分层协议处理机制,实现了以太网诊断协议与传统车载总线的兼容协同,构建完整的车载诊断通信体系。网关节点在此架构中承担关键协议转换功能,确保异构网络间的有效通信。

 

1.4 DoIP 通信过程

DoIP中典型的建链过程参考如下图所示:

首先,整车启动以后,边缘节点作为TCP server端启动监听。相关的以太网节点将作为客户端链接到边缘节点

第二步,测试设备通过广播的方式获取整车上的DoIP节点信息

第三步,收到边缘节点发送的单播响应后,作为TCP Client链接到边缘节点。

第四步, 向边缘节点发送路由激活请求。

第五步,边缘激活请求成功后即可发送诊断报文。

 

需要注意的是,边缘节点作为TCP Server端实际上是有两个Server在同时运行。其中一个Server面向外部Tester, 另一个Server是面向内部DoIP节点。他们的IP是不同的。所以边缘节点起到了一个路由器的功能,这有助于车载网络和外部网络的隔离,保证网络安全。

 

 2  基于DoIP开发的诊断工具

根据以太网DoIP相关的通信协议,开发了一款DoIP诊断工具上位机软件。通过这款软件可以获取以下收益:

1 不需要依赖昂贵的以太网调试设备,如Vector盒子,只需要低成本的以太网转换盒

2 能够在开发阶段快速实现诊断功能调试,不需要臃肿的CANoe环境

3 自定义测试序列,能够进行快速测试验证

4 自定义刷写,可以快速实现基于DOIP的软件刷写

总结就是低成本,高效开发,不被设备环境卡脖子!

2.1 硬件链接

这款软件不需要依赖Vector设备和CANoe,只需要如下一个RG45转100BaseT1的盒子即可实现大部分以太网相关节点的ECU开发的支持。当前如果你的ECU本来就是RG45,那就不需要这个盒子啦,或者也可以根据自己ECU特性找适配的转接设备。

 

2.2 软件概览

本软件支持作为Tester节点(ClientMode)的诊断功能和作为边缘节点的TcpServer(ServerMode)的诊断功能。软件通过JSON配置相关IP/PORT和目标地址以及关键的诊断相关时间参数具体参考如下示例

 

2.3 诊断功能

加载测试文件,连续执行诊断指令

如图所示,启动TCP server,DoIP节点上电后会自动链接到服务端。此时在ServerMode模式下不需要其他操作即可直接进行诊断通信。根据测试需要可以自定义一个测试文件报文起来,使用时直接加载文件,点击RUN,直接运行加载进来的指令。同时支持双击加载的指令实现单发功能。

在响应对话框,双击响应数据,既可以实现16进制和ASCII之间的相互转换

 

 

 

2 对话框直接输入诊断指令,单指令发送

 

 

2.4 刷写功能

需求方面分析,主要存在OEM的需求差异以及ECU本身的差异:

  • 需求差异:Cybersecurity相关安全需求的差异,诊断流程的差异
  • 文件格式多样性:S19/bin/Vbf等OEM私有格式的分级处理要求
  • 传输协议特性:34/36/37服务中的Block结构及数据分片规则差异

设计方面,‌采用文件配置的方式,将刷写流程按照诊断指令的先后顺序预先定义在配置文件里。诊对不同的文件类型,统一按照bin文件输入,用户可以通过简单的脚本工具预先将文件转换成bin文件,从而解决36传输多个block的文件以及格式不统一的问题。具体效果可以参见下图。

 

关于文中提到的配置文件及格式,感兴趣可以联系使用。

 

 

 

相关文章:

浅浅学:DoIP工作流程及基于DoIP的诊断/刷写工具

注:阅读本文需要对UDS及BootLoader有一定了解,基础内容不做赘述。 在汽车"新四化"浪潮的推动下,智能座舱、自动驾驶、车路协同等创新技术正加速重构行业格局。随着车载ECU数量突破百个量级,软件代码量呈指数级增长——…...

首个专业AI设计Agent发布-Lovart

Lovart是什么 Lovart 是为设计师打造的世界上首个专业设计 Agent。Lovart 能像专业设计师一样思考和执行设计任务,提供高水平的设计方案。基于自然语言交互,用户能快速调整布局、颜色和构图。Lovart 支持从创意拆解到专业交付的全链路设计,单…...

二叉树(中序遍历)

嘿,欢迎来到小巫blog!小巫又来啦!看到你对二叉树中序遍历这道题有点困惑,别担心,我会一步步带你搞定它!这道题是树的基础题目,掌握了它,你对树的遍历就会有很深的理解。我相信&#…...

Ubuntu 系统默认已安装 python,此处只需添加一个超链接即可

步骤 1:确认 Python 3 的安装路径 查看当前 Python 3 的路径: which python3 输出类似: /usr/bin/python3 步骤 2:创建符号链接 使用 ln -s 创建符号链接,将 python 指向 python3: sudo ln -s /usr/b…...

AcroForm JavaScript Promise 对象应用示例: 异步加载PDF文件

这段代码演示了在Adobe Acrobat DC Pro 的 JavaScript 环境中如何使用 Promise 对象处理异步操作。具体功能是: 定义了一个loadFile函数,模拟异步加载PDF文件的操作使用Promise对象封装异步操作,提供成功(resolve)和失败(reject)两种状态通过…...

LeetCode 热题 100 114. 二叉树展开为链表

LeetCode 热题 100 | 114. 二叉树展开为链表 大家好,今天我们来解决一道经典的二叉树问题——二叉树展开为链表。这道题在 LeetCode 上被标记为中等难度,要求将二叉树展开为一个单链表,展开后的单链表应该与二叉树的先序遍历顺序相同。 问题…...

DML和DQL

1. 设置MySQL的储存引擎 上一章的附录里已经将ini设置好了,不用再次设置 2. DML语句 插入单数据记录 插入多数据记录 将查询结果插入新表 更新数据 删除数据 注意:delete删除只会删除数据,不会重置表的现有逻辑,truncate会重置表逻…...

多线程与线程互斥

我们初步学习完线程之后,就要来试着写一写多线程了。在写之前,我们需要继续来学习一个线程接口——叫做线程分离。 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法…...

BMS工具箱用来执行贝叶斯模型平均(BMA)计算模块

贝叶斯模型平均(Bayesian Model Averaging,BMA)是一种用于处理模型不确定性的统计方法,通过结合多个模型的预测结果来提高预测的准确性和鲁棒性。在 MATLAB 中,可以使用专门的工具箱(如 BMS 工具箱&#xf…...

Java死锁排查:线上救火实战指南

想象一下,你正在值班,突然监控告警红成一片,用户反馈雪花般飘来:“系统卡死了!用不了了!” —— 这很可能就是Java应用遭遇了“死锁”这个大魔王。这时候,你就是救火队长,首要任务不…...

第十九次博客打卡

今天学习的内容是Java中的常见循环。 在 Java 中,常见的循环结构主要有以下几种:for 循环、while 循环、do-while 循环以及增强型 for 循环(也称为 for-each 循环)。 1. for 循环 for 循环是一种非常灵活的循环结构&#xff0c…...

智能体制作学习笔记1——智能体

01 智能体_哔哩哔哩_bilibili 大语言模型可以理解成一个很厉害的人。 但是要完成一些特定的工作,除了大语言模型,还需要一些工具和业务流程,这样才能自动化帮我们完成特定的工作,这个就叫做智能体。 突然发现放视频的时候出现了…...

Python常见问题

文章目录 1.python有哪些数据类型2.python中的元组和列表的区别是什么?3.python中的break、continue、pass代表什么意思?4.如何在python中生成一个随机数?5.Python有哪些常见的内置函数?6.请用自己最擅长的编程语言,将…...

小程序 存存上下滑动的页面

推荐阅读文档: Vue3组合式API之getCurrentInstance详解 - 且行且思 - 博客园Vue2中,可以通过this来获取当前组件实例; Vue3中,在setup中无法通过this获取组件实例,console.log(this)打印出来的值是undefined。 在Vue3…...

更换git位置并在pycharm中重新配置

更新 PyCharm 中的 Git 路径 更新 PyCharm 终端的 Shell 路径 检查环境变量 确保系统环境变量中的 Path 包含了新的 Git 安装路径 ,如果使用unins0000自动卸载就不会有旧路径。...

AI世界的崩塌:当人类思考枯竭引发数据生态链断裂

AI世界的崩塌:当人类思考枯竭引发数据生态链断裂 ——论过度依赖AI创作对技术进化的反噬 一、数据生态的恶性循环:AI的“自噬危机” 当前AI模型的训练依赖于人类创造的原始数据——书籍、论文、艺术作品、社交媒体动态等。据统计,2025年全球…...

OkHttp连接池

🧰 调整连接池的核心参数 ✅ 最大空闲连接数(maxIdleConnections): 含义:连接池中最多保留的空闲连接数量。默认值:5建议值:10~50(视并发量而定) ✅ 连接保持时间&…...

哈希表的实现01

文章目录 哈希表的实现01哈希概念直接定址法哈希冲突负载因子将关键字转换为整数 哈希函数除法散列法:乘法散列法(了解)全域散列法(了解) 处理哈希冲突(开放定址法)线性探测:二次探测…...

学习日志06 java

还有四天要去比赛了,能赢吗?逼自己一把。。。!!加油! 1 对比一下java重写还是不重写tostring的区别 1. 不重写 toString() 的情况 java class Point {private int x;private int y;public Point(int x, int y) {th…...

spring中的@MapperScan注解详解

一、核心功能与作用 MapperScan是Spring与MyBatis框架集成时用于批量扫描Mapper接口的核心注解,其主要功能包括: 自动注册Mapper接口 通过指定包路径,Spring会自动扫描该路径下的所有Mapper接口,并将其注册为Spring Bean&#x…...

PYTHON训练营DAY25

BUG与报错 一、try else try:# 可能会引发异常的代码 except ExceptionType: # 最好指定具体的异常类型,例如 ZeroDivisionError, FileNotFoundError# 当 try 块中发生 ExceptionType 类型的异常时执行的代码 except: # 不推荐:捕获所有类型的异常&…...

视频图像压缩领域中 DCT 的 DC 系数和 AC 系数详解

引言 在数字图像与视频压缩领域,离散余弦变换(Discrete Cosine Transform, DCT)凭借其卓越的能量集中特性,成为JPEG、MPEG等国际标准的核心技术。DCT通过将空域信号映射到频域,分离出DC系数(直流分量&…...

YOLO v1:目标检测领域的革命性突破

引言 在计算机视觉领域,目标检测一直是一个核心任务,它不仅要识别图像中的物体类别,还要确定物体的精确位置。传统目标检测方法如R-CNN系列虽然准确率高,但计算复杂度高、速度慢。2016年,Joseph Redmon等人提出的YOLO…...

AI智能体 | 使用Coze一键制作“假如书籍会说话”视频,18个作品狂吸17.6万粉,读书博主新标杆!(附保姆级教程)

目录 一、整体工作流设计 二、制作工作流 2.1 开始节点 2.2 大模型_生成对话文案 2.3 代码_字幕切割 2.4 画板_对话背景 2.5 循环_对话语音01 2.5.1 选择器_2 2.5.2 语音合成02 2.5.3 语音合成03 2.5.4 变量聚合_1 2.5.5 视频合成01 2.6 循环_3 2.6.1 选择器_3 …...

HVV蓝队实战面试题

HVV蓝队实战,防守筹备之“部署蜜罐捕获横向扫描行为”。 蜜罐通过模拟内网脆弱服务(如SMB、SSH、数据库端口),诱捕攻击者突破边界后的横向探测行为。 通过监测高频端口扫描、非常规协议请求及非授权IP段遍历,结合多源…...

正则表达式(二)-高级应用_谨慎使用

没事建议别瞎用正则表达式,能让后端处理好的数据,尽量后端处理好,减少前端对数据的处理,保证数据原始的完整性,减少前端耗能。(其实就是懒╮(╯▽╰)╭) 1. 分组捕获 分组捕获用于提取匹配的子字符串,使用 () 定义分组。 示例:提取日期中的年、月、日 (\d{4})-(\d{2…...

在K8S集群中部署EFK日志收集

目录 引言环境准备安装自定义资源部署ElasticsearchMaster 节点与 Data 节点的区别生产优化建议安装好以后测试ES是否正常部署Fluentd测试filebeat是否正常推送日志部署Kibana获取账号密码,账号是:elastic集群测试 引言 系统版本为 Centos7.9内核版本为…...

解决常见数据库问题:保障数据安全与稳定的全方位指南

本文结合行业最佳实践与前沿技术,系统性总结数据库运维中的核心问题与解决方案,助力开发者构建高可靠、高性能的数据服务) 一、性能优化:从SQL到架构的全面调优 性能问题是数据库运维中最常见的挑战,直接影响用户体验…...

武汉科技大学人工智能与演化计算实验室许志伟课题组参加2025中国膜计算论坛

武汉科技大学人工智能与演化计算实验室许志伟课题组参加2025中国膜计算论坛 2025年5月9日至11日,第五届中国膜计算论坛(CWMC 2025)在成都信息工程大学隆重召开。会议由 国际膜计算学会(IMCS) 主办,汇聚了来…...

Femap许可硬件绑定

在电磁仿真领域,Femap软件因其卓越的性能和广泛的应用场景而备受用户青睐。为了确保软件的安全与稳定运行,Femap提供了许可硬件绑定的功能。本文将详细介绍Femap许可硬件绑定的概念和优势,帮助您了解并充分利用这一功能,确保软件在…...

构建优雅对象的艺术:Java 建造者模式的架构解析与工程实践

一、建造者模式的本质与核心价值 在面向对象的软件设计中,创建复杂对象一直是一个需要精心处理的问题。当一个对象的构建需要多个步骤,并且这些步骤具有不同的组合方式时,传统的构造函数方式会显得力不从心。建造者模式(Builder …...

vim启动的时候,执行gg

在 Vim 编辑器中,gg 命令是一个非常有用的命令,它可以将光标快速移动到当前窗口的顶部(即第一行)。如果你想在 Vim 启动时自动执行 gg 命令,有几种方法可以实现这一点: 方法 1:使用 Vim 的启动…...

【SSL部署与优化​】​​HTTP/2与HTTPS的协同效应

HTTP/2与HTTPS的协同效应:为何HTTP/2强制要求TLS 1.2? HTTP/2是HTTP协议的现代升级版,旨在通过多路复用、头部压缩等技术提升性能。然而,HTTP/2的设计与部署与HTTPS(TLS加密)紧密相关,甚至强制…...

JavaScript篇:揭秘函数式与命令式编程的思维碰撞

大家好,我是江城开朗的豌豆,一名拥有6年以上前端开发经验的工程师。我精通HTML、CSS、JavaScript等基础前端技术,并深入掌握Vue、React、Uniapp、Flutter等主流框架,能够高效解决各类前端开发问题。在我的技术栈中,除了…...

ubuntu24.04上安装NVIDIA driver+CUDA+cuDNN+Anaconda+Pytorch

一、NVIDIA driver 使用Ubuntu系统的:软件和更新——>附加驱动,安装NVIDIA驱动。 二、CUDA 安装命令:sudo apt install nvidia-cuda-toolkit 三、cuDNN cuDNN 9.10.0 Downloads | NVIDIA Developer 四、Anaconda Download Anaconda Di…...

vue3基础学习(上) [简单标签] (vscode)

目录 1. Vue简介 2. 创建Vue应用 2.1 下载JS文件 2.2 引用JS文件 2.3 调用Vue方法​编辑 2.4 运行一下试试: 2.5 代码如下 3.模块化开发模式 3.1 Live Server插件 3.2 运行 4. 常用的标签 4.1 reactive 4.1.1 运行结果 4.1.2 代码: 4.2 ref 4.2.1 运行结果 4.2.2…...

.Net HttpClient 使用代理功能

HttpClient 使用代理功能 实际开发中,HttpClient 通过代理访问目标服务器是常见的需求。 本文将全面介绍如何在 .NET 中配置 HttpClient 使用代理(Proxy)功能,包括基础使用方式、代码示例、以及与依赖注入结合的最佳实践。 注意…...

深入理解Java适配器模式:从接口兼容到设计哲学

引言:接口不兼容的困局 在软件开发中,我们经常遇到这样的场景: 旧系统有一个「RS232串口设备」(仅支持sendByRS232(String data)方法),新系统需要通过「USB接口」(要求sendByUSB(String data)…...

非异步信号安全函数

这个程序演示了如何使用sigaction来捕获和处理信号(特别是SIGINT,即CtrlC)。以下是关键点和潜在问题的分析: 程序功能 信号捕获:注册自定义处理函数handler来捕获信号2(SIGINT,通常由CtrlC触发…...

PHP黑白胶卷底片图转彩图功能 V2025.05.15

关于底片转彩图 传统照片底片是摄影过程中生成的反色图像,为了欣赏照片,需要通过冲印过程将底片转化为正像。而随着数字技术的发展,我们现在可以使用数字工具不仅将底片转为正像,还可以添加色彩,重现照片原本的色彩效…...

【C++ / STL】封装红黑树实现map和set

文章目录 一. 源码及框架分析1.决定搜索类型的传参思考:为什么要传第一个参数 2.KeyOfValue的作用 二. 模拟实现map和set1. 实现出复用红黑树框架,并支持insert2. 支持iterator的实现iterator实现思路分析【iterator操作实现详解】 3.支持map的[ ]操作4.map和set代码…...

记录: Windows下远程Liunx 系统xrdp 用到的一些小问题(免费踩坑 记录)

采用liunx Ubuntu22.04版本以下,需要安装 xrdp 或者VNC 具体过程就是下载 在linux命令行里 首先更新软件包:sudo apt update 安装xrdp服务:sudo apt install xrdp 启动XRDP:sudo systemctl start xrdp(如果在启动的…...

WordPress 文章和页面:它们的区别是什么?

很多刚接触WordPress的用户,在创建网站内容时往往会遇到这样一个问题:“我应该用‘文章’还是‘页面’?”虽然两者都能发布内容,但它们之间到底有什么区别呢?这篇文章将从易于理解的角度,帮助大家厘清WordP…...

【工具变量】各省市场化指数-杨兴权版共三个方法(1997-2023年)

市场化指数是衡量中国各地区市场化改革进程的重要指标。本次数据基于杨兴全、马连福和夏立军三位学者的研究成果,系统整理并更新了我国1997-2023年间31个省、自治区、直辖市的市场化指数,便于研究者进行横向和纵向比较分析。 一、数据介绍 数据名称&…...

Android App View——团结引擎车机版实现安卓应用原生嵌入 3D 开发场景

团结引擎 1.5.0 版本已于 4 月 14 日正式发布,从 1.5.0 版本开始,团结引擎车机版带来了一个激动人心的新能力 —— Android App View。现在,开发者可以将任意第三方安卓应用以 2D 组件或 3D 组件的形式,原生嵌入到 Tuanjie 开发的…...

完整的 CentOS 6.10 虚拟机安装启动脚本

好的!下面是一个 完整的 CentOS 6.10 虚拟机安装启动脚本,专为你在 macOS(M 系芯片) QEMU(x86_64 软件模拟) 环境设计,确保你能顺利启动并安装一个接近 Red Hat 6.4 的开发环境。 ⸻ ✅ 前提准…...

如何远程执行脚本不留痕迹

通常我们在做远程维护的时候,会有这么一个需求,就是我想在远程主机执行一个脚本,但是这个脚本我又不想保留在远程主机上,那么有人就说了,那就复制过去再登录远程执行不就行了吗?嗯嗯,但是这还不…...

观测云:从云时代走向AI时代

过去十年,云计算让企业的数据处理能力实现了指数级增长,而观测云作为全栈监控观测平台,见证并参与了这一进程。通过强大的数据采集、处理与展示能力,观测云帮助数百家企业实现了对 IT 基础设施、应用服务、业务链路的全面掌控。 …...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- consistency is the key

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- consistency is the key DeepSeek v3的时候,它模型已经足够强大到能带来consistency稳定性。所以当这个DeepSeek R1 Zero或者DeepSeek R1使用GRPO进行训练的时候,它能够…...

鸿蒙OSUniApp 实现图片上传与压缩功能#三方框架 #Uniapp

UniApp 实现图片上传与压缩功能 前言 在移动应用开发中,图片上传是一个非常常见的需求。无论是用户头像、朋友圈图片还是商品图片,都需要上传到服务器。但移动设备拍摄的图片往往尺寸较大,直接上传会导致流量消耗过大、上传时间过长&#x…...