[原创] 用ESP8266做一个属于自己的小气象站

wateras1   2016-5-30 22:19 楼主
         做小气象站的想法一直都有,只是一直没去尝试,一方面是没时间精力,另外一方面是很多技术知识需要去了解,总之,这件事一直一拖再拖,拖到最近,最终还是下决心干了,花了几个周末补充了下相关知识,终于搞定了,过程说一波三折一点不为过~~~~~~~~~~~~~~
        在做这个气象站之前,我去国内的一些气象站网站试着获得数据,但是很多不让访问,还有一些要收费,没办法,最后找了个国外免费的网站,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,结果如下:

OQ[Q%LLG{O0_VRE@M9NYT_S.png
一个天气预报的数据就以JSON格式的方式返回来了。接下来我们用wireshark来分析下输入URL到底发生了些什么交互。wireshark 我使用的是1.12版本,最新的2点多,我不太用的习惯。
SZ9_QV]8NQVNPV6`54UNPWM.jpg
做这个之前我们需要知道服务器的ip,这个有利于到时分析数据。
F9$J{EEU)0P{R_F4%SO3.png
S`$YR%HK}Y8TP6XOEY072]C.jpg Q642%MT]$OR3}GFY6}W2L~1.png
OQ[Q%LLG{O0_VRE@M9NYT_S.png N4ZGR1)O$MBG@~M3J[C9{YD.png ](]W65EOGNF3RLTPM7PNI]B.png 1F`D3@N2LZT$R]OSCWF4.png

经过上面的分析,我们可以解决任何GET命令访问服务器的组包,接下来我们定义一个数组来保存上面的get命令包通过esp8266的socket接口向服务器发送就行:

1.png

其实我尝试了很多次,发现8266不能把http应答包都接受全,会出现数据丢失(这个看来我还得和芯片原厂沟通下,看看他们有没解决办法了),这个确实挺令人遗憾的,不过毕竟8266面向的是低端用户,看在性价比的份上,我也就勉强接受了这个现实~~~~~~~~~~~~~知道了如何调用天气预报接口获取天气预报数据,后面想怎么处理那些数据都行了~~~~~~~~~~~~~~~




淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目

回复评论 (58)

可以窃听端口了
点赞  2016-5-31 00:29
可以使用服务器进行中转,esp8266请求自己搭建的服务器的接口,使用服务器抓取天气网的数据,然后把需要的数据返回给ESP8266,这样就减少了数据量。
点赞  2016-5-31 00:50
引用: suoma 发表于 2016-5-31 00:29
可以窃听端口了

这种方法可以窃取你的帐号和密码,所以不要连接免费的WIFI,免得钱丢了都不知道什么原因
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2016-5-31 09:24
看起来很好玩   
加油!在电子行业默默贡献自己的力量!:)
点赞  2016-5-31 09:24
wateras1哥,您是把ESP8266玩出了新高度啊。您用哪个封装啊。还是那种小黄板啊。
点赞  2016-5-31 09:29
好好学习一下
点赞  2016-5-31 09:30
引用: huaiqiao 发表于 2016-5-31 09:29
wateras1哥,您是把ESP8266玩出了新高度啊。您用哪个封装啊。还是那种小黄板啊。

其实用什么不要紧,只要能上网就OK了,其实我现在是按照wifi固件的设计思路来分享文章的,先从应用层把常用的协议应用通过简单的小应用分享,最后再到底层,最后可能的话,在任何射频芯片移植都行(硬件支持的话)
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2016-5-31 09:33

9楼 nmg 

@strong想起你要做的气象仪

不知此帖是有可供参考之处
点赞  2016-5-31 09:54
引用: wateras1 发表于 2016-5-31 09:33
其实用什么不要紧,只要能上网就OK了,其实我现在是按照wifi固件的设计思路来分享文章的,先从应用层把 ...

您说的我不是太懂。对了 wifi固件,您是直接使用的固件还是对SDK(应该是叫SDK)编程呢
ESP8266我看安可信的官网是说是基于乐鑫ESP8266的超低功耗的UART-WiFi模块的模组。
可以理解为这个ESP8266的模组用的是乐鑫的esp8266芯片么
点赞  2016-5-31 10:02
研究的好深入
疏雨客晚归,荒烟乱,几许江南无晴!又落花,残香织梦,莫  莫  莫,白首衷肠……
点赞  2016-5-31 10:09
引用: huaiqiao 发表于 2016-5-31 10:02
您说的我不是太懂。对了 wifi固件,您是直接使用的固件还是对SDK(应该是叫SDK)编程呢
ESP8266我看安可信 ...

是的,用的是乐鑫的芯片,至于你上面说的固件和SDK,很多时候都一个说法
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2016-5-31 11:10
引用: nmg 发表于 2016-5-31 09:54
@strong想起你要做的气象仪

不知此帖是有可供参考之处

这个完全没有问题的,气象仪再加个显示什么就可以了
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2016-5-31 11:12
引用: wajuka 发表于 2016-5-31 10:09
研究的好深入

不是干货,不分享,分享必须干货
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2016-5-31 11:12
引用: soso 发表于 2016-5-31 09:24
看起来很好玩

这个可以衍生出很多项目,比如气象仪,你可以用屏幕显示天气预报数据或者网页等
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2016-5-31 11:19
引用: wateras1 发表于 2016-5-31 11:12
不是干货,不分享,分享必须干货

点赞 点赞

然后就默默的想起我的F7板子了
点赞  2016-5-31 11:38
引用: nmg 发表于 2016-5-31 11:38
点赞 点赞

然后就默默的想起我的F7板子了

啊,你那个板子就送给我算了,到时在F7上面把网络协议都整一遍
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2016-5-31 13:02
引用: wateras1 发表于 2016-5-31 11:10
是的,用的是乐鑫的芯片,至于你上面说的固件和SDK,很多时候都一个说法

我说下我的理解哈,我的理解这个固件是hex或者bin文件。而SDK呢,我看好像是软件包,里面包含了头文件,库文件等等,可以进行二次开发的这种看起来。
点赞  2016-5-31 14:19
引用: wateras1 发表于 2016-5-31 13:02
啊,你那个板子就送给我算了,到时在F7上面把网络协议都整一遍

就现在啊?
看到好多网友弄到网络这块都卡住了
比如lidonglei1  ,都卡住100年了
https://bbs.eeworld.com.cn/thread-491359-1-1.html
点赞  2016-5-31 15:42
楼主,请教下,你用socket获取天气,那个获取天气的端口(port)怎么得到呢?我的协议上没有http,所以打算用socket发包获得?或者你告诉我端口号就好了,谢谢
点赞  2016-5-31 17:07
123下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复