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

V4L2框架基础

一、V4L2视频设备驱动基础

1.V4L2是专门为Linux设备设计的整合视频框架(其主要核心在Linux内核,相当于Linux操作系统上层的视频源捕获驱动框架)。为上层访问系统底层的视频设备提供一个统一的标准接口。V4L2驱动框架能够支持多种类型:如视频I/O,radio设备、VBI设备。

V4L2支持以下主要设备类型,通过不同设备节点区分:

  1. 视频捕获设备(Video Capture)
    例如USB摄像头(UVC兼容设备)、MIPI摄像头等,设备节点为/dev/videoX,是V4L2最常用的功能。
    示例应用:实时视频采集、视频会议。

  2. 视频输出设备(Video Output)
    用于向显示器、电视等输出视频信号,部分平台(如i.MX 6/7)支持此功能,但i.MX 8仅支持采集。

  3. 垂直消隐期设备(VBI)
    处理视频消隐期间的数据(如电视字幕),设备节点为/dev/vbiX

  4. 广播设备(Radio)
    支持AM/FM调谐器,设备节点为/dev/radioX

  5. 视频覆盖接口(Video Overlay)
    允许视频数据直接从捕获设备传输到显示设备,无需CPU处理。

  • 用户空间 - /dev/videoX:这是用户空间访问摄像头设备的接口文件。应用程序通过对 /dev/videoX(X 为具体数字,代表不同视频设备)进行读写、控制等操作,来获取摄像头数据或配置摄像头参数。
  • 内核空间 - V4L2 设备号:用于标识 V4L2 设备,是内核区分不同设备的依据。系统通过设备号来定位和管理对应的 V4L2 设备驱动程序。
  • 内核空间 - 平台 V4L2 驱动:V4L2_dev/V4L2_device :与具体硬件平台相关的驱动部分,负责注册设备到 V4L2 驱动核心层,实现设备与核心层之间的交互,并提供一些平台相关的功能支持和硬件操作接口。
  • 内核空间 - V4L2 驱动核心层:V4L2 框架的核心部分,提供了通用的视频设备驱动接口和功能。它管理和协调平台 V4L2 驱动以及具体传感器设备驱动之间的交互,对设备进行统一的管理和调度。
  • 内核空间 - 字符设备驱动 (cdev):V4L2 设备在 Linux 系统中以字符设备的形式存在,字符设备驱动负责提供基本的设备文件操作接口(如 open、read、write 等),使得用户空间能够通过文件操作的方式访问 V4L2 设备。
  • 内核空间 - 具体传感器设备的驱动 V4L2_subdev:针对摄像头具体传感器硬件的驱动,负责初始化传感器、读取传感器数据,并且与 V4L2 驱动核心层交互,将传感器数据转换为 V4L2 框架可处理的格式。
  • 硬件层面 - 摄像头传感器硬件设备:实际的物理硬件,负责捕捉光线并将其转换为电信号,进而产生原始的图像数据,是整个视频采集的源头 。

2.V4L2常用结构体

a.v4l2_device:(属于整个输入设备的总结构体,有多少个输入设备就会有多少个v4l1抽象)。

b.v4l2_subdev:基于v4l2_device之下,代表一个设备的子设备。

c.vb2_queue:v4l2设备的混存管理操作。

d.video_device:专门用于为用户空间提供设备节点,就相当于提供系统调用的API函数(ioctl、open等等)。

e. v4l2_file_operations:定义了用户空间对 V4L2 设备进行文件操作(如打开、关闭、读写等)的函数接口,是用户空间与内核中 V4L2 设备交互的文件操作桥梁。
f. v4l2_ioctl_ops:规定了通过 ioctl 系统调用对 V4L2 设备进行控制操作的函数集合,用于实现对设备各种属性和功能的控制与配置。
g. v4l2_subdev:作为 v4l2_device 的子设备抽象,代表一个 V4L2 设备中的具体功能模块,如摄像头的传感器、ISP 芯片等,负责特定子功能的实现和管理。
h. v4l2_subdev_ops:定义了针对 v4l2_subdev 子设备的操作方法集,涵盖了对子设备的初始化、配置、控制等操作的函数接口,实现对子设备的具体操作逻辑。

1. v4l2_device
  • 功能作用

    • v4l2_device 是整个 V4L2 框架的核心结构体,用于表示一个 V4L2 设备实例。它是整个输入设备的总结构体,相当于 V4L2 框架的入口,管理所有子设备(如 ISP、CSI、MIPI 等)。
    • 它包含指向子设备链表的指针、媒体设备(media_device)的指针、锁、通知操作、控制处理器等数据结构。
    • 当 v4l2_device 被移除时,系统会自动注销所有注册的子设备。
  • 使用方法

    • 在驱动程序中,首先需要通过 v4l2_device_register() 函数注册一个 v4l2_device 实例。
    • 驱动程序需要为每个设备分配一个 v4l2_device 实例,并将其嵌入到更大的结构体中,以便与其他框架(如媒体设备框架)集成。
    • 注册完成后,可以通过 v4l2_device_get() 获取对该实例的引用。
  • 示例

    • 假设一个 USB 摄像头驱动程序,它会为摄像头创建一个 v4l2_device 实例。该实例会管理摄像头的所有功能模块(如 ISP【专门用于处理图像的芯片】、CSI【摄像头串行接口,是一种用于连接摄像头传感器和处理器的接口标准】),并通过 v4l2_device_register() 注册到系统中。用户可以通过 /dev/videoX 节点访问这些功能模块。
2. v4l2_subdev
  • 功能作用

    • v4l2_subdev 是基于 v4l2_device 的子设备结构体,用于抽象一个设备的子设备(如 ISP、CSI、MIPI 等)。它是 V4L2 框架中用于管理子设备的核心结构体。
    • 它包含对子设备操作的函数集合(ops)和控制函数(ctrls),具体实现由硬件驱动完成。
    • 子设备通过挂载到 v4l2_device 的子设备链表中进行统一管理。
  • 使用方法

    • 在驱动程序中,需要为每个子设备创建一个 v4l2_subdev 实例,并将其挂载到对应的 v4l2_device 上。
    • 驱动程序需要实现 ops 和 ctrls 函数,以支持子设备的操作和控制。
    • 子设备可以通过 v4l2_subdev_register() 注册到系统中,并通过 v4l2_subdev_get() 获取引用。
  • 示例

    • 在一个摄像头驱动程序中,ISP(图像信号处理器)和 CSI(摄像头接口)可以分别作为两个子设备。它们会创建各自的 v4l2_subdev 实例,并挂载到主 v4l2_device 上。用户可以通过 /dev/videoX 节点访问这些子设备的功能。
3. vb2_queue
  • 功能作用

    • vb2_queue 是 V4L2 设备的缓存管理操作结构体,用于管理视频缓冲区(buffer)的分配、提交和完成操作。
    • 它与 vb2_v4l2_buffer 结合使用,用于实现数据流的实际逻辑和 DMA 操作。
  • 使用方法

    • 在驱动程序中,需要为每个视频缓冲区队列创建一个 vb2_queue 实例,并将其与 vb2_v4l2_buffer 结合使用。
    • 驱动程序需要实现缓冲区的分配、提交和完成回调函数,以支持数据流的处理。
    • 用户可以通过 /dev/videoX 节点访问这些缓冲区队列,进行数据读写操作。
  • 示例

    • 在一个视频解码器驱动程序中,可以为解码器创建一个 vb2_queue 实例。用户通过 /dev/videoX 节点提交视频帧缓冲区,驱动程序会将缓冲区分配给解码器进行解码处理。
4. video_device
  • 功能作用

    • video_device 是专门用于为用户空间提供设备节点(如 /dev/videoX)的结构体,相当于提供系统调用 API 函数(如 ioctlopen 等)。
    • 它包含指向 v4l2_device 的指针、字符设备节点信息以及文件操作函数集合(如 fops 和 ioctl_ops)。
  • 使用方法

    • 在驱动程序中,需要为每个设备节点创建一个 video_device 实例,并将其与 v4l2_device 连接。
    • 驱动程序需要实现文件操作函数(如 openreleaseioctl 等),以支持用户空间的访问。
    • 用户可以通过 /dev/videoX 节点访问设备的功能。
  • 示例

    • 在一个摄像头驱动程序中,可以为摄像头创建一个 video_device 实例,并将其与主 v4l2_device 连接。用户通过 /dev/videoX 节点访问摄像头的功能,如打开摄像头、获取视频帧等。

5. v4l2_file_operations

  • 功能作用
    • v4l2_file_operations 是用于定义用户空间对 V4L2 设备进行文件操作的结构体。
    • 为用户空间程序提供与 V4L2 设备交互的基本接口,包含打开、关闭、读取、写入等操作的函数指针。
    • 驱动程序通过实现这些函数,处理用户空间对设备的文件操作请求,保障设备正常使用和数据正确传输。
  • 使用方法
    • 在驱动程序中,需定义一个 v4l2_file_operations 结构体实例,并为各成员函数指针赋值,实现具体操作逻辑。
    • 将该结构体实例与 video_device 结构体关联,让用户空间通过设备节点的文件操作能调用到相应处理函数。
  • 示例
    • 在 USB 摄像头驱动程序中,定义 v4l2_file_operations 结构体实例。
    • 实现 open 函数用于初始化摄像头设备,read 函数用于从摄像头读取视频数据。
    • 将其与摄像头的 video_device 关联后,用户通过 /dev/videoX 节点执行 open 和 read 系统调用时,可调用驱动程序中的对应函数,完成对摄像头的操作和数据读取。

6. v4l2_ioctl_ops

  • 功能作用
    • v4l2_ioctl_ops 是用于定义通过 ioctl 系统调用对 V4L2 设备进行控制操作的结构体。
    • ioctl 是向设备驱动程序发送各种控制命令的系统调用,该结构体包含处理不同 ioctl 命令的函数指针。
    • 驱动程序借助这些函数,依据用户发送的命令对设备进行配置、查询状态、执行特定操作等。
  • 使用方法
    • 在驱动程序中,要定义一个 v4l2_ioctl_ops 结构体实例,并为各成员函数指针赋值,实现具体的 ioctl 命令处理逻辑。
    • 把该结构体实例与 video_device 结构体关联,确保用户空间通过设备节点发送的 ioctl 命令能被正确处理。
  • 示例
    • 在视频采集设备驱动程序中,定义 v4l2_ioctl_ops 结构体实例。
    • 实现 VIDIOC_S_FMT 函数用于设置视频采集格式,VIDIOC_G_FMT 函数用于获取当前视频采集格式。
    • 将其与设备的 video_device 关联后,用户通过 /dev/videoX 节点执行相应 ioctl 命令时,驱动程序会调用对应函数完成格式设置或查询操作。

7. v4l2_subdev_ops

  • 功能作用
    • v4l2_subdev_ops 是用于定义对 v4l2_subdev 子设备进行操作的结构体。
    • 包含处理子设备初始化、参数设置、状态获取等各种操作的函数指针。
    • 驱动程序通过实现这些函数,对 V4L2 设备中的子设备(如 ISP、CSI 等)进行精确控制和管理。
  • 使用方法
    • 在驱动程序中,需为每个 v4l2_subdev 子设备定义一个 v4l2_subdev_ops 结构体实例,并为各成员函数指针赋值,实现具体的子设备操作逻辑。
    • 将该结构体实例与对应的 v4l2_subdev 关联,使得对子设备的操作能调用到相应处理函数。
  • 示例
    • 在摄像头驱动程序中,针对 ISP 子设备,定义 v4l2_subdev_ops 结构体实例。
    • 实现 s_stream 函数用于启动或停止 ISP 的数据流处理,g_ctrl 函数用于获取 ISP 的某个控制参数。
    • 将其与 ISP 的 v4l2_subdev 关联后,当需要对 ISP 进行操作时,可调用这些函数,完成对 ISP 的控制和状态查询。

v4l2_subdev_ops

  • 功能作用
    • v4l2_subdev_ops 是专门为 v4l2_subdev 子设备量身定制的操作方法集结构体。在 V4L2 框架里,一个完整的设备往往由多个子设备构成,像摄像头设备可能包含图像传感器、图像信号处理器(ISP)等子设备。v4l2_subdev 用于抽象这些子设备,而 v4l2_subdev_ops 则负责定义对这些子设备进行操作的具体方式。
    • 它涵盖了一系列关键操作的函数接口,其中包括子设备的初始化操作。在系统启动或者设备接入时,需要对各个子设备进行初始化设置,使其处于正常工作状态,例如初始化传感器的参数、配置 ISP 的工作模式等。
  • 使用方法
    • 在编写驱动程序时,首先要为每个 v4l2_subdev 子设备定义一个 v4l2_subdev_ops 结构体实例。这个实例就像是一个操作指南,明确了针对该子设备的各种操作函数。
    • 为 v4l2_subdev_ops 结构体中的各个成员函数指针赋值,也就是实现具体的操作逻辑。例如,对于初始化函数,要编写代码完成子设备的硬件初始化、寄存器配置等工作;对于配置函数,要根据传入的参数对相应的子设备参数进行修改;对于控制函数,要实现启动、停止等操作的具体代码。
    • 将定义好并赋值完成的 v4l2_subdev_ops 结构体实例与对应的 v4l2_subdev 子设备进行关联。这一步通常是通过设置 v4l2_subdev 结构体中的 ops 成员来完成的。关联之后,当需要对该子设备进行操作时,系统就会根据这个关联关系调用 v4l2_subdev_ops 中定义的相应函数。
  • 示例
    • 以一个复杂的摄像头驱动程序为例,其中包含图像传感器和 ISP 这两个重要的子设备。
    • 对于图像传感器子设备,定义一个 v4l2_subdev_ops 结构体实例 sensor_ops。在这个实例中,实现 init 函数用于对图像传感器进行初始化,比如设置传感器的分辨率、帧率等参数;实现 config 函数用于根据不同的拍摄场景(如白天、夜晚)动态调整传感器的曝光、增益等参数;实现 control 函数用于启动或停止传感器的数据采集。

 3.V4L2对uvc免驱usb设备的编程框架主要采集USB摄像头。即V4L2(Video4Linux2)是一个用于Linux系统的视频设备驱动框架,它提供了一套API和接口,使得开发者可以方便地对视频设备进行编程操作。对于UVC(USB Video Class)免驱USB设备,如USB摄像头,V4L2提供了一种标准化的方式来采集视频数据。开发者可以利用V4L2提供的接口来打开设备、设置属性、采集数据等,而不需要为每个具体的设备编写特定的驱动程序。

4.采集方式:打开视频设备(设置视频设备属性:绽放、裁剪等)。在Linux编程中,直接使用ioctl()函数对设备I/O通道进行管理。 

在Linux编程中,打开视频设备后,可以设置该视频设备的属性,例如裁剪、缩放等。这一步是可选的。在Linux编程中,一般使用ioctl函数来对设备的I/O通道进行管理。

具体解释如下:

  1. 打开视频设备:首先需要通过系统调用open()打开视频设备文件,例如/dev/video0,这将返回一个文件描述符(fd)。

  2. 设置视频设备属性:在打开视频设备后,可以设置该设备的一些属性,比如裁剪(crop)、缩放(scale)等。这些设置是可选的,可以根据具体需求来决定是否进行。

  3. 使用ioctl函数管理I/O通道ioctl()函数是Linux系统中用于设备控制操作的系统调用,允许执行设备特定的操作。在视频采集过程中,ioctl()函数常用于设置视频格式、查询设备能力、请求和释放缓冲区等操作。ioctl()函数的原型如下:

   int ioctl(int fd, unsigned long request, ...);
  • fd:设备文件描述符,由open()函数返回。
  • request:具体的命令标志符,用于指定要执行的操作。
  • ...:根据request的不同,可能需要传递额外的参数。

通过ioctl()函数,用户程序可以与内核中的设备驱动程序进行交互,从而实现对视频设备的精细控制。例如,可以使用VIDIOC_S_FMT命令来设置视频格式,使用VIDIOC_REQBUFS命令来请求帧缓冲区等。

5.V4L2操作流程:打开设备-->获取设备capability-->选择视频输入-->设置视频格式以及帧格式-->向驱动申请帧缓冲(不超过5个)-->申请物理内存-->开始视频采集-->出队列以取得已经采集数据的帧缓冲,获得原始采集数据-->停止视频采集-->关闭视频设备.

相关文章:

V4L2框架基础

一、V4L2视频设备驱动基础 1.V4L2是专门为Linux设备设计的整合视频框架(其主要核心在Linux内核,相当于Linux操作系统上层的视频源捕获驱动框架)。为上层访问系统底层的视频设备提供一个统一的标准接口。V4L2驱动框架能够支持多种类型&#x…...

【微知】如何通过mlxlink查看Mellanox网卡和光模块相关的信息?( mlxlink -d 01:00.0 -m)

背景 通过mlxlink可以查看Mellanox网卡的一些链路信息和硬件信息,也可以查看所插入的光模块的一些信息。 兄弟篇通过ethtool查看的方法:如何查看Mellanox网卡上的光模块的信息? 命令 mlxlink -d 01:00.0 -mman手册介绍: 如果…...

使用pytorch和opencv根据颜色相似性提取图像

需求:将下图中的花朵提取出来。 代码: import cv2 import torch import numpy as np import timedef get_similar_colors(image, color_list, threshold):# 将图像和颜色列表转换为torch张量device torch.device(cuda if torch.cuda.is_available() el…...

HTML label 标签使用

点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签&#xff0c;可以使表单更加友好和易于使用&#xff0c;同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…...

SQL注入的分类靶场实践

前言 SQL 注入&#xff08;SQL Injection&#xff09;是一种常见且危险的 Web 安全漏洞&#xff0c;攻击者通过在输入字段中插入恶意 SQL 代码&#xff0c;能够绕过应用程序的验证机制&#xff0c;直接操纵数据库。本文将介绍 SQL 注入的分类&#xff0c;并通过 Pikachu 靶场进…...

用matplotlib构建BI看板:Superset插件开发实战

目录 前言&#xff1a;当经典可视化库遇见BI航母 一、Superset插件架构精要 1.1 核心模块解析 1.2 插件通信机制 二、开发环境准备 2.1 依赖矩阵 三、开发自定义可视化插件 3.1 插件脚手架 3.2 渲染引擎适配 四、Superset深度集成 4.1 控制面板配置 4.2 动态参数传递…...

【Linux】之【Bug】VMware 虚拟机开机 一直卡在黑屏左上角下划线闪烁界面

解决 参考&#xff1a; 解决Ubuntu20.04 开机黑屏光标闪烁进不去系统 Centos根目录100%解决思路 当前界面 ctrlaltf3-f6 暂时进入终端界面 df -h 查看发现根目录 磁盘空间已满 执行命令 查看当前目录占用内存明细 sudo du -h -x --max-depth1清理无用的大内存文件 或者安装…...

【练习】【链表】力扣热题100 19. 删除链表的倒数第 N 个结点

题目 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&…...

SQL-labs13-16闯关记录

http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1&#xff0c;依然是一个登录框&#xff0c;POST型SQL注入 2&#xff0c;挂上burpsuite&#xff0c;然后抓取请求&#xff0c;构造请求判断漏洞类型和闭合条件 admin 发生了报错&#xff0c;根据提示闭合方式是(…...

【Linux】进程信号——信号保存和信号捕捉

文章目录 信号保存信号相关的概念信号是如何保存的呢&#xff1f;有关信号保存的系统调用sigprocmask信号的增删查改查看pending表验证接口 信号捕捉用户态与内核态信号捕捉流程 总结 信号保存 信号相关的概念 信号递达&#xff1a;指 操作系统 将一个信号&#xff08;Signal…...

任务9:交换机基础及配置

CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog 一、交换机基础 交换机的概念&#xff1a;交换机是一种网络设备&#xff0c;用于连接多台计算机或网络设备&#xff0c;实现数据包在局域网内的快速交换。交换机基于MAC地址来转发数据包&#x…...

【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解

目录&#xff1a; 1.题目描述&#xff1a; 输入格式 输出格式 2.题解&#xff1a; 3.详细c代码 1.题目描述&#xff1a; 小明冒充 X 星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 nn 个方格。…...

深度学习R8周:RNN实现阿尔兹海默症(pytorch)

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 数据集包含2149名患者的广泛健康信息&#xff0c;每名患者的ID范围从4751到6900不等。该数据集包括人口统计详细信息、生活方式因素、病史、临床测量、认知和功…...

字节跳动发布 Trae AI IDE!支持 DeepSeek R1 V3,AI 编程新时代来了!

3 月 3 日&#xff0c;字节跳动重磅发布国内首款 AI 原生集成开发环境&#xff08;AI IDE&#xff09;——Trae 国内版&#xff01; Trae 不只是一个传统的 IDE&#xff0c;它深度融合 AI&#xff0c;搭载 doubao-1.5-pro 大模型&#xff0c;同时支持DeepSeek R1 & V3&…...

智能合约安全指南 [特殊字符]️

智能合约安全指南 &#x1f6e1;️ 1. 安全基础 1.1 常见漏洞类型 重入攻击整数溢出权限控制缺陷随机数漏洞前后运行攻击签名重放 1.2 安全开发原则 最小权限原则检查-生效-交互模式状态机安全失败保护机制 2. 重入攻击防护 2.1 基本防护模式 contract ReentrancyGuarde…...

DeepSeek 全套资料pdf合集免费下载(持续更新)

有很多朋友都关注DeepSeek相关使用的教程资料&#xff0c;本站也一直持续分享DeepSeek 学习相关的pdf资料&#xff0c;由于比较零散&#xff0c;这篇文章主要就是做一个汇总&#xff0c;并且持续更新&#xff0c;让大家可以及时获取下载最新的相关DeepSeek的资料。 持续更新地…...

IDEA 接入 Deepseek

在本篇文章中&#xff0c;我们将详细介绍如何在 JetBrains IDEA 中使用 Continue 插件接入 DeepSeek&#xff0c;让你的 AI 编程助手更智能&#xff0c;提高开发效率。 一、前置准备 在开始之前&#xff0c;请确保你已经具备以下条件&#xff1a; 安装了 JetBrains IDEA&…...

将md格式转jupyter并运行

将md格式转jupyter并运行 有时候我们需要将这种文档以学习的形式记笔记到jupyter中&#xff08;任务&#xff09; 但是内容太多了&#xff0c;一个一个粘贴又不方便&#xff0c;怎么办呢&#xff1f; 发现直接粘贴到md中是带格式的&#xff01;&#xff01;&#xff01; 那…...

SOUI基于Zint生成EAN码

EAN码广泛应用与欧洲的零售业。包括EAN-2、EAN-5、EAN-8和EAN-12码。分别编码 2、5、7 或 12 位数字。此外&#xff0c;可以使用 字符将 EAN-2 和 EAN-5 附加符号添加到 EAN-8 和 EAN-13 符号中&#xff0c;就像 UPC 符号一样。 EAN-8校验码计算&#xff1a; 从左往右奇数位的…...

StarRocks-fe工程在Cursor中不能识别为Java项目

SR简介 StarRocks 是一款高性能分析型数据库&#xff0c;支持实时、多维度、高并发的数据分析。本指南旨在解决在使用 VSCode 或 Cursor 开发 StarRocks 后端项目时遇到的模块识别问题。 问题描述 使用 Cursor 或 VSCode 打开 StarRocks 的后端工程 fe 时&#xff0c;spark-…...

AI是否能真正理解人类情感?从语音助手到情感机器人

引言&#xff1a;AI与情感的交集 在过去的几十年里&#xff0c;人工智能&#xff08;AI&#xff09;的发展速度令人惊叹&#xff0c;从简单的语音识别到如今的深度学习和情感计算&#xff0c;AI已经深入到我们生活的方方面面。尤其是在语音助手和情感机器人领域&#xff0c;AI不…...

【Linux】【网络】UDP打洞-->不同子网下的客户端和服务器通信(成功版)

【Linux】【网络】UDP打洞–&#xff1e;不同子网下的客户端和服务器通信&#xff08;成功版&#xff09; 根据上个文章的分析 问题可能出现在代码逻辑上面 我这里重新查找资料怀疑&#xff1a; 1 NAT映射可能需要多次数据包的发送才能建立。 2 NAT映射保存时间太短&#xff…...

【微知】如何查看Mellanox网卡上的光模块的信息?(ethtool -m enp1s0f0 看型号、厂商、生产日期等)

背景 服务器上插入的光模块经常被忽略&#xff0c;往往这里是定位问题最根本的地方。如何通过命令查看&#xff1f; 命令 ethtool提供了-m参数&#xff0c;m是module-info的意思&#xff0c;他是从光模块的eeprom中读取数据。&#xff08;应该是用i2c协议读取的&#xff09;…...

图论基础算法: 二分图的判定(C++)

二分图的基本概念 什么是二分图? 二分图(Bipartite Graph)是指一个图的顶点集可以被分割为两个互不相交的子集 U U U 和 V V V, 并且图中的每一条边都连接 U U U 中的一个顶点和 V V V 中的一个顶点. 换句话说, 二分图中的顶点可以被分成两组, 组内的顶点之间没有边相连…...

AI赋能校园安全:科技助力预防与应对校园霸凌

校园本应是学生快乐学习、健康成长的地方&#xff0c;然而&#xff0c;校园霸凌却成为威胁学生身心健康的隐形“毒瘤”。近年来&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI在校园安全领域的应用逐渐成为解决校园霸凌问题的新突破口。通过…...

PyTorch系列教程:评估和推理模式下模型预测

使用PyTorch时&#xff0c;将模型从训练阶段过渡到推理阶段是至关重要的一步。在推理过程中&#xff0c;该模型用于对以前从未见过的新数据进行预测。这种转换的一个重要方面是使用推理模式&#xff0c;它通过禁用仅在训练期间需要的操作来帮助优化模型的性能。 理解推理模式 …...

Linux注册进程终止处理函数

atexit() 是一个标准库函数&#xff0c;用于注册在进程正常终止时要调用的函数。通过 atexit()&#xff0c;你可以确保在程序结束时自动执行一些清理工作&#xff0c;比如释放资源、保存状态等。 函数原型如下&#xff1a; #include <stdlib.h> int atexit(void (*func…...

Lumerical INTERCONNECT 中的自相位调制 (SPM)

一、自相位调制的数学介绍 A.非线性薛定谔方程&#xff08;NLSE&#xff09;&#xff1a; NLSE 是光学中的一个关键方程。它告诉我们光脉冲在具有非线性和色散特性的介质中的行为方式。该方程如下所示&#xff1a; i ∂A/∂z β2/2 ∂A/∂t γ|A|A 0 其中&#xff1a; - …...

DICOM服务中的C-STORE、 C-FIND、C-MOVE、C-GET、Worklist

DICOM服务说明 DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;是一种用于处理、存储、打印和传输医学影像的标准。DICOM定义了多种服务类&#xff0c;其中C-STORE、C-FIND、C-MOVE和C-GET是与影像数据查询和检索相关的四个主要服务类&#xff…...

Python的pdf2image库将PDF文件转换为PNG图片

您可以使用Python的pdf2image库将PDF文件转换为PNG图片。以下是一个完整的示例&#xff0c;包含安装步骤、代码示例和注意事项。 安装依赖库 首先&#xff0c;您需要安装pdf2image库&#xff1a; pip install pdf2imagepdf2image依赖于poppler库来解析PDF文件。 Windows系统…...

在Blender中给SP分纹理组

在Blender中怎么分SP的纹理组/纹理集 其实纹理组就是材质 把同一组的材质分给同一组的模型 导入到sp里面自然就是同一个纹理组 把模型导入SP之后 就自动分好了...

import模块到另一个文件夹报错:ModuleNotFoundError: No module named xxx

1. 问题 打开项目文件夹my_code&#xff0c;将bb.py的函数或者类import到aa.py中&#xff0c;然后运行aa.py文件&#xff0c;可能会报错ModuleNotFoundError: No module named xxx。 ‪E:\Desktop\my_code ├── a │ ├── train.sh │ └── aa.py └── b└── b…...

[SystemVerilog]例化

SystemVerilog 的例化方式和Verilog 类似 如果信号输入输出name一致 abc abc_inst( .a(a)&#xff0c; .b(b), c(c) ); 使用SystemVerilog abc abc_inst( .a, .b, .c ); 或者 abc abc_inst( .* ); 在SystemVerilog中&#xff0c;可以简化例化方式。 可以使用…...

Java方法详解

Java方法详解 方法1.方法的概念(1).什么是方法(2).方法的定义(3).实参与形参的关系 2.方法重载(1).方法重载的概念 3.递归&#xff08;C语言详细讲过&#xff09; 方法 1.方法的概念 (1).什么是方法 方法类似于C语言中的函数&#xff0c;我们重在体会与理解&#xff0c;不必…...

springboot自动插入创建时间和更新时间到数据库

springboot自动插入创建时间和更新时间到数据库 1.添加TableField注解2.添加TimeMetaObjectHandler配置3.测试 1.添加TableField注解 /*** 创建时间*/TableField(fill FieldFill.INSERT) // 插入时生效private LocalDateTime createTime;/*** 修改时间*/TableField(fill Fiel…...

如何将JAR交由Systemctl管理?

AI越来越火了&#xff0c;我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站 废话不多说&#xff0c;进入正题。下面开始说如何使用 systemctl…...

VMware Workstation Pro安装openKylin 2.0全流程指南

原文链接&#xff1a;VMware Workstation Pro安装openKylin 2.0全流程指南 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在VMware Workstation Pro 上安装 openKylin 2.0 SP1 的文章。openKylin 2.0 作为国产开源桌面操作系统&#xff0c;目前已经发布了最新版本&…...

网络安全检查漏洞内容回复 网络安全的漏洞

网络安全的核心目标是保障业务系统的可持续性和数据的安全性&#xff0c;而这两点的主要威胁来自于蠕虫的暴发、黑客的攻击、拒绝服务攻击、木马。蠕虫、黑客攻击问题都和漏洞紧密联系在一起&#xff0c;一旦有重大安全漏洞出现&#xff0c;整个互联网就会面临一次重大挑战。虽…...

数据仓库的特点

数据仓库的主要特点可以概括为&#xff1a;面向主题、集成性、非易失性、时变性、高性能和可扩展性、支持复杂查询和分析、分层架构以及数据质量管理。 1. 面向主题&#xff08;Subject-Oriented&#xff09; 数据仓库是面向主题的&#xff0c;而不是面向事务的。这意味着数据…...

02_NLP文本预处理之文本张量表示法

文本张量表示法 概念 将文本使用张量进行表示,一般将词汇表示为向量,称为词向量,再由各个词向量按顺序组成矩阵形成文本表示 例如: ["人生", "该", "如何", "起头"]># 每个词对应矩阵中的一个向量 [[1.32, 4,32, 0,32, 5.2],[3…...

青蛙跳杯子(BFS)

#include <iostream> #include <queue> #include <string> #include <unordered_set> using namespace std;int main() {string a, b;cin >> a >> b; int n a.size(); // 字符串长度int d[] {1, -1, -2, 2, -3, 3}; // 跳跃距离queue&…...

【前端基础】1、HTML概述(HTML基本结构)

一、网页组成 HTML&#xff1a;网页的内容CSS&#xff1a;网页的样式JavaScript&#xff1a;网页的功能 二、HTML概述 HTML&#xff1a;全称为超文本标记语言&#xff0c;是一种标记语言。 超文本&#xff1a;文本、声音、图片、视频、表格、链接标记&#xff1a;由许许多多…...

Arm64架构的Linux服务器安装jdk8

一、下载 JDK8 打开浏览器&#xff0c;访问 oracle官网找到适用于自己服务器的 arm64 架构的 JDK8 安装包。 二、安装 JDK8 将下载好的 JDK 压缩包上传到服务器上 解压 JDK 压缩包&#xff1a; tar -zxvf jdk-8uXXX-linux-arm64.tar.gz选择安装目录&#xff0c;我将 JDK 安装…...

深入探索Python机器学习算法:模型调优

深入探索Python机器学习算法&#xff1a;模型调优 文章目录 深入探索Python机器学习算法&#xff1a;模型调优模型调优1. 超参数搜索方法1.1 网格搜索&#xff08;Grid Search&#xff09;1.2 随机搜索&#xff08;Random Search&#xff09;1.3 贝叶斯优化&#xff08;Bayesia…...

【Linux】冯诺依曼体系结构-操作系统

一.冯诺依曼体系结构 我们所使用的计算机&#xff0c;如笔记本等都是按照冯诺依曼来设计的&#xff1a; 截止目前&#xff0c;我们所知道的计算机都是由一个一个的硬件组装起来的&#xff0c;这些硬件又由于功能的不同被分为了输入设备&#xff0c;输出设备&#xff0c;存储器…...

Linux第五讲----gcc与g++,makefile/make

1.代码编译 1.1预处理 我们通过vim编辑完文件之后&#xff0c;想看一下运行结果这时我们便可以试用gcc编译C语言&#xff0c;g编译c. 编译代码&#xff1a; 上述两种方法均可&#xff0c;code.c是我的c语言文件&#xff0c;mycode是我给编译后产生的二进制文件起的名&#x…...

FastGPT 源码:基于 LLM 实现 Rerank (含Prompt)

文章目录 基于 LLM 实现 Rerank函数定义预期输出实现说明使用建议完整 Prompt 基于 LLM 实现 Rerank 下边通过设计 Prompt 让 LLM 实现重排序的功能。 函数定义 class LLMReranker:def __init__(self, llm_client):self.llm llm_clientdef rerank(self, query: str, docume…...

Virtual Box虚拟机安装Mac苹果Monterey和big sur版本实践

虚拟机安装苹果实践&#xff0c;在Windows10系统&#xff0c;安装Virtual Box7.1.6&#xff0c;安装虚拟苹果Monterey版本Monterey (macOS 12) 。碰到的主要问题是安装光盘不像Windows那么容易拿到&#xff0c;而且根据网上很多文章制作的光盘&#xff0c;在viritualBox里都无法…...

【高并发】Java 并行与串行深入解析:性能优化与实战指南

Java 并行与串行深入解析&#xff1a;性能优化与实战指南 在高性能应用开发中&#xff0c;我们常常会面临 串行&#xff08;Serial&#xff09; 和 并行&#xff08;Parallel&#xff09; 的选择。串行执行任务简单直观&#xff0c;但并行能更高效地利用 CPU 资源&#xff0c;…...

软考中级-数据库-3.2 数据结构-数组和矩阵

数组 一维数组是长度固定的线性表&#xff0c;数组中的每个数据元素类型相同。n维数组是定长线性表在维数上的扩张&#xff0c;即线性表中的元素又是一个线性表。 例如一维数组a[5][a1,a2,a3,a4,a5] 二维数组a[2][3]是一个2行2列的数组 第一行[a11,a12,a13] 第二行[a21,a22,a23…...