esp8266_RTOS_SDK http获取天气信息问题记录

记录一下关于使用esp8266通过http获取天气信息的问题,先搁置一段时间再学。
先说进度。使用的是esp8266_rtos_sdk中的http_requests例程。首先填写wifi名和密码。
esp8266_RTOS_SDK http获取天气信息问题记录
可以在代码里修改,也可以在终端输入(我是用的编辑器是vscode)make menuconfig命令在菜单中的Example Configuration下输入wifi名和密码,不过如果wifi名是中文在菜单中输入不进去。

然后修改WEB_SEVER和WEB_URL。这里改为你要获得天气信息所需访问的API。我用的是知心天气,可以免费使用,注册一个账号再看下他的API文档就知道了。
esp8266_RTOS_SDK http获取天气信息问题记录
首先使用Postman 输入下API看下结果,也可以直接在浏览器中输入这个API(原为https,我使用了http,因为使用httpsCA验证失败)也可以获得天气信息。
浏览器:esp8266_RTOS_SDK http获取天气信息问题记录
hostman:
使用get请求,复制粘贴您的API然后点击send.
esp8266_RTOS_SDK http获取天气信息问题记录
得到:esp8266_RTOS_SDK http获取天气信息问题记录这样看起来就舒服多了,而且在后面解析json字符串的时候更加方便,不过也有可以把浏览器中的字符转化化为json格式的网页,百度应该就能找到。
只用修改上面这两个就可以将天气信息打印出来了。使用make flash monitor命令烧录并接收串口信息。
像这样:
esp8266_RTOS_SDK http获取天气信息问题记录
白字部分就是服务器返回的http响应信息,去掉头部就是我们需要的天气信息了。服务器返回的信息通过这里打印出来:
esp8266_RTOS_SDK http获取天气信息问题记录 图一

注释部分是我添加的(使用中不能把这里注释,这里为了使我修改的内容更清晰我才注释的)。作用就是去除http响应的头部信息。通过检测到第一个 ‘ { ’ 字符然后将这个字符及之后的字符放进一个新的字符数组中,方法粗糙(日常写垃圾代码)应该有别的好方法可以提高效率。这里涉及到的变量和数组在这里定义:
esp8266_RTOS_SDK http获取天气信息问题记录
这两个计数变量就直接在刚才的代码上面定义了。
esp8266_RTOS_SDK http获取天气信息问题记录
另一个数组是在函数开始地方定义,数组大小512,设置过小会导致不能接收到完整的http响应信息(不过我记得没修改过的源码里给的也不大,不知道为啥没事,也可能是我精神恍惚了)。

既然我们已经得到了天气的json数据(recv_buf_json数组中)。那接下来就可以解析它了(使用cJSON,SDK里面带了)。

首先我们需要include一下cJSON.h。如图:esp8266_RTOS_SDK http获取天气信息问题记录
为啥我要用这么长的路径而不在c_cpp_properties.json文件中添加下前面的路径呢,其实我试了,就像 #include cJSON/cJSON.h 这样并且都能转跳进去看了,但是编译的时候就是报错找不到文件路径,好吧,想必你也看出来了,我就是个小白希望知道的大佬可以教教我,万分感谢(好像还是个戏精)。不管了,就先这样凑合用吧。
然后再在图一的代码下面添加:
esp8266_RTOS_SDK http获取天气信息问题记录
哦,图一不是第一个图,而是标了图一的图,也就是在获得了json格式的字符数组后。图中注释部分是检验recv_buf_json数组中信息是否正确完整。后面的就是调用cJSON库了,为啥这么写点击这里
输出结果:
esp8266_RTOS_SDK http获取天气信息问题记录
如果你想提取更多信息可以在cJSON那里自己添加。为啥温度没有" °C "符号呢,当然是我不会输出啦。完成部分就先到这里。

问题:为啥用http不用https,在https中填写了WiFi命和密码以及WEB_SEVER和WEB_URL信息后输出是这样的:
esp8266_RTOS_SDK http获取天气信息问题记录
我就顺着代码一层一层往下找,问题出现在这里:
esp8266_RTOS_SDK http获取天气信息问题记录
咋也不懂为啥,找了大半天也不知道怎么修正,有个博客写的解决方法。但是我看了还是不会。先放一放,等搞完别的事再回头学习。