Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
网络学习营
【7天入门RTOS网络编程】Wendell Day6-7 RTOS网络编程课作业☆☆
发布于 2018-10-26 14:23:22 浏览:1917
订阅该版
* 本帖最后由 san兄弟 于 2018-10-26 15:31 编辑 * DAY6~7的课程作业终于做好了,来交作业,首先感谢企鹅群友 rt-thread-郭占鑫、蓝槐和Nautilus三位高手的无私帮助! **1. 题目要求:**观看视频及文档,能够正常获取并运行示例程序,运用所学的知识,获取实时的日期、时间、天气,并把获取的数据通过在 OneNet 云平台创建应用展示出来。首先上图说明已经正常获取并运行了示例程序。运行例程上传温度数据到onenet onenet设置 onenet数据流曲线 ntp同步时间 **2. 完成思路:**获取ntp时间; 获取天气数据,并采用cJSON软件包解析; 使用onenet软件包上传数据至中移OneNet云; 在中移OneNet云中展示数据。**3. 具体步骤:**获取ntp时间的例程已经有了,可以很方便的获取到时间;实时天气数据是难点,因为历程中使用的API已经弃用,可以寻找新的API代替,由于时间关系,没能在作业中使用新的API,使用的是例程中的API和数据,待找到新的免费接口后再来补充吧,现在先把原理搞懂。使用onenet软件包上传数据至中移OneNet云以及展示数据都有例程,需要做的就是将例程使用的各函数整合成自己需要的功能。**在做作业的过程中遇到的问题:**例程中上传到中移OneNet云的数据只有temperature一路数据流,当添加多组数据流后出现云端只能收到第一路数据,其他的无法显示的问题,原因是中移OneNet云有数据上传频率限制,解决方法是在各路数据上传之间加微小延时! 上代码。```#include
#include
/* 使用 HTTP 协议与服务器通信需要包含此头文件 */ #include
/* 使用BSD socket,需要包含socket.h头文件 */ #include
#include
#include
#include
#define GET_HEADER_BUFSZ 1024 //头部大小 #define GET_RESP_BUFSZ 1024 //响应缓冲区大小 #define GET_URL_LEN_MAX 256 //网址最大长度 #define GET_URI "http://mobile.weather.com.cn/data/sk/%s.html" //获取天气的 API #define AREA_ID "101021300" //上海浦东地区 ID /* 天气数据解析 */ void my_weather_data_parse(rt_uint8_t *data) { cJSON *root = RT_NULL, *object = RT_NULL, *item = RT_NULL; root = cJSON_Parse((const char *)data); if (!root) { rt_kprintf("No memory for cJSON root!
"); return; } object = cJSON_GetObjectItem(root, "sk_info"); item = cJSON_GetObjectItem(object, "date"); if (onenet_mqtt_upload_string("date", item->valuestring) < 0) { log_e("upload has an error, stop uploading"); } else { log_d("buffer : {\"date\":%s}", item->valuestring); } rt_thread_delay(rt_tick_from_millisecond(100)); item = cJSON_GetObjectItem(object, "time"); if (onenet_mqtt_upload_string("time", item->valuestring) < 0) { log_e("upload has an error, stop uploading"); } else { log_d("buffer : {\"time\":%s}", item->valuestring); } rt_thread_delay(rt_tick_from_millisecond(100)); item = cJSON_GetObjectItem(object, "cityName"); if (onenet_mqtt_upload_string("cityName", item->valuestring) < 0) { log_e("upload has an error, stop uploading"); } else { log_d("buffer : {\"cityName\":%s}", item->valuestring); } rt_thread_delay(rt_tick_from_millisecond(100)); item = cJSON_GetObjectItem(object, "temp"); if (onenet_mqtt_upload_string("temp", item->valuestring) < 0) { log_e("upload has an error, stop uploading"); } else { log_d("buffer : {\"temp\":%s}", item->valuestring); } rt_thread_delay(rt_tick_from_millisecond(100)); item = cJSON_GetObjectItem(object, "wd"); if (onenet_mqtt_upload_string("wd", item->valuestring) < 0) { log_e("upload has an error, stop uploading"); } else { log_d("buffer : {\"wd\":%s}", item->valuestring); } rt_thread_delay(rt_tick_from_millisecond(100)); item = cJSON_GetObjectItem(object, "ws"); if (onenet_mqtt_upload_string("ws", item->valuestring) < 0) { log_e("upload has an error, stop uploading"); } else { log_d("buffer : {\"ws\":%s}", item->valuestring); } rt_thread_delay(rt_tick_from_millisecond(100)); item = cJSON_GetObjectItem(object, "sd"); if (onenet_mqtt_upload_string("sd", item->valuestring) < 0) { log_e("upload has an error, stop uploading"); } else { log_d("buffer : {\"sd\":%s}", item->valuestring); } if (root != RT_NULL) cJSON_Delete(root); } void my_weather(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; } /* 发送 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); } /* 天气数据解析 */ my_weather_data_parse(buffer); __exit: /* 释放网址空间 */ if (weather_url != RT_NULL) rt_free(weather_url); /* 关闭会话 */ if (session != RT_NULL) webclient_close(session); /* 释放缓冲区空间 */ if (buffer != RT_NULL) rt_free(buffer); } static void my_ntp_sync(void) { 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)); if (onenet_mqtt_upload_string("ntp-time",ctime((const time_t*) &cur_time)) < 0) { log_e("upload has an error, stop uploading"); } else { log_d("buffer : {\"ntp-time\":%s}", ctime((const time_t*) &cur_time)); } rt_thread_delay(rt_tick_from_millisecond(100)); } } /* upload data to onenet*/ static void onenet_upload_entry(void *parameter) { int value = 0; while (1) { my_ntp_sync(); my_weather(); rt_thread_delay(rt_tick_from_millisecond(5 * 1000)); } } int my_onenet_upload_cycle(void) { rt_thread_t tid; tid = rt_thread_create("onenet_send", onenet_upload_entry, RT_NULL, 2 * 1024, RT_THREAD_PRIORITY_MAX / 3 - 1, 20); if (tid) { rt_thread_startup(tid); } return 0; } MSH_CMD_EXPORT(my_onenet_upload_cycle, send data to OneNET cloud cycle);```  **4. 运行结果:**正在上传的数据 中移OneNet云接收到的数据流展示。 虽然天气数据一直在上报,但是由于数据一直没有改变,因此看不出来效果,只有上报的ntp时间是变化的,因此贴个视频来表明数据在传输。时间是有变化的,成功!
查看更多
4
个回答
默认排序
按发布时间排序
sharp
2018-10-26
这家伙很懒,什么也没写!
写的很详细
san兄弟
2018-10-26
这家伙很懒,什么也没写!
>写的很详细 --- :handshake
flyboy
2018-10-29
Do my self();
应用的界面也挺好
san兄弟
2018-10-29
这家伙很懒,什么也没写!
>应用的界面也挺好 --- :victory:以后继续学习和改进
撰写答案
登录
注册新账号
关注者
0
被浏览
1.9k
关于作者
san兄弟
这家伙很懒,什么也没写!
提问
8
回答
36
被采纳
0
关注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
RT-thred的stm32h723对应bsp包CubeMX添加其他外设报错
2
RT-Thread中的time溢出问题,时间戳溢出,解决方法
3
ART-PI使用env驱动ETH网卡,pc和板子可以ping通
4
SystemView线程名字不显示
5
只用网页也能跑RT-Smart 无门槛腾讯Cloud studio + smart-build快速构建
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
9
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
xiaorui
3
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
阳光的掌控者
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部