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

阿里云网站建设流程南通seo网站诊断

阿里云网站建设流程,南通seo网站诊断,网络优化工程师简历,如何建设一个完整的网站目录 第一部分、前言 1、获取心知天气API接口 2、硬件准备 第二部分、电脑串口助手调试WIFI模块获取天气 1、ESP8266获取天气的流程 2、具体步骤 第三部分、STM32驱动ESP8266模块获取天气数据 1、天气数据的解析 1.1、什么函数来解析天气数据#xff1f; 2.1、解析后…目录 第一部分、前言 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?keySwLQ3i0Q5TNa6NSKTlocationhangzhoulanguagezh-Hansunitc 点击上面的链接就会获取到天气数据接下来的步骤就和前面获取时间一样主要区别就是将时间的API接口换成刚刚注册得到的心知天气的API接口即可是不是发现原来也就这么回事。 2、硬件准备 STM32选用核心板F103C8T6然后再加一个ESP8266 WiFi模块任何型号应该都可以我这次用的ESP-01s最后需要一个USB-TTL模块用来打印串口数据。 需要注意的是我的这个ESP-01S有一个EN使能端必须要给高电平才能用上一篇博客用的那个WIFI模块没有EN使能端。所以希望大家注意自己的模块。 第二部分、电脑串口助手调试WIFI模块获取天气 1、ESP8266获取天气的流程 流程和获取时间的流程大致一样只不过这里获取的为天气数据。 2、具体步骤 第一步、AT指令集 0AT 1ATRST 2ATCWMODE1 3ATCIPMUX0 4ATCWJAP你的WiFi名称,你的WiFi密码 5ATCIPMODE1 6ATCIPSTARTTCP,api.seniverse.com,80 7ATCIPSEND 8GET https://api.seniverse.com/v3/weather/now.json?keySwLQ3i0Q5TNa6NSKTlocationhangzhoulanguageenunitc 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 ATCWJAP\iPhone111\,\123456789\\r\n //心知天气的API #define Weather_TCP ATCIPSTART\TCP\,\api.seniverse.com\,80\r\n //心知天气GET报文 /*这里城市 恩施 语言为 英文*/ #define Weather_GET GET https://api.seniverse.com/v3/weather/now.json?keySwLQ3i0Q5TNa6NSKTlocationenshilanguageenunitc\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日 下午1618 //作者 大屁桃 /**************************************************************************/ 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(ATRST\r\n, );delay_ms(500);ESP8266_SendCmd(ATCIPCLOSE\r\n, );delay_ms(500);/UsartPrintf(USART_DEBUG, 3.CWMODE\r\n);while(ESP8266_SendCmd(ATCWMODE1\r\n, OK))delay_ms(500);UsartPrintf(USART_DEBUG, 4.ATCIPMUX\r\n);while(ESP8266_SendCmd(ATCIPMUX0\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日 下午1618 //作者 大屁桃 /**************************************************************************/ 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.ATCIPMODE1 OK\r\n); while(ESP8266_SendCmd(ATCIPMODE1\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)); //发送ATCIPSEND 以及 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日 下午418 //作者 大屁桃 /**************************************************************************/ 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, ATCIPSEND\r\n); //发送命令if(!ESP8266_SendCmd(cmdBuf, )) //收到‘’时可以发送数据{UsartPrintf(USART_DEBUG, 8.ATCIPSEND\r\n);/*发送请求数据*/Usart_SendString(USART2, data, len); //发送设备连接请求数据 } } 第四部分、总结 1、效果展示 这是连接单片机后单片机通过串口返回的数据这里串口只展示了当前天气、当前温度所在地区和所在国家的数据若想增加在主程序中增加即可。 单片机通过串口返回的数据和网址上显示的一致。 2、完整的工程 完整的工程代码点击该链接下载无需积分直接下载STM32工程文件​​​​​​​ 3、补充 这篇博客说明了天气的获取方式天气的读取后面想做天气显示等应用只需要加上LCD的驱动程序即可花里胡哨的功能要靠自己去琢磨噻。 最后希望博客对你有帮助喜欢的话可以点个赞呢。
http://www.tj-hxxt.cn/news/224929.html

相关文章:

  • 一箭天网络推广关键字排名优化工具
  • 网站建设0doit深圳市龙华区地图全图
  • 盗用别人网站图做网站毛坯房110平装修预算
  • 义乌网站建设成都网站设计需要详细填写
  • 网站建设费用北京网站图片360度旋转怎么做的
  • 网站建设入门教程pdfwordpress加载不同模板
  • 如何制作自己的网站 可放广告app网站建设教程视频教程
  • 河北pc端网站建设大兴安岭建设局网站
  • 东营建设工程信息网站市场营销方案范文
  • 网站建设问题调查百度推广效果怎样
  • 提供网站建设小程序制作花生壳做网站缺点
  • 怎样做论坛网站男女做暧暧网站
  • 百度云网站建设教程视频重庆重庆网站建设公司
  • 辽宁网站建设熊掌号自助建站免费信息发布网站
  • 网站建设捌金手指花总十七本地黄页小程序
  • 国际互联网网站高端网站建设设计公司排名
  • 甘肃手机版建站系统哪个好做视频网站用什么模板
  • 买国外域名 网站高端网站建设郑州
  • 网站设计价格大概多少营销网站建设联系方式
  • 21天网站建设实录pdf上海互联网seo公司
  • 设计院门户网站建设方案网站新闻对百度优化有用吗
  • 宽屏大气网站模板杭州 网站制作
  • 深圳建设资格注册中心网站WordPress手机不显示
  • 网站建设验收单格式手机php网站开发工具
  • 鞍钢节能公司网站开发设计开发网站
  • 琼海网站建设长治建立公司网站的步骤
  • 辽宁pc网站建设开发徐州制作手机网站
  • 宁波公司网站开发招聘免费建网站哪家好
  • 免费自助建站哪个网站最好企业管理培训课程安排
  • 郑州做定制网站的公司如何建立网站快捷