什么是SOME/IP?

news2024/11/26 22:45:37

本文是SOME/IP 官方文档的翻译。原文地址:https://www.autosar.org/fileadmin/standards/R22-11/FO/AUTOSAR_RS_SOMEIPProtocol.pdf

1.引言和概览
2. 协议要求
3. 缩略语和术语

术语/缩略语描述
Byte Order Mark字节顺序标记(byte order mark, BOM)是一个Unicode字符,U+FEFF字节顺序标记(byte order mark, BOM),它作为一个魔数出现在文本流的开头,用于表明所使用的编码
Method可被调用的方法、过程、函数或子程序
Parameters方法或事件的输入、输出或输入/输出参数
Remote Procedure Call (RPC)从一个ECU到另一个ECU的方法调用,使用消息传输
Request客户端发给服务端用来调用方法(Method)的消息
Response服务端响应客户端方法调用的消息
Request/Response communication一次请求/回复过程,也就是RPC
Event(事件)单向数据传输,只在变化时调用或循环调用,从数据的生产者发送到消费者
FieldField(字段)代表一种状态,因此在getter、setter和notifier操作的任何时候都有一个有效值
Notification Event用字段通知的事件消息
Getter允许读取字段的请求/响应调用。
Setter允许对字段进行写访问的请求/响应调用。
Service零个或多个方法、零个或多个事件、零个或多个字段的逻辑组合。
Eventgroup一个服务中事件和字段通知事件的逻辑组合,以便允许订阅
Service Instance一个服务的实现,它可以在车辆上多次存在,也可以在ECU上多次存在
Server提供服务实例的ECU在这个服务实例的上下文中应该被称为服务器。
Client在这个服务实例的上下文中,使用服务器服务实例的ECU应该被称为客户端。
Fire and Forget无回复的请求叫做 解雇并遗忘
User Datagram Protocol一种传输层协议
Union一种动态假设不同数据类型的数据结构
non-extensible (standard) struct序列化时不带标签的结构体。最多可以在结构体末尾以兼容的方式添加新成员,而不能添加可选成员。
extensible struct用标签序列化的结构体。可以在任意位置以兼容的方式添加新成员,也可以添加可选成员。

4. 协议定义

SOME/IP 是一种基于网络的服务导向协议。它基于列出服务提供的功能的服务定义。一个服务可以由零个或多个事件、方法和字段的组合组成。

事件(Events)指由提供者给订阅者,周期性或更改时发送的数据

方法(Methods)为订阅者提供了发出在提供者端执行远程过程调用的可能性

字段(Fields)由下面三种的一个或多个组合而成:
- 一个通知器(notifier),数据发生更改时,由提供者发给订阅者
- 一个getter,它可以被订阅者调用以显式地查询提供者的值
- 一个setter,订阅者在想要更改提供者端上的值时可以调用的setter

字段的通知器和事件的主要区别是事件只在发生变化时发送,字段的通知器在订阅后直接发送数据。

4.1 SOME/IP 消息格式定义(序列化)

序列化描述的是数据以协议数据单元(pdu)的形式表示,作为UDP或TCP消息的有效载荷,在基于ip的车载网络上传输。

4.1.1 SOME/IP 头格式

在这里插入图片描述
SOME/IP 头和E2E头格式
在这里插入图片描述

4.1.1.1 Message ID[32 bit]

消息ID是一个32位的标识符,用于标识对应用程序方法的RPC调用或者标识一个事件。消息ID在配置的时候,要求具备唯一性。

4.1.1.2 Method ID[15 bit]

方法ID是消息ID的一部分

Service ID [16 Bit]0 [1 Bit]Method ID [last 15 Bit]

4.1.1.3 Event ID[15 bit]

事件组是一个服务中事件和字段通知事件的逻辑组合,以便允许订阅。事件ID结构如下表所示:

Service ID [16 Bit]1 [1 Bit]Event ID [last 15 Bit]
  • 空事件组无法使用
  • 事件或者字段通知都必须映射到至少一个事件组里

4.1.1.4 Length [32 Bit]

该字段表示从"Request ID"字段开始,到SOME/IP报文结束的字节长度。

4.1.1.5 Request ID [32 Bit]

请求ID允许提供者和订阅者区分同一方法、事件、读取方法或设置方法的多个并行使用。

  • 请求ID对于提供者-订阅者-组合(即一次订阅)必须是唯一的
  • 在生成响应消息时,提供者应将请求ID从请求复制到响应消息中
  • 请求id必须在响应到达或预期不再到达(超时)之前不能重复使用。

请求ID的结果如下表所示

Client ID [16 Bit]Session ID [last 15 Bit]

注意:这意味着ECU的实现者可以根据其实现的需要定义客户端id,而提供者不需要知道此布局或定义,因为他只需在响应中复制完整的请求id。

  • 客户端ID是ECU内部调用客户端的唯一标识符。客户端ID允许ECU区分来自多个客户端对同一方法的调用。
  • 会话ID是一个唯一的标识符,允许区分来自同一发送者的顺序消息或请求。
  • 客户端ID还应通过可配置的前缀或固定值(例如,客户端ID的最重要字节为诊断地址,或为给定应用/SW-C配置的客户端ID),在整个车辆中保持唯一性。
    例如:
Client ID Prefix [8 Bits]Client ID [8 Bits]Session ID [16 Bits]
  • 如果Session Handling未激活,则Session ID设置为0x00。
  • 如果Session Handling已激活,会话ID应设置为[0x1, 0xFFFF]范围内的值
  • 如果Session Handling已激活,会话ID应根据各自的用例递增(专用用例的详细信息包含在单独的规格项中
  • 请求/响应方法应使用带有会话id的会话处理。会话ID应该在每次调用后递增。
  • 当会话ID达到0xFFFF时,它将绕到0x01重新开始
  • 对于请求/响应方法,如果响应的会话ID与请求的会话ID不匹配,订阅者必须忽略响应
  • 对于通知消息,如果会话处理不活跃,则接收方忽略会话ID
  • 对于通知消息,接收方应根据各自的用例处理会话ID(专用用例的详细信息包含在单独的规范项中(例如,[PRS_SOMEIP_00741]),在会话处理是活跃的情况下。

4.1.1.6 Protocol Version [8 Bit]

Protocol Version 固定为1

4.1.1.7 Interface Version [8 Bit]

接口版本应该是一个8位字段,包含服务接口的主要版本。

4.1.1.8 Message Type [8 Bit]

“消息类型”字段用于区分不同类型的消息,应包含以下值

NumberValueDescription
0x00RequestA request expecting a response (even void)
0x01REQUEST_NO_RETURNA fire&forget request
0x02NOTIFICATIONA request of a notification/event callback expecting no response
0x80RESPONSEThe response message
0x81ERRORThe response containing an error
0x20TP_REQUESTA TP request expecting a response (even void)
0x21TP_REQUEST_NO_RETURNA TP fire&forget request
0x22TP_NOTIFICATIONA TP request of a notification/event callback expecting no response
0xa0TP_RESPONSEThe TP response message
0xa1TP_ERRORThe TP response containing an error

消息类型的第三高位(=0x20)被称为TP-Flag,应该设置为1,表示当前的SOME/IP消息是一个段。消息类型的其他位按本节中指定的方式设置。
消息类型请求(0x00)的段具有消息类型(0x20),消息类型响应(0x80)的段具有消息类型(0xa0),等等。具体操作请参见(4.2.1.4章)

4.1.1.9 Return Code [8 Bit]

返回码应使用,表示请求是否已成功处理。为了简化标题布局,每条消息都传输字段返回码。特定消息类型允许返回的代码如下表所示

Message TypeAllowed Return Codes
REQUESTN/A set to 0x00 (E_OK)
REQUEST_NO_RETURNN/A set to 0x00 (E_OK)
NOTIFICATIONN/A set to 0x00 (E_OK)
RESPONSESee Return Codes in [PRS_SOMEIP_00191]
ERRORSee Return Codes in [PRS_SOMEIP_00191]. Shall not be 0x00 (E_OK)

4.1.1.10 Payload [variable size]

在有效载荷字段中携带参数。参数的序列化将在下一节中指定。
SOME/IP有效载荷字段的大小取决于所使用的传输协议。使用UDP, SOME/IP有效载荷应该在0到1400字节之间。为了允许协议栈的未来更改(例如更改为IPv6或添加安全手段),需要限制为1400字节。由于TCP支持有效载荷分段,因此自动支持更大的有效载荷。

有效负载可能由事件的数据元素或方法的参数组成。

4.1.2 Endianess(字节顺序)

  • 所有的SOME/IP头字段应以网络字节序(大端序)编码
  • 有效载荷内部参数的字节顺序应由配置定义

4.1.3 Serialization of Data Structures(数据结构序列化)

序列化基于接口规范定义的参数列表。接口规范定义了PDU中所有数据结构的确切位置,必须考虑内存对齐。

Alignment用于对齐数据的起始位置,在数据之后插入填充元素,以确保对齐的数据从某些内存地址开始。

有些处理器架构可以更有效地访问数据(例如master),当它们的起始地址是某个数字的倍数时(例如32位的倍数)。

  • 如果可变大小数据不是序列化数据流中的最后一个元素,则通过在可变大小数据之后插入填充元素来实现数据的对齐。

数据结构序列化章节涉及的内容比较复杂,个人认为刚开始接触SOME/IP,没必要花费太大精力在这一章节,先学会如何使用SOME/IP即可。


4.2 SOME/IP 协议规范

本章描述SOME/IP的远程过程调用(RPC)、事件通知和错误处理。

4.2.1 Transport Protocol Bindings(传输协议绑定)

SOME/IP 目前支持UDP和TCP传输,这节将介绍TCP/UDP 绑定,而第六章将讨论如何选择传输协议。

如果一个服务端运行同一服务的不同实例,属于不同服务实例的消息将通过服务器端的传输协议端口映射到该服务实例。更多细节见4.2.1.3章节。

所有传输协议绑定都应支持在传输层PDU(即UDP包或TCP段)中传输多个SOME/IP消息。

接收SOME/IP的实现方法(implementation)应能够接收由UDP或TCP传输的未对齐SOME/IP消息

理由是:
当在UDP或TCP中传输多个SOME/IP有效载荷时,只有当每个有效载荷的长度是对齐大小的倍数(例如32位)时,才能保证有效载荷的对齐。

首部格式允许在一个数据包中传输多个SOME/IP消息。SOME/IP实现通过SOME/IP长度字段来标识SOME/IP消息的结束。根据数据包长度字段,SOME/IP将确定数据包中是否有额外的SOME/IP消息。这适用于UDP和TCP传输。

每个SOME/IP载荷必须有自己的SOME/IP 头

一个服务实例可以使用以下设置来通信它的所有方法、事件和通知:

  • 最多一个TCP连接(up to one TCP connection)
  • 最多一个UDP单播连接(up to one UDP unicast connection)
  • 最多一个UDP多播连接(up to one UDP multicast connection)

4.2.1.1 UDP Binding

UDP 绑定需要使用UDP传输协议数据包实现,SOME/IP协议不能限制UPD分片的使用。

对于配置为使用UDP单播通信的服务实例的所有方法、事件和通知,客户端和服务器应使用一个UDP单播连接。

对于配置为使用UDP多播通信的服务实例的所有方法、事件和通知,客户端和服务器应使用一个UDP多播连接。

4.2.1.2 TCP Binding

SOME/IP的TCP绑定很大程度上是基于UDP绑定的。与UDP绑定相比,TCP绑定允许更大的SOME/IP消息,并利用了TCP的健壮性特性(处理丢失、重排序、重复等)。为了降低延迟和反应时间,应关闭内格尔算法(TCP_NODELAY)。

当TCP链接丢失时,未建立的请求应按超时处理。由于TCP处理可靠性,SOME/IP不需要额外的可靠性手段。

对于配置为使用TCP通信的服务实例的所有方法、事件和通知,客户端和服务器应该使用一个TCP连接。

当传输第一个方法调用或客户端试图接收第一个通知时,TCP连接应由客户端打开。

  • 当TCP链接失效时,由客户端负责重新建立TCP链接;当TCP链接不再被请求时,应有客户端关闭TCP链接;当使用TCP连接的所有服务不再可用时(停止或超时),客户端应关闭TCP连接。

  • 服务器在停止所有服务时,不应停止TCP连接。给客户端足够的时间来处理控制数据,从而关闭TCP连接。因为当服务器在客户端意识到不再需要TCP之前关闭TCP连接时,客户端将尝试重新建立TCP连接。


  • 允许使用魔法缓存(Magic Cookies)重新同步TCP流

为了允许测试工具识别通过TCP传输的SOME/IP消息的边界,可以在TCP消息流上以固定距离将SOME/IP魔法缓存消息插入SOME/IP消息中。

魔法缓存消息应该具备以下字段

  • 客户端 -> 服务端:

    • Message ID (Service ID/Method ID): 0xFFFF 0000
    • Length: 0x0000 0008
    • Request ID (Client ID/Session ID): 0xDEAD BEEF
    • Protocol Version: 0x01
    • Interface Version: 0x01
    • Message Type: 0x01
    • Return Code: 0x00
  • 服务端 -> 客户端;

    • Message ID (Service ID/Method ID): 0xFFFF 8000
    • Length: 0x0000 0008
    • Request ID (Client ID/Session ID): 0xDEAD BEEF
    • Protocol Version: 0x01
    • Interface Version: 0x01
    • Message Type: 0x02
    • Return Code: 0x00

    在这里插入图片描述


4.2.1.3 多服务实例(Multiple Service-Instances)

同一个服务的服务实例通过不同的实例id识别。应支持多个服务实例驻留在不同的ECU上,以及一个或多个服务的多个服务实例驻留在单个ECU上。

虽然不同服务的多个服务实例应该能够共享使用的传输层协议的相同端口,但在单个ECU上的同一个服务的多个服务实例应该对每个服务实例使用不同的端口–因为虽然实例ID用于SOME/IP SD,但它们不包含在SOME/IP 头中

服务实例可以通过服务ID和套接字(即ip地址、传输协议(UDP/TCP)和端口号)的组合来识别。建议UDP和TCP实例使用相同的端口号。如果一个服务实例使用UDP端口x,则只有该服务的实例,而同一服务的另一个实例不应该完全使用TCP端口x。

4.2.1.4 使用UDP传输大型SOME/IP消息(SOME/IP-TP)

SOME/IP-TP是指SOME/IP Transport Protocol。当SOME/IP消息很大(大于32KB),我们需要SOME/IP-TP进行传输。SOME/IP消息太大,不能直接通过UDP绑定传输,称为“原始”SOME/IP消息。在SOME/IP- tp消息中传输的原始SOME/IP消息负载的“片段”称为“段”。

只有在需要传输非常大的数据块时才使用TCP (>1400字节),并且在存在错误的情况下没有硬延迟要求

这节内容使用不多,我们先跳过

4.2.2 请求/回复 通讯(R&R communication)

SOME/IP 使用的R&R 通讯模型是最常用的通讯模型


SOME/IP 请求消息需要包含有效载荷和头,因此客户端需要做以下工作:

  • 构建有效载荷
  • 设置客户端想要调用的消息ID(message ID)
  • 设置长度字段为8字节(这8字节是SOME/IP header长度)+序列化有效载荷的长度
  • 设置请求ID(Request ID)为唯一数字(仅对客户端唯一)
  • 设置协议版本
  • 设置交互版本(Interface Version)
  • 设置消息类型(Message Type)
  • 设置返回码
    为了构造请求消息的有效负载,方法的所有input或inout参数应按照方法签名内参数的顺序进行序列化。

服务端回复报文的头部基于客户端请求报文的头部,它需要做到以下工作;

  • 构建有效载荷
  • 从请求报文中获取消息ID
  • 设置长度字段为8字节+新有效载荷的大小
  • 从请求报文中获取Request ID
  • 设置消息类型为0x80(Response)或者0x81(ERROR)
    服务端再未受到对应请求报文时,不能发送回复报文

4.2.3 无回复通讯(Fire&Forget Communication)

客户端也可以发送一种不需要回复的请求,这种报文的主要结构有:

  • 有效载荷
  • Message ID
  • 长度(8+序列号有效载荷的长度)
  • Request ID(可选)
  • 协议版本
  • 交互版本
  • 消息类型0x01
  • 返回码为0x00

4.2.4 通知事件(Notification Events)

因为客户端和服务端是订阅和发布的关系,所以通知是指服务端向客户端发布一项服务。客户端订阅服务后,当该服务出现了值更新或者一个事件发生,服务端就会向客户端发送一个报文。

SOME/IP仅仅用来传输报文,具体的订阅/发布机制,需要参考SOME/IP-SD协议

发送“通知(Notification)”类消息,服务端需要做以下工作:

  • 构建有效载荷
  • 设置消息ID
  • 设置长度字段为8+序列化有效载荷的长度
  • 设置客户端ID(client ID)为0x00。在有会话处理的场景里,服务端发出的通知消息里的会话ID需要每次发送后自动加1
  • 设置协议版本
  • 设置交互版本
  • 设置消息类型为0x02–Notification
  • 设置返回码为0x00

当同一ECU上存在多个订阅客户端时,系统应处理通知的复制,以便在通信介质上保存传输。特别是使用多播消息传输通知时,这一点尤其重要。

4.2.4.1 通知报文的传输策略

  • 固定周期发送
  • 更新即发送
  • 微变发送。当变化值超过一个确定的值时进行发送

4.2.5 场(Fields)

一个场代表一种状态,它有一个有效值。在订阅后立即订阅该字段的消费者将该字段值作为初始事件获取。(The consumers subscribing for the field instantly after subscription get the field value as an initial event)。

  • 场(Field)必须包含getter、setter、 notifier。至少包含一个getter、一个setter、一个notifier
  • 场里的getter,getter request消息里有效载荷为空,getter response的有效载荷为场的值
  • 场里的setter,setter request消息里有效载荷是场要被设置的值,而response 这是实际收到的场要设置的值。如果对请求有效负载的值进行了调整(例如,因为超出了限制),则调整后的值将在响应有效负载中传输
  • 场里的notifier,当客户端订阅了场后,notifier会发送一个事件报文给客户端场的值
  • 场里的值由变化时,notifier会发送一个事件报文,这个报文会遵从事件报文的规则

4.2.6 错误处理

SOME/IP 支持两种不同的错误处理机制:

  • 方法的响应消息中的返回代码(Return Codes in the Response Messages of methods)
  • 故障消息(Explicit Error Messages)

基于你的配置信息,来决定使用哪种机制

4.2.6.1 返回码

返回码字段必须是UINT8

SOME/IP协议中定义的返回码如下表所示;

IDNameDescription
0x00E_OKNo error occurred
0x01E_NOT_OKAn unspecified error occurred
0x02E_UNKNOWN_SERVICEThe requested Service ID is unknown.
0x03E_UNKNOWN_METHODThe requested Method ID is unknown. Service ID is unknown.
0x04E_NOT_READYService ID and Method ID are known. Application not running.
0x05E_NOT_REACHABLESystem running the service is not reachable (internal error code only).
0x06E_TIMEOUTA timeout occurred (internal error code only).
0x07E_WRONG_PROTOCOL_VERSIONVersion of SOME/IP protocol not supported
0x08E_WRONG_INTERFACE_VERSIONInterface version mismatch
0x09E_MALFORMED_MESSAGEDeserialization error, so that payload cannot be deserialized.
0x0aE_WRONG_MESSAGE_TYPEAn unexpected message type was received (e.g.REQUEST_NO_RETURN for a method defined as REQUEST).
0x0bE_E2E_REPEATEDRepeated E2E calculation error
0x0cE_E2E_WRONG_SEQUENCEWrong E2E sequence error
0x0dE_E2ENot further specified E2E error
0x0eE_E2E_NOT_AVAILABLEE2E not available
0x0fE_E2E_NO_NEW_DATANo new data for E2E calculation present.
0x10 -0x1fRESERVEDReserved for generic SOME/IP errors. These errors will be specified in future versions of this document.
0x20 -0x5ERESERVEDReserved for specific errors of services and methods. These errors are specified by the interface specification.

4.2.6.2 异常消息(Error Message)

为了更灵活地处理错误,SOME/IP允许针对错误消息使用不同的消息布局,而不是使用响应消息的消息布局。异常消息的布局推荐如下:

  • 特定异常的联合(Union)。至少需要存在一个不带字段的通用异常。
  • 动态长度异常描述字符串

集合(Union)提供了在将来以类型安全的方式添加新异常的灵活性。该字符串用于传输人类可读的异常描述,以简化测试和调试。

事件/通知报文的接收方不能返回异常消息
Fire&forget报文的接收方不能返回异常消息
对于请求/响应方法,异常消息将复制SOME/IP报头的字段(即消息ID、请求ID和接口版本),但不复制有效载荷。此外,消息类型和返回代码必须设置为适当的值。

4.2.6.3 异常处理概览

异常处理流程概览如下图所以:
在这里插入图片描述
SOME/IP消息应通过错误处理进行检查。这不包括基于应用程序的错误处理,而只包括消息传递和RPC中的错误处理。

4.2.6.4 通信异常和通信异常处理

在考虑RPC消息的传输时,存在不同的可靠性语义:

  • Maybe,消息可能到达通信伙伴
  • At least once,消息至少到达通信伙伴一次
  • Exactly once,消息只到达通信伙伴一次

虽然不同的实现可能实现不同的方法,但SOME/IP目前在使用UDP绑定时实现“可能”可靠性,而在使用TCP绑定时实现“恰好一次”可靠性。进一步的错误处理留给应用程序。对于“可能”的可靠性,当使用请求/响应通信结合UDP作为传输协议时,只需要一个超时。下图显示了“可能”可靠性的状态机。客户端的SOME/IP实现必须等待指定超时的响应。如果超时发生,某些/IP将向客户端应用程序发送E_TIMEOUT信号。

在这里插入图片描述

4.3 交互版本的兼容性

接口版本标识有效载荷的格式。
有效载荷格式受以下因素影响:服务接口规范、序列化配置(例如:可变大小数组的使用、长度字段的大小、填充、TLV、SOME/IP-TP)

5. 配置参数

不在本文档介绍

6. 协议使用范围

6.1 选择传输层协议

SOME/IP支持UDP (User Datagram Protocol)和TCP (Transmission Control Protocol)协议。UDP是一个非常精简的传输协议,只支持最重要的功能(多路复用和使用校验和的错误检测),而TCP为实现可靠的通信增加了额外的功能。TCP不仅可以处理比特错误,还可以处理分段、丢失、重复、重新排序和网络拥塞。在车辆内部,许多应用程序需要非常短的超时才能快速做出反应。使用UDP可以更好地满足这些需求,因为应用程序本身可以处理不太可能发生的错误事件。例如,在循环数据的用例中,等待下一个数据传输而不是尝试修复最后一个数据传输通常是最好的方法。UDP的主要缺点是它不处理分段。因此,只能传输较小的数据块。

  • 只有在需要传输非常大的数据块时才使用TCP (>1400字节),并且在存在错误的情况下没有硬延迟要求
  • 使用UDP针对那些对时延要求高的场景(<100ms)
  • 如果需要传输非常大的数据块,则使用UDP和SOME/IP-TP (>1400字节)和存在错误时的硬延迟要求
  • 当外部传输或传输机制(网络文件系统、APIX链接、1722等)更适合用例时,请尝试使用它们。在这种情况下,SOME/IP可以传输文件句柄或类似的标识符。这给了设计者额外的自由(例如在缓存方面)。

6.2 传输CAN和FlexRay消息

SOME/IP应该允许隧道(tunnel)CAN和FlexRay帧。然而,Message ID空间需要在两个用例之间进行协调。完整的SOME/IP报头应用于传输/隧道CAN/FlexRay

6.3 填充结构体

如果需要填充,接口设计者应在数据类型的定义中插入保留/填充元素(如果需要对齐),因为SOME/IP实现不会自动添加这种填充

6.4 SOME/IP 的安全

服务端可以限制来自客户端的链接。服务器可以强制执行通信策略,以保护服务器免受恶意或未经授权的客户端攻击。也就是说,服务器可能会拒绝订阅事件组,或者拒绝未授权的方法调用。

客户端也可以限制来自服务端的链接。客户端可以执行通信策略来保护客户端免受恶意服务器的攻击。即客户端可以拒绝与未经授权的服务器通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/577951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring学习记录

目录 工厂模式的三种形态 简单工厂模式 代码&#xff1a; 运行结果&#xff1a; 总结&#xff1a; 工厂模式 代码&#xff1a; 运行结果&#xff1a; 总结&#xff1a; 抽象工厂模式 代码&#xff1a; 运行结果&#xff1a; 总结&#xff1a; bean的单例与多例 设置 …

chatgpt赋能python:Python父类调用子类:多态性的核心思想

Python父类调用子类&#xff1a;多态性的核心思想 多态性是面向对象编程(OOP)的核心思想之一&#xff0c;它允许不同的对象在调用同一个方法时产生不同的行为。Python是一门支持多态性的编程语言。在Python中&#xff0c;使用父类调用子类的方法是实现多态性的关键之一。 什么…

考研C语言第五章

5.2 数组基础知识 注意要点&#xff1a; 1.下标0开始 2.没有定义的地方是0 5.3 数组访问越界与数组传递 访问越界&#xff0c;定义超过前面定义的数组长度&#xff0c;占据了后面定义数据的地方 非常危险&#xff01; 在循环里面往往容易造成越界 数组传递 1.函数引用时…

AI一键抠图

前言 由于需要批量抠图&#xff0c;原本是想用MODNet的&#xff0c;可惜最新的模型官方不开源&#xff0c;旧模型扣的人物边缘有白边。最后发现了PP飞桨。 飞桨&#xff08;PaddlePaddle&#xff09;以百度多年的深度学习技术研究和业务应用为基础&#xff0c;集深度学习核心训…

【JDK】一、jdk17的下载与安装配置(图文说明超详细)

JDK17的下载与安装 前言一、JDK17下载1、官方下载地址 &#xff08; Oracle中国的官方网站&#xff09; 二、JDK17安装1、先看一下我现在的java版本和环境变量2、开始新的安装第一步&#xff1a;双击下载的jdk-17.0.7_windows-x64_bin.exe 进入到安装页面第二步&#xff1a;jdk…

内存管理之内存寻址(笔记)

计算机体系结构中的核心问题之一就是如何有效的进行内存寻址。因为所有运算的前提都是要先从内存中取地数据。所以内存寻址技术在一定程度上代表了计算机技术。 1. 图灵机和冯诺依曼体系 图灵机&#xff1a;图灵机是一种通用自动的机器模型&#xff0c;通过二段无线延申的纸带…

C++Primer——第一讲

重制CPrimer 目录 一、第一个程序 二、代码 二、题目 前言 我们会从一个C程序开始&#xff0c;这里默认您已经安装了Dev-C或其他的IDE软件。 一、第一个程序 下面这串代码是可以输出“Hello world”的代码。 #include<bits/stdc.h> using namespace std; int main(){…

Arduino+ESP8266 MCU开发板 ----带你开发DHT11温湿度开发项目

目录 PC调试过程如图 手机APP可在各大商场APP中下载 手机APP调试结果/效果如图 ESP8266 MUC介绍 ESP8266 MUC主要特点&#xff1a; 步1&#xff1a;下载Arduino&#xff0c;本次不多做说明&#xff0c;本次使用的arduino软件为老版本的&#xff0c;新版本有关的问题本人…

统计学的假设检验

假设检验的核心其实就是反证法。反证法是数学中的一个概念&#xff0c;就是你要证明一个结论是正确的&#xff0c;那么先假设这个结论是错误的&#xff0c;然后以这个结论是错误的为前提条件进行推理&#xff0c;推理出来的结果与假设条件矛盾&#xff0c;这个时候就说明这个假…

总结881

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;1800基础部分&#xff0c;背诵15篇短文&#xff09; 周目标&#xff1a;1800高等数学部分并完成错题记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#xff09; 前天错题纠错&#xff0c;线代部…

Solidity拓展:数据类型的转换

1.数据类型隐式转换 (自动) 同一类型之间的转换:由低长度转换为高长度int8-int16-int32int256,但int不能自动转换成uint&#xff0c;因为放不下负数所以直接不让转换,且 int8 不能转换成 uint256 &#xff08;因为 uint256 不能涵盖某些值&#xff0c;例如&#xff0c; -1&…

Android解决xutils数据库kotlin添加List数组问题

Android解决xutils数据库kotlin添加List数组问题 前言&#xff1a; 上一篇我们讲解了xutils中数据库版本升级的使用和问题&#xff0c;这篇博客讲解xutils中数据库添加list数据的问题&#xff0c;这个库真的是很强大&#xff0c;但是数据库的使用真不友好&#xff0c;添加一个…

从零开始手搓一个STM32与机智云的小项目——硬件介绍

文章目录 前言硬件简介选型1.主控2.电源3.电机驱动4.舵机驱动5.USB转TTL6.其他模块 原理图绘制1.STM32最小系统1.电源输入2.晶振选择3.复位电路4.BOOT选择电路5.下载电路 2.电源部分及与PC通信部分3.功能模块的实现1.串口2.定时器输入捕获与输出比较3.硬件SPI4.ADC5.温湿度传感…

学校食堂明厨亮灶 yolov8

学校食堂明厨亮灶可以yolov8网络模型技术&#xff0c;学校食堂明厨亮灶通过对厨师的穿戴情况行为举止等进行监测。YOLOv8 算法的核心特性和改动可以归结为如下&#xff1a;提供了一个全新的 SOTA 模型&#xff0c;包括 P5 640 和 P6 1280 分辨率的目标检测网络和基于 YOLACT 的…

C++环形缓冲区设计与实现:从原理到应用的全方位解析

C环形缓冲区设计与实现&#xff1a;从原理到应用的全方位解析 一、环形缓冲区基础理论解析&#xff08;Basic Theory of Circular Buffer&#xff09;1.1 环形缓冲区的定义与作用&#xff08;Definition and Function of Circular Buffer&#xff09;1.2 环形缓冲区的基本原理&…

SAP-MM-内向外向交货单

1、内向&外向交货单概念 外向交货&#xff08;outbound delivery&#xff09;是用在客户与企业之间的交货单&#xff0c;而内向交货&#xff08;inbound delivery&#xff09;则是用在供应商与企业之间的交货单&#xff1b;换言之&#xff0c;外向交货多用于SD 模块&#…

基于MAX-10 FPGA 超声波测距模块HC_SR04

文章目录 一、介绍超声波测距模块HC_SR04二、模块框图三、模块编写1. 测距信号源2. 距离计算3. 数码管模块4. 顶层模块 四、实验现象总结 一、介绍超声波测距模块HC_SR04 HC-SR04是一种基于超声波的测距模块。该模块向前15度内发送超声波并接收回响&#xff0c;通过发出超声波…

第一章:简单的C程序设计基础

一、C语言词汇 在C语言中使用的词汇分为&#xff1a;关键字、标识符、常量、运算符、分隔符、注释符等。 1.1关键字 1.2标识符 在程序中使用的变量名或函数名等统称为标识符&#xff1b;标识符的命名规则如下&#xff1a; &#xff08;C语言区分大小写&#xff09; 不能是关…

一个简单的基于C/S模型的TCP通信实例

1 TCP协议 1.1 概念 TCP是一种面向连接的、可靠的协议&#xff0c;有点像打电话&#xff0c;双方拿起电话互通身份之后就建立了连接&#xff0c;然后说话就行了&#xff0c;这边说的话那边保证听得到&#xff0c;并且是按说话的顺序听到的&#xff0c;说完话挂机断开连接。也…

2023 华为 Datacom-HCIE 真题题库 08--含解析

单项选择 1.[试题编号&#xff1a;190385] &#xff08;单选题&#xff09;以下关于BGP/MPLSIPVPN路由交互的描述&#xff0c;错误的是哪一项? A、PE与CE之间交互的是IPv4路由信息 B、出口PE可以通过BGP、IGP或静态路由的方式向远端CE发送IPv4路由 C、入口PE将从CE接收到的I…