1. RT-Thread基础环境搭建与云端接入准备

任务目标

本案例完成RT-Thread开发环境搭建,并验证网络模块能够连通互联网。最终交付一个可编译、可烧录、可联网的最小工程,为后续MQTT/HTTP等云端接入案例提供稳定基础。

环境与依赖

  • 硬件:STM32F407开发板 + ESP8266(AT固件,串口连接PA2/PA3,波特率115200)
  • 软件:RT-Thread Studio(v2.2.6+)或ENV工具链,STM32F4 BSP
  • 组件:内核、FinSH控制台、AT设备驱动、SAL套接字抽象层、lwIP(通过SAL使用AT socket)

实现步骤

在RT-Thread Studio中基于STM32F407 BSP创建工程,通过menuconfig启用以下配置:

Hardware Drivers Config → Serial → 使能USART2(AT设备)
Components → Network → Socket Abstraction Layer → 使能SAL
Components → Network → AT commands → 使能AT设备 + ESP8266
Components → Network → lwIP → 使能lwIP(使用SAL)

在board.h中确认USART2引脚为PA2(TX)/PA3(RX)。ESP8266的RST引脚接PB12,用于复位控制。

关键完整代码

以下代码实现ESP8266的初始化、自动连接WiFi,并周期检测网络连通性。将代码保存为main.c,替换工程默认文件。

#include <rtthread.h>
#include <at_device_esp8266.h>
#include <at.h>
#include <sal_lwip.h>

#define WIFI_SSID       "your_wifi_ssid"
#define WIFI_PASS       "your_wifi_password"
#define NET_CHECK_PERIOD    rt_tick_from_millisecond(5000)

static struct at_device_esp8266 esp0 = {
    .name = "esp0",
    .user_data = RT_NULL,
    .wifi_ssid = WIFI_SSID,
    .wifi_password = WIFI_PASS,
    .recv_line_num = 10,
    .power_pin = -1,
    .reset_pin = GET_PIN(B, 12),
};

static int esp8266_device_init(void)
{
    struct at_device *dev = RT_NULL;

    dev = at_device_esp8266_create(&esp0);
    if (dev == RT_NULL) {
        rt_kprintf("esp8266 device create failed\n");
        return -RT_ERROR;
    }

    if (at_device_connect(dev, 3000) != RT_EOK) {
        rt_kprintf("esp8266 connect failed\n");
        return -RT_ERROR;
    }

    rt_kprintf("esp8266 wifi connected, ip: %s\n", at_device_get_ip(dev));
    return RT_EOK;
}
INIT_APP_EXPORT(esp8266_device_init);

static void net_check_thread(void *param)
{
    int sock = -1;
    struct sockaddr_in server;
    struct timeval timeout = {2, 0};

    while (1) {
        sock = socket(AF_INET, SOCK_STREAM, 0);
        if (sock < 0) {
            rt_kprintf("socket create failed\n");
            goto retry;
        }

        server.sin_family = AF_INET;
        server.sin_port = htons(80);
        server.sin_addr.s_addr = inet_addr("180.101.50.242");  // www.baidu.com

        setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));

        if (connect(sock, (struct sockaddr *)&server, sizeof(server)) == 0) {
            rt_kprintf("network OK: TCP connect to baidu:80 success\n");
        } else {
            rt_kprintf("network FAIL: connect error\n");
        }

        closesocket(sock);

retry:
        rt_thread_mdelay(NET_CHECK_PERIOD);
    }
}

static int net_check_thread_init(void)
{
    rt_thread_t tid = rt_thread_create("netchk",
                                        net_check_thread,
                                        RT_NULL,
                                        2048,
                                        20,
                                        10);
    if (tid != RT_NULL) {
        rt_thread_startup(tid);
        return RT_EOK;
    }
    return -RT_ERROR;
}
INIT_APP_EXPORT(net_check_thread_init);

编译与烧录

  1. 在rtconfig.h中确认宏RT_USING_AT、AT_USING_SOCKET、SAL_USING_LWIP均已定义。
  2. 将WiFi SSID和密码填入上述代码对应位置。
  3. 编译工程,生成.elf或.bin文件。
  4. 通过ST-Link烧录至开发板,打开串口终端(115200, 8N1)观察FinSH输出。

验证方法与判定标准

烧录后复位开发板,在串口终端观察日志。满足以下全部条件即判定通过:

  • 出现esp8266 wifi connected, ip: 192.168.x.x,说明WiFi已关联并获取IP。
  • 每5秒输出一次network OK: TCP connect to baidu:80 success,说明设备具备互联网TCP通信能力。
  • 若输出network FAIL,检查WiFi密码、ESP8266固件版本及串口接线。

预期输出示例(非实测):

esp8266 wifi connected, ip: 192.168.1.100
network OK: TCP connect to baidu:80 success
network OK: TCP connect to baidu:80 success

常见问题

  • AT设备创建失败:确认USART2已在board.h中正确初始化,且ESP8266供电稳定(3.3V/500mA以上)。
  • 连接超时:检查ESP8266固件是否为AT 1.7+版本,波特率是否匹配。
  • 编译报SAL未定义:在menuconfig中确认SAL与lwIP组件已勾选并重新生成工程。