基于 i.MX6ULL 的智能家居温湿度采集系统完整版(全栈嵌入式项目)
一、项目概述
本项目基于NXP i.MX6ULL嵌入式平台(ARM Cortex-A7),搭建了一套完整的智能家居温湿度采集系统。项目打通了嵌入式 Linux 开发的全技术链路:
内核驱动 → 用户态进程通信 → MQTT 云平台 → 微信小程序端
GitHub 仓库:https://github.com/shmily451/imx6ull-mini-smart-home
二、硬件组成
| 组件 | 型号 | 说明 |
|---|---|---|
| 主控 | NXP i.MX6ULL | ARM Cortex-A7, 800MHz |
| 开发板 | 正点原子阿尔法 | - |
| 传感器 | DHT11 | 数字温湿度,单总线协议 |
| LED | 板载 sys-led | GPIO 控制 |
| 网络 | 以太网 | 连接路由器/PC |
三、技术栈一览
3.1 驱动层
- Linux 字符设备驱动(file_operations)
- GPIO 中断编程
- DHT11 单总线协议时序解析
- 内核定时器、等待队列、环形缓冲区
- 内核模块编译与交叉编译
- CONFIG_MODVERSIONS 符号版本校验
3.2 应用层
- JSON-RPC 2.0 进程通信
- libev 事件循环库
- 多线程编程(pthread)
- TCP Socket 编程
- cJSON 库
3.3 MQTT 物联网通信
- MQTT 3.1.1 协议(发布/订阅模式)
- Eclipse Paho MQTT C 客户端库
- Mosquitto / EMQX Broker
- MQTT over WebSocket
3.4 微信小程序
- 微信开发者工具
- 手写 MQTT 二进制协议编解码
- WebSocket 通信
3.5 系统部署
- 交叉编译(Poky 工具链)
- SCP 远程部署
- 开机自启配置
四、项目目录结构
imx6ull-mini-smart-home/ ├── 02_dht11_drv_imx6ull/ # DHT11 内核驱动 │ ├── dht11_drv.c # 字符设备驱动 (GPIO 中断) │ ├── dht11_sysfs.c # 用户态备选方案 │ ├── dht11_test.c # 测试程序 │ └── Makefile │ ├── json-rpc_control-hardware/ # JSON-RPC 进程通信 │ ├── rpc_server/ # 后台服务 │ └── rpc_client/ # 客户端 │ ├── mqtt_client/ # MQTT 远程通信 │ ├── mqtt_client.c # Paho MQTT 客户端 │ ├── Makefile │ └── paho_include/ # Paho 头文件 │ ├── wechat-miniapp/ # 微信小程序 │ ├── app.js / app.json │ └── pages/index/ │ ├── index.js # MQTT over WebSocket 客户端 │ ├── index.wxml # UI 模板 │ └── index.wxss # 样式 │ ├── images/ # 效果图片 ├── README.md └── TROUBLESHOOTING.md五、核心实现
5.1 DHT11 内核驱动
DHT11 采用单总线协议,一次通信传输40bit(5 字节)数据帧:
湿度整数 + 湿度小数 + 温度整数 + 温度小数 + 校验和
实现流程:
- GPIO 发送 20ms 低电平起始信号
- 切换 GPIO 为输入,注册双沿中断
- 中断服务程序记录 84 个时间戳
- 相邻时间差 > 50μs 判为数据 1,否则为 0
- CRC 校验通过后存入环形缓冲区,唤醒用户进程
关键技术点:
- 使用
ktime_get_ns()获取纳秒级时间戳 - 环形缓冲区解决中断上下文与用户态的数据传递
- 等待队列实现阻塞读
- 内核定时器做超时保护
5.2 MQTT 通信
MQTT Topic 设计:
| Topic | 方向 | Payload |
|---|---|---|
| smart-home/dht11/temperature | 设备 → Broker | 25 |
| smart-home/dht11/humidity | 设备 → Broker | 60 |
| smart-home/led | Broker → 设备 | ON / OFF |
为什么选择 Paho MQTT?
最初使用轻量级 MQTT-C 库,但在 i.MX6ULL 上反复出现 CONNECT 包无法发送的问题。最终改用 Eclipse Paho MQTT,后者使用独立后台网络线程自动处理协议交互(CONNECT、PING、重连),稳定可靠。
5.3 微信小程序
微信小程序不支持标准 MQTT TCP 连接,只能通过WebSocket。我手动实现了 MQTT 二进制报文的编解码,包括:
- CONNECT(连接)
- SUBSCRIBE(订阅)
- PUBLISH(发布)
- PINGREQ/PINGRESP(心跳)
不依赖任何第三方库,代码完全自研。
六、效果展示
| 开发板实物 | 微信小程序 | MQTTX 桌面端 |
|---|---|---|
i.MX6ULL开发板运行DHT11传感器 | 微信小程序实时显示温湿度数据 | MQTTX桌面客户端监控数据流 |
七、遇到的问题与解决
7.1 module_layout 错误
现象:insmod dht11_drv.ko报no symbol version for module_layout
原因:内核启用了 CONFIG_MODVERSIONS,但编译驱动时 Module.symvers 不完整
解决:
- 删除内核源码 .git 目录
- 禁用 CONFIG_LOCALVERSION_AUTO
- 完整编译内核(make zImage && make modules)
- 重新编译驱动
7.2 MQTT-C 库连接失败
现象:mqtt_client 连接 Broker 后反复超时断开
原因:MQTT-C 库生成的 CONNECT 包被 Nagle 算法缓存,Broker 等待 90 秒后超时
解决:弃用 MQTT-C,改用 Eclipse Paho MQTT C 客户端库
7.3 小程序 WebSocket 连接失败
现象:微信小程序连不上 WebSocket
原因:多数情况下是网络环境问题(防火墙、代理、域名校验)
解决:使用路由器组网,确保设备在同一网段;开发者工具中勾选“不校验合法域名”
八、扩展方向
- 接入公网 EMQX Cloud,实现远程外网访问
- 添加更多传感器(烟雾、光照、人体红外)
- 增加历史数据曲线和告警通知功能
- 引入 MQTT over TLS 加密通信
- 支持 OTA 远程固件更新
- 接入天猫精灵/小爱同学等语音控制
九、源码地址
GitHub:https://github.com/shmily451/imx6ull-mini-smart-home
欢迎 Star、Fork、Issue 交流!
如果这篇文章对你有帮助,请点赞收藏支持一下~ 有问题欢迎在评论区交流!