SOME/IP--协议英文原文讲解5
前言
SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块:
1. SOME/IP协议讲解
2. SOME/IP-SD协议讲解
3. python/C++举例调试讲解
这一章节是按照规范文档顺序讲解的。按内容 这章节应该排在 string/arry数据类型讲解完 再讲 才好理解。读者可直接先阅读 后面string/arry内容后再回过来看这一节。
4.1.4.3 Structured Datatypes and Arguments with Identifier and optional members (’TLV’)
To achieve enhanced forward and backward compatibility, an additional Data ID can
be added in front of struct members or method arguments. The receiver then can
skip unknown members/arguments, i.e. where the Data ID is unknown. New members/arguments can be added at arbitrary positions when Data IDs are transferred in the
serialized byte stream.
Moreover, the usage of Data IDs allows describing structs and methods with optional
members/arguments. Whether a member/argument is optional or not, is defined in the
data definition.
Whether an optional member/argument is actually present in the struct/method or not,
must be determined during runtime. How this is realized depends on the used programming
language or software platform (e.g. using a special available flag, using a
special method, using pointers which might be null, ...).
给结构体每个成员前加个数据ID 用于标识当前methed/notify/struct每个参数成员的唯一性。这样的一个好处就是就是可以向前、后兼容。另一个好处就是同一个method/notify的参数列表(也可以理解成结构体成员,只是对连续多个数据组织方式的一种描述)可以做配置项--打开或关闭,这个要在运行时体现,需要在代码中配置好。比如:同一个method, 根据不同的入参请求 返回不同的参数表。后面说的dataID 也可以称为Tag.
发送端给需要发送的成员的前添加ID,接收端就可以根据ID判断 是哪个成员参数,无法识别的就跳过。这样成员的顺序就没强制要求。
注意:上面说的参数列表是notify/method的所有参数。TLV-struct如果是被嵌套在另一个非TLV的struct中,那TLV-struct就是notify/method就是参数的一部分。SOME/IP TLV的用法和Protobuf协议中TLV一样,可以做参考。
### **TLV的缺点:**
1. **数据冗余:**
- 每个字段都有Tag和Length,会增加传输的数据量。
2. **实现复杂度提升:**
- 需要为TLV的序列化和反序列化设计专门的逻辑。
- 特别是Tag和Length的编码需要一致性,并需要在传输前进行规划。
---
### **总结:TLV的必要性**
尽管直接传输结构体在简单系统中更高效,但在复杂通信场景(如AUTOSAR车载系统)中,使用TLV提供了以下关键优势:
- **前向兼容性**:支持较新版本的字段。
- **后向兼容性**:跳过旧版本不支持的字段。
- **动态扩展性**:支持可选字段和未来扩展。
[PRS_SOMEIP_00201]
Upstream requirements: RS_SOMEIP_00050
A Data ID shall be unique within the direct members of a struct or arguments of a
method. 同一个method/notify/struct的 数据成员ID 要唯一,否则不需要唯一。
Note:
Please note that a Data ID does not need to be unique across different structs or
methods.
Note:
Please note that neither the AUTOSAR Methodology nor AUTOSAR CP RTE, nor
AUTOSAR AP ara::com support the definition or usage of optional method arguments
at the time being. --- 不过现在的AUTOSAR版本不支持可变参数列表的功能
[PRS_SOMEIP_00230]
Upstream requirements: RS_SOMEIP_00050
A Data ID shall be defined either for all members of the same hierarchical level of a
struct or for none of them. -- 同一层次级别的所有参数成员 要么都有ID标识 要么都没有。
[PRS_SOMEIP_00231]
Upstream requirements: RS_SOMEIP_00050
A Data ID shall be defined either for all arguments of a method or for none of them.
In addition to the Data ID, a wire type encodes the datatype of the following member.
Data ID and wire type are encoded in a so-called tag. dataID中有专门几个位是wire-type,用来表示后面携带数据的数据类型,用以反序列化时知道后面数据类型的长度。
[PRS_SOMEIP_00202]
Upstream requirements: RS_SOMEIP_00050
The length of a tag shall be two bytes. tag ID 占用两个字节
WireType是第一个字节的4-6位,真正的DataID占12位。图中后面跟的长度域加个框表示可能有这个长度域--由wrie type决定。
[PRS_SOMEIP_00204]
Upstream requirements: RS_SOMEIP_00050
The lower significant part of the Data ID of the member shall be encoded in bits 7-0
of the second byte of the tag. The higher significant part of the Data ID of the member
shall be encoded in bits 3-0 of the first byte.
Example:
The Data ID of the member is 0x04F2. Then bits 3-0 of the first byte are set to 0x4.
The second byte is set to 0xF2.
举例说明了 DataID怎么编码。
WireType对应的类型 解释。--后面详解
Note: wire type 4 ensures the compatibility with the current approach where the size of length fields is statically configured. This approach has the drawback that changing the size of the length field during evolution of interfaces is always incompatible. Thus, wire types 5, 6 and 7 allow to encode the size of the used length field in the transferred byte stream. A serializer may use this, if the statically configured size of the length field is not sufficient to hold the current size of the data struct.
类型4-7 对应的数据类型是Arry/struct/string中的一种,类型4的长度字段是客户自定,定好后编程、通信双方按照这个配置来序列化、反序列化。类型5-7则对应添加1、2、4字节的长度段。
[PRS_SOMEIP_00206]
Upstream requirements: RS_SOMEIP_00050
If the wire type is set to 5, 6 or 7, the size of the length field defined in the data
definition shall be ignored and the size of the length field shall be selected according
to the wire type.
If a Data ID is configured for a member of a struct/argument of a method, a tag shall
be inserted in the serialized byte stream.
Note:
regarding the existence of Data IDs, refer to [PRS_SOMEIP_00230] and
[PRS_SOMEIP_00231].
wireType 5-7 因为添加了长度字段,则需要忽略后面数据类型中前面的长度字段。如果是struct类型,前面有客户指定添加的长度段(通信双方都应知道)需要忽略,但是struct成员中的类型可能前面有长度字段 ,则不能忽略。
有DataID,必然有Tag。
[PRS_SOMEIP_00212]
Upstream requirements: RS_SOMEIP_00028, RS_SOMEIP_00050
If the datatype of the serialized member/argument is a basic datatype (wire types 0-3)
and a Data ID is configured, the tag shall be inserted directly in front of the member/argument.
No length field shall be inserted into the serialized stream. wireType是0-3则数据前不需要长度段。
[PRS_SOMEIP_00213]
Upstream requirements: RS_SOMEIP_00028, RS_SOMEIP_00050
If the datatype of the serialized member/argument is not a basic datatype (wire type
4-7) and a Data ID is configured, the tag shall be inserted in front of the length field. wireType是4-7则数据前必需要长度段。tag字段必须要在长度段之前。
[PRS_SOMEIP_00214]
Upstream requirements: RS_SOMEIP_00028, RS_SOMEIP_00050
If the datatype of the serialized member/argument is not a basic datatype and a Data
ID is configured, a length field shall always be inserted in front of the member/argument.
Rationale:
The length field is required to skip unknown members/arguments during deserialization.长度段的作用是在反序列化时跳过未知的数据成员(dataID)。
[PRS_SOMEIP_00221]
Upstream requirements: RS_SOMEIP_00040, RS_SOMEIP_00050
The length field shall always contain the length up to the next tag of the struct.长度字段描述的长度必须要包含截至到下一个tag字段之前。
[PRS_SOMEIP_00208]
Upstream requirements: RS_SOMEIP_00040, RS_SOMEIP_00050
If the members/arguments itself are of type struct, there shall be exactly one length
field. The length field is added according to requirements [PRS_SOMEIP_00079] and
[PRS_SOMEIP_00370]. 如果TLV数据成员本身就是struct类型,则前面必须要加上长度字段。(前面章节有讲:如果非TLV的数据则struct类型前 的长度字段是可配置的,可以有 也可以没有 需要客户指定)。
[PRS_SOMEIP_00225]
Upstream requirements: RS_SOMEIP_00050
If the members/arguments itself are of type dynamic length string, there shall
be exactly one length field. The length field is added according to requirements
[PRS_SOMEIP_00089], [PRS_SOMEIP_00090], [PRS_SOMEIP_00093],
[PRS_SOMEIP_00094] and [PRS_SOMEIP_00095]. 如果TLV数据成员是动态长度string类型,则前面必须要加上一个长度字段。(后面章节讲:正常非TLV 动态长度string类型也要有,不过这里明确指出 意思是不能省略这个长度段)。
[PRS_SOMEIP_00224]
Upstream requirements: RS_SOMEIP_00050
If the members/arguments itself are of type fixed length string, there shall be exactly
one length field corresponding to dynamic length strings.如果TLV数据成员是定长string类型,则前面必须要加上一个长度字段。
Note:
when serialized without tag, fixed length strings do not have a length field. For the
serialization with tag, a length field is also required for fixed length strings in the same
way as for dynamic length strings.(后面章节讲:正常非TLV 定string类型是没有的)但是TLV的类型需要加上这个长度字段 (和动态长度string一样)。
[PRS_SOMEIP_00227]
Upstream requirements: RS_SOMEIP_00050
If the members/arguments itself are of type dynamic length array, there shall be
exactly one length field. The length field is added according to requirements
[PRS_SOMEIP_00376], [PRS_SOMEIP_00107], [PRS_SOMEIP_00377] with a size
of 8, 16 or 32 bit.
[PRS_SOMEIP_00226]
Upstream requirements: RS_SOMEIP_00050
If the members/arguments itself are of type fixed length array, there shall be exactly
one length field corresponding to dynamic length arrays.
不管是定长、动态Arry类型 如果是TLV类型 则前面必须要加上长度字段,具体添加规则参考需求:[PRS_SOMEIP_00376], [PRS_SOMEIP_00107], [PRS_SOMEIP_00377]
[PRS_SOMEIP_00228]
Upstream requirements: RS_SOMEIP_00050
If the members/arguments itself are of type union, there shall be exactly one length
field. The length field is added according to requirements [PRS_SOMEIP_00119],
[PRS_SOMEIP_00121] with a size of 8,16 or 32 bit.
[PRS_SOMEIP_00229]
Upstream requirements: RS_SOMEIP_00050
If the members/arguments itself are of type union, the length field shall cover the size
of the type selector field, data and padding bytes.
Note:
For the serialization without tags, the length field of unions does not cover the type
selector field (see [PRS_SOMEIP_00126]). For the serialization with tags, it is required
that the complete content of the serialized union is covered by the length field.
联合体类型 需要在前面加上长度字段,添加方法参见:[PRS_SOMEIP_00119],
[PRS_SOMEIP_00121],但不同的是,TLV类型联合体前的长度字段描述的长度必须涵盖联合体的最大长度(序列化时,实际长度小于最大长度,后面添加空白字节)(注意:正常非TLV的联合体是不用覆盖最大长度的)。
[PRS_SOMEIP_00210]
Upstream requirements: RS_SOMEIP_00028, RS_SOMEIP_00050
A member of a non-extensible (standard) struct which is of type extensible struct, shall
be serialized according to the requirements for extensible structs.
[PRS_SOMEIP_00211]
Upstream requirements: RS_SOMEIP_00028, RS_SOMEIP_00050
A member of an extensible struct which is of type non-extensible (standard) struct,
shall be serialized according to the requirements for standard structs.
当一个非可扩展(标准)结构的成员是一个可扩展结构的类型时,这个成员应当按照可扩展结构的序列化要求来进行序列化。当一个可扩展结构的成员是一个非可扩展(标准)结构的类型时,这个成员应当按照非可扩展(标准)结构的序列化要求来进行序列化。
non-extensible (standard) struct:非TLV struct
extensible struct:TLV 带tag的struct
具体的意思是:TLVstrtuct嵌套个 非TLVstruct成员则成员序列化时这个非TLVstruct成员前面要加上tag/dataID。非TLVstrtuct嵌套个 TLVstruct成员则成员序列化时这个TLVstruct成员前不用加tag/dataID。
[PRS_SOMEIP_00222]
Upstream requirements: RS_SOMEIP_00029, RS_SOMEIP_00050
The alignment of variable length data according to [PRS_SOMEIP_00611] shall always be 8 bit.
Rationale:
When alignment greater 8 bits is used, the serializer may add padding bytes after
variable length data. The padding bytes are not covered by the length field. If the
receiver does not know the Data ID of the member, it also does not know that it is
variable length data and that there might be padding bytes.
对于可变长度的成员内存对齐采用1字节对齐。
理由:
- 避免填充字节问题:当使用大于8位的对齐方式时,序列化器可能会在变长数据之后添加填充字节以满足对齐要求。这些填充字节不被长度字段所涵盖,因此接收方在解析数据时可能会遇到困难。
- 接收方信息不足:如果接收方不知道成员的数据ID,它就无法确定该成员是否是变长数据,也无法预测是否存在填充字节。这可能导致数据解析错误或数据丢失。
- 确保数据一致性:通过规定8位对齐,可以确保发送方和接收方在数据对齐方式上达成一致,从而避免由于对齐不一致而导致的数据解析问题。
[PRS_SOMEIP_00241]
Upstream requirements: RS_SOMEIP_00050
If TLV is used the size of the length field for arrays, structs, unions and strings shall
be greater than 0.
Rationale:
The TLV serialization requires the usage of length fields. When wire type 4 is used, the
length field size must be statically configured. When wire types 5-7 (dynamic length
field size) are used, the static configuration of the length field size must also be present
since not all length fields are preceded by a tag, e.g. structs contained in an array or
the top-level struct contained in a SOME/IP event. Not using length fields here would
result in ambiguities.
[PRS_SOMEIP_00242]
Upstream requirements: RS_SOMEIP_00050
The configured size of the length field for arrays, structs, unions and strings shall be
identical.
Rationale:
In case of an unknown member or argument, the deserializer cannot determine the
actual datatype of the member/argument when wire type 4 is used.
该要求指出,在使用类型-长度-值(TLV)序列化时,数组、结构体、联合体以及字符串的长度字段大小必须大于0。
理由:
- TLV序列化的需求:TLV序列化方法要求使用长度字段来明确每个值(Value)部分的大小。这是为了确保在解析序列化数据时能够准确地恢复原始数据结构。
- 长度字段的重要性:当使用特定的线类型(wire type)时(例如线类型4),长度字段的大小需要静态配置。即使使用动态长度字段大小的线类型(如5-7),也需要存在静态配置的长度字段大小,因为并非所有长度字段之前都有标签。例如,数组中包含的结构体或SOME/IP事件中包含的顶级结构体就没有前置标签。如果不使用长度字段,将会导致解析时的歧义。
[PRS_SOMEIP_00243]
Upstream requirements: RS_SOMEIP_00050
The size of the length field shall be configured for the top-level struct or method request/response.
All arrays, unions, structs and strings used within a struct or all arguments within a method shall
inherit the size of the length field from the top-level definition.
Rationale:
In case of an unknown member or argument, the deserializer needs to know the size of
the length field when wire type 4 is used. The easiest way is that the size of the length
field is then only defined at the top-level element.
要求内容:
- 长度字段的大小应为顶级结构体或方法请求/响应配置。
- 在结构体内部使用的所有数组、联合体、结构体和字符串,或者在方法内部使用的所有参数,应当从顶级定义继承长度字段的大小。
理由:
- 当使用线类型4(wire type 4,在Protocol Buffers中表示长度分隔的字段)时,如果遇到未知成员或参数,反序列化器需要知道长度字段的大小。
- 最简单的方式是只在顶级元素处定义长度字段的大小,这样可以在整个数据结构中保持一致,并简化处理逻辑。
[PRS_SOMEIP_00244]
Upstream requirements: RS_SOMEIP_00050
Overriding the size of the length field at a subordinate array, union, struct or string or
at an individual method argument shall not be allowed.
[PRS_SOMEIP_00216]
Upstream requirements: RS_SOMEIP_00028, RS_SOMEIP_00050
The serializer shall not include optional members/arguments in the serialized byte
stream if they are marked as not available.
[PRS_SOMEIP_00220]
Upstream requirements: RS_SOMEIP_00028, RS_SOMEIP_00050
If the serialization with tags will be introduced for an existing service interface where
tags have not been used, the major interface version shall be incremented and used to
indicate this.
Note:
The receiver only handles received messages that match all configured values of Message ID,
Protocol Version, Interface Version and Message-Type (see[PRS_SOMEIP_00195]).
PRS_SOMEIP_00244
上游需求:RS_SOMEIP_00050
要求内容:
不允许在子数组、联合体、结构体或字符串或单个方法参数中覆盖长度字段的大小。
解释:
为了确保数据的一致性和简化处理逻辑,SOME/IP协议要求长度字段的大小在顶级结构体或方法请求/响应中定义后,其内部的所有数据结构或参数必须继承这一大小配置。不允许在下级元素中覆盖这一设置,以避免可能的解析错误或数据不一致。
PRS_SOMEIP_00216
上游需求:RS_SOMEIP_00028, RS_SOMEIP_00050
要求内容:
如果可选成员/参数被标记为不可用,则序列化器不应将其包含在序列化字节流中。
解释:
在SOME/IP协议中,可选成员/参数的存在与否可以通过特定的标记来指示。如果某个可选成员/参数在当前的消息或请求中不可用,那么序列化器在构建要发送的字节流时应该忽略它,以节省带宽和简化处理。
PRS_SOMEIP_00220
上游需求:RS_SOMEIP_00028, RS_SOMEIP_00050**
要求内容:
如果要在未使用标签的现有服务接口中引入带标签的序列化,则应增加主要接口版本并使用它来指示这一点。
解释:
在SOME/IP协议中,服务接口的版本控制对于确保向后兼容性和处理接口更改至关重要。如果要在现有服务接口中引入新的序列化机制(例如,使用标签来区分不同的可选成员/参数),则必须增加主要接口版本以反映这一更改。这样做可以确保接收方能够识别并正确处理新版本的消息,同时仍然能够处理旧版本的消息(如果它们仍然被发送)。
注意:
接收方只处理与配置的消息ID、协议版本、接口版本和消息类型(见[PRS_SOMEIP_00195])完全匹配的消息。这意味着,如果发送方发送了一个与接收方期望的版本或类型不匹配的消息,接收方可能会拒绝处理该消息或返回错误。
这些要求共同确保了SOME/IP协议中的消息能够以一种可预测和一致的方式被序列化和反序列化,从而支持可靠的服务间通信。
4.6例子 的入参是在 请求包中携带那三个参数a b c, 出参d e是在响应报文中携带。并不是在同一条报文中。
https://github.com/0voice
相关文章:
SOME/IP--协议英文原文讲解5
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 这一章节…...
如何优化频繁跳槽后的简历?
大家好!我是 [数擎 AI],一位热爱探索新技术的前端开发者,在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:前端开发 | A…...
存储异常导致的Oracle重大生产故障
📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…...
从家庭IP到全球网络资源的无缝连接:Cliproxy的专业解决方案
数字化时代,家庭IP作为个人或家庭接入互联网的门户,其重要性日益凸显。然而,要实现从家庭IP到全球网络资源的无缝连接,并享受高效、安全、稳定的网络访问体验,往往需要借助专业的代理服务。Cliproxy,作为业…...
java项目之金华学校社团管理系统源码(ssm+mysql)
项目简介 金华学校社团管理系统实现了以下功能: 金华学校社团管理系统的主要使用者管理员对系统用户、公告信息进行管理。对社团信息进行管理,审核报名,统计社团报名结果等。学生维护个人信息,查看本校的社团信息,对…...
链表(LinkedList) 1
上期内容我们讲述了顺序表,知道了顺序表的底层是一段连续的空间进行存储(数组),在插入元素或者删除元素需要将顺序表中的元素整体移动,时间复杂度是O(n),效率比较低。因此,在Java的集合结构中又引入了链表来解决这一问…...
一、OSG学习笔记-编译开发环境
一、准备工作 1、osg3.6.4源码下载; openscenegraph/OpenSceneGraph at OpenSceneGraph-3.6.4 还有osg中所依赖的第三方库 2、cmake 下载安装好 3、Visual Studio 2019下载安装好 二、cmake 编译构建项目 这里下方1,2,两个先点击1&am…...
【Redis】Linux、Windows、Docker 环境下部署 Redis
一、Linux环境部署Redis 1、卸载 # 查看 Redis 是否还在运行 [appuserlocalhost redis]$ ps -ef|grep redis appuser 135694 125912 0 14:24 pts/1 00:00:00 ./bin/redis-server *:6379 appuser 135731 125912 0 14:24 pts/1 00:00:00 grep --colorauto redis# 停止…...
OSPF基础(3):区域划分
OSPF的区域划分 1、区域产生背景 路由器在同一个区域中泛洪LSA。为了确保每台路由器都拥有对网络拓扑的一致认知,LSDB需要在区域内进行同步。OSPF域如果仅有一个区域,随着网络规模越来越大,OSPF路由器的数量越来越多,这将导致诸…...
第436场周赛:按对角线进行矩阵排序、将元素分配给有约束条件的组、统计可以被最后一个数位整除的子字符串数目、最大化游戏分数的最小值
Q1、按对角线进行矩阵排序 1、题目描述 给你一个大小为 n x n 的整数方阵 grid。返回一个经过如下调整的矩阵: 左下角三角形(包括中间对角线)的对角线按 非递增顺序 排序。右上角三角形 的对角线按 非递减顺序 排序。 2、解题思路 遍历所…...
DeepSeek vs. ChatGPT:不同的诞生时间,对人工智能发展的不同影响
DeepSeek vs. ChatGPT:不同的诞生时间,对人工智能发展的不同影响 ChatGPT 和 DeepSeek 诞生于不同的时间节点,代表了人工智能不同阶段的发展方向。它们在技术、应用以及对AI发展趋势的影响方面各有侧重。 1. 诞生时间与背景 ChatGPT&#x…...
chrome-base 如何实现一个BindOnce
考虑一个问题: worker_thread.task_runner()->PostDelayedTask(FROM_HERE, base::BindOnce(&Ref::Foo, ref, 1), base::Milliseconds(1000)); BindOnce 是如何实现的呢? 翻看源码:base\functional\bind.h 写的 非常简洁 // Bind a…...
代码随想录算法训练营day38
代码随想录算法训练营 —day38 文章目录 代码随想录算法训练营前言一、322. 零钱兑换二维dp数组 二、279.完全平方数二维dp数组 三、139. 单词拆分多重背包背包问题总结问题类型递推公式遍历顺序 前言 今天是算法营的第38天,希望自己能够坚持下来! 今日…...
对接DeepSeek
其实,整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。 获取 KEY https://platform.deepseek.com/transactions 直接付款就是了(现在官网暂停充值2025年2月7日࿰…...
【学术投稿-第六届新材料与清洁能源国际学术会议(ICAMCE 2025)】组织与结构:HTML中的<fieldset>与<legend>标签解析
官网:www.icceam.com 简介 第六届新材料与清洁能源国际学术会议(ICAMCE 2025)将于2025年2月21-23日在郑州隆重举行。清洁能源、新材料是当今工业发展中最重要、最有潜力的领域之一。而新型材料又是新能源的基础和保证。本会议主要围绕“清洁…...
网络安全行业的冬天
冬天已经来了,春天还会远吗?2022年10月28日,各个安全大厂相继发布了财报,纵观2022年前三季度9个月,三六零亏了19亿,奇安信亏了11亿,深信服亏了6亿,天融信亏了4亿,安恒亏了…...
PlantUml常用语法
PlantUml常用语法,将从类图、流程图和序列图这三种最常用的图表类型开始。 类图 基础语法 在 PlantUML 中创建类图时,你可以定义类(Class)、接口(Interface)以及它们之间的关系,如继承&#…...
【开源免费】基于SpringBoot+Vue.JS网上服装商城(JAVA毕业设计)
本文项目编号 T 185 ,文末自助获取源码 \color{red}{T185,文末自助获取源码} T185,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
力扣LeetCode: 80 删除有序数组中的重复项Ⅱ
题目: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件…...
Linux之kernel(4)netlink通信
Linux内核(04)之netlink通信 Author: Once Day Date: 2023年1月3日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可查看专栏: Linux内核知识_Once-Day的博客-…...
autMan奥特曼机器人-对接deepseek教程
一、安装插件ChatGPT 符合openai api协议的大模型均可使用此插件,包括chatgpt-4/chatgpt-3.5-turbo,可自定义服务地址和模型,指令:gpt,要求Python3.7以上,使用官方库https://github.com/openai/openai-pyt…...
Java 大视界 -- Java 大数据在智能政务中的应用与服务创新(78)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
RestTemplate Https 证书访问错误
错误信息 resttemplate I/O error on GET request for “https://21.24.6.6:9443/authn-api/v5/oauth/token”: java.security.cert.CertificateException: No subject alternative names present; nested exception is javax.net.ssl.SSLHandshakeException: java.security.c…...
自动化测试
import os import pyautogui# 将鼠标移动到屏幕坐标 (100, 100) 位置,移动时间为 1 秒 pyautogui.moveTo(100, 100, duration1)# 将鼠标从当前位置向右移动 50 像素,向下移动 50 像素,移动时间为 0.5 秒 pyautogui.moveRel(50, 50, duration0…...
【C编程问题集中营】使用数组指针时容易踩得坑
【C编程问题集中营】使用数组指针时容易踩得坑 文章目录 【C编程问题集中营】使用数组指针时容易踩得坑一、获取数组首地址二、应用场景举例2.1 正常场景2.2 异常场景 三、总结 一、获取数组首地址 一维数组的首地址即数组第一个元素的指针,常用的获取一维数组首地…...
【分布式理论8】分布式调用之:四种IO模型
文章目录 一. 四种IO模型1. 同步阻塞 IO(Blocking IO)2. 同步非阻塞 IO(Non-blocking IO)3. IO 多路复用(IO Multiplexing)4. 异步 IO(Asynchronous IO)在 RPC 中的作用5. 总结 选择…...
MySQL 库建表数量有限制吗?
问:MySQL 库建表数量有限制吗? 答:无限制 官方文档: MySQL has no limit on the number of databases. The underlying file system may have a limit on the number of directories. MySQL has no limit on the number of tabl…...
使用OpenGL自己定义一个button,响应鼠标消息:掠过、点击、拖动
button需要有一个外观 外观 大小跟随窗口改变,采用纯色背景、纯色文字 文字 大小跟随窗口改变 button需要获得鼠标消息 掠过 鼠标掠过时 button 出现阴影,鼠标掠过后 button 阴影消失 点击 点击后进入相应事件 拖动 改变图标所在位置 需要在g…...
基础入门-网站协议身份鉴权OAuth2安全Token令牌JWT值Authirization标头
知识点: 1、网站协议-http/https安全差异(抓包) 2、身份鉴权-HTTP头&OAuth2&JWT&Token 一、演示案例-网站协议-http&https-安全测试差异性 1、加密方式 HTTP:使用明文传输,数据在传输过程中可以被…...
【Python】元组
个人主页:GUIQU. 归属专栏:Python 文章目录 1. 元组的本质与基础概念1.1 不可变序列的意义1.2 元组与数学概念的联系 2. 元组的创建方式详解2.1 标准创建形式2.2 单元素元组的特殊处理2.3 使用 tuple() 函数进行转换 3. 元组的基本操作深入剖析3.1 索引操…...
深度求索与DeepSeek-R1:探索人工智能的新纪元
深度求索与DeepSeek-R1:探索人工智能的新纪元 引言 在当今快速发展的科技领域,尤其是人工智能(AI)方面,每隔一段时间就会出现一款革命性的产品或技术,彻底改变我们对这一领域的认知。2025年初,…...
java: framework from BLL、DAL、IDAL、MODEL、Factory using oracle
oracel 21c sql: -- 创建 School 表 CREATE TABLE School (SchoolId CHAR(5) NOT NULL,SchoolName NVARCHAR2(500) NOT NULL,SchoolTelNo VARCHAR2(8) NULL,PRIMARY KEY (SchoolId) );CREATE OR REPLACE PROCEDURE addschool(p_school_id IN CHAR,p_school_name IN NVARCHAR2,p…...
kafka生产端之架构及工作原理
文章目录 整体架构元数据更新 整体架构 消息在真正发往Kafka之前,有可能需要经历拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)等一系列的作用,那么在此之后又会…...
DeepSeek结合Langchain的基本用法
DeepSeek结合Langchain的基本用法 DeepSeek 基于Openai接口规范的Prompt应答Deepseek结合LangchainDeepSeek 基于langchain的结构化返回 DeepSeek 基于Openai接口规范的Prompt应答 首先我们需要先基于pip 安装 pip install openai最开始我们先熟悉如何使用openai的接口规范&a…...
Python与java的区别
一开始接触Python的时候,哔哩视频铺天盖地,看了很多人主讲的,要找适合自己口味的,各种培训机构喜欢在各种平台引流打广告,看了很多家,要么就是一个视频几个小时,长篇大论不讲原理只讲应用&#…...
win10 llamafactory模型微调相关① || Ollama运行微调模型
目录 微调相关 1.微调结果评估 2.模型下载到本地 导出转换,Ollama运行 1.模型转换(非常好的教程!) 2.Ollama 加载GGUF模型文件 微调相关 1.微调结果评估 【06】LLaMA-Factory微调大模型——微调模型评估_llamafactory评估-C…...
全国路网矢量shp数据(分不同类型分省份)
科研练习数据 全国路网矢量shp数据(分不同类型分省份) 有需要的自取 数据格式:shp(线) 数据包含类型:城市主干道、城市次干道、城市快速路、城市支路、高速公路、内部道路、人行道、乡村道路、自行车道路…...
RocketMq之Broker注册流程详解
1.前言 前面我也是写过一些关于broker注册到NameServer里的代码分析,但是总感觉写的比较简单,今天这篇的话,算是重新梳理一篇broker注册到NameServer中的代码,感兴趣的可以看下我前面写的几篇博客: 1.NameServer的主…...
关于精度话题的杂谈
“ 浮点值的存储、运算都可能会带来精度损失,了解精度损失背后的机制原因方便我们更好的了解什么情况下会发生精度损失、什么情况下精度损失较大,以及思考怎么避免或减少精度损失。” 01 杂谈 之前在CSDN上写过《关于float浮点值二进制存储和运算精度损失…...
AD域控粗略了解
一、前提 转眼大四,目前已入职上饶一公司从事运维工程师,这与我之前干的开发有着很大的差异,也学习到了许多新的知识。今天就写下我对于运维工作中常用的功能——域控的理解。 二、为什么要有域控,即域控的作用 首先我们必须要…...
emlog最新跨站脚本漏洞(CNVD-2025-01607、CVE-2024-13140)
EMLOG是一款轻量级开源博客和CMS建站系统,速度快、省资源、易上手,适合各种规模的站点搭建,基于PHPMySQL开发。 国家信息安全漏洞共享平台于2025-01-16公布该程序存在跨站脚本漏洞。 漏洞编号:CNVD-2025-01607、CVE-2024-13140 …...
DeepSeek-r1和O1、O3mini谁更强?
DeepSeek-r1和O1、O3mini谁更强? 题目:编写一个 js 程序,显示一个球在旋转的六边形内弹跳。球应该受到重力和摩擦力的影响,并且必须逼真地从旋转的墙壁上弹起 DeepSeek-r1 <!DOCTYPE html> <html> <body> &l…...
代码随想录_二叉树
二叉树 二叉树的递归遍历 144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历 // 前序遍历递归LC144_二叉树的前序遍历 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result new ArrayList<Integer&g…...
时序数据库:Influxdb详解
文章目录 一、简介1、简介2、官网 二、部署1、安装2、配置(1)用户初始化 三、入门(Web UI)1、加载数据(1)上传数据文件(2)代码接入模板 2、管理存储桶(1)创建…...
内存泄漏及检测办法
什么情况下会产生内存泄漏? 内存泄漏如何检测? 使用 valgrind 对象计数 基本思路: 在对象的构造函数中增加计数:每次创建一个对象时,增加一个计数。在对象的析构函数中减少计数:每次销毁一个对象时&…...
BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)
代码地址:BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据) BiGRU双向门控循环单元多变量多步预测,光伏功率预测 一、引言 1.1、研究背景和意义 随着全球对可再生能源需求的不断增长,光伏…...
Leetcode 3448. Count Substrings Divisible By Last Digit
Leetcode 3448. Count Substrings Divisible By Last Digit 1. 解题思路2. 代码实现 题目链接:3448. Count Substrings Divisible By Last Digit 1. 解题思路 这一题的话我们走的是一个累积数组的思路。 首先,我们使用一个cache数组记录下任意段数字…...
青少年编程与数学 02-009 Django 5 Web 编程 03课题、项目结构
青少年编程与数学 02-009 Django 5 Web 编程 03课题、项目结构 一、项目结构项目根目录应用目录其他目录 二、项目设置Django 插件设置项目配置环境变量设置项目目录标记版本控制 三、Django 插件安装 Django 插件配置 Django 插件使用 Django 插件功能 四、扩展插件开发效率插…...
【玩转 Postman 接口测试与开发2_018】第14章:利用 Postman 初探 API 安全测试
《API Testing and Development with Postman》最新第二版封面 文章目录 第十四章 API 安全测试1 OWASP API 安全清单1.1 相关背景1.2 OWASP API 安全清单1.3 认证与授权1.4 破防的对象级授权(Broken object-level authorization)1.5 破防的属性级授权&a…...
UA-Track:不确定性感知端到端3D多目标跟踪
论文地址:https://arxiv.org/pdf/2406.02147 主页:https://liautoad.github.io/ua-track-website/ 3D多目标跟踪(MOT)在自动驾驶感知中起着至关重要的作用。最近基于端到端查询的跟踪器可以同时检测和跟踪对象,这在3D …...