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

ESP8266+STM32 AT驱动程序,心知天气API 记录时间: 2025年5月26日13:24:11

 接线为 串口2 接入ESP8266

esp8266.c


#include "stm32f10x.h"//8266预处理文件
#include "esp8266.h"//硬件驱动
#include "delay.h"
#include "usart.h"//用得到的库
#include <string.h>
#include <stdio.h>
#include <cJSON.h>
#include <stdlib.h>
#include <ctype.h>   // for isspace
#include <string.h>  // for strlen
#include <stddef.h>
#include <stdarg.h>char city_name[32]="beijing"; //用于存储你要获取的城市名字(拼音或地址码)
char wifi_ssid[32]="0000"; //用于存储你要连接的热点名字
char wifi_pass[32]="0000"; //用于存储你要连接的热点密码
int is_wifi_connected;//联网标志位
const char *blacklist[] = {
//过滤显示设置"Host:","Date:","Connection:","Content-Type:","access-control-allow-origin:","Content-Length:","etag:","x-powered-by:","x-ratelimit-limit:","x-ratelimit-remaining:","x-ratelimit-reset:","x-request-id:","x-tenant-id:",NULL // 结束标志
};
//用于在杂乱的数据中找到关键词
const char *ExtractField(const char *buf, const char *key, char *out, size_t out_size);
//用于屏蔽关键词输出 
void Filtered_Usart_Printf(const char *line);//======================
//      初始化ESP8266
//======================
void ESP8266_Init(void)
{is_wifi_connected=0;//初始化联网标志位Usart_Printf(USART1, "Send AT\r\n"); //输出到串口一// 查询AT指令有效度ESP8266_SendCmd("AT\r\n","OK");Usart_Printf(USART1, "Send AT+CWJAP?\r\n");// 查询是否已经连上网络if(ESP8266_SendCmd("AT+CWJAP?\r\n",wifi_ssid)) {is_wifi_connected=1;} else {if(ConnectToWiFi()) {is_wifi_connected=1;//表示已经连上网络} else {Usart_Printf(USART_DEBUG, "No Connect  WiFi\r\n");}}}//判断联网是否成功
_Bool ConnectToWiFi(void)
{char cmd[64];Usart_Printf(USART1, "Send AT\r\n");// 启动8266 客户端模式 尝试联网ESP8266_SendCmd("AT\r\n","OK");Usart_Printf(USART1, "Send AT+CWMODE=1\r\n");//尝试连接到网络ESP8266_SendCmd("AT+CWMODE=1\r\n","OK");if(sizeof(wifi_ssid)!=0 &&sizeof(wifi_pass)!=0) {//网络信息没设置不执行联网程序sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", wifi_ssid, wifi_pass);Usart_Printf(USART_DEBUG, "Try to connect WiFi: %s pass:%s\r\n", wifi_ssid,wifi_pass);ESP8266_SendCmd(cmd,"CONNECTED");Usart_Printf(USART_DEBUG, "connected %s\r\n", wifi_ssid);return 1;//不设置逻辑运行成功即返回1表联网成功}}//=================================
//  cmd:命令 res:需要检查的返回指令
// 传递字符串从串口2打印
//=================================
int ESP8266_SendCmd( char *cmd,char *res)
{Usart_Printf(USART2, cmd);char uart_buf[128];//数据缓存机制while(1) {if (USART2_GetLine(uart_buf, sizeof(uart_buf)) > 0) {// 缓冲数据中查找对应的关键词if (strstr(uart_buf, res) != NULL) {// 判断成功才打印(节约资源),收到的内容到串口1Usart_Printf(USART_DEBUG, "Recv: ");Usart_Printf(USART_DEBUG, uart_buf);Usart_Printf(USART_DEBUG, "\r\n");break;}if (strstr(uart_buf, "ERROR") != NULL) {// 判断成功才打印(节约资源),收到的内容到串口1Usart_Printf(USART_DEBUG, "ERROR Recv: ");Usart_Printf(USART_DEBUG, uart_buf);Usart_Printf(USART_DEBUG, "\r\n");}}delay(500);}return 1;//返回1表执行成功
}//=================================
//发送给服务端以获取数据的 GET/POST
//=================================
void GetWeatherAPI(void)
{Usart_Printf(USART_DEBUG, "AT+CIPMUX=0\r\n");ESP8266_SendCmd("AT+CIPMUX=0\r\n", "OK");  // 单连接模式Usart_Printf(USART_DEBUG, "AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n");ESP8266_SendCmd("AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n", "CONNECT");Usart_Printf(USART_DEBUG, "AT+CIPMODE=0\r\n");  // 确保是非透传模式ESP8266_SendCmd("AT+CIPMODE=0\r\n", "OK");httpget();}void httpget(void)
{// 计算 GET 请求长度(根据你构造的 redata)char redata[256];char key[] = "心知天气密匙";sprintf(redata,"GET /v3/weather/now.json?key=%s&location=%s&language=zh-Hans&unit=c HTTP/1.1\r\n""Host: api.seniverse.com\r\n""Connection: close\r\n""\r\n",key, city_name);char cmd[64];sprintf(cmd, "AT+CIPSEND=%d\r\n", strlen(redata));  // 指定长度Usart_Printf(USART_DEBUG, "%d", strlen(redata));ESP8266_SendCmd(cmd, ">");  // 等待 > 提示符// 发送实际内容Usart_Printf(USART_DEBUG, "%s", redata);Usart_Printf(USART2,redata);  // 直接发送原始数据,不带 \r\n 请求体内部已经定义好了char uart_buf[256];//数据缓存机制char temperature_str[16];char text_str[16];while(1) {if (USART2_GetLine(uart_buf, sizeof(uart_buf)) > 0) {Filtered_Usart_Printf(uart_buf);if (ExtractField(uart_buf, "text", text_str, sizeof(text_str)))
{Usart_Printf(USART_DEBUG,"\r\n城市:%s\r\n",city_name);Usart_Printf(USART_DEBUG,"\r\n当前天气:%s\r\n",text_str);
} if (ExtractField(uart_buf, "temperature", temperature_str, sizeof(temperature_str))) {int temperature = atoi(temperature_str);Usart_Printf(USART_DEBUG,"temperature:%d\r\n",temperature);}}Usart_Printf(USART2,"AT+CIPCLOSE\r\n");//关闭服务器
}const char *ExtractField(const char *buf, const char *key, char *out, size_t out_size)
{char search_key[64];snprintf(search_key, sizeof(search_key), "\"%s\":\"", key);const char *start = strstr(buf, search_key);if (!start) return NULL;start += strlen(search_key);const char *end = strchr(start, '"');if (!end) return NULL;size_t len = end - start;if (len >= out_size) len = out_size - 1;strncpy(out, start, len);out[len] = '\0';return out;
}
//屏蔽输出函数
void Filtered_Usart_Printf(const char *line) {for (int i = 0; blacklist[i] != NULL; i++) {if (strstr(line, blacklist[i])) {return;}}Usart_Printf(USART_DEBUG, "%s", line);
}

esp8266.h

#ifndef __ESP8266_H
#define __ESP8266_H
#define USART_DEBUG   USART1// 全局变量声明(外部可见)extern  int is_wifi_connected;void ESP8266_Init(void); //初始化操作
void httpget(void);
int ESP8266_SendCmd( char *cmd,char *res);
void GetWeatherAPI(void);
_Bool ConnectToWiFi(void); #endif

 usart.c

#include "usart.h"
#include <stdarg.h>
#include <string.h>
#include <stdio.h>#include "stm32f10x_usart.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
#include "esp8266.h"uint16_t usart2_index = 0;
uint8_t usart2_rx_buffer[USART2_RX_BUFFER_SIZE];
volatile uint16_t usart2_rx_head = 0;  // 写指针
volatile uint16_t usart2_rx_tail = 0;  // 读指针uint8_t usart1_buf[USART1_BUF_SIZE];
uint8_t usart2_buf[USART2_BUF_SIZE];
// 串口1接收缓冲及状态
u8 USART1_RX_BUF[USART1_REC_LEN];
u16 USART1_RX_STA = 0;// 串口2接收缓冲及状态
u8 USART2_RX_BUF[USART2_REC_LEN];
u16 USART2_RX_STA = 0;
void USART1_Init(u32 bound) {GPIO_InitTypeDef GPIO_InitStruct;USART_InitTypeDef USART_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);// PA9 - TXDGPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);// PA10 - RXDGPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStruct);// 配置串口1USART_InitStruct.USART_BaudRate = bound;USART_InitStruct.USART_WordLength = USART_WordLength_8b;USART_InitStruct.USART_StopBits = USART_StopBits_1;USART_InitStruct.USART_Parity = USART_Parity_No;USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Init(USART1, &USART_InitStruct);// 中断配置USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);USART_Cmd(USART1, ENABLE);// NVIC配置NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);
}
void USART2_Init(u32 bound) {GPIO_InitTypeDef GPIO_InitStruct;USART_InitTypeDef USART_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;// 使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // PA2/PA3RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);// PA2 - TXDGPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);// PA3 - RXDGPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStruct);// 配置串口2USART_InitStruct.USART_BaudRate = bound;USART_InitStruct.USART_WordLength = USART_WordLength_8b;USART_InitStruct.USART_StopBits = USART_StopBits_1;USART_InitStruct.USART_Parity = USART_Parity_No;USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Init(USART2, &USART_InitStruct);// 中断配置USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);USART_Cmd(USART2, ENABLE);// NVIC中断配置NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);
}
void Usart_SendString(USART_TypeDef *USARTx, const char *str) {while (*str) {USART_SendData(USARTx, (uint8_t)*str++);while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);}
}void Usart_Printf(USART_TypeDef *USARTx, const char *fmt, ...) {while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);//等待空闲char buffer[256];va_list ap;va_start(ap, fmt);vsnprintf(buffer, sizeof(buffer), fmt, ap);va_end(ap);Usart_SendString(USARTx, buffer);
}
void USART1_IRQHandler(void) {if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {uint8_t ch = USART_ReceiveData(USART1);if ((USART1_RX_STA & 0x8000) == 0) {if ((USART1_RX_STA & 0x4000) != 0) {if (ch == '\n') {USART1_RX_STA |= 0x8000; // 完整帧接收完成} else {USART1_RX_STA = 0; // 出错重置}} else {if (ch == '\r') {USART1_RX_STA |= 0x4000;} else {USART1_RX_BUF[USART1_RX_STA++ & 0x7FFF] = ch;if (USART1_RX_STA >= USART1_REC_LEN)USART1_RX_STA = 0;}}}}
}
void USART2_IRQHandler(void) {if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {uint8_t data = USART_ReceiveData(USART2);uint16_t next_head = (usart2_rx_head + 1) % USART2_RX_BUFFER_SIZE;if (next_head != usart2_rx_tail) {  // 如果没有发生缓冲区满的情况usart2_rx_buffer[usart2_rx_head] = data;  // 存入数据usart2_rx_head = next_head;               // 更新写指针return;
}   if (next_head == usart2_rx_tail) {// 缓冲区满,允许覆盖usart2_rx_tail = (usart2_rx_tail + 1) % USART2_RX_BUFFER_SIZE;}
usart2_rx_buffer[usart2_rx_head] = data;usart2_rx_head = next_head;}  }
/*** @brief  从 USART2 的 Ring Buffer 中读取一个字节* @param  data: 用于保存读取到的数据* @retval 1: 成功读取, 0: 缓冲区为空*/int USART2_GetLine(char *buf, int max_len) {int i = 0;while (i < max_len - 1) {if (usart2_rx_tail == usart2_rx_head) {break; // 缓冲区为空}char ch = usart2_rx_buffer[usart2_rx_tail];usart2_rx_tail = (usart2_rx_tail + 1) % USART2_RX_BUFFER_SIZE;buf[i++] = ch;if (ch == '\n') { // 遇到换行符结束buf[i] = '\0';return i;}}buf[i] = '\0'; // 补上字符串结束符return i;
}int USART1_WaitRecive(void) {u32 timeout = 0xFFFFF;while ((USART1_RX_STA & 0x8000) == 0) {if (--timeout == 0) return -1;}memcpy(usart1_buf, USART1_RX_BUF, USART1_RX_STA & 0x7FFF);usart1_buf[USART1_RX_STA & 0x7FFF] = '\0';USART1_ClearRxBuffer();return 0;
}void USART1_ClearRxBuffer(void) {memset(USART1_RX_BUF, 0, USART1_REC_LEN);USART1_RX_STA = 0;
}int USART2_WaitRecive(char *res) {u32 timeout = 0xFFFFF;while ((USART2_RX_STA & 0x8000) == 0) {if (--timeout == 0) return -1;}memcpy(usart2_buf, USART2_RX_BUF, USART2_RX_STA & 0x7FFF);usart1_buf[USART2_RX_STA & 0x7FFF] = '\0';USART1_ClearRxBuffer();return 0;}void USART2_ClearRxBuffer(void) {memset(USART2_RX_BUF, 0, USART2_REC_LEN);USART2_RX_STA = 0;
}
#pragma import(__use_no_semihosting)struct __FILE { int handle; };
FILE __stdout;void _sys_exit(int x) { x = x; }
void _ttywrch(int ch) { ch = ch; }int __io_putchar(int ch) {USART_SendData(USART1, (uint8_t)ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);return ch;
}int __io_getchar(FILE *f) {f = f;while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);return USART_ReceiveData(USART1);
}

 usart.h 

 

#ifndef __USART_H__
#define __USART_H__#include "stm32f10x.h"// 接收缓冲大小#define USART1_REC_LEN    256
#define USART2_REC_LEN    256
// 主程序访问接收数据用的缓冲区
#define USART1_BUF_SIZE   256
#define USART2_BUF_SIZE   256
#define USART2_RX_BUFFER_SIZE 2048
// 接收缓冲和状态变量
extern u8 USART1_RX_BUF[USART1_REC_LEN];
extern u16 USART1_RX_STA;extern u8 USART2_RX_BUF[USART2_REC_LEN];
extern u16 USART2_RX_STA;// 数据缓冲(供主程序读取)
extern u8 usart1_buf[USART1_BUF_SIZE];
extern u8 usart2_buf[USART2_BUF_SIZE];// 初始化函数
void USART1_Init(u32 bound);
void USART2_Init(u32 bound);// 发送函数
void Usart_SendString(USART_TypeDef *USARTx, const char *str);
void Usart_Printf(USART_TypeDef *USARTx, const char *fmt, ...);// 接收处理函数
int USART1_WaitRecive(void);
void USART1_ClearRxBuffer(void);
int USART2_GetLine(char *buf, int max_len);int USART2_WaitRecive(char *res);
void USART2_ClearRxBuffer(void);#endif // __USART_H__

main.c 

//头文件
#include "stm32f10x.h"
#include "GPIOLIKE51.h"
#include "usart.h"
#include "esp8266.h"
int main(void)
{    USART1_Init(9600);USART2_Init(115200);Usart_Printf(USART1, "Connect  WiFi\r\n");ESP8266_Init();if(is_wifi_connected==1){GetWeatherAPI();  //更新天气}else{Usart_Printf(USART1,"No connect to");}
}

调试信息展示 

相关文章:

ESP8266+STM32 AT驱动程序,心知天气API 记录时间: 2025年5月26日13:24:11

接线为 串口2 接入ESP8266 esp8266.c #include "stm32f10x.h"//8266预处理文件 #include "esp8266.h"//硬件驱动 #include "delay.h" #include "usart.h"//用得到的库 #include <string.h> #include <stdio.h> #include …...

WPF【11_5】WPF实战-重构与美化(MVVM 实战)

11-10 【重构】创建视图模型&#xff0c;显示客户列表 正式进入 MVVM 架构的代码实战。在之前的课程中&#xff0c; Model 和 View 这部分的代码重构实际上已经完成了。 Model 就是在 Models 文件夹中看到的两个文件&#xff0c; Customer 和 Appointment。 而 View 则是所有与…...

⭐️⭐️⭐️ 模拟题及答案 ⭐️⭐️⭐️ 大模型Clouder认证:RAG应用构建及优化

考试注意事项: 一、单选题(21题) 检索增强生成(RAG)的核心技术结合了什么? A. 图像识别与自然语言处理 B. 信息检索与文本生成 C. 语音识别与知识图谱 D. 数据挖掘与机器学习 RAG技术中,“建立索引”步骤不包括以下哪项操作? A. 将文档解析为纯文本 B. 文本片段分割(…...

kali系统的安装及配置

1 kali下载 Kali 下载地址&#xff1a;Get Kali | Kali Linux &#xff08;https://www.kali.org/get-kali&#xff09; 下载 kali-linux-2024.4-installer-amd64.iso (http://cdimage.kali.org/kali-2024.4/) 2. 具体安装步骤&#xff1a; 2.1 进入官方地址&#xff0c;点击…...

CSS--background-repeat详解

属性介绍 background-repeat ‌属性在CSS中用于控制背景图像是否以及如何重复。当背景图像的尺寸小于其容器的尺寸时&#xff0c;该属性决定了图像如何填充额外的空间。默认情况下&#xff0c;背景图像会在横向和纵向上重复&#xff0c;直到覆盖整个元素。 常见取值 repeat …...

Redis的大Key问题如何解决?

大家好&#xff0c;我是锋哥。今天分享关于【Redis的大Key问题如何解决&#xff1f;】面试题。希望对大家有帮助&#xff1b; Redis的大Key问题如何解决&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis中的“大Key”问题是指某个键的值占用了过多…...

影楼精修-AI追色算法解析

注意&#xff1a;本文样例图片为了避免侵权&#xff0c;均使用AIGC生成&#xff1b; AI追色是像素蛋糕软件中比较受欢迎的一个功能点&#xff0c;本文将针对AI追色来解析一下大概的技术原理。 功能分析 AI追色实际上可以理解为颜色迁移的一种变体或者叫做升级版&#xff0c;…...

node入门:安装和npm使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装npm命令nvm 前言 因为学习vue接触的&#xff0c;一直以为node是和vue绑定的&#xff0c;还以为vue跑起来必须要node&#xff0c;后续发现并不是。 看…...

‘js@https://registry.npmmirror.com/JS/-/JS-0.1.0.tgz‘ is not in this registry

解决方法&#xff1a; 1. npm cache clean --force 2.临时切换到官方源 npm config set registry https://registry.npmjs.org/ npm install js0.1.0 npm config set registry https://registry.npmmirror.com/ # 切换回镜像源...

el-table-column如何获取行数据的值

在Element UI的el-table组件中&#xff0c;你可以通过el-table-column的slot-scope属性&#xff08;在Vue 2.x中&#xff09;或者#default插槽的scope属性&#xff08;在Vue 3.x中&#xff09;来获取当前行的数据。以下是如何实现这一功能的详细步骤&#xff1a; ‌在el-table-…...

leetcode450.删除二叉搜索树中的节点:迭代法巧用中间节点应对多场景删除

一、题目深度解析与BST特性剖析 在二叉搜索树&#xff08;BST&#xff09;中删除节点&#xff0c;需确保删除操作后树依然保持BST特性。题目要求我们根据给定的节点值key&#xff0c;在BST中删除对应节点。BST的核心特性是左子树所有节点值小于根节点值&#xff0c;右子树所有…...

java虚拟机2

一、垃圾回收机制&#xff08;GC&#xff09; 1. 回收区域&#xff1a;GC主要回收堆内存区域。堆用于存放new出来的对象 。程序计数器、元数据区和栈一般不是GC回收的重点区域。 2. 回收单位&#xff1a;GC以对象为单位回收内存&#xff0c;而非字节。按对象维度回收更简便&am…...

自监督软提示调优:跨域NLP新突破

自监督的软提示调优方法(SPSS) 这篇论文提出了一种基于自监督的软提示调优方法(SPSS),用于无监督领域自适应。其核心目标是通过挖掘源域和目标域的内部知识,解决传统提示调优在跨域场景中依赖通用知识、模板生成低效的问题。 一、核心实现原理 1. 自监督分层聚类优化(…...

Pydantic 学习与使用

Pydantic 学习与使用 在 Fastapi 的 Web 开发中的数据验证通常都是在使用 Pydantic 来进行数据的校验&#xff0c;本文将对 Pydantic 的使用方法做记录与学习。 **简介&#xff1a;**Pydantic 是一个在 Python 中用于数据验证和解析的第三方库&#xff0c;它现在是 Python 使…...

PCB设计教程【入门篇】——电路分析基础-基本元件(二极管三极管场效应管)

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理、 目录 前言 1.二极管 1.发光…...

能按需拆分 PDF 为多个文档的工具

软件介绍 彩凤 PDF 拆分精灵是一款具备 PDF 拆分功能的软件。 功能特点 PDF 拆分功能较为常见&#xff0c;很多 PDF 软件都具备&#xff0c;例如 DC 软件提取 PDF 较为方便&#xff0c;但它不能从一个 PDF 里提取出多个 PDF。据印象&#xff0c;其他 PDF 软件也似乎没有能从…...

Apifox 5 月产品更新|数据模型支持查看「引用资源」、调试 AI 接口可实时预览 Markdown、性能优化

Apifox 新版本上线啦&#xff01; 看看本次版本更新主要涵盖的重点内容&#xff0c;有没有你所关注的功能特性&#xff1a; 自动解析 JSON 参数名和参数值调试 AI 接口时&#xff0c;可预览 Markdown 格式的内容性能优化&#xff1a;新增「实验性功能」选项 使用独立进程执行…...

LiveGBS海康、大华、宇视、华为摄像头GB28181国标语音对讲及语音喊话:摄像头设备与服务HTTPS准备

LiveGBS海康、大华、宇视、华为摄像头GB28181国标语音对讲及语音喊话&#xff1a;摄像头设备与服务HTTPS准备 1、背景2、准备工作2.1、服务端必备条件&#xff08;注意事项&#xff09;2.2、语音对讲设备准备2.2.1、大华摄像机2.2.2、海康摄像机 3、开启音频并开始对讲4、相关问…...

Sqlalchemy 连mssql坑

连接失败: (pyodbc.OperationalError) (08001, [08001] [Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [error:0A00014D:SSL routines::legacy sigalg disallowed or unsupported] (-1) (SQLDriverConnect)) (Background on this error at: https://sqlalche.me/e/…...

Prompt Engineering 提示工程介绍与使用/调试技巧

1. 介绍 Prompt Engineering 是一种人工智能&#xff08;AI&#xff09;技术&#xff0c;它通过设计和改进 AI 的 prompt 来提高 AI 的表现。Prompt Engineering 的目标是创建高度有效和可控的 AI 系统&#xff0c;使其能够准确、可靠地执行特定任务。 如果你从来没有使用过Pr…...

LLaMaFactory - 支持的模型和模板 常用命令

一、 环境准备 激活LLaMaFactory环境&#xff0c;进入LLaMaFactory目录 cd LLaMA-Factoryconda activate llamafactory 下载模型 #模型下载 from modelscope import snapshot_download model_dir snapshot_download(Qwen/Qwen2.5-0.5B-Instruct) 二、启动一个 Qwen3-0.6B…...

大模型深度学习之双塔模型

前言 双塔模型&#xff08;Two-Tower Model&#xff09;是一种在推荐系统、信息检索和自然语言处理等领域广泛应用的深度学习架构。其核心思想是通过两个独立的神经网络&#xff08;用户塔和物品塔&#xff09;分别处理用户和物品的特征&#xff0c;并在共享的语义空间中通过相…...

MySQL 8主从同步实战指南:从原理到高可用架构落地

MySQL 8主从同步实战指南:从原理到高可用架构落地 本文将用3000字深度解析MySQL 8主从复制机制,配合全流程部署指南及电商平台实战案例,助你构建高性能数据库集群 一、主从复制核心原理剖析 1.1 复制架构全景图 #mermaid-svg-vdts3hTIyCtz4byk {font-family:"trebuche…...

瑞数6代jsvmp简单分析(天津电子税x局)

国际惯例 今天帮朋友看一个gov网站的瑞数加密&#xff08;天津电子税x局&#xff09; 传送门&#xff08;登陆入口界面&#xff09; 瑞数6特征 1.服务器会发两次包&#xff0c;第一次响应状态码为412&#xff0c;第二次响应状态码为200。 2.有三重debugger&#xff0c;其中有…...

缓存架构方案:Caffeine + Redis 双层缓存架构深度解析

在高并发、低延迟的现代互联网系统中&#xff0c;缓存是提升系统性能和稳定性的重要手段。随着业务复杂度的增长&#xff0c;单一缓存方案&#xff08;如仅使用Redis或仅使用本地缓存&#xff09;已难以满足高性能与一致性需求。 本文将围绕 Caffeine Redis 的双层缓存架构展…...

AI笔记 - 模型调试 - 调试方式

模型调试方式 基础信息打印模型信息计算参数量和计算量过滤原则profile方法get_model_complexity_info方法FlopCountAnalysis方法 基础信息 # 打印执行的设备数量&#xff1a;device_count:1 print(f"device_count:{torch.cuda.device_count()}")# 打印当前网络执行…...

榕壹云物品回收系统实战案例:基于ThinkPHP+MySQL+UniApp的二手物品回收小程序开发与优化

摘要&#xff1a;本文深入解析了一款基于ThinkPHPMySQLUniApp框架开发的二手物品回收小程序——榕壹云物品回收系统的技术实现与商业价值。通过剖析项目背景、核心技术架构、功能特性及系统优势&#xff0c;为开发者与潜在客户提供全面的参考指南&#xff0c;助力资源循环利用与…...

《软件工程》第 9 章 - 软件详细设计

目录 9.1 详细设计的任务与过程模型 9.2 用例设计 9.2.1 设计用例实现方案 9.2.2 构造设计类图 9.2.3 整合并优化用例实现方案 9.3 子系统设计 9.3.1 确立内部设计元素 9.3.2 导出设计类图 9.4 构件设计 9.5 类设计 9.5.1 精化类间关系 9.5.2 精化属性和操作 9.5.…...

WebVm:无需安装,一款可以在浏览器运行的 Linux 来了

WebVM 是一款可以在浏览器中运行的Linux虚拟机。不是那种HTMLJavaScript模拟的UI&#xff0c;完全通过HTML5/WebAssembly技术实现客户端运行。通过集成CheerpX虚拟化引擎&#xff0c;可直接在浏览器中运行未经修改的Debian系统。 Stars 数13054Forks 数2398 主要特点 完整 Lin…...

王树森推荐系统公开课 排序06:粗排模型

shared bottom 表示神经网络被所有特征共享。精排模型主要开销在神经网络&#xff0c;神经网络很大且很复杂。 每做一次推荐&#xff0c;用户塔只做一次推理。物品塔存放入向量数据库。 后期融合模型常用于召回&#xff0c;前期融合模型常用于精排。 物品塔短时间内比较稳…...