1. 小白入门STA模式运用

前面章节讲解了AP模式运用,这节来探索STA模式如何使用。何谓STA模式呢?通俗来讲就是我们的WIFI模块,连接到可用的无线网络(如手机发射出来的热点或者家里路由器的热点),连接上无线网络后,相当于模块也是可以上网了,就跟手机连路由器WIFI上网,这时我们就可以利用模块去访问某些服务器进行通信,来获取我们想要的信息。比如获取天气服务器的天气信息等等。

1.1资源环境:

ESP8266 WIFI模块一个

STM32开发板(本例程采用STM32F103ZET6开发板)

SD卡一张(没有也可以,此处用来获取显示天气状态的图标)

可上网的热点(ssid和密码)

1.2 ESP82266与开发板引脚连接说明:

ESP82266   开发板引脚

VCC    ------    5V

GND   ------    GND

TXD    ------    PB11

RXD    ------    PB10

RST    ------     PA4(可不接)

IO_0   ------     PA15(可不接)

2. STA子模式的配置说明

在AP模式章节也讲到,每种模式又可以设置为三种不同子模式进行数据通信,STA模式也不例外。即模块可以配置为TCP服务器子模式、TCP客户端子模式、UDP子模式。下面分别说下配置成这三种模式的必要配置:

TCP服务器的配置:

TCP客户端的配置:

UDP模式配置:

3. 详解使用说明

首先我们要配置WIFI模块连上热点,这里我们采取配置为TCP客户端子模式,便于后面获取天气预报信息:

atk_8266_send_cmd("AT+CWMODE=1","OK",50);  //配置STA模式
atk_8266_send_cmd("AT+RST","OK",20);       //重启模块
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
//设置无线参数:ssid和密码
sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"",wifista_ssid,wifista_password);while(atk_8266_send_cmd(p,"WIFI GOT IP",300));   //连接目标路由器,获取ip

开发板上设置好要连接的ssid和密码:

当模块连接上热点后,就可以开始建立要访问的目标服务器的TCP连接了:这里以访问心知天气服务器为例

心知天气文档了解入口:https://docs.seniverse.com/api/start/start.html

获取一次实时天气信息如下:以获取广州天气信息为例,这里涉及到http相关知识和cjson格式数据解析

//心知天气端口号
#define WEATHER_PORTNUM     "80"
//心知天气IP
#define WEATHER_SERVERIP    "api.seniverse.com"sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",WEATHER_SERVERIP,WEATHER_PORTNUM);  //配置心知天气的ip和端口
res = atk_8266_send_cmd(p,"OK",200);//连接到目标tcp服务器
delay_ms(300);
atk_8266_send_cmd("AT+CIPMODE=1","OK",100);      //设置传输模式为透传atk_8266_send_cmd("AT+CIPSEND","OK",100);         //开始透传
u3_printf("GET https://api.seniverse.com/v3/weather/now.json?key=x3owc7bndhbvi8oq&location=guangzhou&language=zh-Hans&unit=c\n\n");

当WIFI模块获取心知服务器一次实时天气成功后,会返回对应的cjson格式数据,可以通过串口打印出返回的信息如下:

{"results":[{"location":{"id":"WS0E9D8WN298","name":"骞垮窞","country":"CN","path":"骞垮窞,骞垮窞,骞夸笢,涓浗","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"澶氫簯","code":"4","temperature":"29"},"last_update":"2020-04-19T13:49:00+08:00"}]}

对应部分的cjson格式数据解析如下:

pSub = cJSON_GetObjectItem(root,"results");
if(pSub != NULL)
{arrayItem = cJSON_GetArrayItem(pSub,0);  pr = cJSON_Print(arrayItem);  pItem = cJSON_Parse(pr);       if(pItem != NULL){pSubItem = cJSON_GetObjectItem(pItem,"now");if(pSubItem != NULL){pChildItem = cJSON_GetObjectItem(pSubItem,"code");      //获取气象代码if(pChildItem != NULL){gbkstr = pChildItem->valuestring;curwer_buf[0]=str2int((u8 *)gbkstr);}pChildItem = cJSON_GetObjectItem(pSubItem,"temperature");     //获取实时温度值if(pChildItem != NULL){gbkstr = pChildItem->valuestring;curwer_buf[1] = str2int((u8 *)gbkstr);}         }}
}

我们还可以继续获取今、明、后三天的天气信息,具体看你的心知服务器的api接口:对应的访问接口如下

u3_printf("GET https://api.seniverse.com/v3/weather/daily.json?key=x3owc7bndhbvi8oq&location=guangzhou&language=zh-Hans&unit=c&start=0&days=5\n\n");

返回的cjson格式数据如下:

"results":[{"location":{"id":"WS0E9D8WN298","name":"骞垮窞","country":"CN","path":"骞垮窞,骞垮窞,骞夸笢,涓浗","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"daily":[{"date":"2020-04-19","text_day":"澶氫簯","code_day":"4","text_night":"澶氫簯","code_night":"4","high":"29","low":"22","rainfall":"0.0","precip":"","wind_direction":"鏃犳寔缁鍚?","wind_direction_degree":"0","wind_speed":"16.20","wind_scale":"3","humidity":"78"},{"date":"2020-04-20","text_day":"澶氫簯","code_day":"4","text_night":"澶氫簯","code_night":"4","high":"29","low":"22","rainfall":"0.0","precip":"","wind_direction":"鍗?","wind_direction_degree":"198","wind_speed":"25.20","wind_scale":"4","humidity":"79"},{"date":"2020-04-21","text_day":"涓洦","code_day":"14","text_night":"澶ч洦","code_night":"15","high":"28","low":"20","rainfall":"10.0","precip":"","wind_direction":"鍗?","wind_direction_degree":"179","wind_speed":"25.20","wind_scale":"4","humidity":"89"}],"last_update":"2020-04-19T11:17:53+08:00"}]}

当获取成功后,就可以在我们的开发板上展示如下的天气信息:可知当前的风力、风速、和温度,以及今明后三天的最高温度和最低温度。

大家应该也观察到了,这里会显示出对应天气状态的小图标,是根据获取到气象代码,从SD卡里读取对应气象代码的图片,显示出来的。

SD卡里面的气象小图标如下所示:

具体实现如下:

void Weather_Icon_Show(void)
{u8 i=0;u8 res;u16 temp;pic_info.totpicnum=pic_get_tnum((u8 *)"0:/wc"); //得到总有效文件数pic_info.picfileinfo.lfsize=30*2+1;                     //长文件名最大长度 , _MAX_LFN换成30pic_info.picfileinfo.lfname=mymalloc(SRAMIN,pic_info.picfileinfo.lfsize); //为长文件缓存区分配内存pic_info.pname=mymalloc(SRAMIN,pic_info.picfileinfo.lfsize);              //为带路径的文件名分配内存pic_info.picindextbl=mymalloc(SRAMIN,2*pic_info.totpicnum);              //申请2*totpicnum个字节的内存,用于存放图片索引  res=f_opendir(&pic_info.picdir,"0:/wc"); //打开目录if(res==FR_OK){pic_info.curindex=0;//当前索引为0while(1)//全部查询一遍{temp=pic_info.picdir.index;                               //记录当前indexres=f_readdir(&pic_info.picdir,&pic_info.picfileinfo);              //读取目录下的一个文件if(res!=FR_OK||pic_info.picfileinfo.fname[0]==0)break;   //错误了/到末尾了,退出         pic_info.fn=(u8*)(*pic_info.picfileinfo.lfname?pic_info.picfileinfo.lfname:pic_info.picfileinfo.fname);           res=f_typetell(pic_info.fn);  if((res&0XF0)==0X50)//取高四位,看看是不是图片文件  {pic_info.picindextbl[pic_info.curindex]=temp;//记录索引 ,若是分配的内存空间不够,就会导致索引乱序pic_info.curindex++;}       } }delay_ms(1500);piclib_init();                                        //初始化画图        res=f_opendir(&pic_info.picdir,(const TCHAR*)"0:/wc");    //打开目录if(res==FR_OK)  pic_info.picstatus|=(1<<3);if(pic_info.picstatus&0X08)//打开成功{                for(i=0;i<4;i++){dir_sdi(&pic_info.picdir,pic_info.picindextbl[iconbuf[i]]);          //改变当前目录索引   f_readdir(&pic_info.picdir,&pic_info.picfileinfo);             //读取目录下的一个文件pic_info.fn=(u8*)(*pic_info.picfileinfo.lfname?pic_info.picfileinfo.lfname:pic_info.picfileinfo.fname);             strcpy((char*)pic_info.pname,"0:/wc/");              //复制路径(目录)strcat((char*)pic_info.pname,(const char*)pic_info.fn);           //将文件名接在后面if(i<=2)  ai_load_picfile(pic_info.pname,105+i*265,320,60,60,1);//显示图片   lcddev.width else ai_load_picfile(pic_info.pname,565,90,60,60,1);//显示图片   lcddev.width delay_ms(500);}}if(pic_info.picfileinfo.lfname!=NULL ||pic_info.pname!=NULL || pic_info.picindextbl!=NULL){myfree(SRAMIN,pic_info.picfileinfo.lfname);    //释放内存              myfree(SRAMIN,pic_info.pname);              //释放内存              myfree(SRAMIN,pic_info.picindextbl);            //释放内存      }}

4.总结

通过对WIFI--ESP8266模块STA模式获取天气信息学习应用,不仅可以了解到STA模式原理,还可以加深对HTTP协议,CJSON格式数据解析使用。

STM32连接WIFI-ESP8266获取天气信息---STA模式运用相关推荐

  1. ESP8266 WIFI模块获取天气信息

    ESP8266 WIFI模块获取天气信息 基本步骤 获取天气时间 基本步骤 (1)确认模块在 STA 模式. 如果不在需要输入AT指令: AT+CWMODE=1 响应OK后输入: AT+RST或者重新 ...

  2. esp8266获取天气信息:心知天气get及url讲解说明

    本人最近在使用esp8266获取天气预报,在网上搜寻了一番,使用了心知天气的api(不是打广告),本人对网络方面不是很懂,经过几天的查找资料与学习,然后在博客记录下,方便以后的学习可广大学友. url ...

  3. STM32使用ESP8266模块AT指令连接心知天气API获取天气信息

    由于之前使用STM32单片机来开发一些物联网的小项目,接触到了WIFI模块ESP8266,所以写下来记录一下.本文主要介绍的是STM32通过发送AT指令集来控制ESP8266 WIFI模块连接WiFi ...

  4. Android开发之和风天气篇:1、获取天气信息

    TIME:2020年7月6日 :1.获取天气信息 和风天气API使用方法: step1 申请天气接口 step2 天气接口初始化 step3 选择服务模式 step4 通过URL请求数据 step5解 ...

  5. 微信小程序使用百度api获取天气信息 —— 微信小程序教程系列(16)

    之前已经介绍过,如何使用百度地图api来获取地理位置信息 微信小程序的百度地图获取地理位置 -- 微信小程序教程系列(15) 下面介绍使用百度api来获取天气信息. 1> 第一步:先到百度开放平 ...

  6. bat批处理开发-wifi联网系列(4):连接wifi,获取本机ip、网关及dns,并通过ping对wifi网络的连通性可用性进行检测

    公司wifi很不稳定,编写了个wifi断网后自动重连的批处理,主要包括:可用wifi查询.联网.wifi切换感知.自动检测及掉线重连,网络状态分析等功能. 本次分享第四部分:连接wifi,并对wifi ...

  7. java解析xml实例——获取天气信息

    获取xml并解析其中的数据: package getweather.xml;import java.io.IOException; import java.util.HashMap; import j ...

  8. python通过调用百度天气API接口获取天气信息

    python调用百度接口,获取天气信息 需要到百度注册开发者账号,通过账号获取到每个账号私有的应用访问(AK) 使用此脚本还需要district_id.csv文档,在我资源中可以免费下载,也可在百度天 ...

  9. Android中基于心知天气API获取天气信息

    Android中基于心知天气获取天气信息 JSON JSON简介 JSON对象 JSON数组 JSON解析 Android中获取天气 获取天气的流程 获取心知天气的API key 获取心知天气的API ...

最新文章

  1. Oracle中的MERGE语句
  2. ECCV2020 | 即插即用,涨点明显!FPT:特征金字塔Transformer
  3. 牛客练习赛36 Rabbit的字符串(最小表示法)
  4. 实施自定义JMeter采样器
  5. 手把手教你移植RT-Thread系统
  6. mimes.php,php – Laravel文件上传验证
  7. 福昕pdf阅读器,怎么将pdf文件中的某一页,提取出来,即分页保存?
  8. 邮箱服务申请数字证书
  9. java poi excel 图表_Java用POI实现根据Excel表格模板生成新的Excel并实现数据输出
  10. SQL 查询速度慢原因及优化方法(转载)
  11. BME280嵌入式设计-基于STM32F103的温湿度气压控制板-支持蓝牙串口输出数据!!!
  12. 蓝桥杯 PREV-10 幸运数
  13. UltraEdit下Shift键失效
  14. ltib常用命令详解
  15. 逐步推进的团队项目准备工作全记录
  16. LaTeX之双栏模板表格布局(单双栏满宽+不满宽)
  17. 孔浩java爱酷网_孔浩老师JAVA WebService教程
  18. SqlCommand.ExecuteNonQuery()方法的使用注意
  19. 查看电脑核数和线程数
  20. 远程桌面设置分辨率的步骤

热门文章

  1. Excel表格中如何快速插入多个空白行
  2. Hoeffding's lemma证明
  3. 累计观看5.5亿+,盛世华诞,云上直播随地看
  4. mysql 1058_mysql启动服务报1058错误的解决方法
  5. makefile predefined variable $^ $@
  6. 马化腾对短视频志在必得?腾讯又双叒叕发布了一款短视频App
  7. 网红书店的“关门潮”与场景阅读的“科技浪”
  8. 猫掉进山洞C语言随机数,《小猫出生在秘密山洞》读书心得最新范文五篇
  9. 使用天气api接口调用
  10. ABP 6.0.0-rc.1的新特性