基于 i.MX6ULL 的智能家居温湿度采集系统完整版(全栈嵌入式项目)

📅 2026/7/31 6:56:44 👁️ 阅读次数 📝 编程学习
基于 i.MX6ULL 的智能家居温湿度采集系统完整版(全栈嵌入式项目)


一、项目概述

本项目基于NXP i.MX6ULL嵌入式平台(ARM Cortex-A7),搭建了一套完整的智能家居温湿度采集系统。项目打通了嵌入式 Linux 开发的全技术链路

内核驱动 → 用户态进程通信 → MQTT 云平台 → 微信小程序端

GitHub 仓库:https://github.com/shmily451/imx6ull-mini-smart-home


二、硬件组成

组件型号说明
主控NXP i.MX6ULLARM Cortex-A7, 800MHz
开发板正点原子阿尔法-
传感器DHT11数字温湿度,单总线协议
LED板载 sys-ledGPIO 控制
网络以太网连接路由器/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 字节)数据帧:

湿度整数 + 湿度小数 + 温度整数 + 温度小数 + 校验和

实现流程

  1. GPIO 发送 20ms 低电平起始信号
  2. 切换 GPIO 为输入,注册双沿中断
  3. 中断服务程序记录 84 个时间戳
  4. 相邻时间差 > 50μs 判为数据 1,否则为 0
  5. CRC 校验通过后存入环形缓冲区,唤醒用户进程

关键技术点

  • 使用ktime_get_ns()获取纳秒级时间戳
  • 环形缓冲区解决中断上下文与用户态的数据传递
  • 等待队列实现阻塞读
  • 内核定时器做超时保护

5.2 MQTT 通信

MQTT Topic 设计

Topic方向Payload
smart-home/dht11/temperature设备 → Broker25
smart-home/dht11/humidity设备 → Broker60
smart-home/ledBroker → 设备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.kono symbol version for module_layout

原因:内核启用了 CONFIG_MODVERSIONS,但编译驱动时 Module.symvers 不完整

解决

  1. 删除内核源码 .git 目录
  2. 禁用 CONFIG_LOCALVERSION_AUTO
  3. 完整编译内核(make zImage && make modules)
  4. 重新编译驱动

7.2 MQTT-C 库连接失败

现象:mqtt_client 连接 Broker 后反复超时断开

原因:MQTT-C 库生成的 CONNECT 包被 Nagle 算法缓存,Broker 等待 90 秒后超时

解决:弃用 MQTT-C,改用 Eclipse Paho MQTT C 客户端库

7.3 小程序 WebSocket 连接失败

现象:微信小程序连不上 WebSocket

原因:多数情况下是网络环境问题(防火墙、代理、域名校验)

解决:使用路由器组网,确保设备在同一网段;开发者工具中勾选“不校验合法域名”


八、扩展方向

  1. 接入公网 EMQX Cloud,实现远程外网访问
  2. 添加更多传感器(烟雾、光照、人体红外)
  3. 增加历史数据曲线和告警通知功能
  4. 引入 MQTT over TLS 加密通信
  5. 支持 OTA 远程固件更新
  6. 接入天猫精灵/小爱同学等语音控制

九、源码地址

GitHub:https://github.com/shmily451/imx6ull-mini-smart-home

欢迎 Star、Fork、Issue 交流!


如果这篇文章对你有帮助,请点赞收藏支持一下~ 有问题欢迎在评论区交流!