W5500使用ioLibrary庫創建TCP客戶端

1、WIZnet全硬件TCP/IP協議棧

WIZnet全硬件TCP/IP協議棧,支持TCP,UDP,IPv4,ICMP,ARP,IGMP以及PPPoE協議。
以太網:支持BSD和WIZCHIP(W5500/W5300/W5200/W5100/W5100S)的SOCKET APIs驅動程序。
互聯網:
DHCP客戶端
DNS客戶端
FTP客戶端
FTP服務器
SNMP代理/陷阱
SNTP客戶端
TFTP客戶端
HTTP服務器
MQTT客戶端
其他功能將陸續添加。

ioLibrary庫下載地址: https://gitcode.com/gh_mirrors/io/ioLibrary_Driver?utm_source=csdn_github_accelerator&isLogin=1

案例:項目首頁 - MINISTM32移植W5500ioLiberary:MINISTM32 移植W5500 ioLiberary項目為開發者提供了在MINISTM32平臺上移植W5500網絡芯片的完整解決方案。該項目包含移植所需的庫文件和示例代碼,幫助開發者快速上手并實現網絡通信功能。通過詳細的移植說明和步驟,開發者可以輕松完成配置和調試,節省開發時間。無論是初學者還是有經驗的工程師,都可以利用該項目在STM32F103RCT6平臺上高效集成W5500,實現穩定的網絡連接。項目資源豐富,文檔清晰,是嵌入式網絡開發的理想選擇。 - GitCode

internet文件夾

W5500文件夾

2、W5500芯片

W5500是一款全硬件TCP/IP以太網控制器。W5500集成了TCP/IP協議棧,10/100M以太網數據鏈路
層(MAC)及物理層(PHY),使得用戶使用單芯片就能夠在他們的應用中拓展網絡連接。
支持8個獨立端口(Socket)同時通訊,每一個 Socket 的發送 緩存區都在一個 16KB 的物理發送內存中,初始化分配為 2KB。每一個 Socket 的接收緩 存區都在一個 16KB 的物理接收內存中,初始化分配為 2KB
W5500提供了SPI接口,最大支持80MHz速率,W5500支持SPI模式0和模式3。

3、配置使能W5500驅動

添加wizchip_conf.c,w5500.c和socket.c到工程中。打開wizchip_conf.H,找到_WIZCHIP_宏定義,修改如下:

?#ifndef _WIZCHIP_
? ?// NOTE_LIHAN: Some sections of this code are not yet fully defined.
? ?#define _WIZCHIP_ ? ? ? ? ? ? ? ? ? ? ?W5500 ? // W5100, W5100S, W5200, W5300, W5500, 6300
?? ? //將_WIZCHIP_宏設置為W5500,2025年5月15日修改
?#endif

4、添加SPI1驅動程序

//函數功能:
//初始化SPI1_SCL為PA5,SPI1_MISO為PA6,SPI1_MOSI為PA7,SPI1_CS為PA3;
//設置SPI1的工作模式

void W5500_SPI_Init(void)
{
?? ?GPIO_InitTypeDef ?? ?GPIO_InitStructure;
?? ?SPI_InitTypeDef ? SPI_InitStructure;

? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA的外設時鐘
? RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); ?//使能SPI1的外設時鐘

? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; ? ? ? ? //選擇PIN5,是SPI1的SCL
? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;?? ? ?//選擇引腳為復用推挽輸出
? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //設置引腳的最高工作速率為50MHz
? GPIO_Init(GPIOA, &GPIO_InitStructure); ?//根據GPIO_InitStructure結構指針所指向的參數配置PA5引腳?? ?

? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; ? ? ? ? //選擇PIN6,是SPI1的MISO
?? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;?? ? ?//選擇引腳為輸入懸浮
? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //設置引腳的最高工作速率為50MHz
? GPIO_Init(GPIOA, &GPIO_InitStructure); ?//根據GPIO_InitStructure結構指針所指向的參數配置PA6引腳

? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; ? ? ? ? //選擇PIN7,是SPI1的MOSI
?? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;?? ? ?//選擇引腳為復用推挽輸出
? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //設置引腳的最高工作速率為50MHz
? GPIO_Init(GPIOA, &GPIO_InitStructure); ?//根據GPIO_InitStructure結構指針所指向的參數配置PA7引腳

? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; ? ? ? ? //選擇PIN3,是W5500的片選腳CS
? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ?//選擇引腳為推挽輸出
?? ?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //設置引腳的最高工作速率為50MHz
? GPIO_Init(GPIOA, &GPIO_InitStructure); ?//根據GPIO_InitStructure結構指針所指向的參數配置PA3引腳

//設置SPI1的工作模式
? SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
?? ?//SPI設置為雙線雙向全雙工
? SPI_InitStructure.SPI_Mode = SPI_Mode_Master; ? ? //設置為主SPI
? SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //設置SPI發送接收為8位幀結構
? SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; ? ? ? ?//設置SCK空閑時鐘為低電平
? SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; ? ? ?//數據捕獲于第1個時鐘沿
?? ?//SCK空閑時鐘為低電平,數據捕獲于第1個時鐘沿,這樣就設置了SPI從機在下降沿采集數據了
?? ?//SPI從機在下降沿采集數據,這要求CPU必須在SCK上升沿輸出位值,在SCK為高電平時達到穩定,為數據采集做好準備
? SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; ?//設置NSS輸出由SSI位控制
? SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
?? ?//設置波特率預分頻值為2
? SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; ?//設置數據傳輸先從MSB位開始
? SPI_InitStructure.SPI_CRCPolynomial = 7; ? ? ? ? ? ?//使用CRC7校驗
? SPI_Init(SPI1, &SPI_InitStructure);

? SPI_Cmd(SPI1, ENABLE); //使能SPI外設
}

#define?? ?W5500_CS_high() ? GPIO_SetBits(GPIOA,GPIO_Pin_4) ? //W5500片選引腳
#define?? ?W5500_CS_low() ? ?GPIO_ResetBits(GPIOA,GPIO_Pin_4) //W5500片選引腳

//函數功能:選擇W5500
void SPI_CS_Select(void)
{
?? ?W5500_CS_low();
}

//函數功能:不選擇W5500
void SPI_CS_Deselect(void)
{
?? ?W5500_CS_high();
}

//函數功能:從W5500讀取一個字節
uint8_t SPI_ReadByte(void)
{
?? ?uint8_t byte;

?? ?byte=SPI_I2S_ReceiveData(SPI1);//虛讀一次
?? ?SPI_I2S_SendData(SPI1,0x00);//通過外設SPI1發送0x00為的是發送8個移位時鐘
?? ?while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
?? ?//檢查SPI1標志位,是否設置"發送緩存空標志位",等待數據寄存器空
?? ?byte=SPI_I2S_ReceiveData(SPI1);//讀取1個字節數據

?? ?return byte;
}

//函數功能:將byte發送給W5500
void SPI_WriteByte(uint8_t byte)
{
?? ?SPI_I2S_SendData(SPI1,byte);//通過外設SPI1發送一個數據
?? ?while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
?? ?//檢查SPI1標志位,是否設置"發送緩存空標志位",等待數據寄存器空
}

//函數功能:關閉總中斷
void SPI_CrisEnter(void)
{
?? ?__set_PRIMASK(1);//關閉總中斷
}

//函數功能:使能總中斷
void SPI_CrisExit(void)
{
?? ?__set_PRIMASK(0);//開放總中斷
}

5、TCP客戶端應用程序W5500_HD_Driver.c

#include "W5500_HD_Driver.h"		
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "socket.h"	// Just include one header for WIZCHIP
#include "SPI1.h"//下載地址: https://gitcode.com/gh_mirrors/io/ioLibrary_Driver?utm_source=csdn_github_accelerator&isLogin=1
//W5500的網絡參數
//本地物理地址:00 08 DC 11 11 11
//本地IP地址:192.168.1.199
//本地子網掩碼:	255.255.255.0
//本地網關:192.168.1.1
//DNS服務器IP地址:8.8.8.8
//通過手動配置靜態IP地址,Static IP configuration by manually.
wiz_NetInfo gWIZNETINFO = { {0x00, 0x08, 0xdc,0x11, 0x11, 0x11},{192, 168, 1, 199},{255,255,255,0},{192, 168, 1, 1},{8,8,8,8},NETINFO_STATIC };//端口0的網絡參數
uint16_t LocalPort0=5000;	               //端口0的本地端口號(5000)
uint8_t  DstIP_Port0[4]={192,168,1,190}; //端口0的遠程IP地址:192.168.1.190
uint16_t DstPort_Port0=6000;             //端口0的遠程端口號:6000uint8_t gDATABUF[DATA_BUF_SIZE];//STM32接收/發送W5500的數據緩沖區void W5500_Initialization(void);//函數功能:裝載W5500的本地網絡參數和端口0的網絡參數
void W5500_Load_Net_Parameters(void)
{
//本地物理地址:00 08 DC 11 11 11gWIZNETINFO.mac[0]=0x00;gWIZNETINFO.mac[1]=0x08;gWIZNETINFO.mac[2]=0xdc;gWIZNETINFO.mac[3]=0x11;gWIZNETINFO.mac[4]=0x11;gWIZNETINFO.mac[5]=0x11;//本地IP地址:192.168.1.199gWIZNETINFO.ip[0]=192;gWIZNETINFO.ip[1]=168;gWIZNETINFO.ip[2]=1;gWIZNETINFO.ip[3]=199;//本地子網掩碼:	255.255.255.0gWIZNETINFO.sn[0]=255;gWIZNETINFO.sn[1]=255;gWIZNETINFO.sn[2]=255;gWIZNETINFO.sn[3]=0;//本地網關:192.168.1.1gWIZNETINFO.gw[0]=192;gWIZNETINFO.gw[1]=168;gWIZNETINFO.gw[2]=1;gWIZNETINFO.gw[3]=1;//DNS服務器IP地址:8.8.8.8gWIZNETINFO.dns[0]=8;gWIZNETINFO.dns[1]=8;gWIZNETINFO.dns[2]=8;gWIZNETINFO.dns[3]=8;//DHCP模式gWIZNETINFO.dhcp=NETINFO_STATIC;//告訴ioLibrary庫,當前使用"靜態IP地址"配置//通過手動配置靜態IP地址,Static IP configuration by manually.//端口0的本地端口號LocalPort0=5000;//端口0的遠程IP地址:192.168.1.190DstIP_Port0[0]=192;DstIP_Port0[1]=168;DstIP_Port0[2]=1;DstIP_Port0[3]=190;//端口0的遠程端口號DstPort_Port0=6000;
}/*** @brief  Intialize the network information to be used in WIZCHIP* @retval None*/
//函數功能:設置本地網絡參數:MAC地址,GW網關,SN子網掩碼,本地IP地址,DNS服務器IP地址,DHCP
void network_init(void)
{uint8_t tmpstr[6];ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);//設置本地網絡參數:MAC地址,GW網關,SN子網掩碼,本地IP地址,DNS服務器IP地址,DHCP//設置MAC地址,將gWIZNETINFO.mac寫入W5500;//設置網關,將gWIZNETINFO.gw寫入W5500;//設置子網掩碼,將gWIZNETINFO.sn寫入W5500//設置本地IP地址,將gWIZNETINFO.ip寫入W5500//將gWIZNETINFO.dns[]拷貝到_DNS_[]中//將gWIZNETINFO.dhcp保存到_DHCP_中ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);//讀本地網絡參數:MAC地址,GW網關,SN子網掩碼,本地IP地址,DNS服務器IP地址,DHCP//讀MAC地址,保存到gWIZNETINFO.mac//讀網關,保存到gWIZNETINFO.gw//讀子網掩碼,保存到gWIZNETINFO.sn//讀本地IP地址,保存到gWIZNETINFO.ip//將_DNS_[]拷貝到gWIZNETINFO.dns[]中//將_DHCP_保存到gWIZNETINFO.dhcp中ctlwizchip(CW_GET_ID,(void*)tmpstr);//讀W5500的ID,保存到tmpstr[6]中,"W5500\0",這是ioLibrary驅動定義的ID;//在wizchip_conf.h中定義_WIZCHIP_ID_為"W5500\0"printf("\r\n=== %s NET CONF ===\r\n",(char*)tmpstr);//串口輸出W5500的IDprintf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]);//串口輸出W5500的MAC地址printf("SIP: %d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);//串口輸出W5500的IP地址printf("GAR: %d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);//串口輸出W5500的網關地址printf("SUB: %d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);//串口輸出W5500的子網掩碼printf("DNS: %d.%d.%d.%d\r\n", gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);//串口輸出W5500的DNS服務器IP地址printf("======================\r\n");
}//函數功能:
//1.初始化SPI接口
//2.注冊相關函數
//3.設置W5500每個端口的發送緩沖區和接收緩沖區的大小均為2K字節
//4.等待"以太網"連接完成
//5.裝載本地網絡參數
//6.設置本地網絡參數:MAC地址,GW網關,SN子網掩碼,本地IP地址,DNS服務器IP地址,DHCP
void W5500_Initialization(void)
{uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};//W5500發送和接收各有8個端口,這里定義每個端口的發送緩沖區和接收緩沖區的大小均為2K字節uint8_t tmp;W5500_SPI_Init();   //W5500 SPI初始化配置reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit);	//注冊臨界區函數reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);//注冊SPI片選信號函數reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte);	//注冊讀寫函數if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1){//W5500發送和接收各有8個端口,這里初始化每個端口的發送緩沖區和接收緩沖區的大小均為2K字節printf("WIZCHIP Initialized fail.\r\n");}//等待"以太網"連接完成, PHY link status checkdo{if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1){//讀PHYCFGR寄存器bit0,若為1,則表示網絡已經連接printf("Unknown PHY Link stauts.\r\n");}}while(tmp == PHY_LINK_OFF);W5500_Load_Net_Parameters();//裝載W5500的本地網絡參數和端口0的網絡參數network_init();//設置本地網絡參數:MAC地址,GW網關,SN子網掩碼,本地IP地址,DNS服務器IP地址,DHCP
}//函數功能:端口0發送"I am W5500\r\n"
void SOCKET0_Send_Data(void)
{char buf[20];uint16_t len=0;memset(gDATABUF,'\0',sizeof(gDATABUF));strcpy(buf,"I am W5500\r\n");strcat((char*)gDATABUF,buf);len=strlen( (char*)gDATABUF );send(SOCK_TCPS,gDATABUF,len);//發送數據
}void SOCKET0_Work(void)
{uint16_t len=0;switch(getSn_SR(SOCK_TCPS))//獲取W5500端口0的狀態寄存器{case SOCK_INIT://W5500端口0已經初始化connect(SOCK_TCPS,DstIP_Port0,DstPort_Port0);//將W5500端口0連接到遠程IP地址DstIP_Port0和遠程端口DstPort_Port0上break;case SOCK_ESTABLISHED://W5500端口0已經連接成功if(getSn_IR(SOCK_TCPS) & Sn_IR_CON){//讀端口0的Sn_IR中斷標志寄存器的bit0setSn_IR(SOCK_TCPS, Sn_IR_CON);//回寫清除中斷標志}len=getSn_RX_RSR(SOCK_TCPS);//讀端口0接收緩沖區的數據長度if(len){recv(SOCK_TCPS,gDATABUF,len);//讀"W5500端口0"的數據,長度為len個字節,保存到gDATABUFprintf("%s\r\n",gDATABUF);send(SOCK_TCPS,gDATABUF,len);//將gDATABUF的前len個字節通過"W5500端口0"發送出去}SOCKET0_Send_Data();break;case SOCK_CLOSE_WAIT://W5500端口0處于等待關閉狀態disconnect(SOCK_TCPS);//關閉端口0的連接break;case SOCK_CLOSED://W5500端口0處于關閉狀態socket(SOCK_TCPS,Sn_MR_TCP,LocalPort0,0x00);//打開Socket0,打開一個本地端口break;}
}

6、TCP客戶端應用程序W5500_HD_Driver.h頭文件

#ifndef	_W5500_HD_Driver_H_
#define	_W5500_HD_Driver_H_#include "stm32f10x.h"//使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "wizchip_conf.h"extern wiz_NetInfo gWIZNETINFO;//W5500的網絡參數#define SOCK_TCPS        0     //端口0
extern uint16_t LocalPort0;	   //端口0的端口號
extern uint8_t DstIP_Port0[4]; //端口0的遠程IP地址
extern uint16_t	DstPort_Port0; //端口0的遠程端口號#define DATA_BUF_SIZE   2048
extern uint8_t gDATABUF[DATA_BUF_SIZE];#define	W5500_CS_high()   GPIO_SetBits(GPIOA,GPIO_Pin_4)   //W5500片選引腳
#define	W5500_CS_low()    GPIO_ResetBits(GPIOA,GPIO_Pin_4) //W5500片選引腳extern void W5500_Initialization(void);
extern void SOCKET0_Work(void);
#endif

7、main.c程序

#include "stm32f10x.h"//使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()
#include "delay.h"
#include "USART4.h"#include "LED.h"
#include "W5500_HD_Driver.h"//#include "W5500_Variable.h"const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
int main(void)
{//	SCB->VTOR = 0x8000000;//中斷向量表重定義//	SystemInit();delay_init();//延時函數初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設置系統中斷優先級分組4USART4_Serial_Interface_Enable(115200);printf("%s",CPU_Reset_REG);//調試串口輸出"\r\nCPU reset!\r\n"W5500_Initialization();//1.初始化SPI接口//2.注冊相關函數//3.設置W5500每個端口的發送緩沖區和接收緩沖區的大小均為2K字節//4.等待"以太網"連接完成//5.裝載本地網絡參數//6.設置本地網絡參數:MAC地址,GW網關,SN子網掩碼,本地IP地址,DNS服務器IP地址,DHCPLED_Init();LED0_ON();while(1){LED0=!LED0;delay_ms(1000);SOCKET0_Work();//W5500端口0工作}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83685.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83685.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83685.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

管理Oracle Data Guard的最佳實踐

Oracle Data Guard的中文名字叫數據衛士,顧名思義,它是生產庫的一道保障。所以管理Data Guard是DBA的一項重要工作之一,管理Data Guard時主要有以下幾個注意點需要引起重視。 備份庫的歸檔日志積壓 一般情況下,生產庫的歸檔日志是…

BootCDN介紹(Bootstrap主導的前端開源項目免費CDN加速服務)

文章目錄 BootCDN前端開源項目CDN加速服務全解析什么是BootCDN技術原理與架構CDN技術基礎BootCDN架構特點1. 全球分布式節點網絡2. 智能DNS解析系統3. 高效緩存管理機制4. 自動同步更新機制5. HTTPS和HTTP/2協議支持 BootCDN的核心優勢速度與穩定性開源免費資源豐富度技術規范遵…

2025 Java 微信小程序根據code獲取openid,二次code獲取手機號【工具類】拿來就用

一、controller調用 /*** 登錄** author jiaketao* since 2024-04-10*/ RestController RequestMapping("/login") public class LoginController {/*** 【小程序】登錄獲取session_key和openid** param code 前端傳code* return*/GetMapping("/getWXSessionKe…

軟件架構風格系列(3):管道 - 過濾器架構

文章目錄 前言一、從生活場景到架構原理,看懂管道 - 過濾器的核心邏輯(一)什么是管道 - 過濾器架構?(二)核心組件拆解 二、架構設計圖:一圖看懂管道 - 過濾器架構全貌三、Java 示例代碼&#xf…

【VIM】vim 常用命令

文章目錄 插入模式光標移動拷貝/粘貼/刪除/撤銷塊操作分屏代碼縮進命令組合使用其他PowerVim 前言:本文內容大部分摘抄自酷殼和博客園 ? – ? CoolShell – 陳皓 ? 博客園 – 易先訊 插入模式 a → 在光標后插入o → 在當前行后插入一個新行O → 在當前行前插…

polarctf-web-[簡單rce]

考點&#xff1a; (1)RCE(eval函數) (2)執行函數(passthru函數) (3)/頂級(根)目錄查看 (4)sort排序查看函數 題目來源&#xff1a;Polarctf-web-[簡單rce] 解題&#xff1a; 代碼審計 <?php/*?PolarD&N CTF?*/highlight_file(__FILE__);function no($txt){ # …

HarmonyOs開發之———使用HTTP訪問網絡資源

謝謝關注&#xff01;&#xff01; 前言&#xff1a;上一篇文章主要介紹HarmonyOs開發之———Video組件的使用:HarmonyOs開發之———Video組件的使用_華為 video標簽查看-CSDN博客 HarmonyOS 網絡開發入門&#xff1a;使用 HTTP 訪問網絡資源 HarmonyOS 作為新一代智能終端…

Vue 圖片預覽功能(含縮略圖)

眾所周知&#xff0c;常見的組件庫如Element、Ant Design&#xff0c;自帶的圖片預覽功能都沒有縮略圖&#xff0c;所以 需要單獨封裝一個圖片預覽的服務。 第三方庫&#xff1a;v-viewer 安裝&#xff1a; npm install v-viewer viewerjs 若使用報錯&#xff0c;可安裝指定…

手寫tomcat:基本功能實現(4)

邏輯架構 HTTP 請求與 Socket&#xff1a; 左側的 “HTTP 請求” 箭頭指向 “socket”&#xff0c;表示客戶端發送的 HTTP 請求通過 socket 傳輸到服務器。Socket 負責接收請求&#xff0c;并提取出其中的 請求路徑&#xff08;如 /first&#xff09;和 請求方法&#xff08;如…

jvm安全點(一)openjdk17 c++源碼垃圾回收安全點信號函數處理線程阻塞

1. 信號處理入口?? ??JVM_HANDLE_XXX_SIGNAL?? 是 JVM 處理信號的統一入口&#xff0c;負責處理 SIGSEGV、SIGBUS 等信號。??javaSignalHandler?? 是實際注冊到操作系統的信號處理函數&#xff0c;直接調用 JVM_HANDLE_XXX_SIGNAL。 ??2. 安全點輪詢頁的識別?? …

微信小程序:封裝表格組件并引用

一、效果 封裝表格組件,在父頁面中展示表格組件并顯示數據 二、表格組件 1、創建頁面 創建一個components文件夾,專門用于存儲組件的文件夾 創建Table表格組件 2、視圖層 (1)表頭數據 這里會從父組件中傳遞表頭數據,這里為columns,后續會講解數據由來 循環表頭數組,…

【FMC216】基于 VITA57.1 的 2 路 TLK2711 發送、2 路 TLK2711 接收 FMC 子卡模塊

產品概述 FMC216 是一款基于 VITA57.1 標準規范的 2 路 TLK2711 接收、2 路 TLK2711 發送 FMC 子卡模塊。該板卡支持 2 路 TLK2711 數據的收發&#xff0c;支持線速率 1.6Gbps&#xff0c;經過 TLK2711 高速串行收發器&#xff0c;可以將 1.6Gbps 的高速串行數據解串為 16 位并…

K8S Gateway API 快速開始、胎教級教程

假設有如下三個節點的 K8S 集群&#xff1a; ?? k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、Gateway 是什么 背景和目的 入口&#xff08;Ingress&#xff09;目前已停止更新。新的功能正在集成至網關 API 中。在 Kubernetes …

時序數據庫IoTDB分布式架構解析與運維指南

一、IoTDB分布式架構概述 分布式系統由一組獨立的計算機組成&#xff0c;通過網絡通信&#xff0c;對外表現為一個統一的整體。IoTDB的原生分布式架構將服務分為兩個核心部分&#xff1a; ?ConfigNode&#xff08;CN&#xff09;?&#xff1a;管理節點&#xff0c;負責管理…

Ubuntu 20.04 LTS 中部署 網頁 + Node.js 應用 + Nginx 跨域配置 的詳細步驟

Ubuntu 20.04 LTS 中部署 網頁 Node.js 應用 Nginx 跨域配置 的詳細步驟 一、準備工作1、連接服務器2、更新系統 二、安裝 Node.js 環境1、安裝 Node.js 官方 PPA&#xff08;用于獲取最新穩定版&#xff09;&#xff1a;2、安裝 Node.js 和 npm&#xff08;LTS 長期支持版本…

3DVR制作的工具或平臺

3DVR&#xff08;三維虛擬現實&#xff09;是利用三維圖像技術和虛擬現實技術&#xff0c;將真實場景進行三維掃描并轉換成計算機可識別的三維模型&#xff0c;使用戶能夠在虛擬空間中自由漫游&#xff0c;體驗身臨其境的感覺。3DVR技術結合了全景拍攝和虛擬現實&#xff0c;提…

垂直智能體:企業AI落地的正確打開方式

在當前AI浪潮中&#xff0c;許多企業急于跟進&#xff0c;推出自己的AI智能體解決方案。然而&#xff0c;市場上大量出現的"萬能型"智能體卻鮮有真正解決實際問題的產品。本文將探討為何企業應該專注于開發垂直領域智能體&#xff0c;而非追求表面上的全能&#xff0…

軟件工程各種圖總結

目錄 1.數據流圖 2.N-S盒圖 3.程序流程圖 4.UML圖 UML用例圖 UML狀態圖 UML時序圖 5.E-R圖 首先要先了解整個軟件生命周期&#xff1a; 通常包含以下五個階段&#xff1a;需求分析-》設計-》編碼 -》測試-》運行和維護。 軟件工程中應用到的圖全部有&#xff1a;系統…

王者榮耀游戲測試場景題

如何測試一個新英雄&#xff1a;方法論與實踐維度 測試一個新英雄不僅僅是“打打打”&#xff0c;而是一套完整的測試流程&#xff0c;包括設計文檔驗證、功能驗證、數值驗證、性能驗證、交互驗證等。可以從以下多個角度展開&#xff1a; &#x1f50d; 1. 方法論維度 ? 測試…

第四天的嘗試

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 很抱歉的說一下&#xff0c;我昨天看白色巨塔電視劇&#xff0c;看的入迷了&#xff0c;同時也看出一些道理&#xff0c;學到東西&#xff1b; 但是把昨天的寫事情給忘記了&#xff0c;今天…