数码小叶 发表于 2021-8-1 22:49

【ART-Pi测评】五:联网获取天气数据

本帖最后由 数码小叶 于 2021-8-1 22:48 编辑

<p><span style="font-size:20px;">在上一篇中,已经实现了art-pi的网络自动连接,并且可以获取网络时间,还差一个天气情况。 RT-Thread提供了丰富的组件,webclient 是 RT-Thread 上实现的一个 HTTP 客户端,用来提供高效且功能丰富的 HTTP 客户端编程工具包,利用这个工具可以完成与 HTTP 服务器的通信。</span></p>

<p></p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">打开webclient,并且使能开启 webclient 的 GET/POST 示例</span></p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">再打开包里http客户端示例</span></p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">打开的示例,中文显示是乱码,不方便理解,需要修改文档的编码格式,修改后就可以正常显示了</span></p>

<p></p>

<p>&nbsp;</p>

<p></p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">在http示例里,其获取天气的服务器是http://mobile.weather.com.cn/data/sk/%s.html,实际测试已经打不开</span>。</p>

<p></p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">后来在文档中看到了这个的说明&ldquo;</span><span style="font-size:16px;"><em>此程序仅为 http client 的示例程序,其中获取天气的 API 已经被弃用,实际使用时更换为其他的 API 才可获取最新的天气。</em></span><span style="font-size:20px;">&rdquo;因此,想要获取天气数据,只能更改API了,于是参考了 RT-thread入门课程中的心知天气获取,更改为心知的API。</span></p>

<p>&nbsp;</p>

<p></p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">虽然第一次使用,但是发现利用官网页面还是很容易上手的。心知天气按收费分为好几个版本,越贵的参数越多,不过,免费的感觉已经够用了。注册一个账户先。</span></p>

<p></p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">其接口API,有详细的说明,每个参数的函数,以及每个参数是否要给出都有介绍,使用起来很容易操作</span></p>

<p></p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">实际来获取指定城市,查询时的天气实况</span></p>

<p></p>

<pre>
<code>{
    "results":[
   {
      "location":
      {
            "id":"WTS4JZ3WMZMC",
            "name":"芜湖",
            "country":"CN",
            "path":"芜湖,芜湖,安徽,中国",
            "timezone":"Asia/Shanghai",
            "timezone_offset":"+08:00"
      },
      "now":
      {
            "text":"阴",
            "code":"9",
            "temperature":"25"
      },
      "last_update":"2021-07-28T21:43:20+08:00"
   }
    ]
}</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:20px;">再比如获取指定城市三天的天气情况</span></p>

<p></p>

<pre>
<code>{
    "results":[
   {
      "location":
      {
            "id":"WTS4JZ3WMZMC",
            "name":"芜湖",
            "country":"CN",
            "path":"芜湖,芜湖,安徽,中国",
            "timezone":"Asia/Shanghai",
            "timezone_offset":"+08:00"
      },
      "daily":[
         {
            "date":"2021-07-28",
            "text_day":"阴",
            "code_day":"9",
            "text_night":"阴",
            "code_night":"9",
            "high":"28",
            "low":"24",
            "rainfall":"5.67",
            "precip":"0.99",
            "wind_direction":"西南",
            "wind_direction_degree":"229",
            "wind_speed":"21.92",
            "wind_scale":"4",
            "humidity":"94"
         },
         {
             "date":"2021-07-29",
             "text_day":"阴",
             "code_day":"9",
             "text_night":"晴",
             "code_night":"1",
             "high":"30",
             "low":"22",
             "rainfall":"1.2",
             "precip":"0.43",
             "wind_direction":"西",
             "wind_direction_degree":"274",
             "wind_speed":"19.91",
             "wind_scale":"4",
             "humidity":"89"
         },
         {
            "date":"2021-07-30",
            "text_day":"晴",
            "code_day":"0",
            "text_night":"阴",
            "code_night":"9",
            "high":"32",
            "low":"25",
            "rainfall":"1.2",
            "precip":"0.41",
            "wind_direction":"西南",
            "wind_direction_degree":"237",
            "wind_speed":"6.59",
            "wind_scale":"2",
            "humidity":"81"
         }
         ],
         "last_update":"2021-07-28T20:00:00+08:00"
   }
    ]
}
</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:20px;">因为获取到的数据是json格式的,因此可以利用rt-thread的cJSON 软件包来解析天气</span></p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">保存配置后,打开cjson.c文件,可以看到很多解析接口,利用这些接口去解析刚才获取的天气数据</span></p>

<p></p>

<pre>
<code> if((subobject = cJSON_GetObjectItem(object,"location")) != NULL)
{
    if((item = cJSON_GetObjectItem(subobject,"id")) != NULL)
    if((item = cJSON_GetObjectItem(subobject,"name")) != NULL)
    if((item = cJSON_GetObjectItem(subobject,"country")) != NULL)
    if((item = cJSON_GetObjectItem(subobject,"path")) != NULL)
    if((item = cJSON_GetObjectItem(subobject,"timezone")) != NULL)
    if((item = cJSON_GetObjectItem(subobject,"timezone_offset")) != NULL)                  
}</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:20px;">解析完成后打印输出</span></p>

<p></p>

<p></p>

<p><span style="font-size:20px;">中文和英文实际差距很小,一个是&amp;language=en,一个是&amp;language=zh-Hans,或者直接不带这个参数。也可以自己直接在printf里修改,在心知的API里,提供了详细的天气现象代码说明</span></p>

<p></p>

<p><span style="font-size:20px;">根据代码对照表就很容易修改printf里的字符串了</span></p>

<p></p>

<p>&nbsp;</p>

Jacktang 发表于 2021-8-2 07:24

<p>楼主这个RT-Thread联网获取天气数据整的很好,收藏</p>

freebsder 发表于 2021-8-2 16:41

<p>组件多了确实方便。</p>
页: [1]
查看完整版本: 【ART-Pi测评】五:联网获取天气数据