免费企业网站程序asp/自媒体营销代理
目录
第一部分、前言
1、获取心知天气API接口
2、硬件准备
第二部分、电脑串口助手调试WIFI模块获取天气
1、ESP8266获取天气的流程
2、具体步骤
第三部分、STM32驱动ESP8266模块获取天气数据
1、天气数据的解析
1.1、什么函数来解析天气数据?
2.1、解析后的数据如何使用?
2、相关代码
2.1、main.c文件
2.2、esp8266.c文件
第四部分、总结
1、效果展示
2、完整的工程
3、补充
第一部分、前言
这篇博客拖了很久很久,本来是打算和前面一篇一起发出来的,但是那段时间因为一些事情耽搁了,这篇博客写了一半,剩下的一直都没有写,其次就是人也有点懒,也不太想动🤪🤪。
这几天考试周来了,复习又不想复习,不如把这篇内容更新完整,这篇更新完之后,STM32专栏应该不会再更新了。
然后,后面我打算出一期C语言的学习笔记专栏,再后面就是FPGA的学习笔记专栏。想是这么想的,不知道能不能做好,哈哈🤭。
1、获取心知天气API接口
这里还是希望大家先去看我的第一篇博客:【STM32训练—WiFi模块】第一篇、STM32驱动ESP8266WiFi模块获取网络时间通过这篇博客你会明白WIFI模块获取网络流程是什么样子的,搞懂了这个,你会发现获取天气和获取时间的步骤完全一样,代码也没有什么大的变化。
接着再来说一下心知天气,上一篇文章提到时间的接口是由苏宁后台提供的“quan.suning.com/getSysTime.do”,那么这里想获取天气,那么也需要一个API的接口,这里的API接口由心知天气给我们提供。
因此需要注册一个心知天气,获取自己的密钥。关于注册的过程可以参考心知天气提供的文档:注册与登陆 | 心知天气文档 (seniverse.com)
注册完成后,如何获取属于自己的API接口呢,参考文档如下:查看/修改你的API密钥 (yuque.com)
这是我的API接口,点进去之后就会看到目前杭州的天气数据:https://api.seniverse.com/v3/weather/now.json?key=SwLQ3i0Q5TNa6NSKT&location=hangzhou&language=zh-Hans&unit=c
点击上面的链接,就会获取到天气数据,接下来的步骤就和前面获取时间一样,主要区别就是将时间的API接口换成刚刚注册得到的心知天气的API接口即可,是不是发现原来也就这么回事。
2、硬件准备
STM32选用核心板F103C8T6,然后再加一个ESP8266 WiFi模块(任何型号应该都可以,我这次用的ESP-01s),最后需要一个USB-TTL模块用来打印串口数据。
需要注意的是:我的这个ESP-01S,有一个EN使能端,必须要给高电平才能用,上一篇博客用的那个WIFI模块没有EN使能端。所以希望大家注意自己的模块。
第二部分、电脑串口助手调试WIFI模块获取天气
1、ESP8266获取天气的流程
流程和获取时间的流程大致一样,只不过这里获取的为天气数据。
2、具体步骤
第一步、AT指令集
0:AT
1:AT+RST
2:AT+CWMODE=1
3:AT+CIPMUX=0
4:AT+CWJAP="你的WiFi名称","你的WiFi密码"
5:AT+CIPMODE=1
6:AT+CIPSTART="TCP","api.seniverse.com",80
7:AT+CIPSEND
8:GET https://api.seniverse.com/v3/weather/now.json?key=SwLQ3i0Q5TNa6NSKT&location=hangzhou&language=en&unit=c
9:+++
注意:所有串口步骤同前一篇文章,这里直接有区别的步骤为第八步,因此这里直接跳转到第八步
第八步、连接目标的服务器,TCP是传输协议,api.seniverse.com是心知天气服务器的IP地址,80是服务器端口。
第十步、第九步和前文一样,接着再发送获取数据的请求,得到天气数据
第十一步、关于退出透传的方式也和前面博客完全一样,这里就不再展示,所以一定要看第一篇文章,那个文章介绍的太详细了。
第三部分、STM32驱动ESP8266模块获取天气数据
1、天气数据的解析
这里天气的解析我调用了cJSON的库,你不用管这个库怎么写的,原理是啥,知道它是怎么用的就可以了,例如调用什么函数来解析天气数据?解析后的数据如何使用?弄明白这两个问题,就够了。
1.1、什么函数来解析天气数据?
时间太久了,我都不知道我哪里弄来的这个函数,反正挺好用的,侵权联系我删除!
这个函数我放在我工程的"cJSON.c"文件最下面。
/*********************************************************************************
* Function Name : cJSON_WeatherParse,解析天气数据
* Parameter : JSON:天气数据包 results:保存解析后得到的有用的数据
* Return Value : 0:成功 其他:错误
* Function Explain :
* Create Date : 2017.12.6 by lzn
**********************************************************************************/
int cJSON_WeatherParse(char *JSON, Results *results)
{cJSON *json,*arrayItem,*object,*subobject,*item;json = cJSON_Parse(JSON); //解析JSON数据包if(json == NULL) //检测JSON数据包是否存在语法上的错误,返回NULL表示数据包无效{printf("Error before: [%s] \r\n",cJSON_GetErrorPtr()); //打印数据包语法错误的位置return 1;}else{if((arrayItem = cJSON_GetObjectItem(json,"results")) != NULL); //匹配字符串"results",获取数组内容{int size = cJSON_GetArraySize(arrayItem); //获取数组中对象个数printf("cJSON_GetArraySize: size=%d \r\n",size); if((object = cJSON_GetArrayItem(arrayItem,0)) != NULL)//获取父对象内容{/* 匹配子对象1 */if((subobject = cJSON_GetObjectItem(object,"location")) != NULL){printf("---------------------------------subobject1-------------------------------\r\n");if((item = cJSON_GetObjectItem(subobject,"id")) != NULL) //匹配子对象1成员"id"{printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);memcpy(results[0].location.id,item->valuestring,strlen(item->valuestring));}if((item = cJSON_GetObjectItem(subobject,"name")) != NULL) //匹配子对象1成员"name"{printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);memcpy(results[0].location.name,item->valuestring,strlen(item->valuestring));}if((item = cJSON_GetObjectItem(subobject,"country")) != NULL)//匹配子对象1成员"country"{printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);memcpy(results[0].location.country,item->valuestring,strlen(item->valuestring));}if((item = cJSON_GetObjectItem(subobject,"path")) != NULL) //匹配子对象1成员"path"{printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);memcpy(results[0].location.path,item->valuestring,strlen(item->valuestring));}if((item = cJSON_GetObjectItem(subobject,"timezone")) != NULL)//匹配子对象1成员"timezone"{printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);memcpy(results[0].location.timezone,item->valuestring,strlen(item->valuestring));}if((item = cJSON_GetObjectItem(subobject,"timezone_offset")) != NULL)//匹配子对象1成员"timezone_offset"{printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);memcpy(results[0].location.timezone_offset,item->valuestring,strlen(item->valuestring));}}/* 匹配子对象2 */if((subobject = cJSON_GetObjectItem(object,"now")) != NULL){printf("---------------------------------subobject2-------------------------------\r\n");if((item = cJSON_GetObjectItem(subobject,"text")) != NULL)//匹配子对象2成员"text"{printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);memcpy(results[0].now.text,item->valuestring,strlen(item->valuestring));}if((item = cJSON_GetObjectItem(subobject,"code")) != NULL)//匹配子对象2成员"code"{printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);memcpy(results[0].now.code,item->valuestring,strlen(item->valuestring));}if((item = cJSON_GetObjectItem(subobject,"temperature")) != NULL) //匹配子对象2成员"temperature"{printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);memcpy(results[0].now.temperature,item->valuestring,strlen(item->valuestring));}}/* 匹配子对象3 */if((subobject = cJSON_GetObjectItem(object,"last_update")) != NULL){printf("---------------------------------subobject3-------------------------------\r\n");printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",subobject->type,subobject->string,subobject->valuestring);memcpy(results[0].last_update,item->valuestring,strlen(subobject->valuestring));}} }}cJSON_Delete(json); //释放cJSON_Parse()分配出来的内存空间return 0;
}
2.1、解析后的数据如何使用?
调用上面那个函数后,解析的数据存放在一个双层结构体当中,因此只需访问结构体的成员就可以,每个成员的名称与心知天气返回的名称相匹配。
具体的信息参考心知天气的文档:极速实况 (yuque.com)
2、相关代码
2.1、main.c文件
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
#include "esp8266.h"
#include "cJSON.h" //解析天气//天气数据
extern unsigned char Weather_buff[300];
//天气解析
Results Weather_results[] = {{0}};int main()
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置Usart1_Init(115200);Usart2_Init(115200);LED_Init();delay_init();//初始化很重要//用不了的函数一般都是没有初始化ESP8266_Init();Get_current_weather();//获取天气while(1){LED0 = 0;delay_ms(500);delay_ms(500);delay_ms(500);delay_ms(500);LED0 = 1;delay_ms(500);delay_ms(500);delay_ms(500);delay_ms(500);cJSON_WeatherParse((char *)Weather_buff, Weather_results);printf("%s",Weather_buff); //打印结构体内内容printf("\r\n 打印结构体内内容如下: \r\n");printf("%s \r\n",Weather_results[0].now.text);printf("%s \r\n",Weather_results[0].now.temperature);printf("%s \r\n",Weather_results[0].location.path);printf("%s \r\n",Weather_results[0].location.country);}}
2.2、esp8266.c文件
#include "stm32f10x.h"
#include "sys.h"
#include "string.h"
#include "stdlib.h"
#include "esp8266.h"#include "usart.h"
#include "delay.h"
#include "led.h"//WIFI和密码·
#define ESP8266_WIFI_INFO "AT+CWJAP=\"iPhone111\",\"123456789\"\r\n"
//心知天气的API
#define Weather_TCP "AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n"
//心知天气GET报文
/*这里城市 恩施 语言为 英文*/
#define Weather_GET "GET https://api.seniverse.com/v3/weather/now.json?key=SwLQ3i0Q5TNa6NSKT&location=enshi&language=en&unit=c\r\n"//ESP8266数据存放
unsigned char esp8266_buf[300] = {0};
unsigned short esp8266_cnt = 0, esp8266_cntPre = 0;
//存放天气数据
unsigned char Weather_buff[300]; //位数是随机确定的/**************************************************************************/
//函数作用:ESP8266_Init初始化函数
//函数名称:ESP8266_Init(void);
//内部参数:
//修改日期:2022年4月18日 下午16:18
//作者: 大屁桃
/**************************************************************************/
void ESP8266_Init(void)
{ESP8266_Clear();/*让WIFI推出透传模式*/while(ESP8266_SendCmd("+++", "")) delay_ms(500);UsartPrintf(USART_DEBUG, "1.AT\r\n");while(ESP8266_SendCmd("AT\r\n", "OK"))delay_ms(500);////加一步ESP8266复位操作UsartPrintf(USART_DEBUG, "2.RST\r\n");ESP8266_SendCmd("AT+RST\r\n", "");delay_ms(500);ESP8266_SendCmd("AT+CIPCLOSE\r\n", "");delay_ms(500);/UsartPrintf(USART_DEBUG, "3.CWMODE\r\n");while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))delay_ms(500);UsartPrintf(USART_DEBUG, "4.AT+CIPMUX\r\n");while(ESP8266_SendCmd("AT+CIPMUX=0\r\n", "OK"))delay_ms(500);UsartPrintf(USART_DEBUG, "5.CWJAP\r\n");while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "WIFI GOT IP"))delay_ms(500);delay_ms(500);delay_ms(500);UsartPrintf(USART_DEBUG, "ESP8266_Init OK\r\n");
}/*获取网络天气数据*/
/**************************************************************************/
//函数作用:获取心知天气函数
//函数名称:Get_current_weather(void);
//内部参数:
//修改日期:2022年4月18日 下午16:18
//作者: 大屁桃
/**************************************************************************/
void Get_current_weather(void)
{ESP8266_Clear();UsartPrintf(USART_DEBUG, "6.Weather_TCP OK\r\n"); while(ESP8266_SendCmd(Weather_TCP, "CONNECT"))delay_ms(500);delay_ms(500);UsartPrintf(USART_DEBUG, "7.AT+CIPMODE=1 OK\r\n"); while(ESP8266_SendCmd("AT+CIPMODE=1\r\n", "OK"))delay_ms(500);delay_ms(500);delay_ms(500);
/*sizeof(Weather_GET),必须用sizeof函数,用strlen没有用*/ ESP8266_SendData((u8 *)Weather_GET, sizeof(Weather_GET)); //发送AT+CIPSEND 以及 Weather_GETESP8266_GetIPD_GET(200,Weather_buff);ESP8266_Clear();//清除缓存数据 delay_ms(500);delay_ms(500);while(ESP8266_SendCmd("+++", "")) /*退出透传模式*/delay_ms(500);UsartPrintf(USART_DEBUG, "+++ OK\r\n"); while(ESP8266_SendCmd("AT\r\n", "OK")) //验证是否退出透传模式delay_ms(500);UsartPrintf(USART_DEBUG, "1.AT\r\n");
}/**************************************************************************/
//函数作用:串口二中断函数
//函数名称:USART2_IRQHandler();
//内部参数:
//修改日期:2022年4月18日 下午4:18
//作者: 大屁桃
/**************************************************************************/
void USART2_IRQHandler(void)
{if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断{if(esp8266_cnt >= sizeof(esp8266_buf)) esp8266_cnt = 0; //防止串口被刷爆 esp8266_buf[esp8266_cnt++] = USART2->DR; // USART_SendData(USART1,USART2->DR); //让接收到的数据打印在串口一上USART_ClearFlag(USART2, USART_FLAG_RXNE);}
}//==========================================================
// 函数名称: ESP8266_Clear
//
// 函数功能: 清空缓存
//
// 入口参数: 无
//
// 返回参数: 无
//
// 说明:
//==========================================================
void ESP8266_Clear(void)
{memset(esp8266_buf, 0, sizeof(esp8266_buf));esp8266_cnt = 0;}
//==========================================================
// 函数名称: ESP8266_WaitRecive
//
// 函数功能: 等待接收完成
//
// 入口参数: 无
//
// 返回参数: REV_OK-接收完成 REV_WAIT-接收超时未完成
//
// 说明: 循环调用检测是否接收完成
//==========================================================
_Bool ESP8266_WaitRecive(void)
{if(esp8266_cnt == 0) //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数return REV_WAIT;if(esp8266_cnt == esp8266_cntPre) //如果上一次的值和这次相同,则说明接收完毕{esp8266_cnt = 0; //清0接收计数return REV_OK; //返回接收完成标志}esp8266_cntPre = esp8266_cnt; //置为相同return REV_WAIT; //返回接收未完成标志}//==========================================================
// 函数名称: ESP8266_GetIPD
//
// 函数功能: copy天气数据到Weather_buff数组里面
//
// 返回参数: 平台返回的原始数据
//
// 说明: copy天气数据到Weather_buff
//==========================================================unsigned char *ESP8266_GetIPD_GET(unsigned short timeOut,u8 *buff)//这里我用了一个全局变量将esp8266buf储存到这个全局变量里面
{do{delay_ms(5); } while(timeOut--);strcpy((char*)buff,(char*)esp8266_buf);return buff;
}/*还未用到*/
//==========================================================
// 函数名称: ESP8266_GetIPD
//
// 函数功能: 获取平台返回的数据
//
// 入口参数: 等待的时间(乘以10ms)
//
// 返回参数: 平台返回的原始数据
//
// 说明: 不同网络设备返回的格式不同,需要去调试
// 如ESP8266的返回格式为 "+IPD,x:yyy" x代表数据长度,yyy是数据内容
//==========================================================
unsigned char *ESP8266_GetIPD(unsigned short timeOut)
{char *ptrIPD = NULL;do{if(ESP8266_WaitRecive() == REV_OK) //如果接收完成{ptrIPD = strstr((char *)esp8266_buf, "IPD,"); //搜索“IPD”头if(ptrIPD == NULL) //如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间{//UsartPrintf(USART_DEBUG, "\"IPD\" not found\r\n");}else{ptrIPD = strchr(ptrIPD, ':'); //找到':'if(ptrIPD != NULL){ptrIPD++;return (unsigned char *)(ptrIPD);}elsereturn NULL;}}delay_ms(5); //延时等待} while(timeOut--);return NULL; //超时还未找到,返回空指针}
//==========================================================
// 函数名称: ESP8266_SendCmd
//
// 函数功能: 发送命令
//
// 入口参数: cmd:命令
// res:需要检查的返回指令
//
// 返回参数: 0-成功 1-失败
//
// 说明:
//==========================================================
_Bool ESP8266_SendCmd(char *cmd, char *res)
{unsigned char timeOut = 250;Usart_SendString(USART2, (unsigned char *)cmd, strlen((const char *)cmd));while(timeOut--){if(ESP8266_WaitRecive() == REV_OK) //如果收到数据{ if(strstr((const char *)esp8266_buf, res) != NULL) //如果检索到关键词{ESP8266_Clear(); //清空缓存return 0;}}delay_ms(10);}return 1;}//==========================================================
// 函数名称: ESP8266_SendData
//
// 函数功能: 发送数据
//
// 入口参数: data:数据
// len:长度
//
// 返回参数: 无
//
// 说明:
//==========================================================
void ESP8266_SendData(unsigned char *data, unsigned short len)
{char cmdBuf[32];ESP8266_Clear(); //清空接收缓存sprintf(cmdBuf, "AT+CIPSEND\r\n"); //发送命令if(!ESP8266_SendCmd(cmdBuf, ">")) //收到‘>’时可以发送数据{UsartPrintf(USART_DEBUG, "8.AT+CIPSEND\r\n");/*发送请求数据*/Usart_SendString(USART2, data, len); //发送设备连接请求数据 }
}
第四部分、总结
1、效果展示
这是连接单片机后,单片机通过串口返回的数据,这里串口只展示了当前天气、当前温度,所在地区和所在国家的数据,若想增加在主程序中增加即可。
单片机通过串口返回的数据和网址上显示的一致。
2、完整的工程
完整的工程代码点击该链接下载,无需积分,直接下载:STM32工程文件
3、补充
这篇博客说明了天气的获取方式,天气的读取,后面想做天气显示等应用,只需要加上LCD的驱动程序即可,花里胡哨的功能要靠自己去琢磨噻。
最后希望博客对你有帮助,喜欢的话可以点个赞呢👍👍👍。
相关文章:

【STM32训练—WiFi模块】第二篇、STM32驱动ESP8266WiFi模块获取天气
目录 第一部分、前言 1、获取心知天气API接口 2、硬件准备 第二部分、电脑串口助手调试WIFI模块获取天气 1、ESP8266获取天气的流程 2、具体步骤 第三部分、STM32驱动ESP8266模块获取天气数据 1、天气数据的解析 1.1、什么函数来解析天气数据? 2.1、解析后…...

Maven私服
Maven 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。 建立了 Maven 私服后,当局域网内的用户需要某个构件时,会按照如下顺序进行请求…...

手写RPC总结篇
协议制定:client到server做交互的通信协议,比如request response 网络端点peer 难点1 : Jetty嵌入 ◆jetty Server ◆ServletContextHandler ◆ServletHolder jetty server 起到网络监听的作用ServletContextHandler注册到jetty server中ServletHolde…...

c++11 标准模板(STL)(std::ios_base)成员类型与常量
流打开模式类型 std::ios_base::openmode typedef /*implementation defined*/ openmode; static constexpr openmode app /*implementation defined*/ static constexpr openmode binary /*implementation defined*/ static constexpr openmode in /*implementation defi…...

我用 ChatGPT 写 2023 高考语文作文:全国卷(一)
【2023】新高考|卷 “好的故事,可以帮我们更好地表达和沟通,可以触动心灵、启迪智慧:好的故事以改变一个人的命运,可以展现一个民族的形象故事是有力量的。” 以上材料引发了你怎样的联想和思考?请写一篇文章 要求&…...

4.java转义符,javadoc 标签
java常用转义字符 在控制台,输入tab键,可以实现命令补全 (如何解决cmd中Tab键不能自动补充的问题?百度一下) \t : 一个制表符,实现对齐功能\n : 换行符\ \ : 一个\\ " :一个"\ ’ : 一个’\r : 一个回车 …...

PinYin4j库的使用
一、PinYin4j库简介 1、PinYin4j简介 Pinyin4j 是一个流行的 Java 库,支持汉字和大多数流行的拼音系统之间的转换(汉语拼音,罗马拼音等)。可自定义拼音输出格式,功能强大。 官网地址:http://pinyin4j.sou…...

日志框架 --- Logback
文章目录 1. 什么是logback2. logback的日志级别3. 日志级别的层级4. logback配置文件4.1 logger标签4.2 root标签4.3 appender标签4.4 filter标签4.5 encoder标签 5. 整体演示5.1 配置文件5.2 运行结果 1. 什么是logback Logback是一个用于Java应用程序的日志框架,…...

QML 与 Python 交互
在 Qt 中,C 和 QML 交互一般有如下三种方法 上下文属性:setContextProperty( )向引擎注册类型:调用 qmlRegisterType( )QML 扩展插件:虽然有很大的灵活性,但是用 Python 创建 QML 插件比较麻烦,所以这种方法…...

React基础教程(三):JSX语法
React基础教程(三):JSX语法 1、JSX简介 全称:JavaScript XMLreact定义的一种类似于XML的JS扩展语法:JSXML本质是React.createElement(component, props, ...children)方法的语法糖作用:用来简化创建虚拟DOM(注意&…...

软件测试岗位都是女孩子在做吗?
听我一朋友说,测试岗位基本都是女孩子做。” 不知道是不是以前“软件测试岗”给人印象是“不需要太多技术含量”的错觉,从而大部分外行认为从业软件测试的人员中女生应占了大多数。比如有人就觉得:软件测试主要是细心活,所以女生…...

ARP协议,带你了解ARP协议
目录 一、ARP协议概述 二、使用ARP的四种情况 三、ARP缓存 四、ARP的工作原理 1. 地址解析 2. 地址缓存 五、ARP报文格式 1. ARP请求报文格式 2. ARP响应报文格式 六、免费ARP 七、代理ARP 一、ARP协议概述 ARP(Address Resolution Protocol)地…...

基于Java汽车客运站管理系统设计实现(源码+lw+部署文档+讲解等)
博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…...

0203使用规则-索引-MySQL
文章目录 1 联合索引1.1 最左前缀法则1.2 范围查询 2 索引失效2.1 常见情况2.2 数据分布影响 3 SQL提示4 覆盖索引和回表查询5 前缀索引6 单列和联合索引7 设计原则结语 1 联合索引 1.1 最左前缀法则 在Mysql数据库中创建了联合索引(或称复合索引,即包含…...

LVS+Keepalived群集
一、Keepalived概述 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。 在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,…...

抖音矩阵系统源代码开发部署--源码搭建
抖音矩阵系统是一个具有强大功能的开放性平台,通过数据挖掘技术能够实现精准的用户画像和个性化推荐,这也是抖音成为国内最受欢迎的短视频平台之一的原因之一。矩阵系统的开发需要大量的技术支持和数据分析,同时也需要综合运用大数据、机器学…...

如何用Jmeter进行接口测试 ,这应该是全网最详细的教程了
一、Jmeter 的使用步骤 打开Jmeter 安装包,进入\bin 中,找到"jmeter.bat", 点击打开即可。 在下图打开的Jmeter 页面中,右键“测试计划” -> “添加” -> "Threads(Users)" -> “线程组”, 建立线…...

C语言---malloc(0)会产生什么结果,真的是空指针吗?
前言 (1)几天前在一个交流群中看到有人说,面试问malloc(0)会怎么样是真的恶心。 (2)这个突然激起了我的好奇心。居然还可以malloc(0)?! (3)经过测试最后,发现…...

建模助手618 | 谁不囤点Revit插件我都会生气!
大家好,这里是建模助手。 早在5月份,我们已经就“618”这个事情高调了一番,以提前放“价”的姿势,让许多用户以躺赢的状态拉开了年中大促的序幕。(5月购买的盆友,切记看完全文,内附彩蛋 活动反…...

【“职场程序员是否会保护自己的隐私?为何要求程序员之间保密薪资?”】
职场程序员之间确实有一些秘密,其中之一便是对薪资保密。这并非完全是程序员们的独立行为,而是因为一些公司或组织规定员工之间不能互相透露薪水信息。 第一个原因是保护公司自身利益。如果一个程序员知道其他同事的薪资水平比自己高,他可能…...

企业工程管理系统源码之提高工程项目管理软件的效率
高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保…...

创新指南 | 推动销售的17个可落地的集客式营销示例
无论您是开启集客式的营销有一段时间还是处于起步阶段,了解像您这样的企业是如何粉碎竞争对手的的集客式策略总是有帮助的。无论您的公司做什么,它所服务的行业,是B2B还是B2C ,您都可以在这里找到许多可以使用的示例。 在本文中&…...

ASEMI代理光宝光耦LTV-0314的应用与优势
编辑-Z 在电子设备的设计和制造过程中,光耦合器是一种至关重要的组件。它们在电路中起到隔离作用,保护电子设备免受电压冲击和电流过载的影响。今天,我们将深入探讨一种特殊的光耦合器——LTV-0314,它的特性、应用以及优势。 一、…...

Apikit 自学日记: Apikit 如何发起测试
进入 API 文档详情页,点击上方 测试 标签,进入 API 测试页,系统会根据API文档自动生成测试界面并且填充测试数据。 填写请求参数 首先填写好请求参数。 请求头部 您可以输入或导入请求头部。批量导入的数据格式为 key : value ,…...

python-glob模块_表格及代码样例
glob模块 文章目录 glob模块1. glob.glob(pathname):根据指定的模式匹配文件路径,并返回匹配的路径列表2. glob.iglob(pathname):返回一个迭代器,逐个匹配文件路径,适用于大量文件的情况3. glob.escape(pathname)&…...

GitHub Copilot 最全安装、使用
GitHub Copilot 最全安装、使用教程 一、温馨提示 GitHub Copilot 目前为止可以免费试用一个月,但是试用的前提是必须要绑定银行卡,因为后续会自动扣费,所以请注意试用结束日期,自己定好闹钟关闭订阅。 订阅价格为每月10美刀&a…...

C语言 指针(特别篇)
本篇目录 C语言 指针(特别篇)内存地址简要介绍C语言指针C语言的指针可以指向什么?取地址符 &(Address-of Operator)C语言中的 * 号运算符示例集:指向变量的指针指向数组的指针指向字符串的指针二级指针指针数组的…...

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月26日论文合集)
文章目录 一、检测相关(9篇)1.1 Energy-based Detection of Adverse Weather Effects in LiDAR Data1.2 Anomaly Detection with Conditioned Denoising Diffusion Models1.3 Mask Attack Detection Using Vascular-weighted Motion-robust rPPG Signals1.4 Improved Multi-Sca…...

网络编程与自动化(python)
20.1 网络编程与自动化概述 传统网络运维困境大家在日常的网络运维中是否遇到过如下问题: 设备升级:现网有数千台网络设备,你需要周期性、批量性地对设备进行升级。配置审计:企业年度需要对设备进行配置审计。例如要求所有设备开启sTelnet功能,以太网交换机配置生成树安全…...
有趣的数学 对称/非对称加密简史及数学原理一览
一、非对称加密简史 1、算法建立 对于任何想发送加密信息的人,另一个问题是如何让接收人知道这条信息一开始是如何加密的。对于像字母替换式密码这样的密码,问题在于,一旦窃听者知道了加密方案,后续的信息都可以轻松获取。 公钥加…...