Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Webclient
基于rt-threa的联网时钟
发布于 2023-07-26 17:03:32 浏览:605
订阅该版
[tocm] 仓库地址:https://gitee.com/vacabun/rt_clock # 背景: 在如今互联网蓬勃发展的时代,物联网设备的普及和应用越来越广泛。为了满足物联网设备对实时操作系统的需求,RT-Thread应运而生。RT-Thread是一个基于实时多任务调度的开源操作系统,旨在为嵌入式设备提供简单、高效的解决方案。它具有小巧、灵活、可裁剪等优点,因此被广泛应用于各种嵌入式系统中。 # 方案理念: 该开源项目的方案理念是通过RT-Thread操作系统实现智能物联网设备的时间同步和天气信息显示。为了提供准确的时间信息,项目利用联网功能从时间服务器获取网络时间,并将其同步到设备的实时时钟(RTC)模块中。这样,设备内部的时间将与真实世界保持同步,确保各项时间相关的功能正常运作。 # 设计过程讨论: 在项目的设计过程中,有几个关键步骤需要讨论和考虑。 1. 联网功能: 为了使设备能够与时间服务器通信并获取网络时间,需要选择合适的网络协议栈和通信接口。根据设备的具体需求和资源限制,可以选择使用WiFi、以太网或蜂窝数据网络等方式来建立网络连接。 2. 时间同步: 一旦设备成功连接到时间服务器,需要编写代码来解析服务器返回的时间数据,并将其同步到设备的RTC模块中。这涉及到时间数据格式的处理和RTC驱动的使用,确保时间的准确性和稳定性。 3. 天气信息获取: 为了显示天气信息,项目需要与一种天气数据源进行集成,例如气象API。通过联网功能,设备可以从气象API获取实时的天气数据,然后解析并提取所需的信息(如温度、湿度、天气状况等)。获取到的天气信息可以进一步通过设备的OLED显示屏模块显示出来。 4. OLED显示: 为了在设备上显示天气信息,可以利用RT-Thread提供的图形库和OLED驱动来实现。通过编写相应的代码,可以将已获取的天气信息以图形或文本的形式显示在设备的OLED屏幕上。 # 实现方式: ## 联网功能: **RW007**是由上海睿赛德电子科技有限公司开发基于 WIFI SOC的SPI/UART 高速wifi模块。 开启rw007软件包,通过rw007模块连接wifi。 ## 时间同步 NTP 网络时间协议(Network Time Protocol),是用来同步网络中各个计算机时间的协议。 开启 NTP 软件包(一个运行在 RT_Thread 上的 NTP 客户端),并且当连接上网络后,利用这个软件包,获取当前的 UTC 时间,并更新至 RTC(实时时钟)中。 ## 天气信息获取 使用webclient软件包向天气api获取天气数据,并通过cjson软件包解析获取的json数据。 下面是实现的具体代码: api的appid和appsecret要换成自己的 weather.c ```c #include
#include
#include
#include
#define GET_LOCAL_URI "http://www.tianqiapi.com/free/day?appid=appid&appsecret=appsecret&cityid=CN101020100&unescape=1" struct weather_response response; struct weather_info info; /* send HTTP GET request by simplify request interface, it used to received shorter data */ static int webclient_get_smpl(const char *uri) { if (response.response != RT_NULL) { web_free(response.response); } if (response.root != RT_NULL) { cJSON_Delete(response.root); response.root = RT_NULL; } size_t resp_len = 0; int index; if (webclient_request(uri, RT_NULL, RT_NULL, 0, (void **)&response.response, &resp_len) < 0) { rt_kprintf("webclient send get request failed."); return -RT_ERROR; } // rt_kprintf("webclient send get request by simplify request interface.\n"); // rt_kprintf("webclient get response data: \n"); // for (index = 0; index < strlen(response.response); index++) // { // rt_kprintf("%c", response.response[index]); // } // rt_kprintf("\n"); response.root = cJSON_Parse(response.response); if (response.root != RT_NULL) { response.cityid = cJSON_GetObjectItem(response.root, "cityid"); response.city = cJSON_GetObjectItem(response.root, "city"); response.date = cJSON_GetObjectItem(response.root, "date"); response.week = cJSON_GetObjectItem(response.root, "week"); response.update_time = cJSON_GetObjectItem(response.root, "update_time"); response.wea = cJSON_GetObjectItem(response.root, "wea"); response.wea_img = cJSON_GetObjectItem(response.root, "wea_img"); response.tem = cJSON_GetObjectItem(response.root, "tem"); response.tem_day = cJSON_GetObjectItem(response.root, "tem_day"); response.tem_night = cJSON_GetObjectItem(response.root, "tem_night"); response.win = cJSON_GetObjectItem(response.root, "win"); response.win_speed = cJSON_GetObjectItem(response.root, "win_speed"); response.air = cJSON_GetObjectItem(response.root, "air"); response.pressure = cJSON_GetObjectItem(response.root, "pressure"); response.humidity = cJSON_GetObjectItem(response.root, "humidity"); } return 0; } struct weather_info *get_weather_info() { if (webclient_get_smpl(GET_LOCAL_URI) == 0) { info.status = 0; info.cityid = response.cityid->valuestring; info.city = response.city->valuestring; info.date = response.date->valuestring; info.week = response.week->valuestring; info.update_time = response.update_time->valuestring; info.wea = response.wea->valuestring; info.wea_img = response.wea_img->valuestring; info.tem = response.tem->valuestring; info.tem_day = response.tem_day->valuestring; info.tem_night = response.tem_night->valuestring; info.win = response.win->valuestring; info.win_speed = response.win_speed->valuestring; info.air = response.air->valuestring; info.pressure = response.pressure->valuestring; info.humidity = response.humidity->valuestring; info.status = 0; } else { info.status = 1; } return &info; } int get_weather_info_test(void) { struct weather_info *p_info = get_weather_info(); if (p_info->status == 0) { rt_kprintf("Get weather info success.\n"); rt_kprintf("cityid : %s\n", info.cityid); rt_kprintf("city : %s\n", info.city); rt_kprintf("date : %s\n", info.date); rt_kprintf("week : %s\n", info.week); rt_kprintf("update_time : %s\n", info.update_time); rt_kprintf("wea : %s\n", info.wea); rt_kprintf("wea_img : %s\n", info.wea_img); rt_kprintf("tem : %s\n", info.tem); rt_kprintf("tem_day : %s\n", info.tem_day); rt_kprintf("tem_night : %s\n", info.tem_night); rt_kprintf("win : %s\n", info.win); rt_kprintf("win_speed : %s\n", info.win_speed); rt_kprintf("air : %s\n", info.air); rt_kprintf("pressure : %s\n", info.pressure); rt_kprintf("humidity : %s\n", info.humidity); } else { rt_kprintf("Get weather info failed.\n"); } } MSH_CMD_EXPORT(get_weather_info_test, get_weather_info_test); ``` weather.h ```c #ifndef __WEATHER_H__ #define __WEATHER_H__ #include
struct weather_response { char *response; cJSON *root; cJSON *cityid; cJSON *city; cJSON *date; cJSON *week; cJSON *update_time; cJSON *wea; cJSON *wea_img; cJSON *tem; cJSON *tem_day; cJSON *tem_night; cJSON *win; cJSON *win_speed; cJSON *air; cJSON *pressure; cJSON *humidity; }; struct weather_info { int status; // 0 is success char *cityid; char *city; char *date; char *week; char *update_time; char *wea; char *wea_img; char *tem; char *tem_day; char *tem_night; char *win; char *win_speed; char *air; char *pressure; char *humidity; }; struct weather_info *get_weather_info(); #endif ``` 测试效果 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230726/629e2bc9f1d86f75f210ca910bb8522a.png.webp) ## 屏幕显示 通过I2C通信接口连接0.96寸OLED屏,并使用SSD1306软件包提供的函数来配置参数、绘制图形和显示从网络获取到的数据。 由于没有添加中文字库,部分中文经函数转换为对应英文显示。 显示效果: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230726/e115ac70f7a7cd12134e26cc320d5938.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230726/8c7faa7d5d74622c3f3f91a42db8257d.png.webp)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
vacabun
这家伙很懒,什么也没写!
文章
6
回答
0
被采纳
0
关注TA
发私信
相关文章
1
AT组件连接BC26并使用Webclient软件包GET方式请求失败
2
webclient sal_sock每次send 内存就多占几十字 咋排查
3
webclient使用疑惑 ,post上传数据无效,get下载数据
4
w5500通信不稳定。
5
webclient软件包get接口,等不到response header?
6
webclient使用的建議
7
基于官方 webclient 的 http client
8
stm32使用webclient+mbedtls实现get请求及post太慢
9
Webclient无法下载局域网内的文件
10
webclient的post file的sample,需开启哪个文件系统支持
推荐文章
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组件
热门标签
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
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
3
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部