BabyOS的HTTP接口获取天气

上一次提到BabyOS可以自动同步网络时间,基于此DIY一个电子时钟便是很方便。

如果增加更多的元素,例如获取天气信息,获取实时新闻等。这些数据在网上可以找到http请求的接口。

获取天气的接口

获取天气有很多免费的接口,只是对每日的请求次数有限制,但不影响DIY的使用。基于高德天气接口做实验。

GET请求接口:

http://restapi.amap.com/v3/weather/weatherInfo?city=110101&key=<用户key>

接口参数的介绍可以访问:https://lbs.amap.com/api/webservice/guide/api/weatherinfo

使用postman调用接口获取深圳的天气信息,返回的body数据如下,可以提取 天气、温度和湿度。

{
    "status": "1",
    "count": "1",
    "info": "OK",
    "infocode": "10000",
    "lives": [
        {
            "province": "广东",
            "city": "深圳市",
            "adcode": "440300",
            "weather": "阴",
            "temperature": "27",
            "winddirection": "西南",
            "windpower": "≤3",
            "humidity": "82",
            "reporttime": "2024-03-31 12:30:17",
            "temperature_float": "27.0",
            "humidity_float": "82.0"
        }
    ]
}

HTTP请求实现

HTTP是基于TCP的传输协议,目前的代码已实现TCP,基于此再实现HTTP接口。整个流程如下:

../_images/http_uml.jpg

接收的数据是否完整需要解析校验,那么引入了第三方代码 http-parser。将收到的数据喂给http-parser,可以知道响应数据是否接收完成。

获取天气实验

BabyOS的test目录内代码可以在Linux平台运行,请切换到dev分支,进入test/netif/目录。

基于原ntp例子进行修改,体验前需要将这里的用户key补齐:

void ntp_test()
{
    bUTC_DateTime_t tm;
    bUTC_t          now_utc = bUTC_GetTime();

    bUTC2Struct(&tm, now_utc, 8);
    b_log("%d-%02d-%02d %02d:%02d:%02d %02d\r\n", tm.year, tm.month, tm.day, tm.hour, tm.minute,
          tm.second, tm.week);
    b_log_w(":::::%d\r\n", bGetFreeSize());
    if (now_utc > 1711855508)
    {
        bHttpRequest(httpfd, B_HTTP_GET,
                     "http://restapi.amap.com/v3/weather/"
                     "weatherInfo?city=440300&key=XXXXXXXX",
                     NULL, NULL);
    }
}

执行指令:

make

生成可执行文件在build目录,接着执行:

./build/BabyOS

实验效果:

../_images/linux_http.png

硬件板子上实验

linux平台调试完成后,可以试试在硬件板子上运行。更新例程:

../_images/bear_http.png