Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
IoT_Board
RT-Thread Studio
邮件应用
手把手教你用STM32发送带附件的邮件 (三)
发布于 2020-07-11 21:48:34 浏览:974
订阅该版
[tocm] ## 上节回顾 上一小节我们实现了基本的邮件发送功能,并且学习了如下知识点: 1. 如何使用 RT-Thread Studio 添加软件包。 2. 如何应对由于项目重新构建导致的参数丢失问题。 3. 如何配置邮件相关参数。 4. 如何修改邮件应用相关代码。 并且在上一章节我们强调了如果要能够正常收发邮件,必须打开邮件服务器的SMTP功能,并且使用相应的授权码登录而非邮箱的登录密码。在开始第三章节之前还请大家好好回顾一下前两节的内容。本章节将会是本项目的终章,并且有了前两章的积累,本章的内容也会相对简单一点。 ## 本节目标 本节在上一节的基础上实现邮件中夹带附件的功能,附件的形式为存于文件系统的文件,因此,本节需要加入文件系统。 ### 加入文件系统 由于本节的附件功能需要文件的功能,因此我们需要在项目中加入文件系统。 ###打开FatFs文件系统 1、首先打开 RT-Thread Settings,点击 更多配置: ![image.png](/uploads/20200711/6bb5b89dbcc8ab057017a251842686b1.png) 2、依次打开 **虚拟文件系统 - 使用设备虚拟文件系统** ,在 使能 **elm chan FatFs ** 的框中打上勾,勾上后便会打开FatFs文件系统的具体选项,我们继续打开 **使能 elm chan FatFs - elm chan 的 FatFs,通用Fat文件系统模块** ,由于我们使用的是SPI Flash,因此我们将 **设置要处理的最大扇区大小** 设为 **4096**。 ![image.png](/uploads/20200711/2834545a1987f82efde9c9189e0e99c4.png) 修改完后保存配置,由于本项目是基于原有的WIFI例程,而WIFI例程中已经包含了一个完整的文件系统功能所需的flash操作、分区操作等软件包和组件,所以我们在本节中就无需再加入这些组件,如果是一个全新的项目的话,那要实现一个文件系统就不仅仅是打开FatFs这一个操作了。我们在这里着重于邮件功能,因此对于这些细节就不再赘述,如有兴趣或者对其中的原理不明白的读者可以去RT-Thread官方文档查看有关文件系统的知识。 保存完后,我们的Fatfs文件系统相关文件就被加入到了工程中,而我们无需对其进行修改。 **同样的,由于我们更新了软件包,因此我们的一些库与路径的配置被删除,我们需要重新加回来,步骤与内容与前两节的一模一样,如果遗忘了可以再去查阅前两节关于库与路径的配置。** 此时,现在我们的文件系统还不能正常运行起来,我们需要对其进行一个初始化。 ### 初始化FatFs文件系统 根据RT-Thread官方的文档可知,文件系统的初始化过程一般分为以下几个步骤: 1、初始化 DFS 组件。 2、初始化具体类型的文件系统。 3、在存储器上创建块设备。 4、格式化块设备。 5、挂载块设备到 DFS 目录中。 其中,第一项和第二项都是基于RT-Thread的自动初始化机制初始化好的,因此我们需要做的就是后面三个步骤。 为了操作的简便,我们直接在 **main.c** 中定义如下函数: ```c static int filesystem_init(void) { //在存储器上创建块设备,名为filesystem struct rt_device *flash_dev = fal_blk_device_create("filesystem"); if (flash_dev == NULL) { LOG_E("Can't create a block device on filesystem partition."); } else { LOG_D("Create a block device on the filesystem partition of flash successful."); } /* 挂载 spi flash 中名为 "filesystem" 的分区上的文件系统 */ if (dfs_mount(flash_dev->parent.name, "/", "elm", 0, 0) == 0) { LOG_I("Filesystem initialized!"); } else { LOG_E("Failed to initialize filesystem!"); //挂载不成功,格式化文件系统 dfs_mkfs("elm", "filesystem"); //重新挂载 if (dfs_mount(flash_dev->parent.name, "/", "elm", 0, 0) == 0) { LOG_I("Filesystem initialized!"); } else { LOG_E("Failed to initialize filesystem!"); return -1; } } return 0; } ``` 该函数完成了文件系统的初始化工作,可以看到,首先其创建了一个名为 **filesystem** 的块设备,然后尝试将其挂载,若挂载不成功,可能是第一次使用导致,所以需要给它格式化一次文件系统,然后再次挂载。挂载成功后,文件系统便可正常使用。 定义好函数后我们即可在 **main** 函数中调用,这里需要注意的是,由于我们的文件系统初始化操作是基于 **fal** 分区的,所以在初始化文件系统之前理论上应该先调用 `fal_init()` 初始化 **fal** 功能,但是在这里我们的 wifi 初始化中已经包含了 fal 的初始化,因此我们无需再手动初始化一次。不过相对应的,我们的文件系统初始化函数就需要放在 wifi 初始化函数 `rt_hw_wlan_wait_init_done(500);` 之后: ![image.png](/uploads/20200711/65ece0e47ebe9376112fc052b05d652c.png) 修改完后,我们编译并且下载代码,观察串口终端的信息: ![image.png](/uploads/20200711/dfab0eefbefd560d1e43ef4e15fff354.png) 我们看最后两行,倒数第二行提示初始化文件系统失败,因为我们是第一次使用,还没有格式化,因此无法正常挂载,此时我们的代码会让其自动格式化并且再次挂载,从而得到最后一行的成功提示。当然,格式化文件系统不会每次上电都运行一遍,一般只要格式化一次,并且使用过程中没有遇到一些问题导致文件系统损坏,那么以后重启的时候都不需要再次格式化。 我们输入一个创建文件夹的命令 :**mkdir test** 创建一个名为 **test** 的文件夹,等待系统响应,如果没有错误信息,则再输入 **ls** 命令查看我们的文件夹是否创建成功: ![image.png](/uploads/20200711/cb923c5f75db36c2e26f05799bd22d8c.png) 如果如上图所示,那么我们的文件夹已经创建成功,这也就意味着我们的文件系统已经成功加入。 ### 加入附件 如果你成功抵达了这里,那么恭喜你,你离项目完成只差一步之遥了! 还记得在第二节中被我们注释掉的邮件例程的代码吗?我们打开 **smtp_client** 中的 **smtp_client_example.c** 文件,找到 **smtp_thread** 函数中的 **while(1)** ,此时你应该能看到上一节被我们注释掉的那三行代码,现在将其注释去掉: ![image.png](/uploads/20200711/9598d65511d52ac07422df1a67772021.png) 这里加入了两个附件,分别是 **a.txt** 和 **b.txt** , 由于我们刚刚将文件系统加入,其中还没有任何文件,自然也就没有这两个文件,所以我们需要创建这两个文件。 我们打开串口终端,输入 `echo HELLO a.txt` ,这条命令创建了 **a.txt** 文件,并且在里面写入了 **HELLO** 字符串,创建完成后我们可以通过 **ls** 命令查看我们的文件是否成功创建,如果要查看文件的内容,可以使用 **cat + 文件名** 的命令查看: ![image.png](/uploads/20200711/02d1c77b1f954c2205163898f24760cd.png) 可以看到,我们成功创建了 **a.txt** 文件,并且内容也正确。 我们再使用 `echo WORLD b.txt` 创建 **b.txt** 文件。 到这里,我们所有的工作都已经完成。编译并下载。待开发板连上网络并获取到IP,在终端中输入 **smtp_test** 命令开启邮件测试: ![image.png](/uploads/20200711/a98951fd79eef6be1adee9233db81c23.png) 看到成功信息后,我们查看一下我们的收件箱: ![image.png](/uploads/20200711/327b7fb94ad7ebafb0665d313c2b2395.png) 可以看到邮件已被成功接收,并且后面多了一个附件标志,这表明我们的附件已经成功发送。点击进入查看详细信息: ![image.png](/uploads/20200711/c29ae110cba73d72053ea7b2969985f3.png) 可以看到内容正常,并且附件也是全部都接收到,最后我们下载查看附件内容是否正确: ![image.png](/uploads/20200711/7295a669bb9c0d7acae83b02cef2d2cb.png) ![image.png](/uploads/20200711/1cfe9f5c8ac1be5d6e37b6f54e414548.png) 可以看到,两个附件都是没有问题的,其内容就是我们写入的内容。至此,我们的项目也就全部完成。 ## 结语 本项目基于潘多拉开发板,并且使用 RT-thread Studio 进行开发,实现了一个带附件的邮件发送功能,当然本文章只是带领大家了解并学会邮件功能的基本使用与开发,侧重于快速实现演示效果,如果你需要应用到实际的项目中,那么一定不能照搬文中的代码,需要根据你的项目需求进行代码的规范与优化。 并且,文中包含了太多的知识点不能一一进行说明,特别是我们的代码是基于 **IOT_Board SDK** 的其中一个例程来开发,里面早已帮我们配置好了许多基础组件与软件包,使得我们的工作量大大减小,如果从零开发,其工作量与代码量远远不止文中所描述的那么多。因此如果对RT-Thread的一些组件与软件包有兴趣并且想了解,那么一定要去RTT的官方文档与软件包的主页去查看。 本章结束
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
WKJay
wkjay.com
文章
10
回答
135
被采纳
24
关注TA
发私信
相关文章
1
rt_thread studio 啥时候能用呢
2
RT_Thread使用反馈帖子
3
RTT studio 下的 AT指令问题。
4
什么时候RTT Sdudio支持Ubuntu,Deepin和UOS操作系统
5
rt thread Studio 关于J-LINK下载问题
6
RT-Thread studio 调试设置问题
7
RTT-Studio 如何设置调试配置参数?
8
rt_thread studio 软件包配置
9
RT-Studio目前只能开发STM32的项目吗?
10
rtt studio 生成hex名字修改
推荐文章
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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部