请选择 进入手机版 | 继续访问电脑版
论坛
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 1873|回复: 5

ESP8266_15天气预报之TCP的GET操作

[复制链接]

24

主题

49

帖子

196

积分

注册会员

Rank: 2

积分
196
发表于 2019-12-4 19:09:17 | 显示全部楼层 |阅读模式
本帖最后由 lazyduck 于 2019-12-10 16:24 编辑


前面几节,TCP的基本操作聊了一些。接下来这几节,聊一聊HTTP协议下的GET操作。首先明确几个基本概念:
HTTP(HyperText Transfer Protocol,超文本传输协议)是一套计算机通过网络进行通信的规则,使HTTP客户端能够从HTTP服务器端请求到信息和服务,目前的版本号是1.1。
HTTP通讯机制是在一次完整的HTTP通讯过程中,客户端和服务器之间建立连接分为以下几个步骤。
1、建立连接: 其中包括:域名解析,TCP三次握手。
2、发送数据
3、返回数据
4、关闭连接
咱们这一节主要研究的是其中的前二个步骤:建立连接和发送数据。即域名如何解析,数据该以什么样的格式发送。
如何演示?天气预报?
是的,天气预报。这个东西虽然有点俗,但用来讲解,效果还是挺好的。
首先,去心知天气(自行百度,非广告)注册一个账户,然后购买一个免费版的产品。这时,你就能通过API查看全国任意城市的天气了。
使用方式,将 API 密钥中的“私钥”作为 API 请求中的 key 参数值:
https://api.seniverse.com/v3/weather/now.json?key=your_private_key&location=beijing&language=zh-Hans&unit=c
把连接中的加黑字体换成你的私钥,然后粘贴到浏览器,效果如下:
看不清图片的,看下面文字:
{“results”:[{“location”:{“id”:”WX4FBXXFKE4F”,”name”:”北京”,”country”:”CN”,”path”:”北京,北京,中国”,”timezone”:”Asia/Shanghai”,”timezone_offset”:”+08:00″},”now”:{“text”:”多云”,”code”:”4″,”temperature”:”27″},”last_update”:”2019-09-17T14:25:00+08:00″}]}
想看其它城市的天气,更换连接中的文字:beijing为你想要的城市即可。
先说域名解析,为什么要解析?
研究这个之前,先思考一个问题,我们上网的时候,究竟是怎么上的。以百度为例,我们输入的网址是:www.baidu.com或者http://www.baidu.com,再或者https://www.baidu.com
严格来说,URL应该符合以下形式:
<协议>://<主机>:<端口>/<路径>?<参数>&<参数>
协议常用的有http、https或者ftp;“://”不能省略;主机就是“www”开头的网址,端口没有写的话,默认80;斜杠后面跟的是路径等等。对照这个格式,百度的网址可以写成这样:
http://www.baidu.com:80/index.html
所以,做域名解析的时候,要考虑这几方面的因素:协议、主机、端口、路径,也就是说你要把这几样因素都找到。域名解析的函数网上有很多公开的代码,我这里贴一个,仅供参考:
  1. <font size="4">void ICACHE_FLASH_ATTR http_parse_request_url(char *URL,char *host,char *filename,unsigned short *port)
  2. {
  3.         char *PA;
  4.         char *PB;
  5.         memset(host,0,sizeof(host));
  6.         memset(filename,0,sizeof(filename));
  7.         *port=0;
  8.         if(!(*URL)) return;
  9.         PA=URL;
  10.         if(!strncmp(PA,"http://",strlen("http://")))
  11.                 PA=URL+strlen("http://");
  12.         if(!strncmp(PA,"https://",strlen("https://")))
  13.                 PA=URL+strlen("https://");
  14.         PB=strchr(PA,'/');
  15.         if(PB){
  16.                 memcpy(host,PA,strlen(PA)-strlen(PB));
  17.                 if(PB+1){
  18.                         memcpy(filename,PB+1,strlen(PB-1));
  19.                         filename[strlen(PB)-1]=0;
  20.                 }
  21.                 host[strlen(PA)-strlen(PB)]=0;
  22.         }else{
  23.                 memcpy(host,PA,strlen(PA));
  24.                 host[strlen(PA)]=0;
  25.         }
  26.         PA=strchr(host,':');
  27.         if(PA)
  28.                 *port=atoi(PA+1);
  29.         else
  30.                 *port=80;
  31. }</font>
复制代码
所以,解析完成之后,得到主机和路径,按照相应格式,组成数据包,发送给服务器,服务器就能返回相应的数据。
那么,ESP8266怎么发送?直接通过espconn_sent函数把数据发出去?那是肯定不行滴。需要一个特定的格式。HTTP请求数据格式如下:
当浏览器发送请求时,它要向服务器发送一个数据块,也就是请求信息,其中信息由三部分组成。
1. 请求方法 URI协议/版本
2. 请求头(Request Header)
3. 请求正文
示范代码如下:
  1. <font size="4">GET/sample.jspHTTP/1.1

  2. Accept:image/gif.image/jpeg,*/*

  3. Accept-Language:zh-cn

  4. Connection:Keep-Alive

  5. Host:localhost

  6. User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)

  7. Accept-Encoding:gzip,deflate</font>
复制代码
再比如,当我使用浏览器访问网址的时候,通过抓包工具,可以看到如下信息:
这些内容,有些是可以不要的。所以最终整理一下,以访问心知天气的API为例,实际的内容格式如下:
  1. <font size="4">GET v3/weather/now.json?key=your_private_key&location=beijing&language=zh-Hans&unit=c HTTP/1.1

  2. Accept: */*

  3. Host: api.seniverse.com

  4. Connection: Keep-Alive</font>
复制代码
GET后面跟的是前面那个API网址中,api.seniverse.com后面的那一串字符,然后是“HTTP/1.1”。由于格式原因,没有显示在同一行,实际应用的时候放在同一行即可。
实际应用中,每次输入不同的API链接,我们不可能手动把前面的host和后面的字符串拆分开,所以需要上面的解析函数,用来判断哪部分是host,哪部分是字符串。
程序修改完成,保存、清理、编译、下载一条龙,然后重新上电。这里借助串口助手来查看效果。效果如下所示:
从receive data开始,都是收到的信息。我这里查看了廊坊的天气,显示晴天,28度,还可以~
但是目前这个数据只能通过串口打印出来,而且还有一定的格式,需要对格式进行解析,这部分下一节再说。
完整工程源码,请关注公众号:单片机爱好者,回复关键字:ESP8266,即可获取。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

1

主题

107

帖子

568

积分

高级会员

Rank: 4

积分
568
发表于 2019-12-5 19:40:10 | 显示全部楼层
一些大型网站的天气也可以获取的,像新浪天气,要分析网站代码,直接获取它的信息源。我喜欢获取本地气象台网站的天气,因为他们的网站好欺负,气温又准确。
回复

使用道具 举报

24

主题

49

帖子

196

积分

注册会员

Rank: 2

积分
196
 楼主| 发表于 2019-12-10 16:24:44 | 显示全部楼层
abcrazy 发表于 2019-12-5 19:40
一些大型网站的天气也可以获取的,像新浪天气,要分析网站代码,直接获取它的信息源。我喜欢获取本地气象台 ...

你分享个信息源,我看下
回复

使用道具 举报

1

主题

107

帖子

568

积分

高级会员

Rank: 4

积分
568
发表于 2019-12-11 21:19:42 | 显示全部楼层
lazyduck 发表于 2019-12-10 16:24
你分享个信息源,我看下

地方气象台,就是本地的,找不到网址了,没有全国的,只有区域播报。刚好这个网站比较容易分析数据来源而已。
回复

使用道具 举报

24

主题

49

帖子

196

积分

注册会员

Rank: 2

积分
196
 楼主| 发表于 2019-12-12 18:43:59 | 显示全部楼层
abcrazy 发表于 2019-12-11 21:19
地方气象台,就是本地的,找不到网址了,没有全国的,只有区域播报。刚好这个网站比较容易分析数据来源而 ...

论坛里好冷清啊,人好少
回复

使用道具 举报

1

主题

107

帖子

568

积分

高级会员

Rank: 4

积分
568
发表于 2019-12-14 13:07:43 | 显示全部楼层
lazyduck 发表于 2019-12-12 18:43
论坛里好冷清啊,人好少

论坛知名度不够高。像stm32的论坛,原子比较多人。原子免费发布很多教程视频,安信可没更新那么多视频。基础打稳后,我都是看乐鑫官方手册过来的。乐鑫这两年发布 IDF 开源后很赞。看源码好费脑力,有时会发现乐鑫官方源码很明显的 BUG。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|安信可论坛    

GMT+8, 2020-2-24 04:54 , Processed in 0.020338 second(s), 12 queries , Redis On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表