8266 WiFi模块通过网络获取时间及天气信息

目前市面上的智能时钟智能摆件设备都需要获取时间及天气信息的功能,之前也有很多客户和朋友询问这方面的问题,所以就写了这篇文章介绍获取时间及天气的方法,希望对大家能有些帮助。

 

获取时间


计算机获取网络时间使用的是ntp协议,ntp协议是一种基于UDP的网络授时协议。其原理是客户机向ntp服务器发起请求,服务器再向客户机返回请求,客户机根据发送请求及返回请求的时间点,来计算自身时间与服务器时间之间的差值,然后根据此差值将自身时间与服务器时间调整一致。

假设当前客户机的时间可能不准确,服务器的时间是准确的,客户机通过ntp协议校准时间的过程如下:

8266 WiFi模块通过网络获取时间及天气信息_第1张图片

 

  • T1时刻,客户机发起请求,数据包的内容为客户机的当前时间T1

  • T2时刻,服务器收到请求,在数据包中加入服务器的当前时间T2

  • T3时刻,服务器回复请求,在数据包中加入服务器的当前时间T3

  • T4时刻,客户机收到回复,在数据包中加入客户机的当前时间T4

 

T4时刻,客户机已经拥有足够信息来计算自身时间与服务器时间的差值:

客户机与服务器之间的平均网络时延为:

Delay=((T4-T1)-(T3-T2)) / 2


客户机相对于服务器的时间差为:

Offset =(((T2 -Delay)-T1)+((T3+Delay)- T4)) / 2

整理后可得:

Offset =((T2 - T1)+(T3 - T4)) / 2

以上计算基于的假设是客户机发送请求的网络延时与服务器回复数据的网络延时相等,实际应用中这两个延时时间不一定相等,所以这就是NTP校时不准确的原因。

以上协议和计算稍显复杂,实现起来计较困难,好在ESP_IDF中已将实现了ntp协议栈,我们在使用时只要设置ntp服务器即可,国内常用的ntp服务器如下:

cn.ntp.org.cnedu.ntp.org.cnus.ntp.org.cntime.buptnet.edu.cn  //北京邮电大学s1b.time.edu.cn      //清华大学s1c.time.edu.cn      //北京大学s1d.time.edu.cn      //东南大学

由上文的ntp原理分析可知,校时的准确性取决于网络延迟的稳定性,所以为了获得更精确的时间,应就近选择ntp服务器,减少网络延迟干扰。

 

获取天气信息


百度搜索 “天气api”,能够找到很多天气服务提供商,大部分是收费的,找到了几个免费的分享给大家:

https://www.heweather.net  //部分免费https://www.tianqiapi.comhttp://www.weather.com.cn/data/cityinfo/101010100.htmlhttp://wthrcdn.etouch.cn/WeatherApi?city=北京

前两个需要采用https获取天气数据,并且需要注册才能使用,可用过当前网络的IP获取当前城市的天气信息,有访问次数限制。后面两个通过http访问,访问次数无限制,需指定城市名称或城市编号方可获得相关城市天气信息。

下文以和风天气为例,给大家介绍下如何获取天气信息:

通过浏览器访问和风天气API接口:

https://free-api.heweather.net/s6/weather/now?location=auto_ip&key=f9e338e363254fb4b7ee272e62200cae

将返回的数据格式如下:

{  "HeWeather6": [{    "basic": {      "cid": "CN101280601",      "location": "深圳",      "parent_city": "深圳",      "admin_area": "广东",      "cnty": "中国",      "lat": "22.54700089",      "lon": "114.08594513",      "tz": "+8.00"    },    "update": {      "loc": "2019-10-19 14:56",      "utc": "2019-10-19 06:56"    },    "status": "ok",    "now": {      "cloud": "91",      "cond_code": "101",      "cond_txt": "多云",      "fl": "30",      "hum": "43",      "pcpn": "0.0",      "pres": "1011",      "tmp": "29",      "vis": "16",      "wind_deg": "82",      "wind_dir": "东风",      "wind_sc": "1",      "wind_spd": "5"    }  }]}

 

解析收到的数据便可获得天气信息。

Wifi设备模拟上述过程,首先与服务器建立加密TCP连接,然后发送http请求,等待服务器返回数据,然后通过cJSON解析数据即可。关于HTTP协议相关的知识,这里不再讲解,有兴趣可参考我的另一篇文章 :HTTP协议分析。

 

效果演示


通过ESP8266连接和风天气获取当前所在城市的天气信息,运行效果如下:

 

深圳  Mon Oct 21 11:31:57 2019晴  东风  2级温度:24 体感:25气压:1005 相对湿度:69

本示例的代码已上传至GitHub,https://github.com/ospanic/wifi_time_waether 点击即可查看代码,有问题可在GitHub上留言。

 

喜欢可扫码关注哦!

8266 WiFi模块通过网络获取时间及天气信息_第2张图片

            手把手教你物联网

你可能感兴趣的:(物联网技术分享)