【STM32】 TCP/IP通信协议(1)

一、前言

TCP/IP是干啥的?它跟SPI、IIC、CAN有什么区别?它如何实现stm32的通讯?如何去配置?为了搞懂这些问题,查询资料可解决如下疑问:

1.为什么要用以太网通信?

以太网(Ethernet) 是指遵守 IEEE 802.3 标准组成的局域网,是互联网技术的一种,由于它是在组网技术中占的比例最高,很多人直接把以太网理解为互联网。但是,IEEE 还有其它局域网标准,如 IEEE 802.11 是无线局域网,俗称 Wi-Fi。IEEE802.15 是个人域网,即蓝牙技术,其中的 802.15.4 标准则是 ZigBee 技术。(想具体了解的可以浏览这篇博客http://t.csdnimg.cn/3oz5b)

工业以太网是在以太网技术和Tcp/ip技术的基础上开发出来的一种工业网络,在工业当中,由于以太网的用户培训成本低、产品技术成熟、价格低供应稳定、信息集成容易等优势,应用范围比较广,因此在STM32上使用还是很重要的。

以太网所用的协议则是TCP/IP通信协议

2.什么是TCP/IP?

TCP/IP是一个庞大的协议族,是众多网络协议的集合,还包括:ARPIPICMPUDPTCPDNSDHCPHTTP、FTP、MQTT等等。TCP/IP 协议栈中不同协议所完成的功能是不一样的, 某些协议的实现要依赖于其它协议,依据这种依赖关系,可以将协议栈分层。低层协议为相邻的上层协议提供服务,是上层协议得以实现的基础。

3.TCP/IP分层模型是什么?

TCP/IP分成四层:应用层传输层网络层网络接口层。分层就是让不同的底层网卡可以独立实现自己的功能,比如物理层提供二进制传输、实现编码为网络层提供标准的接口,当然内部如何实现无需在意。

传输过程:举个例子:加入你发送QQ消息给朋友A,“周末出来玩吗?”,按下“发送”或者回车键时,计算机如何将这些信息传输过去呢?

你发送消息:

(1)应用层:发现你传输的数据有一条文字信息,于是做好了标记,加上应用层首部,传送到传输层。

(2) 传输层:由于对方也需要用QQ接收你发来的消息,因此就用到了“端口”(电脑上有很多程序,不同程序由不同的端口来识别),于是做好端口标记,再加上TCP首部,跟之前的部分形成TCP,送往网络层

(3) 网络层:由于网路是由无数的子网层成的,要想把信息发送到对方的电脑中,就得用到IP地址,把数据送到相应的子网中找到对应的IP地址(IP地址包括网络号和主机号,网络号相同则判断在同一个子网下)的电脑。于是做好标记,加上IP首部,与之前的部分形成IP数据包,送到链路层。

(4)数据链路层:连入网络的每个计算机都会有网卡接口,每个网卡都会有一个唯一的地址,名叫“MAC地址”。计算机之间的数据传输就是通过MAC地址来唯一寻找并传送的(MAC地址由48位二进制所构成,在网卡生产时就唯一标识了)。所以当我们需要发送数据时,不仅要找到电脑主机,还要知道 MAC地址。假设ARP协议帮我们找到目标主机的MAC地址,但有时候发送的信息有些大,一次发送不出去,这是链路层便会切开成一组一组的,并一次次发送出去。

(5)物理层:收到数据链路层的数据,根据二进制划分为高低电平进行传输。

朋友A接收消息:

(1)物理层:0101....的电平信号经过,物理层把数据接收给链路层。

(2)链路层:如果MAC地址相匹配,便会排序查看数据是否有问题,没问题就拆掉以太网首部,把剩下的交给IP层。

(3)IP层:发现有数据,就拆掉IP首部,交给传输层

(4)传输层:发现目的地是送往是QQ端口,于是拆掉TCP首部,交给应用层

(5)应用层:QQ页面显示“周末出来玩吗?”

4.LwIP是什么?和TCP/IP有什么关系?

(1)LWIP的定义:

Light weight IP,顾名思义是一个轻量化的TCP/IP协议,由瑞典计算机科学院(SICS)的ADam Dunkels开发的一个小型开源的TCP/IP协议栈

(2)LWIP设计目的:用少量的资源消耗实现一个较为完整的TCP/IP协议栈。能用于云台接入、无线网关、远程模块、工控控制器、路由器、摄像头

(3)LWIP与TCP/IP的区别:

【1】LWIP并没有实现TCP/IP的全部功能

【2】极大地减少了对RAM的占用

【3】LWIP既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行

【4】LWIP并没有采用很明确的分层结构,它假设各层之间的部分数据和结构体和实现原理在其他层是可见的,简单来说就传输层知道IP层是如何封装数据、传递数据的,IP层知道链路层是怎么封装数据的等等,可以实现内存区域共用,极大避免数据拷贝,尽可能减少占用。

(4)LWIP的特点:

【1】资源开销低,高度可以剪裁,一切不需要的功能都可以通过红变异选项去掉,LWIP的流畅运行需要40KB的代码ROM的几十KB的RAM

【2】支持的协议较为完整

【3】实现了一些常见的应用程序,DHCP客户端、DNS客户端、HTTP服务器等

【4】提供了三种编程接口:RAW/Callback API(适合少任务、交互数据量少、数据处理时间开销小的场合)、NETCONN API(就是Sequential API,适合多任务、大数据量、大型应用)和 Socket API(是对NETCONN API的简单封装、更简单、但效率低、功能不完整)

【5】高度可移植。其源代码全部用 C 实现 ​ 【6】开源、免费,用户可以不用承担任何商业风险地使用它 ​ 【7】发展历史长

5.LwIP协议栈?

协议栈是协议的具体实现形式,通俗来讲就是用代码实现的库函数,从而让开发人员调用。因此我们在LWIP官网下载最新版,然后把里面的代码文件服战在自己的工程当中,然后用LWIP提供给用户的接口函数在字节的程序里实现TCP通信的功能。

6.TCP的“三次握手”和“四次挥手”是什么意思?

TCP是一种面向连接的传输协议,通俗来讲,UDP就像你妈在楼下扯一嗓子让你下楼帮忙,所有人都听得到,而且你也容易听不清;而TCP就像你妈打电话给你,信息传输一对一且稳定。

“三次握手”是确认连接的方式: 通俗来讲就是用三次发送来让双方确认自己与对方的发送与接收是正常的。 第一次 A:我要和B通信 第二次 B:好,我可以和你通信(当A收到这段话时,A已经确认了连接的可靠性,但B还不能确认A能否听到自己的回话) 第三次:A:我能听到你的回话,可以开始了。(这时候双方都确认了连接的可靠性) 如果握手尝试5次都没回应,就断开。

“四次挥手”是确认断开连接的方式: 通俗来讲就是用四次发送来让双方都确认连接的断开。 第一次 A:我要去忙别的了,不和你说了 第二次 B:我这句话还有一半没讲完呢,你听我说完再走 第三次 B:好的我说完了,你去忙吧 第四次 A:好的,我走了(A发完后会停留2毫秒,如果收到B的释放报文,说明B已经收到了释放信号,连接断开) 如果B没收到第四次挥手,就会重复发送第三次的释放信号,A发完后会停留2毫秒,如果还受到了B的第三次挥手信号,说明B没收到第四次挥手,这时候会A会再次重复第四次挥手。

img

二、STM32F4以太网MAC简介

以太网MAC存在于TCPIP栈中的数据链路层上。STM32F4自带有10/100Mbit/s的以太网MAC内核,

这个以太网MAC内核有如下特性:

  1. 支持外部PHY接口实现10M/100Mbit/s数据传输速率

  2. 通过符合IEEE802.3的MII接口与外界快速以太网PHY进行通信

  3. 支持全双工和半双工操作

  4. 报头和帧起始数据(SFD)在发送路径中插入、在接收员路径中删除

  5. 可逐帧控制CRC和pad自动生成

  6. 可编程帧长度,支持高达16kB的巨型帧...

由图中我们可以知道:

数据从芯片出发,通过以太网DMA传输,由FIFO寄存器收发,经过MAC,再通过时钟线MDC和数据线MDIO发送给外部PHY。

以太网接收发送FIFO数据寄存器的大小为2KB(发送的数据不能超过1500个字节)以及STM32F4的以太网与外部PHY通过RMII接口MII接口管理

F4的MAC接口有3个接口:SMI、MII、RMII

1. 站管理接口:SMI

程序中可以通过这个接口来访问PHY寄存器,SMI接口有两根线:数据线MDIO和时钟线MDC,该接口支持访问多达32个PHY

MDC:周期性时钟,提供以最大频率2.5Mhz传输数据时的参考时序,在空闲状态下,SMI管理接口将MDC时钟信号驱动为低电平

MDIO:数据输入/输出比特流,用于通过MDC时钟信号向/从PHY设备同步传输状态信息。

管理帧格式:(STM32F4XX中文参考手册P825)

PADDR:PHY地址

RADDR:寄存器地址

数据位:16位数据位(PHY寄存器都是16位的)

2. 介质独立接口:MII

介质独立接口(MII)定义了10Mbit/s和100Mbit/s的数据传输速率下,以太网内核与PHY设备之间的连接

TX_CLK和RX_CLK为发送和接收连续时钟,当速率为10Mbit/s时为2.5MHZ,速率为100Mbit/s时为25MHZ

要生成TX_CLK和RX_CLK时钟,必须向外部PHY提供25MHZ时钟,通常我们使用25M的晶振,也可以使用STM32F4xx的MCO的引脚输出25MHZ的时钟

3. 精简介质独立接口:RMII

精简介质独立接口 (RMII) 规范降低了 10/100 Mbit/s 下微控制器以太网外设与外部 PHY 间的引脚数。根据 IEEE 802.3u 标准,MII 包括 16 个数据和控制信号的引脚。RMII 规范将引脚数减少为 9 个。

MAC和PHY的参考时钟必须都是 50 MHz!

三、PHY层芯片LAN8720

RJ45 <-> PHY芯片 <-> 以太网MAC

是一个低功耗的10/100M以太网PHY层芯片,使用RMII接口和以太网MAC层进行通信,内置全双工模块,支持10Mbps和100Mbps。可以通过自卸调的方式与目的主机最佳的连接方式。支持自动翻转功能,无需更换网线即可将连接更改为直连或交叉连接。

LAN8720A-CP-TR_MICROCHIP(美国微芯)-LAN8720A-CP-TR中文资料_PDF手册_价格-立创商城

1.原理图

(1)STM32引脚:

(2)EARTHNET:

(3)RJ45:

(4)PCF8574

io扩展芯片

2.LAN8920说明

(1)PHY地址

上文有说MAC可以通过SML接口连接32个PHY芯片,那如何识别这32个PHY呢?就是通过PHY地址来区别的。

由于三(2)的原理图中第10号引脚浮空,默认为地址0x00

(2)RMII模式设置

LAN8720在RMII模式下可以设置两种连接模式:

REF_CLK输入模式(nINT)和REF_CLK输出模式。

配置模式决定了nINT / REFCLKO引脚的功能。 nINTSEL配置带锁定在POR和nRST的上升沿。默认情况下,通过内部上拉电阻将nINTSEL配置为nINT模式。

表带值模式REF_CLK说明
nINT引脚 = 0REF_CLK输出模式作为REF_CLK时钟源
nINT引脚 = 1REF_CLK输入模式作为中断引脚

REF_CLK来自外部,必须在XTAL1 / CLKIN引脚上驱动。

i. REF_CLK输入模式

在REF_CLK输入模式下,XTAL1/CLKIN引脚驱动50 MHz REF_CLK。使用该模式时,必须在器件外部提供用于REF_CLK的50 MHz源。如图所示,时钟同时驱动到MAC和PHY。

在这里插入图片描述

ii.REF_CLK输出模式

为了降低BOM成本,该器件具有从低成本25 MHz晶体生成RMII REF_CLK信号的功能。与通常需要50 MHz的第三泛音晶体相比,这种类型的晶体便宜。 MAC必须能够与外部时钟一起使用,才能利用此功能。

从25 MHZ晶体中获取REF_CLK

在这里插入图片描述

在某些系统架构中,可以使用25 MHz的时钟源。该器件可用于为MAC生成REF_CLK,在此特定示例中,只能使用25 MHz的时钟(时钟不能为50 MHz)。与25 MHz晶振模式相似,nINT功能被禁用。

外部25 MHZ源获得REF_CLK

在这里插入图片描述

3.PHY寄存器

LAN8720有32个寄存器,每个寄存器都有16位。

这32个寄存器中分为两类:

类似的寄存器:根据IEEE标准定义0~15寄存器(重点BCR和BSR寄存器根据用户实现的功能来设置)

自由定义的寄存器:16~31寄存器是由芯片制造商自由定义(一般无需修改)

在正点原子案例代码中

PHY_SR=0X1F 指的是第31位的寄存机(也就是上图寄存器)

PHY_SPEED_STATUS=0X0004 指的是PHY的速度为100Mbit/s(根据上图寄存器配置而成)

PHY_DUPLEX_STATUS=0X0010 指的是半双工传输模式(根据上图寄存器配置而成)

4.以太网DMA描述符

学过STM32-DMA内容的同学们都应该知道DMA是不需要CPU的参与就可以实现内存和外设之间的数据交换。同样的,对于STM32互联型单片机的以太网DMA的作用也是如此,它的作用就是在不需要CPU的参与下,实现内存和以太网外设的数据交换。通俗来说,就是我们将要发送的数据放在一片内存去,告诉以太网DMA,我已经将数据放过去了,你去取出来发送到网络中去;当网络数据来的时候,以太网DMA自动将数据拷贝到一片内存中,通过中断的方式告诉CPU,数据来了,你去取出来吧。

发送:不需要CPU的参与下,把描述符指向的缓冲区数据传输到TX FIFO当中

接收:不需要CPU的参与下,将RX FIFO的数据传输到描述符指向的缓冲区当中

描述符分为:

        常规描述符:管理缓冲区

        增强描述符:在常规描述符基础上开启时间戳和IPV4(内容不讲)

描述符不是实际存在的物理结构,而是在程序中通过软件实现的,其实就是一个结构体

常规描述符的结构体代码:

TX DMA描述符成员变量:

  • TDES0[31]置0:CPU可将数据拷贝到描述符中,拷贝完成之后把该位置为1,告诉DMA可以发送出去了

  • TDES0[20]置1:描述符中的第二个地址是下一个描述符地址【ST以太网驱动库是TDES0[20]置1】

  • TDES0[28:16]:如果TDES0[20]位置为1,则该字段无效

  • TDES0[31:0]:取决于TDES0[20]的值,为1,则指向下一个描述符地址

RX DMA描述符成员变量:

RDES0[31]置0:MAC将数据从RX FIFO传输到RX描述符中,拷贝完成之后将该位置0,告诉CPU可以接收数据

RDES0[14]置1:描述符中的第二个地址是下一个描述符地址【ST以太网驱动库是RDES0[14]置1】

RDES0[28:16]:如果RDES0[14]位置为1,则该字段无效

RDES0[31:0]:取决于RDES0[14],为1,则指向下一个描述符地址

STM32 ETH-DMA描述符(只用到了常规描述符而未用到增强型描述符):

ETH为发送接收申请内存:

发送:网络层下达pbuf->拷贝到TXFIFO->MAC->PHY(光电信号);

接收:外部->PHY->mac->RXFIFO->网络层

其中 ETH_TX_BUF_SIZE = ETH_MAX_PACKET_SIZE描述符最大长度为1524

STM32中提供的以太网驱动库使用的是链接结构:

描述符注意事项:

1.一个以太网数据包可以跨越一个或多个DMA描述符

2.一个DMA描述符只能用于一个以太网数据包

3.DMA描述符列表中的最后一个描述符指向第一个,形成链式结构

四、正点原子重点代码分析

总流程如下所示

img

1、LWIP初始化

img

//LWIP初始化(LWIP启动的时候使用)
//返回值:0,成功
//      1,内存错误
//      2,LAN8720初始化失败
//      3,网卡添加失败.
u8 lwip_comm_init(void)
{u8 retry=0;struct netif *Netif_Init_Flag;      //调用netif_add()函数时的返回值,用于判断网络初始化是否成功struct ip_addr ipaddr;              //ip地址struct ip_addr netmask;             //子网掩码struct ip_addr gw;                  //默认网关 
​if(ETH_Mem_Malloc())return 1;       //内存申请失败if(lwip_comm_mem_malloc())return 2; //内存申请失败lwip_comm_default_ip_set(&lwipdev); //设置默认IP等信while(LAN8720_Init())               //初始化LAN8720,如果失败的话就重试5次{retry++;if(retry>5) {retry=0;return 3;} //LAN8720初始化失败}lwip_init();                        //初始化LWIP内核
​
#if LWIP_DHCP       //使用动态IPipaddr.addr = 0;netmask.addr = 0;gw.addr = 0;
#else               //使用静态IPIP4_ADDR(&ipaddr,lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);IP4_ADDR(&netmask,lwipdev.netmask[0],lwipdev.netmask[1] ,lwipdev.netmask[2],lwipdev.netmask[3]);IP4_ADDR(&gw,lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);printf("网卡en的MAC地址为:................%d.%d.%d.%d.%d.%d\r\n",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]);printf("静态IP地址........................%d.%d.%d.%d\r\n",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);printf("子网掩码..........................%d.%d.%d.%d\r\n",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);printf("默认网关..........................%d.%d.%d.%d\r\n",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
#endifNetif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,&ethernetif_init,&ethernet_input);//向网卡列表中添加一个网口#if LWIP_DHCP           //如果使用DHCP的话lwipdev.dhcpstatus=0;   //DHCP标记为0dhcp_start(&lwip_netif);    //开启DHCP服务
#endifif(Netif_Init_Flag==NULL)return 4;//网卡添加失败 else//网口添加成功后,设置netif为默认值,并且打开netif网口{netif_set_default(&lwip_netif); //设置netif为默认网口netif_set_up(&lwip_netif);      //打开netif网口}return 0;//操作OK.
}   

(1)ETH_Mem_Malloc()

为描述符及缓冲区申请内存,除了这种用算法实现的内存申请函数可以申请内存之外,ST官方给出的例程是使用简单的使用数组来实现申请内存。

(2)判断是否开启DHCP(动态IP)

未开启则采用静态IP:申请远端IP地址、网卡MAC地址、本地IP地址、子网掩码、默认网关

(3)以太网环境配置

配置以太网环境、并且初始化RMII的IO(通过调用的HAL_ETH_Init函数,它会调用HAL_ETH_MspInit函数初始化相应的接口IO以及复位PHY芯片管脚)、复位PHY芯片(非常重要,不复位以太网通信不能成功

(4)初始化LwIP内核

它是LwIP内核源码自带的函数,初始化了一系列函数,如sys_init()、mem_init()、pbuf_init()、netif_init()。

2.添加虚拟网卡

LwIP是软件,如何管理真正的以太网硬件呢,比如网络接口有多种,如WIFI接口、以太网接口,怎么管理这些实际的网络接口,LwIP抽象了一个虚拟网卡来管理这些各种硬件网络接口。

(1)ethernetif_init:

网卡初始化,设置虚拟网卡参数,该函数在ethernetif.c文件中已经帮我们实现好了整体框架。它会调用low_level_init函数,该函数初始化发送和接收描述符,并开启ETH中断。

(2)err_t low_level_init:

初始化发送和接收描述符,并开启ETH中断。

(3)ethernetif_input:

以太网数据包输入,这里LwIP默认已经帮我们实现好了框架。开启虚拟网卡:通过low_level_input接收,再用netif结构体中的input字段(一个函数)来处理数据包

3.虚拟网卡控制块

img

4.发送流程

img

5.接收流程

接收有两种方式接收数据包,一种是查询式接收数据包,一种是中断方式接收数据包。

img

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国式报表制作困难?!那是因为你没选对报表工具!

一、报表工具介绍 在信息化时代&#xff0c;数据是企业决策的核心驱动力。报表工具作为数据处理与分析的重要手段&#xff0c;广泛应用于财务、销售、运营等各个领域&#xff0c;成为企业洞察市场、优化管理、提升效率的关键工具。传统上&#xff0c;报表制作依赖于复杂的编程…

AWS注册时常见错误处理

引言 创建AWS账号是使用AWS云服务的第一步&#xff0c;但在注册过程中可能会遇到一些常见的问题。本文中九河云将帮助您排查和解决在创建AWS账户时可能遇到的一些常见问题&#xff0c;包括未接到验证电话、最大失败尝试次数错误以及账户激活延迟等。 常见问题及解决方法 1. …

tensorflow底层架构

tensorflow底层架构 架构图 Training libraries 和 Inference libs&#xff08;训练库和推理库&#xff09; Training libraries&#xff1a;用于模型的训练过程&#xff0c;包括定义模型、计算梯度、更新模型权重等。这些库提供了在训练过程中所需的所有功能。Inference lib…

如何使用ArcGIS Pro制作地理区位图

你是否经常在网上看到别人制作的地理区位图&#xff0c;自己也跃跃欲试&#xff0c;这里为你分享一下制作方法&#xff0c;希望能对你有所帮助。 乡镇数据处理 将乡镇边界数据加载进来&#xff0c;打开符号系统&#xff0c;将所有的乡镇边界数据设置成一个颜色&#xff0c;如…

流浪软件uniaccess agent 删除

cmd的C盘找不到就用git rm -rf 之后&#xff0c;只剩下 俩文件夹删不掉 然后360软件就看到了&#xff0c;可惜卸载失败 然后360文件就找到了&#xff0c;彻底删除 再回git 查看 方法 https://blog.51cto.com/u_16099347/11352333 https://blog.csdn.net/xioayu96/article/…

9.25盒马鲜生一面

1.自我介绍 2.css两种盒子模型 ​3.rem和em 4.px概念 5.transition和animation的区别 6.移动端适配方案 7.vh、vw、% 8.js基本数据类型 9.call、apply、bind的区别 10.js实现继承的方法 11.get和post的区别 12.web安全&#xff08;XSS&#xff0c;CSRF&#xff09; …

Hadoop安装与配置

一、Hadoop安装与配置 1、解压Hadoop安装包 找到hadoop-2.6.0.tar.gz,将其复到master0节点的”/home/csu”目录内&#xff0c;解压hadoop [csumaster0 ~]$ tar -zxvf ~/hadoop-2.6.0.tar.gz 解压成成功后自动在csu目录下创建hadoop-2.6.0子目录&#xff0c;可以用cd hadoo…

Matlab simulink建模与仿真 第十九章(生成C代码)

一、Configuration Parameters模型参数配置 1、仿真时间 &#xff08;1&#xff09;在Solver选项卡中可以设置仿真的起始时间和结束时间&#xff0c;一般起始时间设为0&#xff0c;而结束时间按需设置。 &#xff08;2&#xff09;如果希望仿真不会自动暂停&#xff08;也就…

代码随想录算法训练营第55天 | 寻找存在的路径

寻找存在的路径 题目描述 给定一个包含 n 个节点的无向图中&#xff0c;节点编号从 1 到 n &#xff08;含 1 和 n &#xff09;。 你的任务是判断是否有一条从节点 source 出发到节点 destination 的路径存在。 输入描述 第一行包含两个正整数 N 和 M&#xff0c;N 代表节点…

音视频入门基础:AAC专题(9)——FFmpeg源码中计算AAC裸流每个packet的duration和duration_time的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

极度精简 Winows11 系统镜像!Tiny11 2311下载 - 支持苹果 M 芯片 Mac 安装 (ARM 精简版)!

最新推出的 Tiny11 是一款极端精简版 Windows 11 系统镜像&#xff0c;针对苹果 M 芯片 Mac 用户&#xff08;ARM 架构&#xff09;提供良好支持。Tiny11 内置了众多优化特性&#xff0c;如更小的安装体积和更快的启动速度&#xff0c;特别适合有特殊需求或老机型的用户。用户可…

打卡软件——人脸识别综合实现Pro

目录 概要 代码说明 1. 导入库 2. 加载预训练的车辆检测模型 3. 读取视频 4. 初始化变量 5. 逐帧处理视频 6. 处理帧 7. 处理检测结果 8. 计算框的坐标 9. 检查车辆中心是否已计数 10. 绘制检测框 11. 显示车流量 12. 退出条件 13. 释放资源 整体代码 效果展示…

过敏星人能否好好呼吸?约克VRF中央空调从呼吸开始全方位守护

对于包括向先生在内的过敏人群来说,秋天可能是比春天更难熬的坎儿,防不胜防的过敏原,例如空气中飘散的花粉、螨虫、霉菌、宠物毛发和皮屑、屋尘等,因为空气质量问题频频引发的过敏症状,令他们苦不堪言,止不住地打喷嚏、眼睛越揉越痒、起床后就开始擦鼻涕…… 如何才能远离这些…

免费的高质量、美观的甘特图模板

呈现您的项目规划新高度&#xff0c;精选几款高品质、视觉出众的甘特图模板。 甘特图Excel模板-Ganttable系统风格甘特图Excel模板-专业甘特图Excel模板-浅蓝色甘特图Excel模板-深灰色 这些 Excel 甘特图模板均源自 Ganttable 甘特图AI工具的智能生成与导出。利用 Ganttable&a…

Win32动态库介绍及全局函数导出

Windows操作系统中&#xff0c;库分为动态链接库(dll)和静态链接库(lib) 动态库是Windows中实现代码共享的一种方式。它是一个二进制式文件&#xff0c;不可单独运行&#xff0c;需要调用方调用才能运行。在Windows中&#xff0c;动态库可以被多种编程语言所支持。 静态链接库不…

线下线上陪玩系统要多少钱?该怎么搭建?

关于线下线上陪玩系统的价格&#xff0c;由于开发成本、功能复杂度、系统规模以及定制需求等因素的不同&#xff0c;价格差异较大&#xff0c;一般在几千元至几万元不等。具体价格需要根据实际需求和预算进行商议和定制。 搭建线下线上陪玩系统大致可以分为以下几个步骤&#…

论文阅读- On the Feasibility of Fully AI-automated Vishing Attacks

https://arxiv.org/pdf/2409.13793 目录 摘要 INTRODUCTION II. GOALS AND THREAT MODEL III. VIKING A. Architecture B. Interaction with the LLM C. Audio processing D. Call processing E. Implementation IV. EVALUATION METHODOLOGY A. Experiment design …

外卖霸王餐在对接api过程中需要注意哪些方面的问题?

在对接外卖霸王餐 API 过程中&#xff0c;需要注意以下几个方面&#xff1a; 一、合法性与合规性 1.遵守法律法规&#xff1a; 确保你的业务和对 API 的使用符合当地的法律法规&#xff0c;包括消费者权益保护法、电子商务法等。了解并遵守与食品相关的法律法规&#xff0c;…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0926)

十四、文章分类添加编辑 [element-plus 弹层] Git仓库&#xff1a;https://gitee.com/msyycn/vue3-hei-ma.git 点击显示弹层 准备弹层 const dialogVisible ref(false)<el-dialog v-model"dialogVisible" title"添加弹层" width"30%">…

【React】组件通信

1. 组件通信 组件间的数据传递 1.1 父传子 步骤&#xff1a; 父组件传递数据——在子组件标签上绑定属性子组件接收数据——子组件通过props参数接收数据 function Son(props) {return <div>{props.value}</div> }function App() {const value 父组件传给子…