ESP8266获取天气和万年历(Arduino)

过完年一直没更新博客,主要还是在继续研究ESP8266这块板子的功能。上篇主要是在同一网络下,使用iOS的Siri调用捷径控制,其主要原理是用ESP8266做Server端,接收来自iOS的Get HTTP访问。若是在同一网内,这样的配置还是挺方便的,但是要在外网进行控制,就必须使用一个内网穿透的软件,并且该软件还要运行在同一个网内的设备上,类似有花生壳、网络通等,对比下来,网络通给的带宽大一点,响应比花生壳快,客户端也更简洁,不容易掉线。当做测试都可以的。

下面我们主要讲一下ESP8266如何做为客户端,获取网络天气等信息。其实就是将上面讲的反过来用,使ESP8266成为一个Client,访问一些特定的url,基本上都是使用GET和POST方式,刚开始接触可能有点难,但是弄清原理和结构之后,就简单了。简单来说,就是连上网的ESP8266,建立client端,然后client发送GET HTTP的访问信息,client获取到的就是反馈的结果。当然,大多数时候Arduino会采用Jason的库来帮助完成这项工作,因为更加便捷,而且一般API反馈的数据结构也都是Jason的,毕竟和html很像,使用和提取都方便。

天气api用的心知,万年历用的(https://www.timelessq.com/blog/47-cn.html),使用说明也很详细,文中的第一个api链接点进入好像有点问题,用这个https://cos.timelessq.com/api/time/index.php,非常感谢这两个免费的api接口提供者,以及参考的代码原作者(https://www.arduino.cn/thread-49411-1-1.html)。

这里说明一下,weather的程序是几乎用的参考,time的是自己改的。提两个过程中研究得头疼的问题,最开始用网络提供的(https://www.sojson.com/open/api/lunar/json.shtml)api,浏览器和网页get测试都挺好,可client客户端“死活”不通,一直报301错误,其实就是他们改为了https的访问,一直也没解决,后来放弃,使用了现在这个。若有同学做通了,还请留言告知,我学习一下呢!后来改成现在这个后,会遇到反馈数据过长,因此weather中用的char就读不完整,所以改为了readString,后来又因为readString有1s的响应时间,太慢,改为了read。哈哈哈!因为要套用Json的解析,所以对读取的数据又复制到char* content中,保证传递到root的是正确地Jason格式。要保证{}的完整性,不能有多于字符,所以在复制字符过程中,去掉了尾端的空字符,前端补上了‘{’(因为为了截取内容,用到了{,导致line中会没有,因此在content中补上)。

别的也没什么了,具体看代码。下图是展示,源码已经传到我的Github,需要的留言我私信地址。

posted @ 2019-05-12 19:20  西葫芦的小孩  阅读(3682)  评论(0编辑  收藏  举报