查看: 590|回复: 0

[原创] 【RT1060EVK】基于RTThread网络获取天气

[复制链接]
  • TA的每日心情
    奋斗
    昨天 13:46
  • 签到天数: 850 天

    [LV.10]以坛为家III

    5

    主题

    5741

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    7000
    最后登录
    2024-5-7
    发表于 2023-7-5 11:20:12 | 显示全部楼层 |阅读模式
    看到RT1060evk板子有网络接口,本次就试试网络功能。搞一个获取天气信息例子试试效果。
    插上网线

    2.jpg


    打开menuconfig配置。找到板上外设,打开网络和SDRAM。
    3.jpg
    4.jpg

    然后选择WebClient软件包,这个是用于获取天气的IOT软件包。使用的是心知天气的API,通过HTTP协议或取返回数据,返回数据是Json结构.
    5.jpg
    再就是CJson软件包。
    6.jpg

    更新mdk工程。
    7.jpg

    对keil工程设置一下。
    8.jpg
    9.jpg

    获取天气代码。
    1. #include <rtthread.h>
    2. #include <rtdevice.h>
    3. #include <board.h>

    4. #include <webclient.h>  /* 使用 HTTP 协议与服务器通信需要包含此头文�?? */
    5. #include <sys/socket.h> /* 使用BSD socket,需要包含socket.h头文�?? */
    6. #include <netdb.h>
    7. #include <cJSON.h>
    8. #include <finsh.h>



    9. #if     1

    10. #define GET_HEADER_BUFSZ        1024        //头部大小
    11. #define GET_RESP_BUFSZ          512        //响应缓冲区大
    12. #define GET_URL_LEN_MAX         256         //网址最大长
    13. #define GET_URI                 "http://api.seniverse.com/v3/weather/now.json?key=%s&location=%s&language=zh-CN&unit=c" //心知天气 API
    14. #define AREA_NAME               "guangzhou" //广州 ID
    15. #define XINZHI_API_KEY          "********"     //心知天气认证 pravite key,注册心知天气账号获取

    16. /* 天气数据解析 */
    17. void net_weather_data_parse(rt_uint8_t *data)
    18. {
    19.     cJSON *root = RT_NULL, *object = RT_NULL, *item = RT_NULL;
    20.     cJSON *arrayItem = RT_NULL,*subobject = RT_NULL;
    21.    
    22.     root = cJSON_Parse((const char *)data);
    23.     if (!root)
    24.     {
    25.         rt_kprintf("\nNo memory for cJSON root!\n");
    26.         return;
    27.     }
    28.     if((arrayItem =  cJSON_GetObjectItem(root, "results")) != RT_NULL)
    29.     {
    30.         //int size = cJSON_GetArraySize(arrayItem);     //获取数组中对象个 3
    31.         if((object = cJSON_GetArrayItem(arrayItem,0)) != RT_NULL)//获取父对象内
    32.         {
    33.             /* 匹配子对1 */
    34.             if((subobject = cJSON_GetObjectItem(object,"location")) != RT_NULL)
    35.             {
    36.                 item = cJSON_GetObjectItem(subobject, "name");
    37.                 rt_kprintf("\nCityName:%s \n", item->valuestring);
    38.                 item = cJSON_GetObjectItem(subobject, "path");
    39.                 rt_kprintf("CityPath:%s \n", item->valuestring);
    40.             }
    41.             /* 匹配子对2 */
    42.             if((subobject = cJSON_GetObjectItem(object,"now")) != RT_NULL)
    43.             {
    44.                 item = cJSON_GetObjectItem(subobject, "text");
    45.                 rt_kprintf("weather:%s \n", item->valuestring);
    46.                 item = cJSON_GetObjectItem(subobject, "code");
    47.                 rt_kprintf("code:%s \n", item->valuestring);
    48.                 item = cJSON_GetObjectItem(subobject, "temperature");
    49.                 rt_kprintf("temperature:%s \n", item->valuestring);
    50.             }
    51.             /* 匹配子对3 */
    52.             if((subobject = cJSON_GetObjectItem(object,"last_update")) != RT_NULL)
    53.             {
    54.                 rt_kprintf("UpdateTime:%s \n", subobject->valuestring);
    55.             }
    56.         }
    57.     }

    58.     if (root != RT_NULL)   cJSON_Delete(root);
    59. }

    60. void netweather(int argc, char **argv)
    61. {
    62.     rt_uint8_t *buffer = RT_NULL;
    63.     int resp_status;
    64.     struct webclient_session *session = RT_NULL;
    65.     char *weather_url = RT_NULL;
    66.     int content_length = -1, bytes_read = 0;
    67.     int content_pos = 0;

    68.     /*  weather_url 分配空间 */
    69.     weather_url = rt_calloc(1, GET_URL_LEN_MAX);
    70.     if (weather_url == RT_NULL)
    71.     {
    72.         rt_kprintf("No memory for weather_url!\n");
    73.         goto __exit;
    74.     }

    75.     /* 拼接 GET 网址 */
    76.     if(argc > 1)
    77.     {
    78.         rt_snprintf(weather_url, GET_URL_LEN_MAX, GET_URI,XINZHI_API_KEY, argv[1]);
    79.     }else
    80.     {
    81.         rt_snprintf(weather_url, GET_URL_LEN_MAX, GET_URI,XINZHI_API_KEY, AREA_NAME);
    82.     }

    83.     /* 创建会话并且设置响应的大 */
    84.     session = webclient_session_create(GET_HEADER_BUFSZ);
    85.     if (session == RT_NULL)
    86.     {
    87.         rt_kprintf("No memory for get header!\n");
    88.         goto __exit;
    89.     }

    90.     /* �?? GET 请求使用默认的头 */
    91.     if ((resp_status = webclient_get(session, weather_url)) != 200)
    92.     {
    93.         rt_kprintf("webclient GET request failed, response(%d) error.\n", resp_status);
    94.         goto __exit;
    95.     }

    96.     /* 分配用于存放接收数据的缓 */
    97.     buffer = rt_calloc(1, GET_RESP_BUFSZ);
    98.     if (buffer == RT_NULL)
    99.     {
    100.         rt_kprintf("No memory for data receive buffer!\n");
    101.         goto __exit;
    102.     }
    103.     rt_memset(buffer,0,GET_RESP_BUFSZ);
    104.     content_length = webclient_content_length_get(session);
    105.     rt_kprintf("\r\ncontent_length = %d\r\n",content_length);
    106.     if (content_length)
    107.     {
    108.         /* 返回的数据是分块传输. */
    109.         do
    110.         {
    111.             bytes_read = webclient_read(session, buffer + content_pos,
    112.                                         content_length - content_pos > GET_RESP_BUFSZ ?
    113.                                         GET_RESP_BUFSZ : content_length - content_pos);
    114.             rt_kprintf("bytes_read = %d\r\n",bytes_read);
    115.             if (bytes_read <= 0)
    116.             {
    117.                 break;
    118.             }
    119.             content_pos += bytes_read;
    120.         }while (content_pos < content_length);
    121.     }
    122.    
    123.     for(int i=0;i<content_length;i++)
    124.         rt_kprintf("%c",buffer[i]);
    125.     rt_kprintf("\r\n");
    126.    
    127.     /* 天气数据解析 */
    128.     net_weather_data_parse(buffer);
    129.    
    130. __exit:
    131.     /* 释放网址空间 */
    132.     if (weather_url != RT_NULL)
    133.         rt_free(weather_url);
    134.     /* 关闭会话 */
    135.     if (session != RT_NULL)
    136.         webclient_close(session);
    137.     /* 释放缓冲区空 */
    138.     if (buffer != RT_NULL)
    139.         rt_free(buffer);
    140. }

    141. MSH_CMD_EXPORT(netweather, Get weather by webclient);

    142. #endif

    复制代码
    注意使用网络时不能操作led那个gpio。main中去掉点灯。
    10.jpg

    编译出现一个错误。找到对应头文件路径包含上。
    11.jpg

    加上头文件路径后编译成功
    12.jpg

    下载完成,复位,打开串口工具。可以看到输出信息了。
    13.jpg

    测试网络接口和SDRAM.
    14.jpg

    下面就是获取天气信息了。
    15.jpg

    可以看到获取的Json字符串了。Json解析有点问题。是SDRAM不稳定,分配堆内存在SDRAM中,出现错误了。






    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-8 05:21 , Processed in 0.105959 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表