微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > 用ESP8266做一个属于自己的小气象站

用ESP8266做一个属于自己的小气象站

时间:10-02 整理:3721RD 点击:
做小气象站的想法一直都有,只是一直没去尝试,一方面是没时间精力,另外一方面是很多技术知识需要去了解,总之,这件事一直一拖再拖,拖到最近,最终还是下决心干了,花了几个周末补充了下相关知识,终于搞定了,过程说一波三折一点不为过~~~~~~~~~~~~~~
在做这个气象站之前,我去国内的一些气象站网站试着获得数据,但是很多不让访问,还有一些要收费,没办法,最后找了个国外免费的网站,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面向的是低端用户,看在性价比的份上,我也就勉强接受了这个现实~~~~~~~~~~~~~知道了如何调用天气预报接口获取天气预报数据,后面想怎么处理那些数据都行了~~~~~~~~~~~~~~~

可以窃听端口了

可以使用服务器进行中转,esp8266请求自己搭建的服务器的接口,使用服务器抓取天气网的数据,然后把需要的数据返回给ESP8266,这样就减少了数据量。

这种方法可以窃取你的帐号和密码,所以不要连接免费的WIFI,免得钱丢了都不知道什么原因

看起来很好玩

wateras1哥,您是把ESP8266玩出了新高度啊。您用哪个封装啊。还是那种小黄板啊。

好好学习一下

其实用什么不要紧,只要能上网就OK了,其实我现在是按照wifi固件的设计思路来分享文章的,先从应用层把常用的协议应用通过简单的小应用分享,最后再到底层,最后可能的话,在任何射频芯片移植都行(硬件支持的话)

@strong想起你要做的气象仪

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

您说的我不是太懂。对了 wifi固件,您是直接使用的固件还是对SDK(应该是叫SDK)编程呢
ESP8266我看安可信的官网是说是基于乐鑫ESP8266的超低功耗的UART-WiFi模块的模组。
可以理解为这个ESP8266的模组用的是乐鑫的esp8266芯片么

研究的好深入

是的,用的是乐鑫的芯片,至于你上面说的固件和SDK,很多时候都一个说法

这个完全没有问题的,气象仪再加个显示什么就可以了

不是干货,不分享,分享必须干货

这个可以衍生出很多项目,比如气象仪,你可以用屏幕显示天气预报数据或者网页等

点赞 点赞

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

啊,你那个板子就送给我算了,到时在F7上面把网络协议都整一遍

我说下我的理解哈,我的理解这个固件是hex或者bin文件。而SDK呢,我看好像是软件包,里面包含了头文件,库文件等等,可以进行二次开发的这种看起来。

就现在啊?
看到好多网友弄到网络这块都卡住了
比如lidonglei1 ,都卡住100年了
http://bbs.eeworld.com.cn/thread-491359-1-1.html

楼主,请教下,你用socket获取天气,那个获取天气的端口(port)怎么得到呢?我的协议上没有http,所以打算用socket发包获得?或者你告诉我端口号就好了,谢谢

试出来了,端口是80
发送的数据格式为:
GET /data/2.5/weather?q=Guangzhou&APPID=dcb4158f8517885db3f3e8005546xxxx HTTP/1.1
Host:api.openweathermap.org
Accept: */*
Content-Length: 0
Connection: close

不错,一下就搞明白了。

一般都是拿SDK做二次开发,这个要看官方给你开放到什么程度了,其实这个也不影响你学习其他协议的。

哦哦,是的。你指的其他协议是?

楼主搞一个可以对接到论坛的?比如有回复,可以通过外部屏幕显示提示?
做一个桌面的小设备,联网实现一些贴心功能。
时钟+天气提醒+论坛专用提醒

这个功能你们可以在我的基础上面扩展,我接下来要把天气预报数据发到我邮箱去。

比如MQTT,COAP,HTTP,XML,JSON,SSL,SMTP,SNTP等一些应用协议

哦哦,知道了,谢谢啦。

我也是新手,用别的WIFI芯片测试的,8266还不懂怎么玩

感谢楼主的分享,好文章啊,要好好学习,这个芯片知道很久了,一直也没时间去玩,等空下来一定要玩玩看,到时候再跟楼主请教

其实都一样,方法都是通用的,不限于某一种WIFI,我手上正好有8266,所以拿来用了,其实也可以用f7整有线的也行的

我目前使用瑞昱的8711,有线的没有玩过,SOCKET都是一个标准的协议,所以哪个片子上运行都一样的

可以窃听端口了

是可以的,你用这种方法可以捕捉12306的交互,我同学通过这种方法做了个抢票软件

这个需要WIFI模块支持HTTP协议?

http仅仅是一个协议,以太网模块都支持,8266的http是我加上去的

串口的WIFI模块能实现这个功能吗,能的话我想试一下。

可以呀,透传就行,按照我这个帖子的方法实现get和post命令,如果能修改SDK的话,就直接实现http的代码

我的没有socket,端口号什么的怎么弄,能简单说下吗,我不太明白。

串口转以太网模块,就是配上网络,主动发送数据就行,不过你那个是AT模式的还是?

我是AT命令的,有命令模式和透传模式,具体发什么命令来获取数据,获取数据的格式什么什么样的呢?

我这个是AT指令的,改不了SDK,不知道具体的怎么弄。

发送AT命令一样可以实现类似功能,你把GET命令头和命令行什么的拼接成一个数据,调用AT+SEND命令发送就行,前提建立好TCP链接。

基于ESP8266获取网络天气预报的源码楼主可以共享吗?本人刚接触Arduino几个月,软件基础也薄弱,网上找了一些范例,编译总是通不过,希望能共享学习下。

能开放源码么??用的AT还是IOT功能呢??

arduino IDE 1.6.9+ESP8266,研究了好几天,终于GET到了Json格式的天气预报,现在不知道怎么解Json,没什么编程底子的人,搞起来真恼火。

今天把Json数据取出来了,下一步想办法挂一个12864的LCD,能挂SPI接口的LCD最好再吐槽一下,ESP8266拿来做主控的事情,资料少得可怜

ESP8266JSON解析用的是官方API接口解析的还是CJSON呢?

#include <ArduinoJson.h>用的这个,刚开始解析的YY天气,免费的信息太少了,后来干脆访问中国气象站的一个FLASH页面,直接取里面的关键字,用OLED显示出来。现在碰到新问题,PCF8563的软I2C驱动没找到,看来要自己写了,或是用其他软I2C库改。

挺好的,如果用官方的JSON接口解析就很麻烦了

stc单片机可否解析json 现在是得到了服务器返回的json 单片机怎么处理呢

移植一个cjson,不过不知道stc ram够吗?cjson很占ram的

我对ESP8266建立socket通信有一些疑问,在AT模式或者透传模式该怎么建立socket连接,可以请你指点一下吗,我的QQ 1402968150,谢谢

你直接去下载下官方的AT命令表看下就行,和GPRS命令差不多

我也试试。

“GET命令头和命令行”怎么得到。我网站注册都注册不了

你抓包

额。。抓到了3Q,前几次方法搞错了。。不过那个网站注册不了总是“reCAPTCHA verification failed, please try again”,很蛋疼。

挺好玩,下次参考着也做个

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top