# BabyOS的HTTP接口获取天气 上一次提到BabyOS可以自动同步网络时间,基于此DIY一个电子时钟便是很方便。 如果增加更多的元素,例如获取天气信息,获取实时新闻等。这些数据在网上可以找到http请求的接口。 ## 获取天气的接口 获取天气有很多免费的接口,只是对每日的请求次数有限制,但不影响DIY的使用。基于高德天气接口做实验。 GET请求接口: ```C http://restapi.amap.com/v3/weather/weatherInfo?city=110101&key=<用户key> ``` 接口参数的介绍可以访问:https://lbs.amap.com/api/webservice/guide/api/weatherinfo 使用postman调用接口获取深圳的天气信息,返回的body数据如下,可以提取 天气、温度和湿度。 ```C { "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接口。整个流程如下: ![](../_static/http_uml.jpg) 接收的数据是否完整需要解析校验,那么引入了第三方代码 http-parser。将收到的数据喂给http-parser,可以知道响应数据是否接收完成。 ## 获取天气实验 BabyOS的test目录内代码可以在Linux平台运行,请切换到dev分支,进入test/netif/目录。 基于原ntp例子进行修改,体验前需要将这里的用户key补齐: ```C 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 实验效果: ![](../_static/linux_http.png) ## 硬件板子上实验 linux平台调试完成后,可以试试在硬件板子上运行。更新例程: ![](../_static/bear_http.png)