当前位置: 首页 > news >正文

RT-Thread 第 8 课时:LwIP 网络基础 + MQTT 软件包上云

前言导读

前面搞定:内核线程、驱动外设、文件存储、日志归档;本节课直击物联网核心 —— 联网上云:先懂 LwIP 轻量级 TCP/IP 协议栈,再用 RT-Thread 官方 MQTT 软件包,实现设备连接 MQTT 服务器、订阅主题、发布传感器数据,完成「终端采集→本地存储→云端上报」全链路。

前置:已会设备配置、FinSH、有 ESP8266/ETH 网口模块、搭建 MQTT 测试服务器。


一、课时学习目标

  1. 理解 LwIP 协议栈、SAL 套接字抽象层原理
  2. 学会 WiFi 模块 (ESP8266) 驱动配网、联网调试
  3. 掌握 TCP/UDP 基础套接字编程
  4. 熟练使用 RT-Thread MQTT 软件包:连接 / 订阅 / 发布
  5. 实现 AHT10 温湿度数据实时上报 MQTT 云端

二、核心概念:LwIP + SAL 网络架构

2.1 LwIP 是什么

LwIP = 轻量级 TCP/IP 协议栈,专为嵌入式 MCU 设计:

  • 支持 TCP/UDP/ICMP/DHCP
  • 内存占用小,适配 STM32 等单片机组网
  • RT-Thread 原生深度适配,开箱即用

2.2 SAL 套接字抽象层

上层统一标准 Socket 接口,下层兼容:

  • WiFi 网卡、以太网、4G 模组
  • 业务代码不用改,换联网模块直接兼容

2.3 联网整体流程

硬件模组驱动 → 网卡注册 → DHCP 获取 IP → Socket 通信 → MQTT 应用


三、实操 1:ESP8266 WiFi 配网(基础必备)

3.1 Studio 配置开启

  1. 开启 AT 组件、ESP8266 驱动
  2. 绑定串口 (如 uart2) 对应 WiFi 模块
  3. 配置 WiFi 名称 / 密码

3.2 FinSH 联网调试命令

wifi scan # 扫描周边WiFi wifi join SSID PWD # 连接WiFi ifconfig # 查看本机IP、网关、网卡状态 ping 4.2.2.2 # 测试外网通断

判断标准:拿到 IP、ping 通,说明底层网络链路正常。


四、实操 2:原生 TCP Socket 通信(理解网络)

4.1 基础 Socket 核心 API

socket() // 创建套接字 connect() // 连接服务器 send() // 发送数据 recv() // 接收数据 close() // 关闭连接

4.2 简易 TCP 客户端 Demo

#include <rtthread.h> #include <sys/socket.h> #include <netdb.h> #define SERVER_IP "192.168.1.100" #define SERVER_PORT 8080 void tcp_client_thread(void *arg) { int sockfd; struct sockaddr_in server_addr; char buf[64] = "Hello TCP Server\r\n"; // 创建socket sockfd = socket(AF_INET, SOCK_STREAM, 0); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); inet_aton(SERVER_IP, &server_addr.sin_addr); // 连接服务器 connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); while(1) { send(sockfd, buf, rt_strlen(buf), 0); rt_thread_mdelay(2000); } }

五、实操 3:MQTT 软件包上云(本节课重点)

5.1 MQTT 核心优势

物联网标准协议:

  • 发布 / 订阅模式
  • 轻量、低流量、稳定
  • 适配阿里云 / 腾讯云 / 华为云 / 私有 MQTT 服务器

5.2 RT-Thread 配置 MQTT

  1. Env/Studio 下载 MQTT 官方软件包
  2. 配置 MQTT 服务器地址、端口、设备 ID
  3. 开启心跳、重连机制

5.3 关键 MQTT 主题约定

  • 上报主题:device/xxx/upload
  • 控制下发主题:device/xxx/cmd

5.4 完整 MQTT 发布温湿度 Demo

#include <rtthread.h> #include <mqttclient.h> // MQTT配置 #define MQTT_BROKER "tcp://192.168.1.100:1883" #define DEVICE_ID "rtthread_sensor_01" #define TOPIC_UP "device/sensor/upload" // 定时上报线程 void mqtt_upload_thread(void *arg) { float temp, humi; char payload[128]; while(1) { // 读取AHT10数据 aht10_read_data(&temp, &humi); // 拼接JSON报文 rt_snprintf(payload, sizeof(payload), "{\"device\":\"%s\",\"temp\":\"%.2f\",\"humi\":\"%.2f\"}", DEVICE_ID, temp, humi); // MQTT发布消息 mqttclient_publish(TOPIC_UP, payload, rt_strlen(payload), 0, 0); rt_kprintf("MQTT上报:%s\r\n", payload); rt_thread_mdelay(5000); } }

5.5 MQTT 订阅接收云端指令

实现云端下发指令,控制板载 LED 开关:

  • 订阅指令主题
  • 收到消息解析 JSON
  • 调用 PIN 驱动翻转 LED 电平

六、工程完整业务架构(终极整合)

AHT10采集线程 → 消息队列 → 本地文件存储(FatFS) → MQTT云端上报(LwIP) 云端指令 → MQTT订阅 → 消息解析 → 控制LED/继电器外设 日志全程输出 → ulog分级打印

一套架构 = 标准商用物联网终端模板。


七、FinSH 网络排错必用命令

ifconfig # 看IP网卡 ping # 测网络连通 mqtt status # 查看连接状态 list_netdev # 查看网络设备

八、本节课避坑总结

  1. 必须先 WiFi 联网拿到 IP,再跑 MQTT
  2. MQTT 设备 ID 全网唯一,防止冲突掉线
  3. 网络线程加心跳 + 自动重连,断网自动恢复
  4. 高频上报数据一定要加缓冲区,防网络阻塞
  5. JSON 报文严格格式,云端解析报错大多是符号问题

九、课后作业

  1. 对接公共免费 MQTT 服务器,实现跨网上报
  2. 云端下发指令,控制 OLED 切换显示界面
  3. 断网缓存:离线数据存 Flash,联网后补传

下一课最终章预告

第 9 课时:综合终极项目:全屋环境监测物联网终端(全程整合调试 + 优化 + 低功耗)把前面 8 节课所有知识点,合成一个可直接落地、可烧录量产的完整项目。

http://www.jsqmd.com/news/625934/

相关文章:

  • 从‘乐学小鹅’到‘com.tencent.k12gy’:一次Frida注入失败带给我的Android应用‘身份证’认知升级
  • DrissionPage实战:从零构建高效网页自动化工具
  • 作业2:6位数码管相关练习
  • 从Flannel迁移到Calico:Kubernetes网络插件实战切换指南
  • 双唾液酸神经节苷脂GD3
  • 强化学习部署相关概念区分: parameters.pkl、Checkpoint 与 TorchScript
  • Lychee多模态重排序模型效果展示:T→T纯文本检索中长尾query高分匹配案例
  • PlugY颠覆式体验完全指南:暗黑破坏神2单机限制的终极解决方案
  • 用R包sommer做基因组选择:从单性状到多性状GBLUP,一份给育种新手的保姆级代码指南
  • 别再为加工发愁!手把手教你将HFSS的3D模型变成Altium可用的PCB封装(以定向耦合器为例)
  • **发散创新:基于Rust的内存安全加固技术实战与深度剖析**在现代软件开发中,**内存
  • ESP32-S3玩转RGB屏幕:解决画面漂移的5个实战技巧(附配置代码)
  • 学Simulink——基于Simulink的重复控制抑制周期性负载转矩扰动
  • 2024年企业服务器CPU怎么选?从Intel至强Silver 4410Y到Gold 6248R的实战性能分析与避坑指南
  • 【实战指南】利用再生龙(Clonezilla)实现Linux服务器整盘灾备
  • 在飞腾D2000的麒麟V10上离线装Docker,我踩过的坑和填坑方法都在这了
  • eDNA原始数据分析 各文件含义
  • HarmonyOS6 ArkTS Tabs自定义页签切换联动
  • 从频谱分析到PCB布线:开关电源EMI优化的5个关键步骤(附实测数据)
  • 告别零样本提示:为什么在复杂业务里,Text2SQL微调才是王道?以DB-GPT-Hub为例
  • GitHub中文化插件实战指南:开发版与稳定版选型深度解析
  • 电商客服+导购智能体的设计与开发颇
  • AI未来3-5年十大核心方向
  • 基于Simulink的李雅普诺夫稳定性保障的非线性控制
  • 从81.7万细胞中解码“语法”:人类发育多组学图谱首次揭示调控序列的硬规则与软约束
  • 告别接线烦恼!用JDY-23蓝牙模块DIY一个手机遥控的智能小夜灯(附Arduino代码)
  • 把轮询时代收起来,ABAP Daemon 才是事件驱动应用的长驻底座
  • 告别手动复制:用Apifox Helper插件+访问令牌,实现IDEA与API文档的自动同步
  • 从AAAI2025看技术风向:Gaussian Splatting、Mamba、MoE这些词为啥这么火?
  • 让微信网页版重新可用:wechat-need-web浏览器插件完全攻略