Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
网络学习营
【7天入门RTOS网络编程】Nautilus day6-7 作业
发布于 2018-10-23 16:05:42 浏览:1622
订阅该版
* 本帖最后由 yukelab 于 2018-10-23 16:08 编辑 * **题目要求**运用所学的知识,获取实时的日期、时间、天气,并把获取的数据通过在 OneNet 云平台创建应用展示出来。**完成思路**[list=1] (*)按照题目要求,获取实时的日期,时间,天气,需要用到package中的webclient获取天气信息,通过cJSON解析天气信息中的数据;NTP获取实时的时间数据; (*)OneNet云平台当然要使用OneNet工具包和paho mqtt工具包(因为OneNET的设备接入方式是MQTT)。 (*)完成思路很简单 [/list]![day6_1.png](/uploads/201810/23/160822ybwb93f9z1h51wsj.png) 中间部分没有先后顺序。本来打算获取时间后,采用本地时间作为一个时间戳,与天气信息同时上传。可是,示例里的天气WebAPI已经弃用,获取到的天气信息是2013年左右的。于是,在网上找了好多API,大多收费,找到一个测试接口,勉强可以用,不过获取时间间隔和1h内获取的数目有限制,因此在实现的过程中将天气信息的上传改为单次。时间同步后,可以直接使用本地数据,因此,对时间的上传使用了连续上传,进行试验;**具体步骤**过程叙述较多,具体可见文档附件,这里只贴代码部分了 ```/* 获取天气信息相关头文件 */ #include
/* 使用 HTTP 协议与服务器通信需要包含此头文件 */ #include
/* 使用BSD socket,需要包含socket.h头文件 */ #include
#include
#define GET_HEADER_BUFSZ 1024 //头部大小 #define GET_RESP_BUFSZ 2048 //响应缓冲区大小 #define GET_URL_LEN_MAX 256 //网址最大长度 /* 实时天气信息,数据来自国家气象局天气网,每小时更新一次 */ #define GET_URI "http://api.k780.com:88/?app=weather.today&weaid=%s&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json" //获取天气的 API #define AREA_ID "101290101" //昆明地区 ID static void weather_hw(void); static int onenet_publish_string(int argc, char **argv); /* 与OneNET连接相关头文件 */ #include
#include
/* 与ntp获取相关头文件 */ #include
#include
#ifdef FINSH_USING_MSH #include
typedef struct __weather_msg { char cityNo[20]; char cityNm[20]; char wind[20]; int winp; int temperature; int humidity; char date[20]; } WEATHER_MSG; static WEATHER_MSG weather_msg; static void onenet_upload_weather(void) { weather_hw(); rt_kprintf("date: %s
", weather_msg.date); if (onenet_mqtt_upload_string("date", weather_msg.date) < 0) { log_e("upload string has an error!
"); } if (onenet_mqtt_upload_string("cityNm", weather_msg.cityNm) < 0) { log_e("upload has an error, stop uploading"); } if (onenet_mqtt_upload_string("wind", weather_msg.wind) < 0) { log_e("upload has an error, stop uploading"); } if (onenet_mqtt_upload_digit("temperature", weather_msg.temperature) < 0) { log_e("upload has an error, stop uploading"); } if (onenet_mqtt_upload_digit("winp", weather_msg.winp) < 0) { log_e("upload has an error, stop uploading"); } if (onenet_mqtt_upload_digit("humidity", weather_msg.humidity) < 0) { log_e("upload has an error, stop uploading"); } else { log_i("buffer : {\"humidity\":%d}", (int)weather_msg.humidity); } } MSH_CMD_EXPORT(onenet_upload_weather, send weather data to OneNET cloud cycle); /* upload random value to temperature*/ static void onenet_upload_ntp_entry(void *parameter) { char *host_name = NULL; /* 同步时间 */ time_t cur_time = ntp_sync_to_rtc(host_name); if (cur_time) { rt_kprintf("Get local time from NTP server: %s", ctime((const time_t*) &cur_time)); #ifdef RT_USING_RTC rt_kprintf("The system time is updated.
"); #else rt_kprintf("The system time update failed. Please enable RT_USING_RTC.
"); #endif /* RT_USING_RTC */ } while (1) { /* 获取本地时间并将其上传到OneNET云 */ cur_time = ntp_get_local_time(host_name); if (onenet_mqtt_upload_string("datetime", ctime((const time_t*) &cur_time)) < 0) { log_e("upload has an error, stop uploading"); break; } else { log_i("buffer : {\"Get local time\": %s}", ctime((const time_t*) &cur_time)); } rt_thread_delay(rt_tick_from_millisecond(5 * 1000)); } } static int onenet_upload_cycle_hw(void) { rt_thread_t tid; tid = rt_thread_create("onenet_upload", onenet_upload_ntp_entry, RT_NULL, 2 * 1024, RT_THREAD_PRIORITY_MAX / 3 - 1, 5); if (tid) { rt_thread_startup(tid); } return 0; } MSH_CMD_EXPORT(onenet_upload_cycle_hw, send data to OneNET cloud cycle); /* onenet mqtt command response callback function */ static void onenet_cmd_rsp_cb(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size) { char res_buf[] = { "cmd is received!
" }; log_d("recv data is %.*s
", recv_size, recv_data); /* user have to malloc memory for response data */ *resp_data = (uint8_t *) ONENET_MALLOC(strlen(res_buf)); strncpy(*resp_data, res_buf, strlen(res_buf)); *resp_size = strlen(res_buf); } /* set the onenet mqtt command response callback function */ static int onenet_set_cmd_rsp(int argc, char **argv) { onenet_set_cmd_rsp_cb(onenet_cmd_rsp_cb); } MSH_CMD_EXPORT(onenet_set_cmd_rsp, set cmd response function); #endif /* FINSH_USING_MSH */ static void weather_data_parse(rt_uint8_t *data, WEATHER_MSG *p_msg) { cJSON *root = RT_NULL, *object = RT_NULL, *item = RT_NULL; root = cJSON_Parse((const char *)data); if (!root) { /* rt_kprintf("%s", data); */ rt_kprintf("No memory for cJSON root!
"); return; } object = cJSON_GetObjectItem(root, "result"); item = cJSON_GetObjectItem(object, "cityno"); strncpy(p_msg->cityNo, item->valuestring, strlen(item->valuestring)); rt_kprintf("
cityNo:%s ", p_msg->cityNo); item = cJSON_GetObjectItem(object, "citynm"); strncpy(p_msg->cityNm, item->valuestring, strlen(item->valuestring)); rt_kprintf("
cityName:%s ", p_msg->cityNm); item = cJSON_GetObjectItem(object, "temperature"); p_msg->temperature = atoi(item->valuestring); rt_kprintf("
temp :%d ", p_msg->temperature); item = cJSON_GetObjectItem(object, "wind"); strncpy(p_msg->wind, item->valuestring, strlen(item->valuestring)); rt_kprintf("
wd :%s ", p_msg->wind); item = cJSON_GetObjectItem(object, "winp"); p_msg->winp = atoi(item->valuestring); rt_kprintf("
ws :%d ", p_msg->winp); item = cJSON_GetObjectItem(object, "humidity"); p_msg->humidity = atoi(item->valuestring); rt_kprintf("
humidity:%d ", p_msg->humidity); item = cJSON_GetObjectItem(object, "days"); strncpy(p_msg->date, item->valuestring, strlen(item->valuestring)); rt_kprintf("
days :%s
", p_msg->date); if (root != RT_NULL) cJSON_Delete(root); } static void weather_hw(void) { rt_uint8_t *buffer = RT_NULL; int resp_status; struct webclient_session *session = RT_NULL; char *weather_url = RT_NULL; int content_length = -1, bytes_read = 0; int content_pos = 0; /* 为 weather_url 分配空间 */ weather_url = rt_calloc(1, GET_URL_LEN_MAX); if (weather_url == RT_NULL) { rt_kprintf("No memory for weather_url!
"); goto __exit; } /* 拼接 GET 网址 */ rt_snprintf(weather_url, GET_URL_LEN_MAX, GET_URI, AREA_ID); /* 创建会话并且设置响应的大小 */ session = webclient_session_create(GET_HEADER_BUFSZ); if (session == RT_NULL) { rt_kprintf("No memory for get header!
"); goto __exit; } else { rt_kprintf("create session successed!
"); } /* 发送 GET 请求使用默认的头部 */ if ((resp_status = webclient_get(session, weather_url)) != 200) { rt_kprintf("webclient GET request failed, response(%d) error.
", resp_status); goto __exit; } /* 分配用于存放接收数据的缓冲 */ buffer = rt_calloc(1, GET_RESP_BUFSZ); if(buffer == RT_NULL) { rt_kprintf("No memory for data receive buffer!
"); goto __exit; } content_length = webclient_content_length_get(session); if (content_length < 0) { /* 返回的数据是分块传输的. */ do { bytes_read = webclient_read(session, buffer, GET_RESP_BUFSZ); if (bytes_read <= 0) { break; } } while (1); } else { do { bytes_read = webclient_read(session, buffer, content_length - content_pos > GET_RESP_BUFSZ ? GET_RESP_BUFSZ : content_length - content_pos); if (bytes_read <= 0) { break; } content_pos += bytes_read; } while (content_pos < content_length); } /* 天气数据解析 */ weather_data_parse(buffer, &weather_msg); __exit: /* 释放网址空间 */ if (weather_url != RT_NULL) rt_free(weather_url); /* 关闭会话 */ if (session != RT_NULL) webclient_close(session); /* 释放缓冲区空间 */ if (buffer != RT_NULL) rt_free(buffer); }```**输出结果** ![day6.png](/uploads/201810/23/160509kug2by5yb9foo5fr.png) 下载附件 [day6.pdf](https://oss-club.rt-thread.org/uploads/201810/23/160534ksrrxcevkvqerbeo.attach)
查看更多
4
个回答
默认排序
按发布时间排序
风雨潇潇
2018-10-23
这家伙很懒,什么也没写!
汗呐汗啊
flyboy
2018-10-24
Do my self();
强:call:
yukelab
2018-10-24
这家伙很懒,什么也没写!
>强 --- 只是照猫画虎了:)
san兄弟
2018-10-26
这家伙很懒,什么也没写!
请问是怎么设置onenet收到多路数据流的,我的程序发送了多路不同名称的,只能收到第一路,后面的都看不到
撰写答案
登录
注册新账号
关注者
0
被浏览
1.6k
关于作者
yukelab
这家伙很懒,什么也没写!
提问
17
回答
47
被采纳
1
关注TA
发私信
相关问题
1
【LWIP学习营】第一关开发环境搭建
2
LWIP学习营第一周入门移植问题汇总贴
3
【LWIP学习营】f407+lan8720A小结
4
【LwIP学习营】【第一周】仅零散记录,无主题
5
【LWIP学习营】正点原子探索者F407+LAN8720第一周小结
6
【LwIP学习营】【第一周】网络通信基础及实现TCP 聊天客户端
7
【LwIP学习营】【第一周】LWIP移植
8
【LwIP学习营】【第一周】LWIP移植
9
【LwIP学习营】【第一周】开发板适配
10
【LwIP学习营】【第一周】环境搭建和配置验证
推荐文章
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
STM32H7R7运行CherryUSB
2
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
3
使用RC522软件包驱动FM1722
4
常量数据类型和表达式陷阱分享
5
进行i2c驱动移植的经验总结
热门标签
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在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部