Android端通过Eclipse Paho库接入MQTT服务,订阅ESP8266发布的温湿度主题,并向控制主题发送LED开关指令。核心步骤包括:规划上报与控制主题、配置Android网络权限、订阅并解析JSON数据、在Arduino IDE中配置ESP8266环境。最终实现Android界面实时显示温湿度,且点击按钮可控制硬件LED亮灭。
完成效果与核心链路
本案例的目标是建立两条双向通信链路,确保硬件与软件端数据互通:
- 数据上报链路:ESP8266将温湿度数据发布到指定主题,Android App订阅该主题并解析显示。
- 指令下发链路:Android App点击控制按钮,将开关指令发布到控制主题,ESP8266接收后执行对应动作。
只有当这两条链路均能稳定运行,才算案例验收通过。
第一步:准备MQTT服务与主题规划
在编写代码前,必须确定服务端地址、端口、用户名、密码、客户端ID以及具体的主题名称。入门阶段可使用自建的Apache Apollo、云平台旧版MQTT产品或其他兼容服务。
主题规划需严格区分“上报”与“控制”,避免逻辑混乱。建议采用以下命名规范:
- 上报主题:
home/sensor/report,用于ESP8266发送温湿度数据。 - 控制主题:
home/led/set,用于Android发送LED开关指令。
记录所有连接参数,确保Android与ESP8266使用相同的MQTT服务端配置。
第二步:确认MQTT服务端状态
服务启动后,需进入管理页面验证虚拟主机、队列、主题或连接状态是否正常。若服务端未监听端口,后续所有设备连接均会失败。

第三步:Android项目配置与依赖
Android端推荐使用Eclipse Paho库进行连接、订阅和发布操作。配置时需完成以下关键步骤:
- 添加依赖:在Gradle文件中引入Eclipse Paho相关库。
- 配置权限:在AndroidManifest.xml中添加网络访问权限。
- 处理后台限制:针对Android 9及以上版本,需配置前台服务、后台限制及网络安全策略(如明文传输允许)。
参数封装建议:将服务端地址、端口、用户名、密码、客户端ID、上报主题和控制主题集中封装为配置类。避免散落在Activity的点击事件中,以便后续更换云平台时只需修改一处配置。
第四步:建立连接与数据订阅
连接成功后,立即订阅上报主题。收到消息时的处理逻辑如下:
- 解析数据:将接收到的JSON字符串解析为温度和湿度字段。
- 线程切换:MQTT回调通常不在UI线程执行,必须使用Handler或Coroutine切回主线程更新界面,否则可能引发崩溃或数据不刷新。

第五步:ESP8266开发环境准备
硬件端使用Arduino IDE配置ESP8266开发板环境。操作顺序如下:
- 添加管理器地址:在首选项中添加ESP8266开发板管理器URL。
- 安装支持包:通过开发板管理器安装ESP8266核心库及MQTT客户端库。
务必在环境配置完成后,再进行业务代码的编写与调试。

第六步:ESP8266发布温湿度消息
ESP8266端需先连接Wi-Fi,再连接MQTT服务端。读取DHT11传感器数据或模拟数据后,将JSON字符串发布到上报主题。示例数据格式如下:
{"temperature":26,"humidity":58}
调试技巧:若Android未收到消息,请使用桌面MQTT工具订阅同一主题,确认ESP8266是否真正发出消息。调试时应避免同时修改Android和硬件代码,以免无法定位错误源。
第七步:Android下发LED控制指令
当Android用户点击灯泡或开关按钮时,向控制主题发布指令(如on、off或JSON格式)。ESP8266订阅该主题后,根据消息内容切换GPIO输出状态。
验证方法:在ESP8266串口监视器中打印收到的主题和内容,确认指令是否到达。入门测试阶段,优先保证主题一致、客户端在线及网络可达;链路稳定后,再考虑重连机制、离线缓存及安全认证。
常见问题排查
- Android连接失败:检查服务端端口是否开放,以及手机网络是否能访问服务端地址。
- 收到空数据:核对ESP8266发布的主题与Android订阅的主题是否完全一致(包括大小写)。
- 界面不刷新:确认MQTT回调中是否已正确切回主线程更新UI。
- LED无反应:使用串口调试工具确认ESP8266是否收到了控制主题的消息。
验收清单
案例完成时,需满足以下四个条件:
- MQTT服务端可正常访问。
- Android App已成功连接并订阅主题。
- 温湿度数据能在Android界面实时显示。
- LED控制指令能被ESP8266接收并执行。
满足上述条件后,可进一步扩展历史数据记录、告警通知及设备列表管理等功能。