ESP8266学习

一,连接Wifi

1.Esp8266连接手机热点

AT

AT+RST
AT+CWMODE=1
AT+CWJAP="ESP8266","123456789"

手机查看连接信息

2.Esp8266连接手机热点进入透传模式

AT

AT+RST
AT+CWMODE=1
AT+CWJAP="ESP8266","123456789"

AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.10.7",8080
AT+CIPMODE=1    //透传模式
AT+CIPSEND
AT+RESTORE

需要先发送 “+++” 来退出透传模式,之后才能进行 AT 指令的交互。

不加回车换行

AT+SAVETRANSLINK=1,"192.168.10.7",8080,"TCP",100        保存,上电后自动配置

AT+SAVETRANSLINK=1,"服务器IP",端口,"TCP"  // 保存透传配置(1 表示使能上电自动连接和自动进入透传模式。即模块在上电之后,会按照后续设定的参数自动连接目标服务器,并自动进入透传模式;如果设置为 0,则不会自动进行连接和进入透传,需要手动发送相关指令来操作。)100 表示模块上电后自动连接服务器时的超时时间

解释:

  1. AT:测试模块是否正常响应,正常会返回 "OK"
  2. AT+RST:重启模块,恢复初始状态
  3. AT+CWMODE=1:STA(站点)模式,模块作为客户端连接外部 WiFi(如路由器)AT+CWMODE=2:AP(接入点)模式,模块自身创建 WiFi 热点供其他设备连接AT+CWMODE=3:混合模式,同时具备 STA 和 AP 功能(既能连外部 WiFi,又能自建热点)
  4. AT+CWJAP="ESP8266","123456789":连接名为 "ESP8266"、密码 "123456789" 的 WiFi
  5. AT+CIPSTART="TCP","192.168.10.7",8080:建立 TCP 连接到 IP 为 192.168.10.7、端口 8080 的服务器
  6. AT+CIPMUX=0:设置为单连接模式(同一时间只保持一个连接)
  7. AT+CIPMODE=1:开启透传模式(串口数据直接通过 TCP 发送,无需额外指令)
  8. AT+CIPSEND:进入透传发送状态(此时可直接发送数据)
  9. AT+RESTORE:恢复模块出厂设置(清除所有配置)

二,两个ESP8266通信

1.一个配置服务器

  • AT+RST:用于复位 ESP8266 模块。
  • AT+CWMODE=2:设置模块的工作模式为 AP(接入点)模式,此时模块可作为热点,让其他设备连接。
  • AT+CWSAP="ESP8266","12345678",5,3:配置 AP 模式下的参数,设置热点名称为 “ESP8266”,密码为 “12345678”,信道为 5,加密方式为 WPA PSK。
  • AT+CIPMUX=1:将模块设置为多连接模式,支持同时与多个客户端建立连接。
  • AT+CIPSERVER=1,8080:建立服务器,端口为 8080,这样模块可监听来自客户端的连接请求。
  • AT+CIFSR:用于查询模块的 IP 地址等网络相关信息。

AT+CIPSEND=<连接ID>,<数据长度>

2.另一个单片机作为客户端

  • AT
  • AT+RST
  • AT+CWMODE=1
  • AT+CWJAP="ESP8266","123456789"
  • AT+CIPMUX=0
  • AT+CIPSTART="TCP","192.168.10.7",8080
  • AT+CIPMODE=1    //透传模式
  • AT+CIPSEND
  • AT+RESTORE

需要先发送 “+++” 来退出透传模式,之后才能进行 AT 指令的交互。

这样两个ESP8266就可以相互通信

程序:

服务器

一个程序是创建服务器,检测信息,是否连接,和获取的数据信息

这个程序,功能不完善,能简单获取设备号,和显示客户端发来的消息

#include "stm32f10x.h"
#include "OLED.h"
#include "Delay.h"
#include "usart.h"
#include "string.h"
#include "EXTI_KEY.h"extern const unsigned char BMP1[];
//extern const unsigned char BMP2[];#define BUFFER_SIZE 100  //缓冲区大小
char receiveBuffer[BUFFER_SIZE];  // 缓冲区
//uint16_t dht11[BUFFER_SIZE];  //
uint8_t receiveIndex = 0,copyreceive=0;  // 接收索引
uint16_t receivedChar=0;char server_ok=0,show=0;
char i=0,kehu=0,clear=0;void ESP8266_SendAT(char *p,char*q)
{USART_SendString(USART1,p);while((receiveBuffer[copyreceive-3]!=*q)&&(receiveBuffer[copyreceive-2]!=*(q+1)));memset(receiveBuffer,32,BUFFER_SIZE);
}void ESP8266_Init() 
{ESP8266_SendAT("AT\r\n", "OK");          // 测试模块ESP8266_SendAT("AT+CWMODE=2\r\n", "OK"); // 设为AP模式(手机/设备可连)ESP8266_SendAT("AT+CWSAP=\"ESP8266\",\"12345678\",5,3\r\n", "OK"); // AP名:ESP8266,密码:12345678ESP8266_SendAT("AT+CIPMUX=1\r\n", "OK"); // 多连接模式ESP8266_SendAT("AT+CIPSERVER=1,8080\r\n", "OK"); // 启动服务器,端口8080
}int main()
{char *customer;static uint8_t last_state = 0xFF; //记录上次状态// 硬件初始化EXTI_PE_Configuration();  // 中断按键配置OLED_Init();              // OLED初始化USART1_Config();          // 串口1配置(连ESP8266)ESP8266_Init();           // 初始化ESP8266服务器OLED_Clear();OLED_ShowString(1, 1, "Server Ready");  // 显示服务器就绪while(1){//模式1 显示客户端连接状态if(show == 1){OLED_ShowString(1,1,"Wait Connect");customer=receiveBuffer+2;if(strncmp(customer,"CONNECT",7)==0){uint8_t current_customer = *(customer-2) - '0';if(last_state!=current_customer){OLED_Clear();OLED_ShowString(1, 1, "Connected");switch(current_customer) {case 0:OLED_ShowString(2,1,"one customer");break;case 1:OLED_ShowString(2,1,"two customer");break;case 2:OLED_ShowString(2,1,"three customer");break;case 3:OLED_ShowString(2,1,"four customer");break;default:OLED_ShowString(2,1,"unknown");break;}OLED_ShowString(3,1,"status: on");last_state=current_customer;}show = 0;}}//显示客户端发送的数据if(show == 2){OLED_Clear();OLED_ShowString(1,1,"Wait Data");customer=receiveBuffer;if(strncmp(customer,"+IPD,",5)==0){OLED_ShowString(2,1,"Data:");OLED_ShowString(2,6,receiveBuffer+9); //+IPD,0,4:}show=0;}	}
}void USART1_IRQHandler(void)
{if (USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET) {receivedChar = USART_ReceiveData(USART1);if (receivedChar!= '\n' && receiveIndex < BUFFER_SIZE - 1) {receiveBuffer[receiveIndex++] = receivedChar;} else {receiveBuffer[receiveIndex] = '\0';copyreceive=receiveIndex;receiveIndex = 0; }show =kehu;}
}
void EXTI0_IRQHandler(void)
{	static int mode=0;if(EXTI_GetITStatus(EXTI_Line0) != RESET) {mode = (mode >= 2) ? 1 : mode + 1;  // 模式1/2切换// 发1字节数据到服务器连接(ID=0)USART_SendString(USART1, "AT+CIPSEND=0,1\r\n");Delay_ms(100);USART_SendData(USART1, mode);  // 发模式值(1/2)Delay_ms(100);kehu = mode;  // 标记当前模式}  EXTI_ClearITPendingBit(EXTI_Line0);     
}

客户端

连接服务器,检测服务器发来的消息,为’1‘的话,发送数据

#include "stm32f10x.h"
#include "OLED.h"
#include "Delay.h"
#include "usart.h"
#include "string.h"
#include "dht11.h"extern const unsigned char BMP1[];
//extern const unsigned char BMP2[];
u8 temp;
u8 humi;
u8 tempp;
u8 humip;
#define BUFFER_SIZE 100  
char receiveBuffer[BUFFER_SIZE];  
uint8_t receiveIndex = 0,copyreceive=0; uint16_t instruction=0;char i=0,ready=0,show=0;
void ESP8266_AT(char *p,char*q)
{USART_SendString(USART1,p);while((receiveBuffer[copyreceive-3]!=*q)&&(receiveBuffer[copyreceive-2]!=*(q+1)));memset(receiveBuffer,32,BUFFER_SIZE);
}
void ESP8266_Init(void)
{USART_SendString(USART1, "+++");  // 发送退出指令Delay_ms(500);USART_SendString(USART1, "+++");Delay_ms(500);USART_SendString(USART1, "+++");OLED_ShowString(1,1,"ESP_Init");Delay_ms(500);ESP8266_AT("AT\r\n","OK");ESP8266_AT("AT+CWMODE=1\r\n","OK");ESP8266_AT("AT+CWJAP=\"ESP8266\",\"12345678\"\r\n","OK");ESP8266_AT("AT+CIPMUX=0\r\n","OK");ESP8266_AT("AT+CIPMODE=1\r\n","OK");ESP8266_AT("AT+CIPSTART=\"TCP\",\"192.168.4.1\",8080\r\n","OK");ESP8266_AT("AT+CIPSEND\r\n","OK");OLED_ShowString(4,1,"ESP_Init ok");Delay_s(1);
}int main()
{char tx[10];OLED_Init();USART1_Config();DHT11_Init();ESP8266_Init();ready=1;OLED_Clear();OLED_ShowString(1,1,"wait server");OLED_ShowString(2,1,"temp:");OLED_ShowString(3,1,"humi:");while(1){DHT11_Read_Data(&temp,&tempp,&humi,&humip);OLED_ShowNum(2,6,temp,2);OLED_ShowNum(3,6,humi,2);OLED_ShowString(2,8,".");OLED_ShowString(3,8,".");OLED_ShowNum(2,9,tempp,1);OLED_ShowNum(3,9,humip,1);if(show==1){OLED_ShowNum(4,1,instruction,2);show=0;}if(instruction==49){tx[0]='T';tx[1]=(temp/10)+'0';tx[2]=(temp%10)+'0';tx[3]='.';tx[4]=(tempp%10)+'0';tx[5]='\0';USART_SendString(USART1,tx);Delay_ms(500);tx[0] = 'H';                  tx[1] = (humi / 10) + '0';   tx[2] = (humi % 10) + '0';    tx[3] = '.';                  tx[4] = (humip % 10) + '0';   tx[5] = '\0';                 USART_SendString(USART1, tx);Delay_ms(500);  // 保持与温度发送相同的间隔}}}void USART1_IRQHandler(void)
{if (USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET) {char receivedChar = USART_ReceiveData(USART1);if(ready==0){if (receivedChar!= '\n' && receiveIndex < BUFFER_SIZE - 1) {receiveBuffer[receiveIndex++] = receivedChar;} else {receiveBuffer[receiveIndex] = '\0';  copyreceive=receiveIndex;receiveIndex = 0;  }}if(ready==1){instruction=receivedChar;show=1;}}
}

三:MQTT连接

1.通信

无线通信                                                                                  通信协议

WIFI                                                                                           MQTT

NBIOT                                                                                        coap

GPRS                                                                                          HTTP

Lora

MQTT要保证实时连接

2.传输层协议

TCP和UDP的对比

对比维度

TCP

UDP

连接方式

面向连接(三次握手)

无连接

传输可靠性

可靠(不丢、有序)

不可靠(可能丢、乱序)

速度

较慢(多步骤确认)

快(无额外步骤)

资源开销

适用场景

需可靠(下载、聊天)

需快速(直播、游戏)

3.涉及的C 语言知识

Strlen函数和Sizeof函数:

相同点:字符数组的长度

不同点:是否包含结束标志’\0’

Strlen 不包含结束标志‘\0‘

Sizeof 包含结束标志’\0’

Memcpy

void *memcpy(void *str1,const void *str2,size_t n)

从存储区str2复制n个字节到存储区str1中

将一个内存数据复制到另一块中,即用于复制源空间的数据到目的空间

Memset 

void *memset(void *str, int c, size_t n) 

将已开辟内存空间 str 的首 n 个字节的值设置为指定的值 c

常用于初始化某个内存空间

Sprintf  头文件   stdio.h

Sprint函数数据打印到数组容器中

4.onenet平台

围绕设备→平台(上报事件) ” 和 “平台→设备(下发指令)

 设备数据上报平台

设备事件上报请求($sys/{pid}/{device-name}/thing/event/post 、发布权限)

  • 谁用:设备(比如传感器、智能终端 )
  • 干啥用:设备主动把自身的 “事件” 发给平台。
    举个例子:
    • 温湿度传感器检测到 “温度超限”,就通过向这个主题 发布(Publish) 消息,把 {"event":"temp_over","data":{"temp":35}}(意思是 “温度超限事件,当前温度 35℃” )这类数据上报给平台,让平台知道 “设备那边出状况了”。
    • 简单说就是 设备主动 “喊” 平台:我这有情况,你看看

设备事件上报响应($sys/{pid}/{device-name}/thing/event/post/reply 、订阅权限)

  • 谁用:还是设备(因为要接收平台回复 )
  • 干啥用:设备订阅这个主题,等平台回应。
    接着上面的例子:
    • 平台收到传感器 “温度超限” 事件后,可能回复 {"code":200,"msg":"已收到,将触发降温策略"}(意思是 “收到事件,会处理” )。
    • 设备因为订阅了这个主题,就能收到平台的 响应(Reply),知道 “平台接收到事件,下一步要干啥” 。
    • 简单说就是 设备等平台 “回话”,确认消息有没有处理、下一步咋做

设备接收平台下发命令

1. 设备属性设置请求($sys/{pid}/{device-name}/thing/property/set 、订阅权限 )

核心作用:平台→设备 “发指令” 的通道,让平台能远程要求设备修改自身属性(比如开关 LED、调整传感器采集频率 )。

  • 谁用:设备端(如单片机 + ESP8266 )需要 订阅(Subscribe) 这个主题,才能收到平台的指令。
  • 场景举例:
    平台想控制设备 “打开 LED”,就会往 $sys/{pid}/{device-name}/thing/property/set 主题发一条消息,内容可能是:

  • 设备因为订阅了这个主题,就能收到这条消息,知道 “平台要我改 LED 状态为开” 。
  • 通俗理解:平台通过这个主题 “远程喊话设备”:“你把某个属性改成 XX ,赶紧执行!”

2. 设备属性设置响应($sys/{pid}/{device-name}/thing/property/set_reply 、发布权限 )

核心作用:设备→平台 “回反馈” 的通道,让设备能告诉平台 “指令执行结果咋样了”(成功 / 失败、具体状态 )。

谁用:设备端执行完平台指令后,需要 发布(Publish) 消息到这个主题,回复平台。

场景举例:

设备收到 “打开 LED” 指令后,成功点亮了 LED ,就往 $sys/{pid}/{device-name}/thing/property/set_reply 发消息:

  • 平台收到后,就知道 “设备收到指令了,而且执行成功,LED 确实开了” 。
  • 通俗理解:设备通过这个主题 “回喊平台”:“你让我改的属性,我改完了!结果是 XX ,你看看对不对~”

设备数据上报平台

设备事件上报请求($sys/{pid}/{device-name}/thing/event/post 、发布权限)

  • 谁用:设备(比如传感器、智能终端 )
  • 干啥用:设备主动把自身的 “事件” 发给平台。
    举个例子:
    • 温湿度传感器检测到 “温度超限”,就通过向这个主题 发布(Publish) 消息,把 {"event":"temp_over","data":{"temp":35}}(意思是 “温度超限事件,当前温度 35℃” )这类数据上报给平台,让平台知道 “设备那边出状况了”。
    • 简单说就是 设备主动 “喊” 平台:我这有情况,你看看

设备事件上报响应($sys/{pid}/{device-name}/thing/event/post/reply 、订阅权限)

  • 谁用:还是设备(因为要接收平台回复 )
  • 干啥用:设备订阅这个主题,等平台回应。
    接着上面的例子:
    • 平台收到传感器 “温度超限” 事件后,可能回复 {"code":200,"msg":"已收到,将触发降温策略"}(意思是 “收到事件,会处理” )。
    • 设备因为订阅了这个主题,就能收到平台的 响应(Reply),知道 “平台接收到事件,下一步要干啥” 。
    • 简单说就是 设备等平台 “回话”,确认消息有没有处理、下一步咋做

设备接收平台下发命令

1. 设备属性设置请求($sys/{pid}/{device-name}/thing/property/set 、订阅权限 )

核心作用:平台→设备 “发指令” 的通道,让平台能远程要求设备修改自身属性(比如开关 LED、调整传感器采集频率 )。

  • 谁用:设备端(如单片机 + ESP8266 )需要 订阅(Subscribe) 这个主题,才能收到平台的指令。
  • 场景举例:
    平台想控制设备 “打开 LED”,就会往 $sys/{pid}/{device-name}/thing/property/set 主题发一条消息,内容可能是:

  • 设备因为订阅了这个主题,就能收到这条消息,知道 “平台要我改 LED 状态为开” 。
  • 通俗理解:平台通过这个主题 “远程喊话设备”:“你把某个属性改成 XX ,赶紧执行!”

2. 设备属性设置响应($sys/{pid}/{device-name}/thing/property/set_reply 、发布权限 )

核心作用:设备→平台 “回反馈” 的通道,让设备能告诉平台 “指令执行结果咋样了”(成功 / 失败、具体状态 )。

谁用:设备端执行完平台指令后,需要 发布(Publish) 消息到这个主题,回复平台。

场景举例:

设备收到 “打开 LED” 指令后,成功点亮了 LED ,就往 $sys/{pid}/{device-name}/thing/property/set_reply 发消息:

  • 平台收到后,就知道 “设备收到指令了,而且执行成功,LED 确实开了” 。
  • 通俗理解:设备通过这个主题 “回喊平台”:“你让我改的属性,我改完了!结果是 XX ,你看看对不对~”

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

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

相关文章

Mac安装mitmproxy及操作对监控的请求

在 macOS 上安装和配置 mitmproxy 是一个相对简单的过程&#xff0c;可以使用常见的包管理工具如 Homebrew 或直接通过 Python 的包管理工具 pip。以下是详细的安装步骤&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Homebrew 是 macOS 上流行的包管理工具。它可以快速安…

c++ 数据结构-堆、优先队列 小总结

之前学习了一些堆、优先队列的知识点&#xff0c;在此做一个小总结。堆&#xff08;Heap&#xff09;堆&#xff08;Heap&#xff09;是一种特殊的完全二叉树数据结构&#xff0c;具有以下重要特性&#xff1a;结构特性堆是一棵完全二叉树&#xff0c;即除了最后一层外&#xf…

编写Linux下usb设备驱动方法:probe函数中要进行的工作

一. 简介 前一篇文章简单学习了 Linux下usb设备驱动实现流程&#xff0c;文章如下&#xff1a; 编写Linux下usb设备驱动方法&#xff1a;usb设备驱动实现流程-CSDN博客 本文来学习一下 usb设备驱动的 probe函数要完成的任务。 当usb主控制器检测到设备与 驱动相匹配时&…

动态规划:为什么暴力算法会有重复子问题

第一步&#xff1a;先明确 “子问题” 和 “重复子问题” 的定义 在算法中&#xff0c;“子问题” 不是泛指 “小一点的问题”&#xff0c;而是具有明确 “状态参数” 的、可独立求解的问题单元。 状态参数&#xff1a;描述子问题核心信息的变量&#xff08;比如 01 背包中的 “…

【网络】添加路由时,via和dev参数作用、直连路由

文章目录概述1、带via1.1 添加路由前的初始状态1.2. 执行添加路由的命令1.3. 添加路由后的状态2、不带 via (使用设备接口)&#xff0c;直连3、带via还是不带via ?4、dev xx的作用4.1 命令中带via时&#xff0c;建议不带 dev eth0 (让系统自动判断)4.2 命令中带via&#xff0c…

云原生---企业级Kubernetes

一、Kubernetes介绍 1.简介 kubernetes的本质是一组服务器集群&#xff0c;它可以在集群的每个节点上运行特定的程序&#xff0c;来对节点中的容器进行管理。目的是实现资源管理的自动化&#xff0c;主要提供了如下的主要功能&#xff1a; 自我修复&#xff1a;一旦某一个容器…

无人机三维路径规划首选算法:RRT_

无人机三维路径规划首选算法&#xff1a;RRT* 要判断哪种算法更适合无人机三维路径规划&#xff0c;需先明确无人机三维路径规划的核心需求&#xff0c;再结合各算法的底层逻辑与特性进行匹配。以下先梳理核心需求&#xff0c;再逐一分析算法特性&#xff0c;最终通过对比得出结…

CentOS 7 服务器初始化:从 0 到 1 的安全高效配置指南

前言 对于运维或开发人员而言&#xff0c;新到手的 CentOS 7 服务器绝非 “开箱即用”—— 默认的国外软件源下载缓慢、系统缺乏基础工具、防火墙未做安全配置&#xff0c;这些问题都会影响后续使用效率与服务器安全性。本文整理了 CentOS 7 服务器初始化的全套实操方案&#…

32.Attention-注意力机制

不是所有的信息都是有用的&#xff0c;或者说重要的。我们应该把注意力放在他该在的地方。 在人工智能领域&#xff0c;注意力机制被广泛应用。他可以帮助模型关注与当前任务相关的特征&#xff0c;而忽略不重要的特征&#xff0c;以提高准确率。注意力机制本质&#xff1a;即通…

如何设计 “用户共创型” IP 成长社群模型?​

“用户共创型” IP 成长社群的核心&#xff0c;是从 “IP 单向输出” 转向 “IP 与用户共生”&#xff0c;让用户从 “被动接收者” 变为 “主动参与者”&#xff0c;通过 “需求共建、内容共造、价值共享” 形成闭环&#xff0c;既强化用户归属感&#xff0c;又为 IP 注入持续…

Windows 命令行:mkdir 命令

专栏导航 上一篇&#xff1a;Windows 命令行&#xff1a;dir 命令 回到目录 下一篇&#xff1a;MFC 第一章概述 本节前言 本节&#xff0c;我们来讲解一个常见的命令&#xff0c;mkdir 命令。 学习本节知识&#xff0c;需要你首先懂得如何打开一个命令行界面&#xff0c;…

Linux系统编程——进程(函数)

回调函数&#xff1a;atexit()原型&#xff1a; int atexit(void (*function)(void));功能&#xff1a; 注册进程退出前执行的函数参数&#xff1a; function 函数指针&#xff0c;指向void返回值void参数的函数指针返回值 成功 返回0失败 …

均胜电子上半年毛利率持续提升,汽车智能化与机器人业务多点突破

8月25日&#xff0c;全球领先的智能汽车科技解决方案提供商均胜电子&#xff08;600699.SH&#xff09;发布2025上半年业绩&#xff0c;报告期内公司实现营业收入约303.47亿元&#xff0c;同比增长12.07%&#xff1b;营业利润总额约12.47亿元&#xff0c;归母净利润同比增长11.…

【QT入门到晋级】进程间通信(IPC)-共享内存

前言 前面分享了几种IPC通信技术&#xff0c;都有成熟的交互机制&#xff08;阻塞和非阻塞方式交互&#xff09;&#xff0c;而本文分享的共享内存&#xff0c;更像是系统提供了一张“白纸”&#xff0c;让多个进程自己构建管理及安全机制&#xff0c;而有些场景只需要简单的机…

自动化测试概念与 Web 自动化实战(基于 Selenium)

在软件测试领域&#xff0c;自动化测试是提升测试效率、保障回归测试质量的核心手段。尤其对于 C 开发的项目&#xff0c;自动化测试能有效减少重复手工操作&#xff0c;避免新增功能对历史功能的影响。本文从自动化基础概念入手&#xff0c;详解自动化分类、Web 自动化测试核心…

NeRAF、ImVid论文解读

目录 一、NeRAF 1、概述 2、方法 3、训练过程 4、实验 二、ImVid 1、概述 2、Imvid数据集 3、STG方法 一、NeRAF 1、概述 NeRF类方法仅支持视觉合成功能&#xff0c;缺乏声学建模能力。对于以往的声学建模&#xff08;如NAR/INRAS&#xff09;会忽略三维场景几何对声…

重复文件删除查找工具 Duplicate Files Search Link v10.7.0

软件介绍 Duplicate Same Files Searcher 是一款面向 Windows 平台的专业重复文件检索与清理工具&#xff0c;兼具符号链接替换与 NTFS 高级特性支持&#xff0c;可在无损数据的前提下大幅缩减磁盘冗余。 软件使用 软件打开后是英文版&#xff0c;手动切换中文&#xff08;按…

简易shell

目录 一、整体功能概述 函数准备 1.env命令 2.getenv()函数 3.snprintf 4.strtok()函数 三、全局变量 四、核心功能函数解析 1. 信息获取函数 2. 命令行交互 3. 命令解析 4. 普通命令执行 5. 内置命令处理&#xff08;核心功能&#xff09; 五、主函数流程 六、总…

网关资源权限预加载:从冷启动阻塞到优雅上线的完整闭环

网关资源权限预加载:从冷启动阻塞到优雅上线的完整闭环 基于 Spring Cloud Gateway + Spring Cloud Alibaba Nacos ——一篇可落地的技术方案与源码级实现 1. 场景与痛点 在微服务网关层做 统一资源权限校验 时,必须满足: 启动阻塞:所有权限规则加载完成前,不监听端口,拒…

open webui源码分析8—管道

我们可以把Open WebUI想象成一个管道系统&#xff0c;数据通过管道和阀门流动。管道作为open webui的插件&#xff0c;可以为数据构建新的通路&#xff0c;可以自定义逻辑和处理数据&#xff1b;阀门是管道的可配置部件&#xff0c;控制数据流过管道时的行为。管道可以理解成用…