Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Network
使用WebClient&tls获取实时天气
发布于 2018-08-27 10:44:48 浏览:4083
订阅该版
* 本帖最后由 slyant 于 2018-9-12 23:08 编辑 * 修改自组件自带的webclient_get_sample.c例子如果运行失败,注意修改lwip\opt.h文件的MEMP_NUM_NETDB宏定义值为>1的值,否则https的URL的解析会失败,MEMP_NUM_NETDB的大概意思是lwip_addrinfo()占用的内存释放前能够被并发调用的数量。 app_httpclient.c [hide] ```#include
#include
#include
#include
#include "cJSON_util.h" #define GET_HEADER_BUFSZ 1024 #define GET_RESP_BUFSZ 1024 #define GET_RESP_CONTENTSZ 4096 #define URL_LEN_MAX 1024 #define GET_LOCAL_URI "https://www.apiopen.top/weatherApi?city=%s" #define LOCAL_CITY "%E6%AD%A6%E6%B1%89" //urlencode("武汉") static void weather_data_parse(char* data) { cJSON *root = RT_NULL, *object = RT_NULL, *list = RT_NULL, *item = RT_NULL, *weatheritem = RT_NULL; int index, list_size = 0; root = cJSON_Parse((const char *)data); if (!root) { rt_kprintf("No memory for cJSON root!
"); return; } item = cJSON_GetObjectItem(root, "code"); if(item->valueint != 200) { item = cJSON_GetObjectItem(root, "msg"); rt_kprintf("
%s", item->valuestring); goto __EXIT; } object = cJSON_GetObjectItem(root, "data"); item = cJSON_GetObjectItem(object, "city"); rt_kprintf("
city:\t%s", item->valuestring); list = cJSON_GetObjectItem(object, "forecast"); list_size = cJSON_GetArraySize(list); for(index=0;index
Data:\t%s", cJSON_item_get_string(weatheritem, "date")); rt_kprintf("
type:\t%s", cJSON_item_get_string(weatheritem, "type")); rt_kprintf("
wendu:\t%s-%s", cJSON_item_get_string(weatheritem, "low"), cJSON_item_get_string(weatheritem, "high")); rt_kprintf("
fengxiang:%s %s", cJSON_item_get_string(weatheritem, "fengxiang"), cJSON_item_get_string(weatheritem, "fengli")); rt_kprintf("
"); } rt_kprintf("
"); __EXIT: if (root != RT_NULL) cJSON_Delete(root); } int get_weather(int argc, char **argv) { struct webclient_session* session = RT_NULL; unsigned char *buffer = RT_NULL; char *URI = RT_NULL; int index, ret = 0; int bytes_read, resp_status; int content_length = -1; char *city_name = rt_calloc(1,255); if(argc == 1) { strcpy(city_name, LOCAL_CITY); } else if (argc == 2) { strcpy(city_name, argv[1]); urlencode(city_name);//对中文编码 } else if(argc > 2) { rt_kprintf("wt [CityName] - webclient GET request test.
"); return -1; } URI = rt_calloc(1, URL_LEN_MAX); rt_snprintf(URI, URL_LEN_MAX, GET_LOCAL_URI, city_name); buffer = (unsigned char *) web_malloc(GET_RESP_CONTENTSZ); if (buffer == RT_NULL) { rt_kprintf("no memory for receive buffer.
"); ret = -RT_ENOMEM; goto __exit; } /* create webclient session and set header response size */ session = webclient_session_create(GET_HEADER_BUFSZ); if (session == RT_NULL) { ret = -RT_ENOMEM; goto __exit; } /* send GET request by default header */ rt_kprintf("send GET request to %s
", URI); if ((resp_status = webclient_get(session, URI)) != 200) { rt_kprintf("webclient GET request failed, response(%d) error.
", resp_status); ret = -RT_ERROR; goto __exit; } content_length = webclient_content_length_get(session); if (content_length < 0) { rt_kprintf("webclient GET request type is chunked.
"); do { bytes_read = webclient_read(session, buffer, GET_RESP_BUFSZ); if (bytes_read <= 0) { break; } for (index = 0; index < bytes_read; index++) { rt_kprintf("%c", buffer[index]); } } while (1); rt_kprintf("
"); } else { int content_pos = 0; do { bytes_read = webclient_read(session, buffer+content_pos, GET_RESP_BUFSZ); if (bytes_read <= 0) { break; } content_pos += bytes_read; } while (content_pos < content_length); weather_data_parse((char*)buffer); } __exit: if (session) { webclient_close(session); } if (buffer) { web_free(buffer); } if (URI) { web_free(URI); } return ret; } #ifdef FINSH_USING_MSH #include
MSH_CMD_EXPORT_ALIAS(get_weather, wt, wt [CityName] webclient GET request test); #endif /* FINSH_USING_MSH */ ``` [/hide] 因中文地名需要URL转码,涉及文件url_code.c,url_code.h [hide] ```#ifndef __URL_CODE_H__ #define __URL_CODE_H__ void urlencode(char *url); void urldecode(char *url); #endif``````#include
//#include
#include
#include
#define BURSIZE 1024 static int hex2dec(char c) { if ('0' <= c && c <= '9') { return c - '0'; } else if ('a' <= c && c <= 'f') { return c - 'a' + 10; } else if ('A' <= c && c <= 'F') { return c - 'A' + 10; } else { return -1; } } static char dec2hex(short int c) { if (0 <= c && c <= 9) { return c + '0'; } else if (10 <= c && c <= 15) { return c + 'A' - 10; } else { return (char)-1; } } /* * 编码一个url */ void urlencode(char *url) { int i = 0; int len = strlen(url); int res_len = 0; char *res = rt_calloc(1, BURSIZE); for (i = 0; i < len; ++i) { char c = url*; if (('0' <= c && c <= '9') || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '/' || c == '.') { res[res_len++] = c; } else { int j = (short int)c; if (j < 0) j += 256; int i1, i0; i1 = j / 16; i0 = j - i1 * 16; res[res_len++] = '%'; res[res_len++] = dec2hex(i1); res[res_len++] = dec2hex(i0); } } res[res_len] = '\0'; strcpy(url, res); rt_free(res); } /* * 解码url */ void urldecode(char *url) { int i = 0; int len = strlen(url); int res_len = 0; char *res = rt_calloc(1, BURSIZE); for (i = 0; i < len; ++i) { char c = url*; if (c != '%') { res[res_len++] = c; } else { char c1 = url[++i]; char c0 = url[++i]; int num = 0; num = hex2dec(c1) * 16 + hex2dec(c0); res[res_len++] = num; } } res[res_len] = '\0'; strcpy(url, res); rt_free(res); } ``` [/hide] 运行结果: ![wt.png](/uploads/201808/27/105226xkkq3gqg6xgea84s.png)
查看更多
48
个回答
默认排序
按发布时间排序
aozima
2018-08-27
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
666 前排围观
Cheney_Chen
2018-08-27
这家伙很懒,什么也没写!
顶一下,最新版本 webclient 试用:lol
ljt8015
2018-08-29
这家伙很懒,什么也没写!
mark
XQQ
2018-08-29
这家伙很懒,什么也没写!
mark
wangbo
2018-09-03
这家伙很懒,什么也没写!
123
wangbo
2018-09-03
这家伙很懒,什么也没写!
[i=s] 本帖最后由 wangbo 于 2018-9-4 14:06 编辑 [/i] 456
haveDream
2018-09-07
这家伙很懒,什么也没写!
这个必须顶
明月夜
2018-09-07
这家伙很懒,什么也没写!
学习一下
yangjie
认证专家
2018-09-07
hello
123
haveDream
2018-09-07
这家伙很懒,什么也没写!
[i=s] 本帖最后由 haveDream 于 2018-9-7 19:13 编辑 [/i] webclient_get_sample.c 这个文件git上没有?楼中从哪里下的代码,找到了,版本最新才能找到
撰写答案
登录
注册新账号
关注者
0
被浏览
4.1k
关于作者
slyant
这家伙很懒,什么也没写!
提问
10
回答
28
被采纳
0
关注TA
发私信
相关问题
1
lwip1.4.1连接经常会断开无法连接上,可以ping通
2
LPC1768:RTT+LWIP+webserver用IE刷网页出现硬件中断错误(已经解决)
3
求一些LWIP开发的经验,目前ping一直不稳定。
4
stm32f207+dp83848无法ping通
5
RTT下的LWIP传递机制
6
rtt内lwip的socket是否是线程安全?
7
Lwip+enc28j60无法ping通
8
坑爹的rtconfig.h lwip关掉了checksum
9
花了一个晚上,把RT2.0的LWIP、网卡驱动、文件系统整合起来了,发现一点小问题
10
lwip例程中udp发送时如何指定源端口发送到指定目的地端口
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
在用clangd开发RTT吗,快来试试如何简单获得清晰干净的工作区
2
GD32F450 片内 flash驱动适配
3
STM32H7R7运行CherryUSB
4
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
5
使用RC522软件包驱动FM1722
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部