概述
接上期文章:《入住阿里云MQTT物联网平台》
我们已经获取到阿里云设备三元组信息,并且做好了消息转发“云产品流转”设置,今天就来使用ESP32连接阿里云,试试用MQTT开关板载LED是什么感觉。
相关资源下载:ESP32连接阿里云MQTT物联网平台的Arduino支持库及示例代码
一、硬件:ESP32最小系统板加一根安卓手机USB数据线,板载按键和LED,USB取电,不需要额外电源连接,网上商店一大把,便宜易得,非常适合本实验项目。图片如下:
二、软件:Arduino软件,设置好ESP32编程环境,下载相关支持库。(相关教程和资源网上很多,请自行百度。)本文用到的库包括:Crypto(使用到库文件:SHA256.h,用于阿里云MQTT连接密码运算);pubsubclient-2.8(使用到库文件: PubSubClient.h,用于MQTT协议通信);ArduinoJson(使用到库文件ArduinoJson.h,用于JSON数据解析);由于阿里官方的MQTT连接库用起来不太顺手(个人习惯吧),自己照着CPP文件进行修改,做成一个Class,加上我喜欢的中文注释,自我感觉还不错。文前链接包括所有支持库及实验代码,感兴趣可以前往下载。下载资源包括两个文件夹,直接复制到arduino代码文件夹下。如果你libraries目录下已经存在相关支持库,可以不复制相应库文件。
- 程序结构说明。
本程序使用arduino编写,MQTT被封装成一个Class:
#ifndef ALIMQTT_H
#define ALIMQTT_H
#include <WiFi.h>
#include <PubSubClient.h>
#include <SHA256.h>
#include <ArduinoJson.h>
class ALIMQTT{
……
};
#endif
代码太长,这里节约一点版面,需要的按文前指示下载,花钱不多,支持一下未偿不可。
使用的时候先申明MQTT连接对象:ALIMQTT mqtt;
在程序入口setup()过程中首先初始化串口,连接WIFI,成功后初始化MQTT对象,传入设备三元组信息,设置Callback回调函数。初始化程序如下:
uint8_t led=2;//LED--D2(GPIO2)
void setup() {
uint8_t Index;
Serial.begin(115200);
pinMode(led, OUTPUT); //设置LED引脚为输出模式以便控制LED
WiFi.mode(WIFI_STA);
WiFi.begin("ShuFang","12345678");//这里请使用你自己的WIFI名和密码。
Index=60;
Serial.print("rn连接WIFI...");
while(WiFi.status()!=WL_CONNECTED && Index!=0){
Serial.print(".");Index--;delay(500);
digitalWrite(led,not digitalRead(led));//LED慢速闪烁表示正在连接WIFI.
}
if(Index!=0){
Serial.println("成功!");
digitalWrite(led,1);//WIFI连接成功LED常亮.
mqtt.begin("a1lkLsmt6QI","ESP32_LED","719bc6e69907e1568472e6c16d0719f3");//这里的参数请使用你自己在阿里云平台申请的设备三元组相应信息。
mqtt.setCallback(callback);//这里设置回调函数,以便对接收信息进行处理。
}else{
digitalWrite(led,0);//WIFI连接失败LED熄灭.
Serial.println("失败!");
}
}
这里要特别注意:
1、请确认你使用模块LED连接引脚的IO编号,本人LED引脚GPIO2。
2、如果你使用电脑串口调试助手,请设置相同的波特率。
3、请修改程序中的WIFI名称密码与你自己家里的WIFI一致。
4、请注意mqtt.begin()传入的参数分别表示阿里设备三元组:productKey、deviceName、deviceSecret顺序不能搞错了,请修改为你自己的设备信息。
5、回调函数格式是固定的(函数名可以更改,但须与mqtt.setCallback(callback);一致):
void callback(char *topic, byte *payload, unsigned int length){……}
回调传入三个参数:topic为订阅主题Topic;payload为订阅收到的信息体,即消息本身;length为信息体字节数。
在主循环loop()中,加入语句mqtt.loop();目的是MQTT心跳保持和接收订阅消息。如果没有这行代码,MQTT连接不会接收到订阅消息,也不会产生回调事件。
void loop() {
mqtt.loop();
}
MQTT远程控制LED代码在回调函数中完成:
void callback(char *topic, byte *payload, unsigned int length){
JsonVariant params;
payload[length]='