Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
网络学习营
【7天入门RTOS网络编程】day5-7 补交作业
发布于 2018-10-29 21:17:35 浏览:1961
订阅该版
事情太多,今天抽空补交一下作业,算给自己一个交代 1、要求 NTP同步本地时钟; 从网上获取本地天气数据 上传天气数据到onenet平台 2、思路: 1)ntp还用例程里的,app开始后,先更新ntp日期时间 2)ontnet_mqtt_init(),注册onenet平台mqtt接口及创建线程(线程工作:固定间隔时间上传数据) 3)获取天气接口初始化及创建线程(线程工作:固定间隔时间获取本地天气) 4)创建 互斥量 进程间数据通信 3、结果:(实现代码附后) ![day 5-7_2.gif](/uploads/201810/29/211505xlnldts4fn9mde0n.gif) 动图,见过程 ![2018-10-29_210838.png](/uploads/201810/29/211505mrqvfrff0jjdfv5r.png) 打印输出结果解析(部分) ![2018-10-29_211146.png](/uploads/201810/29/211505ohe8fdazbeudqhb1.png) ![2018-10-29_211707.png](/uploads/201810/29/211721munzpnf3nb61gnfb.png) 4、实现 ```/* * File : myday5_7demo.c * * * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-10-29 wo4fisher myday5_7demo */ #include
// weather http header #include
/* 使用 HTTP 协议与服务器通信需要包含此头文件 */ #include
/* 使用BSD socket,需要包含socket.h头文件 */ #include
#include
#include
// ntp #include
//onenet #include
#include
/******************* weather ************************/ // weather define #define GET_HEADER_BUFSZ 1024 //头部大小 #define GET_RESP_BUFSZ 1024 //响应缓冲区大小 #define GET_URL_LEN_MAX 256 //网址最大长度 #define AREA_ID "101100501" #define GET_URI "http://www.weather.com.cn/data/sk/%s.html" rt_uint8_t temperature[10]={0}; rt_uint8_t humidity[10]={0}; /******************** end ***************************/ /******************* RTT ************************/ /* 指向线程控制块的指针 */ static rt_thread_t tid_weather = RT_NULL; static rt_thread_t tid_onenet = RT_NULL; static rt_mutex_t temp_mutex = RT_NULL; /******************** end ***************************/ /* 天气数据解析 */ void my_weather_data_parse(rt_uint8_t *data) { cJSON *root = RT_NULL, *object = RT_NULL, *item = RT_NULL; char * pos; root = cJSON_Parse((const char *)data); if (!root) { rt_kprintf("No memory for cJSON root!
"); return; } object = cJSON_GetObjectItem(root, "weatherinfo"); item = cJSON_GetObjectItem(object, "cityid"); rt_kprintf("
cityName:%s ", item->valuestring); item = cJSON_GetObjectItem(object, "temp"); rt_kprintf("
temp :%s ", item->valuestring); rt_sprintf(temperature,"%s",item->valuestring); rt_kprintf("
temperature:%s
",temperature); item = cJSON_GetObjectItem(object, "wd"); rt_kprintf("
wd :%s ", item->valuestring); item = cJSON_GetObjectItem(object, "ws"); rt_kprintf("
ws :%s ", item->valuestring); item = cJSON_GetObjectItem(object, "sd"); rt_kprintf("
sd :%s ", item->valuestring); rt_sprintf(humidity,"%s",item->valuestring); rt_kprintf("
humidity:%s
",humidity); pos=strchr(humidity,'%'); *pos='\0'; rt_kprintf("
humidity:%s
",humidity); item = cJSON_GetObjectItem(object, "time"); rt_kprintf("
time :%s
", item->valuestring); if (root != RT_NULL) cJSON_Delete(root); } void weather_entry(void* parameter) { 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; while(1) { /* 为 weather_url 分配空间 */ weather_url = rt_calloc(1, GET_URL_LEN_MAX); /* 创建会话并且设置响应的大小 主要是分配空间 */ session = webclient_session_create(GET_HEADER_BUFSZ); /* 分配用于存放接收数据的缓冲 */ buffer = rt_calloc(1, GET_RESP_BUFSZ); if (weather_url == RT_NULL || session == RT_NULL || buffer == RT_NULL) { rt_kprintf("No memory for weather_url!
"); goto __exit; } /* 拼接 GET 网址 */ rt_snprintf(weather_url, GET_URL_LEN_MAX, GET_URI, AREA_ID); /* 发送 GET 请求使用默认的头部 */ if ((resp_status = webclient_get(session, weather_url)) != 200) { rt_kprintf("webclient GET request failed, response(%d) error.
", resp_status); 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); } rt_kprintf("
weather data:
%s
",buffer); rt_mutex_take(temp_mutex,RT_WAITING_FOREVER); /* 天气数据解析 */ my_weather_data_parse(buffer); rt_mutex_release(temp_mutex); rt_thread_delay(rt_tick_from_millisecond(10 * 1000)); __exit: /* 释放网址空间 */ if (weather_url != RT_NULL) rt_free(weather_url); /* 关闭会话 */ if (session != RT_NULL) webclient_close(session); /* 释放缓冲区空间 */ if (buffer != RT_NULL) rt_free(buffer); } } /***************************************************/ /* upload random value to temperature*/ static void onenet_upload_entry(void *parameter) { while (1) { rt_mutex_take(temp_mutex,RT_WAITING_FOREVER); if (onenet_mqtt_upload_string("temperature", temperature) < 0) { log_e("temperature upload has an error, stop uploading"); break; } else { log_d("buffer : {\"temperature\":%s}", temperature); } if (onenet_mqtt_upload_string("humidity", humidity) < 0) { log_e("humidity upload has an error, stop uploading"); break; } else { log_d("buffer : {\"humidity\":%s}", humidity); } rt_mutex_release(temp_mutex); rt_thread_delay(rt_tick_from_millisecond(9 * 1000)); } } int onenet_publish_digit(int argc, char **argv) { if (argc != 3) { log_e("onenet_publish [datastream_id] [value] - mqtt pulish digit data to OneNET."); return -1; } if (onenet_mqtt_upload_digit(argv[1], atoi(argv[2])) < 0) { log_e("upload digit data has an error!
"); } return 0; } MSH_CMD_EXPORT_ALIAS(onenet_publish_digit, onenet_mqtt_publish_digit, send digit data to onenet cloud); int onenet_publish_string(int argc, char **argv) { if (argc != 3) { log_e("onenet_publish [datastream_id] [string] - mqtt pulish string data to OneNET."); return -1; } if (onenet_mqtt_upload_string(argv[1], argv[2]) < 0) { log_e("upload string has an error!
"); } return 0; } MSH_CMD_EXPORT_ALIAS(onenet_publish_string, onenet_mqtt_publish_string, send string data to onenet cloud); /* 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 */ 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); /***************************************************/ void app_init(int argc, char **argv) { char *host_name = NULL; ntp_sync(host_name); //更新本地时间,有打印信息,直接调用 onenet_mqtt_init(); rt_thread_delay(rt_tick_from_millisecond(10 * 1000)); temp_mutex=rt_mutex_create("temp_mutex",RT_IPC_FLAG_PRIO); //创建互斥量 tid_weather= rt_thread_create("tid_weather", weather_entry, (void*)1, /* 线程入口是thread_entry, 入口参数是1 */ 1024*4, 20, 5); //THREAD_STACK_SIZE, THREAD_PRIORITY,THREAD_TIMESLICE if (tid_weather != RT_NULL){ rt_kprintf("weather thread init ok
"); rt_thread_startup(tid_weather); } tid_onenet = rt_thread_create("onenet_send", onenet_upload_entry, RT_NULL, 2 * 1024, 21, 5); if (tid_onenet) { rt_thread_startup(tid_onenet); } } MSH_CMD_EXPORT(app_init, a app demo for ntp sync& get weather); ```
查看更多
1
个回答
默认排序
按发布时间排序
XQQ
2018-10-30
这家伙很懒,什么也没写!
挺好
撰写答案
登录
注册新账号
关注者
0
被浏览
2k
关于作者
wo4fisher
这家伙很懒,什么也没写!
提问
8
回答
4
被采纳
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
使用RC522软件包驱动FM1722
2
常量数据类型和表达式陷阱分享
3
进行i2c驱动移植的经验总结
4
在VSCode中使用clang-format
5
我该如何使用这个微雪的WIFI400 WIFI-LPB-100在rtt里或者我该怎样为它开发驱动
热门标签
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
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
289
次被采纳
张世争
809
个答案
175
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部