Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
2024-RSOC
夏令营
【2024-RSOC】软件包与组件(MQTT+文件系统)(Day5)
发布于 2024-07-31 00:28:45 浏览:420
订阅该版
[tocm] ## 软件包 ### 温湿度传感器 首先到Menuconfig开启下对应的软件包 ![image-20240730000909378.png](https://oss-club.rt-thread.org/uploads/20240731/34af9abe1244f20179809d20f3e91013.png) 保存后退出输入pkgs -update即可自动下载对应的代码 然后在代码目录下的packages即可看到刚刚下好的aht10的驱动了 虽然板子自带的是AHT21,但是这个驱动也是适配的了,而且温湿度传感器代码都差不多的,i2c地址正确就行 #### 另外 如果需要输出小数,那么还需要添加rt_vsnprintf_full包 ![image-20240730002715510.png](https://oss-club.rt-thread.org/uploads/20240731/a289591afc475e2a3e3cd6e841ebccee.png) ### MQTT 首先来到阿里云物联网平台注册一个账号,并且选择开通试用一个实例 ![image-20240730003402010.png](https://oss-club.rt-thread.org/uploads/20240731/8d0633d9850b211ee2f34463bec83ef8.png.webp) 然后新建一个产品和设备 ![image-20240730004355727.png](https://oss-club.rt-thread.org/uploads/20240731/7be2a29b1a7f7e2c23a33dd5f75d6732.png.webp) ![image-20240730004735507.png](https://oss-club.rt-thread.org/uploads/20240731/d78b0fdfcfc7ba76b0361cd6e0d61ccc.png.webp) ![image-20240730085608448.png](https://oss-club.rt-thread.org/uploads/20240731/ef61a5e9ab46497d78aefae86b0a15b4.png.webp) 顺便添加几个模块,方便后面代码实践 接下来到menuconfig去开启下wifi模块的软件包,需要按图配置下针脚 ![image-20240730004935248.png](https://oss-club.rt-thread.org/uploads/20240731/37fc7667c6676a23c8694004513476e1.png) 还有阿里云的物联网平台的软件包 注意:这里需要设置下前四个选项 分别是产品key和密钥 以及设备名和密钥 这些都可以刚创建的产品和设备那里查看 下面还有个simple也开一下,这是实例 ![image-20240730005036877.png](https://oss-club.rt-thread.org/uploads/20240731/af6df2155209c2ad7ca37aaee69d93d1.png) #### 代码实践 实现下上传温湿度到阿里云以及通过mqtt控制板子的led 为了方便理解,所以直接在mqtt提供的示例代码里面改 ![image-20240730200207232.png](https://oss-club.rt-thread.org/uploads/20240731/841d9d5159f5386a1c304ab23baa7c53.png) 初始化温湿度设备 ![image-20240730200249016.png](https://oss-club.rt-thread.org/uploads/20240731/31314f92d3d31674db4d2dbfc2d639b1.png) 按下图实现温湿度上传 ![image-20240730200359339.png](https://oss-club.rt-thread.org/uploads/20240731/d789a1ce9a3c24f442ed75dcb7ad4191.png) 按下图实现控制亮灯 ![image-20240730200427411.png](https://oss-club.rt-thread.org/uploads/20240731/d82616175dc3c2edcb82105626e5b93f.png.webp) ## 组件 定义:指的是一个可以独立开发、测试、部署和维护的软件单元。 软件包跟组件大概就是类似于房子跟建房子用的砖块把 就好像温湿度软件包里面使用了I2C组件 ### 文件系统 定义: >**DFS** 是 RT-Thread 提供的虚拟文件系统组件,全称为 Device File System。 >在 RT-Thread DFS 中,文件系统有统一的根目录,使用 `/` 来表示。 >有点类似linux ![DFS 层次架构图](https://www.rt-thread.org/document/site/rt-thread-version/rt-thread-standard/programming-manual/filesystem/figures/fs-layer.png) | 类型 | 特点 | | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | FatFS | FatFS 是专为小型嵌入式设备开发的一个兼容微软 FAT 格式的文件系统,采用ANSI C编写,具有良好的硬件无关性以及可移植性,是 RT-Thread 中最常用的文件系统类型。我们今天使用到的elm_fat就是这个类型。 | | RomFS | 传统型的 RomFS 文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以 XIP(execute In Place,片内运行) 方式运行,在系统运行时, 节省 RAM 空间。我们一般拿其作为挂载根目录的文件系统 | | DevFS | 即设备文件系统,在 RT-Thread 操作系统中开启该功能后,可以将系统中的设备在 `/dev` 文件夹下虚拟成文件,使得设备可以按照文件的操作方式使用 read、write 等接口进行操作。 | | UFFS | UFFS 是 Ultra-low-cost Flash File System(超低功耗的闪存文件系统)的简称。它是国人开发的、专为嵌入式设备等小内存环境中使用 Nand Flash 的开源文件系统。与嵌入式中常使用的 Yaffs 文件系统相比具有资源占用少、启动速度快、免费等优势。 | | NFS | NFS 网络文件系统(Network File System)是一项在不同机器、不同操作系统之间通过网络共享文件的技术。在操作系统的开发调试阶段,可以利用该技术在主机上建立基于 NFS 的根文件系统,挂载到嵌入式设备上,可以很方便地修改根文件系统的内容。 | ### POSIX接口层 POSIX 表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写 POSIX),POSIX 标准定义了操作系统应该为应用程序提供的接口标准,是 IEEE 为要在各种 UNIX 操作系统上运行的软件而定义的一系列 API 标准的总称。 学过linux的应该都知道当需要对文件进行读写操作,都需要用到read open write那些函数,这就是POSIX接口层了 以上都是介绍,下面了解下原理就开始实践了 ### 文件系统启动流程 内容比较复杂,先浅浅的来个概念的理解先 这里分为两部分理解 第一部分就是初始化一个DFS组件,把文件系统初始化好,但是还没办法存储东西,因为缺少了类似硬盘一样的东西,于是有了第二部分 第二部分就是针对W25Q64的,首先用SFUD进行驱动,然后通过FAL抽象层注册为BLK设备,然后绑定到第一部分里,这样就可以访问存储了 ![image-20240730204807423.png](https://oss-club.rt-thread.org/uploads/20240731/e84fe99d41d6fbd0fd6e07563cf10171.png.webp) ### 代码实践 打开一下相关的软件包和组件 ![image-20240730204159854.png](https://oss-club.rt-thread.org/uploads/20240731/039132755887225227954035b623a10a.png) ![image-20240730204351005.png](https://oss-club.rt-thread.org/uploads/20240731/7df536f69ff5d2f6517a89e71d2622c5.png) 接下来开一下组件 ![image-20240730204436529.png](https://oss-club.rt-thread.org/uploads/20240731/211e05371f0c65c71542ca3ee85db168.png) 按路径打开完后在进去fatfs里面设置一下 ![image-20240730204514525.png](https://oss-club.rt-thread.org/uploads/20240731/44bfe880d8188121012b051db492640e.png) 顺便开下这个 ![image-20240730215552901.png](https://oss-club.rt-thread.org/uploads/20240731/d28fd68a3cd4418296ba8ef70c7a69e8.png) 然后保存编译运行即可使用 **注意**:由于Rw007模块和W25Q64用的同一个spi2所以还需要在main函数最底下空行加上这个代码 作用是初始化w25q64前先把Rw007关了 ``` #define WIFI_CS GET_PIN(F, 10) void WIFI_CS_PULL_DOWN(void) { rt_pin_mode(WIFI_CS,PIN_MODE_OUTPUT); rt_pin_write(WIFI_CS, PIN_LOW); } INIT_BOARD_EXPORT(WIFI_CS_PULL_DOWN); ``` ![image-20240730211658311.png](https://oss-club.rt-thread.org/uploads/20240731/4c767103cb3bc42fc07e23d07ef7bdef.png.webp) 每次运行都可以看到这个分区表,这个分区表差不多类似于电脑的硬盘的分区 这是RT-Thread默认分的分区表,虽然有分区了但是还没有格式化 (默认格式化了filesystem分区,也就是/下的fas文件夹) 首先格式化一下font分区,在此之前需要分配个块设备,相当于硬盘分配盘符d盘,e盘之类 ![image-20240730213009483.png](https://oss-club.rt-thread.org/uploads/20240731/bac379a503853646bdc2d38e2fe7b6ec.png) 然后格式化一下,运行后来到终端输入mkfs -t elm font **注意**:第一次的新板子可能需要mkfs -t elm filesystem mount filesystem /fal elm 分配下filesystem,然后重启,不然可能会报错 ``` [684] E/app.filesystem: Failed to initialize filesystem! ``` 继续,挂载font上去就能用了 ``` mkdir /fal/font mouint font /fal/font elm ``` 接下来可以写代码读写文件了 ### 代码实践 实现以下每次mqtt发送温湿度的时候,另外存一份文件 >文件名为:1.txt; 文件内容: Num:0 (代表总数) Temp:XX ; Humi:XX ; Count: 1(自上电起所采集的数据次数) Temp:XX ; Humi:XX ; Count: 2(自上电起所采集的数据次数) Temp:XX ; Humi:XX ; Count: 3(自上电起所采集的数据次数) ``` static int file_data(void) { int fd; fd = open("/fal/1.txt", O_RDWR | O_CREAT); //如果打开成功 if (fd >= 0) { //判断文件是否为空 rt_uint32_t size = read(fd, buffer, 1); if (size < 0) { rt_kprintf("Read File Fail.\n"); return ; } if(buffer[0]!='n') { //写入文件 write(fd, "num:0\r\n", 8); num_count=0; }else{ //读取num次数 lseek(fd, 0, SEEK_SET); read(fd, buffer, 8); char *ptr = NULL; num_count=strtol(buffer+4,ptr,10); rt_kprintf("count:%s\n",buffer); rt_kprintf("count:%d\n",num_count); } num_count++; lseek(fd, 0, SEEK_SET); char temp[5] = {'\0'}; sprintf(temp, "%d", num_count); write(fd, "num:", 4); write(fd, temp,3); write(fd, "\r\n", 2); lseek(fd, 0, SEEK_END); char temp_String[40] = {'\0'}; sprintf(temp_String,String, (int)Temp, (int)Humi, num_count); write(fd, temp_String, sizeof(temp_String)); rt_kprintf("Write done.\n"); close(fd); } else { rt_kprintf("File Open Fail.\n"); } return 0; } ``` 在上文推送数据到mqtt的时候调用这段代码 ![image-20240731001501548.png](https://oss-club.rt-thread.org/uploads/20240731/3396966e0fc73ab50acf1e0225ee19cf.png) 运行结果 代码写的比较粗糙,主要是帖子拖了这么久才发有点不好意思,故快速开发一下
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
alight
该用户没有签名
文章
8
回答
0
被采纳
0
关注TA
发私信
相关文章
1
2024RT-Thread操作系统
推荐文章
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
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部