DDS通信中间件——DDS-TSN规范

news2025/6/4 7:09:18

DDS通信中间件——DDS-TSN规范

做了十年DDS通信中间件产品的程序员和大家分享一下对DDS这套规范的个人理解。预期本系列文章将包括以下内容陆续更新:

  1. DDS规范概述
  2. DCPS规范解读 & QoS策略
  3. XTypes规范解读
  4. RTPS规范解读
  5. DDS安全规范解读
  6. DDS-RPC规范解读( 请求响应模式 & 函数调用模式 )
  7. DDS-TSN规范解读
  8. DDS-XRCE规范解读

1. 概述

1.1. TSN是什么?

TSN(时间敏感网络,Time-Sensitive Networking)是以太网技术的重要演进,旨在通过标准化协议解决传统以太网在确定性时延高可靠性时间同步等方面的局限性,从而满足工业自动化、车载网络、智能电网等对实时性要求严苛的场景需求。下图(侵删)展示了TSN的重要协议及功能TSN的核心功能及协议可归纳为以下四大类:

  • 时钟同步(Timing and Synchronization), TSN通过高精度时钟同步协议确保网络中所有设备的时间一致性,这是实现低时延调度的基础。
    • IEEE 1588(PTP,精确时间协议):提供亚微秒级同步。
    • IEEE 802.1AS:基于PTP优化,专为TSN设计。
    • IEEE 802.1AS-REV:增强版,支持更复杂的网络拓扑。
  • 数据调度及流量整形(Traffic Shaping),通过智能调度机制,TSN可优先处理关键数据流,避免网络拥塞。
    • IEEE 802.1Qbv(时间感知整形,TAS):为时间敏感流量分配固定时间窗口。
    • IEEE 802.1Qav(基于信用的整形):适用于音视频等流媒体数据。
    • IEEE 802.1Qcr(异步流量整形):动态调整非实时流量。
  • 可靠性(Ultra Reliability),TSN通过冗余和错误检测机制保障数据传输的确定性。
    • IEEE 802.1CB(帧复制与消除):通过冗余路径提升容错能力。
    • IEEE 802.1Qci(帧检测过滤):拦截错误或恶意数据包。
    • IEEE 802.1Qca(路径控制):优化冗余路径选择。
  • 资源管理(Resource Management),TSN支持动态资源分配,确保关键任务始终获得所需带宽。
    • IEEE 802.1Qat(流预留协议,SRP):预先分配带宽资源。
    • IEEE 802.1Qcc(集中式配置):简化网络管理,支持动态配置。

在这里插入图片描述

1.2. DDS与TSN结合

那么基于何种考虑会想要结合DDS和TSN这两种技术,我们从以下几个方面来描述。

1.2.1. 为什么DDS需要TSN?
  • 增强主题数据可靠传输,DDS中间件作为应用层协议配置可靠传输时是通过反馈重传的方式进行可靠性保证,当链路发生中断时,只能等待或者传输失败,此时如果能够利用TSN的链路可靠能力即可增强主题数据可靠传输能力;

  • 实现端到端有界时延(确定性)数据传输,虽然DDS中有诸如Deadline、LatencyBudget的QoS策略来配置主题数据的时延,但是如果没有TSN基础设施来保证协议栈传输确定性是没有办法实现的。以下图为例,为了实现应用到应用的端到端确定性传输,需要传输的每个环节都具备确定性包括:

    • 应用程序到DDS中间件调用,接口调用通常都具备确定性;
    • DDS中间件处理逻辑,从接收到应用程序的数据到提交给协议栈的时间,这一部分需要各家的DDS中间件优化实现来保证;
    • 协议栈的端到端传输确定性,这一点就需要TSN规范来保证,包括:端节点处理以及交换设备的处理,涉及流量整形相关的规范。

    在这里插入图片描述

1.2.2. 为什么TSN需要DDS?

TSN是二层规范,但是业务系统一般都是利用应用层协议,而采用DDS作为TSN规范的应用层“封装”有以下好处:

  • 提供更高级别的抽象,提供以数据为中心的发布/订阅通信模型(包括其他通信模式);
  • 多语言支持;
  • 更加简单的方式使用TSN能力,包括抽象为QoS配置,易于理解,统一配置方式屏蔽不同厂家TSN产品的使用区别。
1.2.3. 为什么DDS和TSN结合
  • DDS和TSN都实现了混合承载的通信能力,即都支持为需要传输的数据进行分级传输,体现为不同的QoS;
  • DDS的发布订阅和TSN的流定义都是1对多模式,非常适合结合。

2. DDS-TSN规范

回到DDS-TSN规范本身,协议涵盖的内容如下图所示,可以看出DDS-TSN的重点是在DDS系统如何部署在TSN网络上。

在这里插入图片描述

3. DDS-TSN部署模型

3.1. 应用配置(DDS实体配置)

这一部分是原本DDS系统就包含的,其结构如下图所示:

  • ApplicationLibrary,配置系统中包含的DDS应用,一个应用引用关联DomainParticiapntLibrary中一个或者多个域参与者;
  • DomainParticipantLibrary,配置系统中包含的域参与者的定义,包括子实体(主题、发布者、订阅者、数据写者、数据读者);
  • TypeLibrary,类型库,系统中DDS主题所关联的类型结构,通过主题的属性引用关联;
  • QosLibrary,Qos库,系统中所有实体的QoS集中存储的位置,通过各个实体的属性引用关联;

在这里插入图片描述

3.2. 部署配置

本身DDS系统在通常情况下是不需要部署方案的,因为本身DDS应用是具备位置无关性的,(在所有节点都是同构的前提下)应用程序运行在不同的节点上对系统的功能、性能不会产生影响。但是当需要部署在TSN上时,由于TSN需要事先规划流量才能达到预想的可靠性、时间确定性,所以在TSN上部署DDS系统时需要增加部署配置,这个配置也是这份规范的核心,只有在确定了部署方案的基础上,才能根据部署方案计算出底层TSN基础设施的配置,从而上下配合达到预想的可靠性、确定性。

部署配置的结构如下图所示:

  • 节点库,定义硬件环境,包括节点的IP地址、Mac地址(注意:实际实现时取决于底层DDS与TSN的适配形式,这些字段可能仅需要一部分);
  • 部署库,定义部署方案:
    • 哪个节点上运行哪些应用,节点引用节点库中的定义,应用引用上面应用配置中ApplicationLibrary的定义;
    • TSN相关的部署配置,在下面章节中具体介绍;

在这里插入图片描述

3.3. TSN配置

TSN配置隶属于部署配置,用于描述详细DDS的主题如何映射到TSN的流,这个配置主要有两个方面的作用:

  • DDS中间件使用这个配置来把主题数据打上特定的标签,TSN基础设施通过这些标签来识别流,注意:打标签的方式可以有多种,例如:二层的VLAN Tag、三层的dscp、或者6元组,具体的方式需要结合实际的TSN硬件来设计;
  • 这些配置交给TSN基础设施配置管理员,配置管理员根据这个配置来配置TSN基础设施(TSN终端或者TSN交换机);

TSN配置的结构如下图所示:

  • NetworkRequirements,基础网络的需求,包括冗余路径数量、允许的最大时延;
  • TrafficSpecification,流量规范,即该主题数据的周期、数据大小、所需要的流量整形算法等;
  • DataFrameSpecification,数据帧规范,即该主题数据将打上何种标签;

在这里插入图片描述

4. DDSI-RTPS适配TSN

4.1. 消息模块

为保障确定的行为以及确定的消息大小,TSN相关的DataWriter仅保留,协议认为其他的报文是不受规划的或者不必要的,会破坏TSN已经规划的流量:

  • Info_ts
  • data
  • data_frag

4.2. 发现模块

  • 所有的发现信息都只使用best-effort流量;
  • 使用静态发现,屏蔽所有可能的发现信息;

4.3. QoS策略

仅考虑以下配置:

  • BEST-EFFORT
  • VOLATILE
  • KEEP_LAST & depth=1

5. 配置示例

5.1. 示例概述

协议提供了两个在TSN上部署DDS系统的示例,分别是基于UDP/IP上通信的示例以及直接基于Ethernet上通信的示例。这里我们专注看UDP/IP作为底层通信的示例。应用部署以及主题发布/订阅图如下图所示。每个节点都安装了TSN网卡,通过以下配置可以完成:无论背景流量如何,Square、Triangle主题数据都能在2ms内提交给接收端。

在这里插入图片描述

为了增加配置的灵活性,配置分为两个部分:

  • DDS系统配置文件,该文件定义DDS应用,每个应用包括:

    • 域参与者信息
    • 域参与者包含的子实体(主题、发布者、订阅者、数据读者、数据写者)
    • 数据类型
    • QoS配置库
    • 示例:dds-tsn_configuration_example_system_design.xml
  • 部署方案配置文件,该文件定义系统包括:

    • 涉及的节点
    • DDS应用与节点的映射关系
    • TSN配置
    • 示例:dds-tsn_configuration_example_deployment_design.xml

假设系统中存在一个实体(一个程序、工具软件)有以下的功能,后面我们把这个实体称为DDS-TSN工具:

  • 读取上面的配置文件,按照部署策略部署应用;
  • 能够与CNC(或是工具链/任何能够配置底层网络的实体)通信;

5.2. 应用配置

定义了5个应用,和上图描述的一致,不赘述。

<!-- App1发布Square主题 -->
<application name="Application_1">
	<domain_participant name="DomainParticipant_1" domain_id="32" >
		<register_type name="ShapeType" type_ref="ShapeType" />
		<topic name="Square" register_type_ref="ShapeType" />
		<publisher name="Publisher_1">
			<data_writer name="SquareWriter_1" topic_ref="Square" />
		</publisher>
	</domain_participant>
</application>
<!-- App2发布Triangle主题 -->
<application name="Application_2">
	<domain_participant name="DomainParticipant_2" domain_id="32" >
		<register_type name="ShapeType" type_ref="ShapeType" />
		<topic name="Triangle" register_type_ref="ShapeType" />
		<publisher name="Publisher_2">
			<data_writer name="TriangleWriter_2" topic_ref="Triangle" />
		</publisher>
	</domain_participant>
</application>
<!-- App3订阅Square主题 -->
<application name="Application_3">
	<domain_participant name="DomainParticipant_3" domain_id="32" >
		<register_type name="ShapeType" type_ref="ShapeType" />
		<topic name="Square" register_type_ref="ShapeType" />
		<subscriber name="Subscriber_3">
			<data_reader name="SquareReader_3" topic_ref="Square" />
		</subscriber>
	</domain_participant>
</application>
<!-- App4订阅Triangle主题 -->
<application name="Application_4">
	<domain_participant name="DomainParticipant_4" domain_id="32" >
		<register_type name="ShapeType" type_ref="ShapeType" />
		<topic name="Triangle" register_type_ref="ShapeType" />
		<subscriber name="Subscriber_4">
			<data_reader name="TriangleReader_4" topic_ref="Triangle" />
		</subscriber>
	</domain_participant>
</application>
<!-- App5订阅Square、Triangle主题 -->
<application name="Application_5">
	<domain_participant name="DomainParticipant_5" domain_id="32" >
		<register_type name="ShapeType" type_ref="ShapeType" />
		<topic name="Square" register_type_ref="ShapeType" />
		<topic name="Triangle" register_type_ref="ShapeType" />
		<subscriber name="Subscriber_5">
			<data_reader name="SquareReader_5" topic_ref="Square" />
			<data_reader name="TriangleReader_5" topic_ref="Triangle" />
		</subscriber>
	</domain_participant>
</application>

5.3. 部署配置

5.3.1. 节点配置

定义了5个节点,以及ip/mac地址,很清晰,不赘述。

"node_libraries": [
    {
        "name": "MyNodeLibrary",
        "nodes": [
            {
                "name": "Host_1",
                "hostname": "Host1",
                "ipv4_address": "192.168.1.1",
                "mac_address": "AA:AA:AA:AA:AA:AA"
            },
            {
                "name": "Host_2",
                "hostname": "Host2",
                "ipv4_address": "192.168.1.2",
                "mac_address": "BB:BB:BB:BB:BB:BB"
            },
            {
                "name": "Host_3",
                "hostname": "Host3",
                "ipv4_address": "192.168.1.3",
                "mac_address": "CC:CC:CC:CC:CC:CC"
            },
            {
                "name": "Host_4",
                "hostname": "Host4",
                "ipv4_address": "192.168.1.4",
                "mac_address": "DD:DD:DD:DD:DD:DD"
            },
            {
                "name": "Host_5",
                "hostname": "Host5",
                "ipv4_address": "192.168.1.5",
                "mac_address": "EE:EE:EE:EE:EE:EE"
            }
        ]
    }
]
5.3.2. 部署配置

这里选一个Talker一个Listener详细讲解,Talker示例如下

<deployment name="Deployment_Host_1">
	<!-- App1部署在Host1上  -->
	<node node_ref="MyNodeLibrary::Host_1" />
	<application_list>
		<application application_ref="MyApplicationLibrary::Application_1" />
	</application_list>
	<configuration>
		<tsn>
			<!-- Square主题映射为Square流 -->
			<tsn_talker name="SquareWriterTalker_1"
						stream_name="SquareStream"
						datawriter_ref="MyApplicationLibrary::Application_1::DomainParticipant_1::Publisher_1::SquareWriter_1">
				<!-- 该主题数据的标识如下,目标IP、DSCP、UDP、目标端口 -->
				<data_frame_specification>
					<ipv4_tuple>
						<source_ip_address>0.0.0.0</source_ip_address>
						<destination_ip_address>239.255.255.1</destination_ip_address>
						<dscp>0</dscp>
						<protocol>17</protocol>
						<source_port>0</source_port>
						<destination_port>7421</destination_port>
					</ipv4_tuple>
				</data_frame_specification>
				<!-- 该主题数据将以2000000ns为周期发送,每包不超过1000字节,提交到协议栈的偏移范围为[0, 2000000],抖动为5000ns -->
				<traffic_specification>
					<periodicity>
						<sec>0</sec>
						<nanosec>2000000</nanosec>
					</periodicity>
					<samples_per_period>1</samples_per_period>
					<max_bytes_per_sample>1000</max_bytes_per_sample>
					<transmission_selection>0</transmission_selection>
					<time_aware>
						<earliest_transmit_offset>0</earliest_transmit_offset>
						<latest_transmit_offset>2000000</latest_transmit_offset>
						<jitter>5000</jitter>
					</time_aware>
				</traffic_specification>
				<!-- 不需要额外的冗余路径,最大时延不应该超过2000000ns -->
				<network_requirements>
					<num_seamless_trees>1</num_seamless_trees>
					<max_latency>2000000</max_latency>
				</network_requirements>
			</tsn_talker>
		</tsn>
	</configuration>
</deployment>

Listener的配置示例如下:

<deployment name="Deployment_Host_3">
	<!-- App3部署在Host3上 -->
	<node node_ref="MyNodeLibrary::Host_3" />
	<application_list>
		<application application_ref="MyApplicationLibrary::Application_3" />
	</application_list>
	<configuration>
		<tsn>
			<!-- 流标识为SquareStream -->
			<tsn_listener name="SquareReaderListener_3"
						  stream_name="SquareStream"
						  datareader_ref="MyApplicationLibrary::Application_3::DomainParticipant_3::Subscriber_3::SquareReader_3">
				<!-- 传输需求为最大时延2000000ns -->
				<network_requirements>
					<num_seamless_trees>1</num_seamless_trees>
					<max_latency>2000000</max_latency>
				</network_requirements>
			</tsn_listener>
		</tsn>
	</configuration>
</deployment>

5.4. 部署过程

5.4.1. 流配置

以Square流配置为例,根据构造规则,将DDS-TSN配置中的TSNTalker转化为YANG的Talker Group请求,如下:

{
    "stream-id": "AA-AA-AA-AA-AA-AA-00-01",
    "stream-rank": {
        "rank": 1
    },
    "end-station-interfaces": [
        {
            "mac-address": "AA-AA-AA-AA-AA-AA"
        }
    ],
    "data-frame-specification": [
        {
            "ipv4-tuple": {
                "source-ip-address": "0.0.0.0",
                "destination-ip-address": "239.255.255.1",
                "dscp": 0,
                "protocol": 17,
                "source-port": 0,
                "destination-Port": 7421
            }
        }
    ],
    "traffic-specification": {
        "interval": {
            "numerator": 2,
            "denominator": 1000
        },
        "max-frames-per-interval": 1,
        "max-frame-size": 1000,
        "transmission-selection": 0,
        "time-aware": {
            "earliest-transmit-offset": 0,
            "latest-transmit-offset": 2000000,
            "jitter": 5000
        }
    },
    "user-to-network-requirements": {
        "num-seamless-trees": 1,
        "max-latency": 2000000
    },
    "interface-capabilities": {
        "vlan-tag-capable": true,
        "cb-stream-iden-type-list": [],
        "cb-sequence-type-list": []
    }
}

同理将DDS-TSN配置中的TSNListetner转化为YANG的Listener Group请求,如下:

{
    "stream-id": "AA-AA-AA-AA-AA-AA-00-01",
    "end-station-interfaces": [
        {
            "mac-address": "CC-CC-CC-CC-CC-CC"
        }
    ],
    "user-to-network-requirements": {
        "num-seamless-trees": 1,
        "max-latency": 2000000
    },
    "interface-capabilities": {
        "vlan-tag-capable": true,
        "cb-stream-iden-type-list": [],
        "cb-sequence-type-list": []
    }
}

CNC将会返回Status响应,响应中包含SquareStream的调度结果,内容如下:

{
    "stream-id": "AA-AA-AA-AA-AA-AA-00-01",
    "status-info": {
        "talker-status": "ready",
        "listener-status": "ready",
        "failure-code": 0
    },
    "accumulated-latency": 150000,
    "interface-configuration": {
        "interface-list": [
            {
                "ieee802-mac-addresses": {
                    "destination-mac-address": "EE-DD-CC-BB-AA-00",
                    "source-mac-address": "AA-AA-AA-AA-AA-AA"
                },
                "ieee802-vlan-tag": {
                    "priority-code-point": 3,
                    "vlan-id": 4500
                },
                "ipv4-tuple": {
                    "source-ip-address": "0.0.0.0",
                    "destination-ip-address": "239.255.255.1",
                    "dscp": 0,
                    "protocol": 17,
                    "source-port": 0,
                    "destination-port": 7421
                },
                "time-aware-offset": 25000
            }
        ]
    }
}

Triangel流配置同理,这里不一一展示。

5.4.2. 节点配置

计算出Stream配置后,每个主机需要为不同应⽤程序的执⾏做好准备。在完全集中的配置模型中,这将由 CUC 负责。在其他模型中,可以是应用或者系统集成商(System integrator)负责这项配置。

如果主机需要配置为执⾏流转换(Stream Transformation),则配置 IEEE 802.1CB 中与流标识相关的函数来执行以下转换:

  • 在Host1上,将IP报文信息与Status.interface-configuration.interface-list[0].ipv4-tuple信息相符的以太网头中的DestinationMacAddress以及VlanTag域替换为Status.interface-configurationinterface-list[0].ieee802-mac-addresses.destination-mac-address以及Status.interface-configurationinterface-list[0].ieee802-vlan-tag.vlan-id,由于Host1与SquareStream关联,所以上面提到的Status为SquareStream关联的Status响应。
  • 在Host5上,将IP报文信息与Status.interface-configuration.interface-list[0].ipv4-tuple相符的以太网头中的DestinationMacAddress以及VlanTag域还原到原有的值,由于Host5与SquareStream以及TriangleStream都关联,所以上面提到的Status需要分别对SquareStream与TriangleStream关联的Status响应。
  • Host2/Host3/Host4同理。

注意:如果**流转换(Stream Transformation)**在临近的网桥上执行,以上的配置则无需执行,Status响应中的interface-configuration节点也不会存在。

经过流转换配置,主机被配置为发出的每个样本数据都根据Status响应中的 interface-configuration.interfacelist[0].time-aware-offset

5.4.3. DDS应用配置以及执行Schedule

配置主机后,可以开始发布周期。DDS 应⽤程序可能需要调整以符合流时间表,包括:

  • 将QoS调整为8.2.3中规定的值;
  • 使用分区QoS(分区名为stream_name)来限制与TSN流不相关的匹配连接;
  • 配置必须通过其发送时间敏感流量的接⼝。如果需要执行流转换,应用还需要配置IP报文头中的地址为Status响应中的interface-configuration。

根据示例配置,Talker将会以2ms为周期,意味着以2ms的周期调用DataWriter::write操作,底层的DDS库拷贝、序列化并从适当的网络接口上发送报文,所选的时间间隔必须⾜以适应 在指定时间段内执⾏上⾯列出的所有步骤。计算序列化和执⾏时间的机制超出了本规范的范围。

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

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

相关文章

JWT安全:弱签名测试.【实现越权绕过.】

JWT安全&#xff1a;假密钥【签名随便写实现越权绕过.】 JSON Web 令牌 (JWT)是一种在系统之间发送加密签名 JSON 数据的标准化格式。理论上&#xff0c;它们可以包含任何类型的数据&#xff0c;但最常用于在身份验证、会话处理和访问控制机制中发送有关用户的信息(“声明”)。…

Baklib知识中台加速企业服务智能化实践

知识中台架构体系构建 Baklib 通过构建多层级架构体系实现知识中台的底层支撑&#xff0c;其核心包含数据采集层、知识加工层、服务输出层及智能应用层。在数据采集端&#xff0c;系统支持对接CRM、ERP等业务系统&#xff0c;结合NLP技术实现非结构化数据的自动抽取&#xff1…

VMware Tools 手动编译安装版

OWASPBWA安装VMware tools 安装时&#xff0c;显示如下提示 官方安装手册参考&#xff1a;https://knowledge.broadcom.com/external/article?legacyId1014294 按照提示&#xff0c;下载linux.iso文件&#xff0c;并连接到虚拟机的CDROM里&#xff0c;状态勾选已连接&#x…

android平台驱动开发(六)--Makefile和Kconfig简介

Makefile&#xff1a; 1.编译进内核&#xff0c;还是以模块方式加载 模块方式编译成ko,通常是自己添加脚本方式insmod ,android 平台通常默认有modprobe加载&#xff0c;不需要额外添加insmod脚本 lsmod |grep test 可以查看是否安装成功 rmmod test-m.ko 可以删除ko 2.多…

【手写系列】手写线程池

PS&#xff1a;本文的线程池为演示 Demo&#xff0c;皆在理解线程池的工作原理&#xff0c;并没有解决线程安全问题。 最简单一版的线程池 public class MyThreadPool {// 存放线程&#xff0c;复用已创建的线程List<Thread> threadList new ArrayList<>();publ…

Live Helper Chat 安装部署

Live Helper Chat(LHC)是一款开源的实时客服聊天系统,适用于网站和应用,帮助企业与访问者即时沟通。它功能丰富、灵活、可自托管,常被用于在线客户支持、销售咨询以及技术支持场景。 🧰 系统要求 安装要求 您提供的链接指向 Live Helper Chat 的官方安装指南页面,详细…

ARXML解析与可视化工具

随着汽车电子行业的快速发展,AUTOSAR标准在车辆软件架构中发挥着越来越重要的作用。然而,传统的ARXML文件处理工具往往存在高昂的许可费用、封闭的数据格式和复杂的使用门槛等问题。本文介绍一种基于TXT格式输出的ARXML解析方案,为开发团队提供了一个高效的替代解决方案。 …

PnP(Perspective-n-Point)算法 | 用于求解已知n个3D点及其对应2D投影点的相机位姿

什么是PnP算法&#xff1f; PnP 全称是 Perspective-n-Point&#xff0c;中文叫“n点透视问题”。它的目标是&#xff1a; 已知一些空间中已知3D点的位置&#xff08;世界坐标&#xff09;和它们对应的2D图像像素坐标&#xff0c;求解摄像机的姿态&#xff08;位置和平移&…

在日常管理服务器中如何防止SQL注入与XSS攻击?

在日常管理服务器时&#xff0c;防止SQL注入&#xff08;Structured Query Language Injection&#xff09;和XSS&#xff08;Cross-Site Scripting&#xff09;攻击是至关重要的&#xff0c;这些攻击可能会导致数据泄露、系统崩溃和信息泄露。以下是一份技术文章&#xff0c;介…

Wkhtmltopdf使用

Wkhtmltopdf使用 1.windows本地使用2.golangwindows环境使用3.golangdocker容器中使用 1.windows本地使用 官网地址 https://wkhtmltopdf.org/&#xff0c;直接去里面下载自己想要的版本&#xff0c;这里以windows版本为例2.golangwindows环境使用 1.安装扩展go get -u githu…

ArcGIS Pro 创建渔网格网过大,只有几个格网的解决方案

之前用ArcGIS Pro创建渔网的时候&#xff0c;发现创建出来格网过大&#xff0c;只有几个格网。 后来查阅资料&#xff0c;发现是坐标不对&#xff0c;导致设置格网大小时单位为度&#xff0c;而不是米&#xff0c;因此需要进行坐标系转换&#xff0c;网上有很多资料讲了ArcGIS …

重学计算机网络之以太网

一&#xff1a;历史发展进程 DIX EtherNet V2 战胜IEEE802.3成为主流版本。总线型交换机拓扑机构代替集线器星型拓扑机构 1990年IEEE制定出星形以太网10BASE-T的标准**802.3i**。“10”代表10 Mbit/s 的数据率&#xff0c;BASE表示连接线上的信号是基带信号&#xff0c;T代表…

《深度解构现代云原生微服务架构的七大支柱》

☁️《深度解构现代云原生微服务架构的七大支柱》 一线架构师实战总结&#xff0c;系统性拆解现代微服务架构中最核心的 7 大支柱模块&#xff0c;涵盖通信协议、容器编排、服务网格、弹性伸缩、安全治理、可观测性、CI/CD 等。文内附架构图、实操路径与真实案例&#xff0c;适…

使用SCSS实现随机大小的方块在页面滚动

目录 一、scss中的插值语法 二、方块在界面上滚动的动画 一、scss中的插值语法 插值语法 #{}‌ 是一种动态注入变量或表达式到选择器、属性名、属性值等位置的机制 .类名:nth-child(n) 表示需同时满足为父元素的第n个元素且类名为给定条件 效果图&#xff1a; <div class…

AI 眼镜新纪元:贴片式TF卡与 SOC 芯片的黄金组合破局智能穿戴

目录 一、SD NAND&#xff1a;智能眼镜的“记忆中枢”突破空间限制的存储革命性能与可靠性的双重保障 二、SOC芯片&#xff1a;AI眼镜的“智慧大脑”从性能到能效的全面跃升多模态交互的底层支撑 三、SD NANDSOC&#xff1a;11&#xff1e;2的协同效应数据流水线的高效协同成本…

论文阅读(六)Open Set Video HOI detection from Action-centric Chain-of-Look Prompting

论文来源&#xff1a;ICCV&#xff08;2023&#xff09; 项目地址&#xff1a;https://github.com/southnx/ACoLP 1.研究背景与问题 开放集场景下的泛化性&#xff1a;传统 HOI 检测假设训练集包含所有测试类别&#xff0c;但现实中存在大量未见过的 HOI 类别&#xff08;如…

算法学习--持续更新

算法 2025年5月24日 完成&#xff1a;快速排序、快速排序基数优化、尾递归优化 快排 public class QuickSort {public void sort(int[] nums, int left, int right) {if(left>right){return;}int partiton quickSort(nums,left,right);sort(nums,left,partiton-1);sort(nu…

Postman 发送 SOAP 请求步骤 归档

0.来源 https://apifox.com/apiskills/sending-soap-requests-with-postman/?utm_sourceopr&utm_mediuma2bobzhang&utm_contentpostman 再加上自己一点实践经验 1. 创建一个新的POST请求 postman 创建一个post请求, 请求url 怎么来的可以看第三步 2. post请求设…

Python Day39 学习(复习日志Day4)

复习Day4日志内容 浙大疏锦行 补充: 关于“类”和“类的实例”的通俗易懂的例子 补充&#xff1a;如何判断是用“众数”还是“中位数”填补空缺值&#xff1f; 今日复习了日志Day4的内容&#xff0c;感觉还是得在纸上写一写印象更深刻&#xff0c;接下来几日都采取“纸质化复…

[Python] Python自动化:PyAutoGUI的基本操作

初次学习&#xff0c;如有错误还请指正 目录 PyAutoGUI介绍 PyAutoGUI安装 鼠标相关操作 鼠标移动 鼠标偏移 获取屏幕分辨率 获取鼠标位置 案例&#xff1a;实时获取鼠标位置 鼠标点击 左键单击 点击次数 多次有时间间隔的点击 右键/中键点击 移动时间 总结 鼠…