[BSP][nxp]增加wifi_weather_sample.c (#9118)
* [BSP][nxp]增加wifi_weather_sample.c * [BSP][nsp]增加wifi_weather_sample.c
This commit is contained in:
parent
90917cc75a
commit
099e24951c
|
@ -18,6 +18,9 @@ if GetDepend(['BSP_USING_RW007']):
|
|||
if GetDepend(['RT_USING_SFUD']):
|
||||
src += Glob('ports/drv_filesystem_spi_flash.c')
|
||||
|
||||
if GetDepend(['PKG_USING_CJSON']) and GetDepend(['PKG_USING_WEBCLIENT']):
|
||||
src += Glob('ports/wifi_weather_sample.c')
|
||||
|
||||
|
||||
CPPPATH = [cwd, cwd + '/MCUX_Config/board']
|
||||
CPPDEFINES = ['DEBUG', 'CPU_MCXN947VDF_cm33_core0']
|
||||
|
|
|
@ -0,0 +1,199 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-06-27 Zhang the first version
|
||||
*/
|
||||
|
||||
#include <rtdevice.h>
|
||||
#include <rtthread.h>
|
||||
#include "spi_wifi_rw007.h"
|
||||
#include "webclient.h"
|
||||
#include "cJSON.h"
|
||||
#include "stdio.h"
|
||||
|
||||
#ifdef PKG_USING_CJSON
|
||||
#ifdef PKG_USING_WEBCLIENT
|
||||
|
||||
#define city_id 54523
|
||||
#define MAX_RESPONSE_SIZE 1024
|
||||
#define INITIAL_RESPONSE_SIZE 128
|
||||
|
||||
static void parse_weather_data(const char *buf);
|
||||
static void get_weather_forecast(void);
|
||||
|
||||
static void parse_weather_data(const char *buf)
|
||||
{
|
||||
|
||||
cJSON *root = cJSON_Parse(buf);
|
||||
if (root == NULL) {
|
||||
rt_kprintf("Error parsing JSON data\n");
|
||||
return;
|
||||
}
|
||||
|
||||
cJSON *msg = cJSON_GetObjectItem(root, "msg");
|
||||
if (msg == NULL) {
|
||||
rt_kprintf("Error getting msg object\n");
|
||||
cJSON_Delete(root);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
rt_kprintf("msg: %s\n", msg->valuestring);
|
||||
}
|
||||
|
||||
cJSON *code = cJSON_GetObjectItem(root, "code");
|
||||
if (code == NULL) {
|
||||
rt_kprintf("Error getting code object\n");
|
||||
cJSON_Delete(root);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
rt_kprintf("code: %d\n", code->valueint);
|
||||
}
|
||||
|
||||
cJSON *data = cJSON_GetObjectItem(root, "data");
|
||||
if (data == NULL) {
|
||||
rt_kprintf("Error getting data object\n");
|
||||
cJSON_Delete(root);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
rt_kprintf("data: \n");
|
||||
}
|
||||
|
||||
cJSON *location = cJSON_GetObjectItem(data, "location");
|
||||
if (location == NULL) {
|
||||
rt_kprintf("Error getting location object\n");
|
||||
cJSON_Delete(root);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
rt_kprintf(" location: \n");
|
||||
}
|
||||
|
||||
cJSON *id = cJSON_GetObjectItem(location, "id");
|
||||
cJSON *name = cJSON_GetObjectItem(location, "name");
|
||||
cJSON *path = cJSON_GetObjectItem(location, "path");
|
||||
|
||||
if (id != NULL && name != NULL && path != NULL) {
|
||||
rt_kprintf(" id: %d\n", id->valueint);
|
||||
rt_kprintf(" name: %s\n", name->valuestring);
|
||||
rt_kprintf(" path: %s\n", path->valuestring);
|
||||
} else {
|
||||
rt_kprintf("Error getting fields\n");
|
||||
}
|
||||
|
||||
cJSON *now = cJSON_GetObjectItem(data, "now");
|
||||
if (now == NULL) {
|
||||
rt_kprintf("Error getting now object\n");
|
||||
cJSON_Delete(root);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
rt_kprintf(" now: \n");
|
||||
}
|
||||
|
||||
cJSON *precipitation = cJSON_GetObjectItem(now, "precipitation");
|
||||
cJSON *temperature = cJSON_GetObjectItem(now, "temperature");
|
||||
cJSON *pressure = cJSON_GetObjectItem(now, "pressure");
|
||||
cJSON *humidity = cJSON_GetObjectItem(now, "humidity");
|
||||
cJSON *windDirection = cJSON_GetObjectItem(now, "windDirection");
|
||||
cJSON *windDirectionDegree = cJSON_GetObjectItem(now, "windDirectionDegree");
|
||||
cJSON *windSpeed = cJSON_GetObjectItem(now, "windSpeed");
|
||||
cJSON *windScale = cJSON_GetObjectItem(now, "windScale");
|
||||
|
||||
if (precipitation != NULL && temperature != NULL && pressure != NULL && humidity != NULL &&
|
||||
windDirection != NULL && windDirectionDegree != NULL && windSpeed != NULL && windScale != NULL) {
|
||||
rt_kprintf(" precipitation: %d\n", precipitation->valueint);
|
||||
rt_kprintf(" temperature: %.1f\n", temperature->valuedouble);
|
||||
rt_kprintf(" pressure: %d\n", pressure->valueint);
|
||||
rt_kprintf(" humidity: %d\n", humidity->valueint);
|
||||
rt_kprintf(" windDirection: %s\n", windDirection->valuestring);
|
||||
rt_kprintf(" windDirectionDegree: %d\n", windDirectionDegree->valueint);
|
||||
rt_kprintf(" windSpeed: %.1f\n", windSpeed->valuedouble);
|
||||
rt_kprintf(" windScale: %s\n", windScale->valuestring);
|
||||
} else {
|
||||
rt_kprintf("Error getting fields\n");
|
||||
}
|
||||
|
||||
cJSON *alarm = cJSON_GetObjectItem(data, "alarm");
|
||||
if (alarm == NULL) {
|
||||
rt_kprintf("Error getting alarm object\n");
|
||||
cJSON_Delete(root);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
rt_kprintf(" alarm: %s\n", cJSON_Print(alarm));
|
||||
}
|
||||
|
||||
cJSON *lastUpdate = cJSON_GetObjectItem(data, "lastUpdate");
|
||||
if (lastUpdate == NULL) {
|
||||
rt_kprintf("Error getting lastUpdate object\n");
|
||||
cJSON_Delete(root);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
rt_kprintf(" lastUpdate: %s\n", cJSON_Print(lastUpdate));
|
||||
}
|
||||
|
||||
cJSON_Delete(root);
|
||||
}
|
||||
|
||||
static void get_weather_forecast(void)
|
||||
{
|
||||
char url[256];
|
||||
snprintf(url, sizeof(url), "http://weather.cma.cn/api/now/%d", city_id);
|
||||
|
||||
struct webclient_session* session = webclient_session_create(1024);
|
||||
if(session == NULL) return;
|
||||
|
||||
int rc = webclient_get(session, url);
|
||||
if(rc != 200) goto free_session_exit;
|
||||
|
||||
char *response = rt_malloc(INITIAL_RESPONSE_SIZE);
|
||||
if(response == NULL) goto free_session_exit;
|
||||
|
||||
int data_ptr = 0;
|
||||
int buf_size = INITIAL_RESPONSE_SIZE;
|
||||
do {
|
||||
int bytes_read = webclient_read(session, &response[data_ptr], INITIAL_RESPONSE_SIZE);
|
||||
if(bytes_read <= 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
data_ptr += bytes_read;
|
||||
if(data_ptr > MAX_RESPONSE_SIZE) {
|
||||
break;
|
||||
}
|
||||
|
||||
if((data_ptr + INITIAL_RESPONSE_SIZE) > buf_size) {
|
||||
response = rt_realloc(response, data_ptr + INITIAL_RESPONSE_SIZE);
|
||||
buf_size += INITIAL_RESPONSE_SIZE;
|
||||
}
|
||||
} while(1);
|
||||
|
||||
/* response is alive */
|
||||
parse_weather_data(response);
|
||||
|
||||
rt_free(response);
|
||||
|
||||
free_session_exit:
|
||||
webclient_close(session);
|
||||
}
|
||||
|
||||
static void wifi_weather_sample(void)
|
||||
{
|
||||
/* wifi join */;
|
||||
get_weather_forecast();
|
||||
rt_kprintf("\r\n");
|
||||
rt_kprintf("wifi_weather_sample complete\r\n");
|
||||
}
|
||||
|
||||
MSH_CMD_EXPORT(wifi_weather_sample, wifi weather sample);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue