ISO14229 -1 UDS诊断服务记录-001:0x34\0x36\0x37\0x31\0x19\0x14服务报文格式介绍
目录
1、34服务-请求下载
1.1、诊断请求格式
1.2、正响应格式
1.3、负响应格式
1.4、工程应用分析
2、36服务-传输数据
2.1、请求报文格式
2.2、正响应格式
2.3、负响应NRC
3、37服务-退出传输
3.1、报文格式
3.2、正响应格式
3.3、负响应NRC
4、31服务-例程控制
4.1、报文格式
4.2、正响应格式
4.3、负响应NRC
5、19服务-读取DTC信息
5.1、报文格式
6、14服务-清除DTC
6.1、报文格式
7、签名验证
7.1、软件签名及验签方法
7.2、创建指纹数据块
7.3、数据签名
7.4、RSA-PSS填充
7.5、数据解签
1、34服务-请求下载
1.1、诊断请求格式
dataFormatIdentifier
高位表示“Compression Method”,低位表示“Encryption Method”。0x00表示不使用Compression Method和Encryption Method,非0x00值由主车厂自定义。
Compression Method:压缩方法
Encryption Method:加密方法
addressAndLengthFormatIdentifier
bit 3-0表示memoryAddress参数字节数,bit 7-4表示memorySize参数字节数。(一般为0x44表示4个字节地址,4个字节数据长度)
memoryAddress
该参数指定了block在MCU PFlash上写入的起始地址。此处提到的block指的是bootloader、application、标定数据块、指纹信息(包含每个block的起始地址和长度以及相应的hash摘要,用于验签操作)等。在刷写时,会将这每个software part当作一个block刷入到MCU的Flash上。该block与0x36所提到的block不是同一个概念。
如下就有6个地址空间
memorySize
该参数指定了要写入的block的Size大小。
报文格式举例如下
44:表示4字节地址4字节长度
00440000:地址
000310B8:数据长度
1.2、正响应格式
lengthFormatIdentifier
该参数是一个单字节值,每个nibble分别编码:
bit 7 - 4: maxNumberOfBlockLength参数的长度(字节数)。
bit3 - 0:由文档保留,设置为“0”
此参数的格式与请求消息中包含的addressAndLengthFormatIdentifier参数的格式兼容,只是必须将较低的小块设置为“0”。
maxNumberOfBlockLength
该参数指定了可以通过0x36服务一次传输的最大数据量。
若该参数为0x82,也就是说每次通过0x36服务只能最多发送130个字节,其中还包括了SID和blockSequenceCounter,所以说实际上每次可传的数据信息只有128个字节。
上述截图20中的2表示两个字节 00 82 也就是130字节,其实也就是传输128字节。128字节如下图所示传输示例。
以上地址空间为S32K3的例子。
1.3、负响应格式
1.4、工程应用分析
在0x34的service handler中会对请求中的memoryAddress和memorySize进行校验,也就是规定了要写入PFlash的block要在所限定的地址范围内(OTA使用)。
如下示例所示,需要在配置工具中针对相应的block配置地址范围。若要写入的block的地址与所配置的不匹配,则会返回NRC31 (requestOutOfRange)。针对Allowed Write Security levels也需要进行配置。
下图是英飞凌的例子
2、36服务-传输数据
2.1、请求报文格式
blockSequenceCounter
块序列计数器占一个字节,0x34服务后,发送的第一个0x36服务请求的blockSequenceCounter为0x01。之后,每发送一次0x36服务请求,blockSequenceCounter就加1。当增加到0xFF后,下次发送0x36服务请求时blockSequenceCounter = 0x00。
transferRequestParameterRecord
字节长度和参数格式不定,由厂家制定。
正常格式如下
2.2、正响应格式
blockSequenceCounter
对0x36服务请求中的blockSequenceCounter的响应一一对应的。
transferResponseParameterRecord
0x36服务用于下载数据时,该参数为非必选项。
2.3、负响应NRC
3、37服务-退出传输
3.1、报文格式
transferRequestParameterRecord
可选参数,由厂家定义
3.2、正响应格式
3.3、负响应NRC
4、31服务-例程控制
4.1、报文格式
sub-function
子功能,用于指定对例程的操作动作,有以下三种可选项:
-- 0x01: startRoutine(启动例程)
-- 0x02: stopRoutine(停止例程)
-- 0x03: requestRoutineResults(请求例程结果)
routineIdentifier
例程标识符,由两个字节组成,用于指定要控制的例程。部分例程标识符是由ISO定义,部分则是由主机厂或者供应商定义。
routineControlOptionRecord
例程控制可选参数,用于携带其它信息,比如启动条件、退出条件等,一般可以不填。
4.2、正响应格式
routineInfo
一般写个00表示通过,01表示失败。表示条件类的,例如行车过程中禁止升级等。与负响应有很大区别的。
routineStatusRecord
可选参数,用于在执行相应例程操作后,返回ECU相关信息(例如,通过0x31 02服务停止例程中,ECU可以通过该参数返回该例程总运行时间等信息)。可根据实际需要进行使用,一般较少用到。
4.3、负响应NRC
一定要注意响应的优先级。
5、19服务-读取DTC信息
用户通过请求该服务,读取ECU的故障诊断码(DTC)信息,服务的sub-function代表了各式各样读取DTC的方法,UDS给19服务的sub-function从0x00到0x19进行了明确定义。
作用:
0x19服务的主要作用是读取存储在ECU中的故障码信息。这包括故障码的标识符、故障码的状态、故障码的严重性等信息。
通过读取故障码信息,工程师可以了解车辆存在的问题,识别需要进行维修或故障排除的系统,并采取适当的措施来解决问题。
首先看一下故障的状态掩码的解释
bit 0 : testFailed
指示最近执行test的结果,test失败置1,但是它不一定被ECU存储到EEPROM中,只有当bit2或bit3被置1时DTC才会被存储。test通过则置0,如果调用了14服务清除DTC的话,也需要重新置0
“0”= DTC测试的最新结果表明未检测到故障。
“1”= DTC测试的最新结果表明了一个成熟的失败结果。
bit1:testFailedThisMonitoringCycle
该位表示在当前test中,诊断test是否已经报告了一个testFailed结果。当新的检测循环开始时,这个位需要置0,在调用了14服务后也需要置0。如果该位置1,那么一直保持置1状态直到新的检测循环开始,因此bit1可以理解为当前DTC。如果bit2和bit3通常一起使用。
“0”= testFailed:在当前操作周期内或在当前操作周期内调用ClearDiagnosticInformation后,尚未报告testFailed结果。
“1”= testFailed:在当前操作周期中至少报告了一次testFailed结果。
bit2:pendingDTC
根据ISO 14229的定义,当一个test结束时,若某个DTC满足故障触发条件,则bit2置1。bit2位其实是表示DTC处于testFailed和confirmedDTC之间的一个状态,称为待定DTC。因为DTC并不是一达到触发位就会被报出来的,而是故障出现一段时间后才会被确认,而中间的这个状态就用bit2位来表示,因此bit2位又可被称为待定DTC。当某个DTC刚达到判定条件的时候,bit2被置1,若一段时间后故障条件不满足了,则bit2置0,若一段时间后故障仍然存在,那么bit3就要置1了。
“0”= 在完成测试完成且未检测到故障的操作循环后或调用ClearDiagnosticInformation服务时,该位应设置为0。
“1”= 如果在当前操作循环中检测到故障,则该位应设置为1并锁定。
bit3:confirmedDTC
当bit3置1时,说明故障已经发生了一段时间,也就是bit2至少有一次被置1了。需要注意的是,bit3置1的时候,DTC被存储在EEprom中,但并不代表现在故障还存在,所以可以理解为历史故障。在调用14服务清除DTC后需要置0。
“0”= 自上次调用ClearDiagnosticInformation后,或在满足故障诊断码的老化条件(或由于故障记忆溢出而清除了故障诊断码)后,从未确认过故障诊断码。
“1”= 自上次调用ClearDiagnosticInformation后至少确认一次的DTC,且尚未满足老化标准
bit4:testNotCompletedSinceLastClear
因为并不是所有的DTC测试都是从上电就开始的,所以该位用来表示上次调用14服务清除诊断消息后,是否进行过完整的test。如果进行了完整的test,无论结果如何,都置0,否则置1。
“0”= 自上次清除诊断信息以来,DTC测试至少返回一次测试结果(无论通过或失败)。
“1”= 自上次清除诊断信息后,DTC测试尚未运行到完成。
bit5:testFailedSinceLastClear
该位表示在上次调用14服务清除后DTC后,若test DTC未进行测试或者测试了但结果是pass时置0,如果test运行完成并且返回结果为fails,那么该位置1。在调用14服务清除DTC后需要置0。bit4和bit5通常一起使用。
“0”=自上次清除诊断信息后,DTC测试未显示失败结果。如果满足老化阈值或发生故障记忆溢出,则车辆制造商应负责将该位重置为零(“0”)。
“1”=自上次清除诊断信息以来,DTC测试至少返回一次失败结果。
bit6:testNotCompletedThisOperationCycle
该位表示在当前检测循环周期过程中DTC test是否完成,若完成了置0,未完成置1。在调用ClearDiagnosticDTC后需要置1。
“0”= DTC测试在当前驾驶循环期间(或自上次在当前操作循环期间清除诊断信息以来)完成。
“1”= 此操作循环(或自上次清除此操作循环的诊断信息后),DTC测试尚未运行到完成。
bit7:warningIndicatorRequested
该位报告警告指示,比如说仪表盘上的警示灯等。但不是所有的DTC都会有警告指示,如果没有和DTC相关的警告存在,该位应置0;如果该DTC有相关警告指示,bit3置1的时候,bit7也要置1。在调用14服务清除DTC后需要置0。
5.1、报文格式
Service ID (SID): 0x19
请求示例1:19 01 / 19 02
19 01 09 => 根据状态掩码0x09读取匹配的DTC数量
19 02 09 => 根据状态掩码0x09 读取匹配的DTC
19 01正响应格式
19 02正响应格式
对应了以下报文
请求示例 2: 19 04
19 04 00 0101 41 FF => 假设0x000101 是设置的转向灯故障码名称,FF代表读取所以快照数据。读取转向灯故障发送时的快照信息
在此格式下,Service ID + Sub-Funtion + DTCMaskRecord (三个字节) + SnapshotRecordNumber
19 04响应格式
请求示例 3: 19 06
19 06 C1 40 41 FF => 读取转向灯故障发送此时信息
与19 04 格式类似,区别在于最后一个字节时DTCExtDataRecordNumber, DTC扩展数据记录编号。
请求示例 4: 19 0A
发送指令19 0A,读取ECU支持的所有DTC列表以及各DTC的状态。
6、14服务-清除DTC
当请求该服务之后,ECU回复正响应,即使没有存储任何DTC故障信息。若ECU支持内存中多份DTC状态信息副本(例如:一份存在RAM里,一份存在EEPROM里,当然大部分是用flash模仿EEPROM的功能),则ECU会清除0x19 Sub-function 02的服务(ReadDTCInformation)请求的信息副本,即RAM中的那份。
通过本服务重置/清除的DTC信息包括但不限于以下各项数据:
1,DTC状态字节
2,捕获的DTC快照数据
3,捕获的DTC扩展数据
4,其他特定于DTC的相关数据,如最近的DTC,标志,计数器,计时器等。
6.1、报文格式
Service ID Group of DTC
14 XX XX XX
第一个字节就是SID,
后边的三个字节 用于标识将要被删除的DTC种类,UDS规定用FF FF FF表示所有种类的DTC,由厂家自定义代表Powertrain、Chassis、、Body、Network Communication等种类DTC的值。
通常,该服务请求请求报文为14 FF FF FF:清除所有存储的DTC信息。
例如:
TX 04 14 FF FF FF 00 00 00
RX 01 54 AA AA AA AA AA
7、签名验证
7.1、软件签名及验签方法
签名验证的目的在于确认OTA升级包来源的可靠性。
ECU软件签名与验签的整体流程可以分为创建指纹数据块、数据签名和数据解签这三个步骤。其中,创建指纹数据块和数据签名的操作由外部工具链执行,数据解签的操作由ECU执行。流程示意图如下所示:
7.2、创建指纹数据块
指纹数据块,顾名思义,就是包括了整个OTA升级软件包的特征信息。OTA升级包中通常包括Bootloader、Application、Calibration Data等Software Part Block。这里提到的Software Part Block指的是一个地址上连续的block,可以通过在链接脚本中设置填充的方式使其地址连续(例如,Tasking中的fill关键字),如下所示:
memory Bootloader
{mau = 8;size = 256k - 256 - 16k;type = rom;fill = 0x00000000;map cached (dest=bus:sri, dest_offset=0x80040100, size=256k - 256 - 16k);map not_cached (dest=bus:sri, dest_offset=0xa0040100, reserved, size=256k - 256 - 16k);
}
然后通过Hash算法(例如SHA256)针对每个Software Part Block计算出相应的Hash摘要。接着将Software Part Block的数目、每个Software Part Block的起始地址、大小、Hash摘要都按顺序进行排列,从而创建出一个新的数据块。这个数据块就称为指纹数据块。
7.3、数据签名
此处以RSA-PSS算法进行介绍签名流程,RSA算法采用RSA2048,Hash算法采用SHA256。下图展示了生成签名的整体流程。
M
输入消息,此处即为Fingerprint Data Block。
H
Fingerprint Data Block通过SHA256算法计算得到的Hash摘要,其大小为32个字节
EM
32个字节大小的Hash摘要通过PSS算法进行填充后得到的大小为256个字节的加密消息。
S
EM通过使用RSA2048中的私钥K1签名后生成的大小为256个字节的数字签名。
7.4、RSA-PSS填充
RSA-PSS填充
RSA2048算法中的输入和输出的大小都为2048 bit(256 Byte),所以需要使用一种填充算法将32 Byte的Hash摘要填充成为256 Byte的消息。
下图展示了PSS算法进行填充的流程示意图,大体可以分为以下四步:
M转换成M1
M1 = p1 || mHash ||salt
p1为8字节大小的0。
mHash为M(Fingerprint Data Block)通过SHA256生成的消息摘要,大小为32 Byte,即mHash的大小hLen为32。
salt是一个伪随机数,其长度 (sLen)一般等于hLen,此处为32。
构建DB
DB = p2 || salt
p2的值等于若干个字节的0x00,后面跟着1字节的0x01。这若干个字节长度即为xLen,则xLen表达式如下:
xLen = emLen - sLen - hLen -2
其中,emLen指的是EM长度,此处为256。
MGF
RSA-PSS采用的MGF (Mask Generation Function,掩码生成函数) 为MGF1。对于上图而言,MGF所对应的输入和输出如下:
mask = MGF1(mgfSeed, maskLen, hash)
其中,mgfSeed = Hash(M1),Hash函数选择SHA256。
maskLen = emLen - hLen -1
构建EM
EM = maskedDB || H || bc
输入如下所示:
maskedDB = DB xor mask
H = Hash(M1)
bc = 0xBC
其中,bc的长度为1个字节,H的长度为hLen,maskedDB的长度记为(mdbLen)为:
mdbLen = emLen - hLen - 1
7.5、数据解签
数据解签
针对签名的验证流程可以分为如下4个步骤:
解密
使用公钥对S (数字签名) 进行解密,从而得到EM。
分割EM
获取到EM以后,接下来就是分割和验证:
maskedDB, H, bc = Split(EM)
最右一个字节是bc,然后从bc往左数hLen个字节是H,然后剩下的是maskedDB。
如果最右一个字节不是0xBC,则签名验证停止(该数字签名是非法的)。
计算salt
得到H以后,就可以计算mask,
mask = MGF1(H, maskLen, hash)
因为,maskedDB = DB xor mask
所以,DB = maskedDB xor mask
得到DB以后,就可以对其分割
p2, salt = Split(DB)
其中,salt是DB的最右sLen个字节,剩下的是p2。
如果p2的值不等于若干个字节的0x00,后面跟着1字节的0x01,那么验证停止(该数字签名是非法的)。
校验Hash
通过所接收到的M(Fingerprint Data Block),计算Hash摘要:
mHash = Hash(M)
然后构建M1:
M1 = p1 || mHash || salt
接着计算M1的Hash:
H1 = Hash(M1)
比较H1与H,如果两者相等,则签名验证通过。如果不相等,则签名非法。
相关文章:
ISO14229 -1 UDS诊断服务记录-001:0x34\0x36\0x37\0x31\0x19\0x14服务报文格式介绍
目录 1、34服务-请求下载 1.1、诊断请求格式 1.2、正响应格式 1.3、负响应格式 1.4、工程应用分析 2、36服务-传输数据 2.1、请求报文格式 2.2、正响应格式 2.3、负响应NRC 3、37服务-退出传输 3.1、报文格式 3.2、正响应格式 3.3、负响应NRC 4、31服务-例程控制 …...
使用 MediaMTX 和 FFmpeg 推拉 RTSP 流媒体
实时流传输协议 RTSP(Real-Time Streaming Protocol)是 TCP/IP 协议体系中的一个应用层协议,由哥伦比亚大学、网景和 RealNetworks 公司提交的 IETF RFC 标准。该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。RTSP 在体系…...
Mac 电脑安装 Raptor 流程图软件的方法
0. 安装逻辑 (1)运行 raptor,本质上需要 mac 能够运行 windows 程序,因此需要安装 .NET Runtime 7.0,这是微软程序运行必须的文件。 (2)运行 raptor 还需要安装依赖文件 mono-libgdiplus。 &am…...
W801学习笔记二十:宋词学习应用
前三章完成了唐诗的应用,本章将实现宋词的学习应用。 宋词与唐诗的区别不大,马上开始。 1、我们需要参考前面唐诗的方式,把宋词文本下载下来,并进行格式整理。 W801学习笔记十七:古诗学习应用——上 2、在菜单中添加…...
EPAI手绘建模APP转换模型和坐标系
(11) 模型转换 图 273 转换工具栏 ① 实体转成曲面,先选择需要转成曲面的实体模型,再点击该按钮。将选择的实体模型转成多个曲面。 ② 曲线转成NURBS样条曲线,先选择需要转成NURBS样条曲线的边模型,修改转换参数,将选…...
STM32快速入门(串口传输之USART)
STM32快速入门(串口传输之USART) 前言 USART串口传输能实现信息在设备之间的点对点传输,支持单工、半双工、全全双工,一般是有三个引脚:TX、RX、SW_RX(共地)。不需要一根线来同步时钟。最大优…...
什么是网络安全和网络隐私?
什么是网络安全?这个是我最感兴趣的话题,网络安全说白了就是在网络上的安全,跟现实中一样,现实中为了家里的安全,我们会给家门上锁,会装监控,农村的话可能还会养一条狗,只有我们让别人进我们家,别人才能进来,对于计算机来说也是一样的,我们会设置账户的密码,会设置防火墙,会安…...
树莓派变小路由器放出热点wifi
环境 树莓派4Bubuntu20 作用 树莓派放出wifi后,笔记本电脑连接树莓派的wifi,并且ip配置在一个网段,就可以互相通信(笔记本放出wifi,树莓派连接效果一样),这样的好处是树莓派只要一上电就会自…...
数据猎手:使用Java和Apache HttpComponents库下载Facebook图像
引言 在信息驱动的时代,互联网上的数据成为了无可比拟的宝藏。本文旨在探讨如何通过利用Java和Apache HttpComponents库,从全球最大的社交网络平台Facebook上获取图像数据。 作为全球最大的社交网络平台,Facebook聚集了数以亿计的用户&#…...
uniapp——阻止冒泡
点击事件阻止冒泡 click.stop"onSubmit"其他类型,比如视频: 最后加了一个 click.stop <view class"videoBox" v-if"item.video_url"><video :src"i.image(item.video_url)" :controls"true&quo…...
Jmeter性能测试(四)
一、遇到问题解决思路 1、检查请求头是否正确 2、检查请求参数是否正确 3、检查鉴权信息是否正确 4、检查变量作用域 5、检查数据提取是否正确(正则/json提取器) 二、请求头检查 1、在Http信息头管理器查看 2、注意这里的变量作用域是全局的 三、请求参数检查 1、在查看结…...
从零开始精通RTSP之传输ADPCM等音频流
概述 在上一篇文章中,我们详细介绍了使用RTP传输AAC音频流的打包方法。除了AAC编码算法外,常用的音频编码算法还有ADPCM、G711A、G711U、G726等。接下来,我们继续介绍RTP传输ADPCM等音频流的打包方法。 封装方法 RTP封装ADPCM等音频数据时&am…...
box-decoration-break 使用介绍
box-decoration-break属性的使用 一、定义 box-decoration-break是CSS片段模块(CSS Fragmentation Module Level 3)中的一个属性,主要用于指定背景(background)、内边距(padding)、边框&#…...
技术分享 | 京东商品API接口|京东零售数据可视化平台产品实践与思考
导读 本次分享题目为京东零售数据可视化平台产品实践与思考。 主要包括以下四个部分: 1.京东API接口介绍 2. 平台产品能力介绍 3. 业务赋能案例分享 01 京东API接口介绍 02 平台产品能力介绍 1. 产品矩阵 数据可视化产品是一种利用数据分析和可视化技术&…...
OpenHarmony鸿蒙蓝牙BLE调试app
OpenHarmony蓝牙模块提供了ble的功能,本篇提供一个简单的app供测试时使用。代码使用API10,对应4.0Release版本固件。 1.开启BLE 开启BLE前,先在设置界面中打开蓝牙开关。 openBle()函数负责打开ble扫描,并打印扫描结果。主要代…...
HackMyVM-VivifyTech
目录 信息收集 arp nmap nikto whatweb WEB web信息收集 wpscan feroxbuster hydra 提权 系统信息收集 横向渗透 git提权 get root 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:9d:6d:7b, …...
将unity中相机位置保存为json 文件或者 发送给后端
将unity中相机位置保存保存到服务器 ///相机的位置public Transform cameraTransform;void Start(){// SaveCameraPosition("sd");// ("{\"name\":\"sd\",\"position\":\"(0.00, 5.00, -12.00)\",\"rotation\&qu…...
vue2-表单组件封装
创建组件 components/test/index.vue <template><el-form :model"formData">// <!-- 具名插槽 --><slot name"header" /><el-form-itemv-for"(item, index) in formItem":key"index":label"item.la…...
智能家居4 -- 添加接收消息的初步处理
这一模块的思路和前面的语言控制模块很相似,差别只是调用TCP 去控制 废话少说,放码过来 增添/修改代码 receive_interface.c #include <pthread.h> #include <mqueue.h> #include <string.h> #include <errno.h> #include <…...
Python selenium
1.搭建环境 1.安装: pip install msedge-selenium-tools 不要使用pip install selenium,我的电脑上没法运行 2.下载驱动 Microsoft Edge WebDriver |Microsoft Edge 开发人员 edge浏览器点设置---关于即可找到版本号,一定要下载对应版…...
Python内置函数next()详解
Python的next()函数是一个内置函数,用于从迭代器中获取下一个元素。如果迭代器耗尽,则抛出StopIteration异常。 函数定义 next()函数的基本语法如下: next(iterator[, default])iterator:一个迭代器对象。default:可…...
初识指针(1)<C语言>
前言 指针是C语言中比较难的一部分,大部分同学对于此部分容易产生“畏难情结”,但是学习好这部分对C语言的深入很大的帮助,所以此篇主要以讲解指针基础为主。 指针概念 变量创建的本质就是在内存中申请空间,找到这个变量就需要地址…...
uniapp使用vconsole调试 兼容App
前言:引入vconsole发现uniapp打出来的包里,看不到vconsole,uniapp开发的h5需要使用vconsole真机调试,如果直接在main.ts引入,打包后整个项目会页面空白,经实验在单个页面引入可解决,以下是解决方…...
论文笔记模版
1. 摘要 1.1 背景 1.2 挑战 1.3 提出新方法 1.4 贡献 2. 引言 2.1 背景(引出问题) ①介绍大背景: ② 应用场景: ③ 介绍主题: 2.2 引出挑战 一般用图表来展现出我们的挑战(直观,解决什…...
docker-本地私有仓库、harbor私有仓库部署与管理
一、本地私有仓库: 1、本地私有仓库简介: docker本地仓库,存放镜像,本地的机器上传和下载,pull/push。 使用私有仓库有许多优点: 节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下…...
【Go 语言入门专栏】Go 语言的起源与发展
前言 Go 语言是当下最为流行的编程语言之一,大约在 2020、2021 年左右开始于国内盛行,许多大厂很早就将部分 Java 项目迁移到了 Go,足可看出其在性能方面的优越性。 相信各位都知道,在爬虫业务中,并发是一个关键的需…...
发电机组远程管理,提升管控力,降低运维成本
发电机组是指发电机发动机以及控制系统的总称,用来把发动机提供的动能转化为电能。它通常由动力系统、控制系统、消音系统、减震系统、排气系统组成。发电机组远程管理系统利用物联网技术与PLC远程控制模块集成解决方案,在提高发电机组的运行效率、降低运…...
java将文件压缩打包后进行下载
今天受到一个需求,需要查出文件,然后将文件打包后下载。看了下项目里默认代码有压缩功能,以此修改了下,项目使用了hutool。项目是若依项目 定义zip的数据传输对象,ossId可以是文件表的id Data public class SysOssZi…...
【4/26-4/30】 Arxiv安全类文章速览
4/26 标题: Merchants of Vulnerabilities: How Bug Bounty Programs Benefit Software Vendors 作者: Esther Gal-Or, Muhammad Zia Hydari, Rahul Telang摘要: 软件漏洞允许恶意黑客利用,威胁系统和数据安全。本文研究了激励道德黑客发现并负责任地向软件供应商披…...
活动图与状态图:UML中流程图的精细化表达——专业解析系统动态性与状态变迁
流程图是一种通用的图形表示法,用以展示步骤、决策和循环等流程控制结构。它通常用于描述算法、程序执行流程或业务过程,关注于任务的顺序执行。流程图强调顺序、分支和循环,适用于详细说明具体的处理步骤,图形符号相对基础和通用…...
做电子商务系统网站/晋城今日头条新闻
这个问题严格来说是肯定有的,kafka只能保证分区内的有序性。 下面是kafka作者Jay Kreps的blog中介绍kafka设计思想的一段话。 Each partition is a totally ordered log, but there is no global ordering between partitions (other than perhaps some wall-clock…...
国外网站 工信部备案/免费源码下载网站
问题:想要自己构建爬虫和自动化表格,进行数据收集和分析,有哪些好的渠道学习?1.很多人一上来就要爬虫,其实没有弄明白要用爬虫做什么,最后学完了却用不上。大多数人其实是不需要去学习爬虫的,因…...
亚马逊网站建设的意义/总排行榜总点击榜总收藏榜
【http://msdn.microsoft.com/zh-cn/library/bb861909.aspx】 在 Microsoft SharePoint Foundation 中,修改 web.config 设置的一种方法是使用 Microsoft.SharePoint.Administration 命名空间的 SPWebConfigModification 类,这使得您能够动态地对实体进行…...
wordpress商品导出淘宝/学历提升
各位Gopher们,因疫情影响,北京不允许举办大型线下活动,我们在征询过部分Gopher的意见后,决定取消今年的线下大会。对此,我们感到非常遗憾!但各位Gopher也别太过伤心和惋惜,好事多磨,…...
流量型网站 cms/制作网站费用
链接地址:http://www.wrclub.net/news/listnews.aspx?id2630ANDhttp://www.csdn.net/news/newstopic/17/17128.shtml...
怎么做动态的实时更新的网站/免费平台
1. 基本语法test condition或[ condition ]使用括号方式时,条件与括号之间要加空格。2. 测试文件状态例:测试文件 scores.txe 是否可执行。 [rootlocalhost ~]# [ -x scores.txt ] [rootlocalhost ~]# echo $? 1 条件测试可以使用以下条件表达…...