一、项目概述本项目基于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_operationsGPIO 中断编程DHT11 单总线协议时序解析内核定时器、等待队列、环形缓冲区内核模块编译与交叉编译CONFIG_MODVERSIONS 符号版本校验3.2 应用层JSON-RPC 2.0 进程通信libev 事件循环库多线程编程pthreadTCP Socket 编程cJSON 库3.3 MQTT 物联网通信MQTT 3.1.1 协议发布/订阅模式Eclipse Paho MQTT C 客户端库Mosquitto / EMQX BrokerMQTT over WebSocket3.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 采用单总线协议一次通信传输40bit5 字节数据帧湿度整数 湿度小数 温度整数 温度小数 校验和实现流程GPIO 发送 20ms 低电平起始信号切换 GPIO 为输入注册双沿中断中断服务程序记录 84 个时间戳相邻时间差 50μs 判为数据 1否则为 0CRC 校验通过后存入环形缓冲区唤醒用户进程关键技术点使用ktime_get_ns()获取纳秒级时间戳环形缓冲区解决中断上下文与用户态的数据传递等待队列实现阻塞读内核定时器做超时保护5.2 MQTT 通信MQTT Topic 设计Topic方向Payloadsmart-home/dht11/temperature设备 → Broker25smart-home/dht11/humidity设备 → Broker60smart-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.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 远程固件更新接入天猫精灵/小爱同学等语音控制九、源码地址GitHubhttps://github.com/shmily451/imx6ull-mini-smart-home欢迎 Star、Fork、Issue 交流如果这篇文章对你有帮助请点赞收藏支持一下 有问题欢迎在评论区交流
基于 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_operationsGPIO 中断编程DHT11 单总线协议时序解析内核定时器、等待队列、环形缓冲区内核模块编译与交叉编译CONFIG_MODVERSIONS 符号版本校验3.2 应用层JSON-RPC 2.0 进程通信libev 事件循环库多线程编程pthreadTCP Socket 编程cJSON 库3.3 MQTT 物联网通信MQTT 3.1.1 协议发布/订阅模式Eclipse Paho MQTT C 客户端库Mosquitto / EMQX BrokerMQTT over WebSocket3.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 采用单总线协议一次通信传输40bit5 字节数据帧湿度整数 湿度小数 温度整数 温度小数 校验和实现流程GPIO 发送 20ms 低电平起始信号切换 GPIO 为输入注册双沿中断中断服务程序记录 84 个时间戳相邻时间差 50μs 判为数据 1否则为 0CRC 校验通过后存入环形缓冲区唤醒用户进程关键技术点使用ktime_get_ns()获取纳秒级时间戳环形缓冲区解决中断上下文与用户态的数据传递等待队列实现阻塞读内核定时器做超时保护5.2 MQTT 通信MQTT Topic 设计Topic方向Payloadsmart-home/dht11/temperature设备 → Broker25smart-home/dht11/humidity设备 → Broker60smart-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.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 远程固件更新接入天猫精灵/小爱同学等语音控制九、源码地址GitHubhttps://github.com/shmily451/imx6ull-mini-smart-home欢迎 Star、Fork、Issue 交流如果这篇文章对你有帮助请点赞收藏支持一下 有问题欢迎在评论区交流