做小气象站的想法一直都有,只是一直没去尝试,一方面是没时间精力,另外一方面是很多技术知识需要去了解,总之,这件事一直一拖再拖,拖到最近,最终还是下决心干了,花了几个周末补充了下相关知识,终于搞定了,过程说一波三折一点不为过~~~~~~~~~~~~~~
在做这个气象站之前,我去国内的一些气象站网站试着获得数据,但是很多不让访问,还有一些要收费,没办法,最后找了个国外免费的网站,
http://openweathermap.org/api。这个网站其实也分免费和商用两种,我申请的前面一种。要访问这个网站的天气预报数据,需要先注册一个帐号,获得appid,才可以访问,返回的天气预报数据主要支持json,xml,html格式,默认返回格式是json,正好前段时间实现了json树的构建和解析,可以直接在这个DIY中使用。
官方提供获取天气预报接口如下:
Call current weather data for one location
By city name
Description:
You can call by city name or city name and country code. API responds with a list of results that match a searching word.
API call:
api.openweathermap.org/data/2.5/weather?q={city name}
api.openweathermap.org/data/2.5/weather?q={city name},{country code}
Parameters:
q city name and country code divided by comma, use ISO 3166 country codes
我使用的是第一种方法通过城市名字,北京这么霸气的名称就不加国家编码了
,做这个之前,我走过一段弯路,主要是http数据包不是很熟,GET命令组包不太熟悉,本来打算移植下http功能,一下没搞定,于是采用了组包的方式来实现,组包的过程中也出现过请求命令返回401的错误,经过多次失败的组包,最后实现了。其实做这个我们可以用wireshark来分析get命令包,而不是瞎搞,做这个之前我们需要了解URL:
什么是URL呢?
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
上面是比较正规的定义,其实说白了就是我们经常输入的网址,我们要获得GET的命令组包可以通过用浏览器向服务器发送一个GET命令(其实浏览器发送请求就是一次GET命令),我们通过wireshark抓包把协议的请求和应答都捕捉到,如果搞网络的不懂使用wireshark,那真是太浪费了一个神器,我有同学自己做了一个抢票软件,也是通过wireshark来抓包12306的数据实现的。我们在浏览器中输入URL,结果如下:
一个天气预报的数据就以JSON格式的方式返回来了。接下来我们用wireshark来分析下输入URL到底发生了些什么交互。wireshark 我使用的是1.12版本,最新的2点多,我不太用的习惯。
做这个之前我们需要知道服务器的ip,这个有利于到时分析数据。
经过上面的分析,我们可以解决任何GET命令访问服务器的组包,接下来我们定义一个数组来保存上面的get命令包通过esp8266的socket接口向服务器发送就行:
其实我尝试了很多次,发现8266不能把http应答包都接受全,会出现数据丢失(这个看来我还得和芯片原厂沟通下,看看他们有没解决办法了),这个确实挺令人遗憾的,不过毕竟8266面向的是低端用户,看在性价比的份上,我也就勉强接受了这个现实~~~~~~~~~~~~~知道了如何调用天气预报接口获取天气预报数据,后面想怎么处理那些数据都行了~~~~~~~~~~~~~~~