ESP32连接阿里云MQTT物联网平台

接上期文章:《入住阿里云MQTT物联网平台》

        我们已经获取到阿里云设备三元组信息,并且做好了消息转发“云产品流转”设置,今天就来使用ESP32连接阿里云,试试用MQTT开关板载LED是什么感觉。

相关资源下载:ESP32连接阿里云MQTT物联网平台的Arduino支持库及示例代码

一、硬件:ESP32最小系统板加一根安卓手机USB数据线,板载按键和LED,USB取电,不需要额外电源连接,网上商店一大把,便宜易得,非常适合本实验项目。图片如下:

ESP32连接阿里云MQTT物联网平台

二、软件: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 
    #include 
    #include 
    #include 

    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]=' ';//写入一个字符串结束标志,防止后续处理时溢出。
    StaticJsonDocumentdoc;DeserializationError error = deserializeJson(doc, payload);//反序列化JSON数据,注意其中的4096请根据自己信息长短进行合理设置。
    if(!error){mqttCommand(doc.as());}
}
void mqttCommand(JsonVariant params){
  if(params.containsKey("params")){
    if(params["params"].containsKey("COMMAND")){/*阿里平台里添加设备属性COMMAND*/
      if(params["params"]["COMMAND"].is()){
        if(params["params"]["COMMAND"].as()=="restart"){
          ESP.restart();//模块重启。
        }
      }
    }
    if(params["params"].containsKey("LED")){/*阿里平台里添加设备属性LED*/
      if(params["params"]["LED"].is()){
        if(params["params"]["LED"].as()==1){
          digitalWrite(led,1);
        }
        if(params["params"]["LED"].as()==0){
          digitalWrite(led,0);
        }
      }
    }
    //这里可以添加其他属性设置代码。
  }
}

回调处理使用到JSON库,方便数据解析处理,这也是MQTT程序通常的做法,如果你不想这样做,可以自行编写代码搜索payload。用自己喜欢的方式进行任意的处理。(其实就是个字符串,你可以想到很多方法去处理和使用它,你也可以简简单把它打印到串口,慢慢分析)

最后烧写程序到ESP32模块,注意有的模块烧写的时候需要按住按键,有的模块则不需要。烧写完成,模块重启,请关注串口信息和LED状态。

然后呢,然后就是:

  • 在线调试。

模块烧写成功后会自动重启,连接WIFI,连接阿里云平台。

现在我们登陆阿里MQTT物联网平台(都看到这里了,请不要告诉我你还没有注册!)

“控制台”–>“物联网平台”–>“公共实例”,左边栏点击“监控运维”–>“在线调试”“请选择设置”后面选择我们正在使用的产品和设备。必须与程序中使用的产品设备一致。如果你看到“设备在线”,恭喜你,咱们程序烧写成功,并且模块已经成功连接到物联网平台!如果“设备已离线”,请仔细检查程序,WIFI连接是否成功,MQTT三元组信息是否正确,网络是否通达。重点关注串口调试信息,直到连接成功。如果你足够仔细,严格按前文所述修改代码,应该可以一次成功。

此时,你会看到高度设备自定义属性,每个属性下面有一个输入框,在LED属性输入框里填入0,点后面的“调试”à“设置”。是不是灯灭了?改为1再来一次,是否灯亮了?有不有点小小的激动?

本文章来源于互联网,如有侵权,请联系删除!原文地址:ESP32连接阿里云MQTT物联网平台

相关推荐: 【物联网】微信小程序接入阿里云物联网平台

微信小程序接入阿里云物联网平台 一 阿里云平台端 1.登录阿里云 阿里云物联网平台 点击进入公共实例,之前没有的点进去申请 2.点击产品,创建产品 3.产品名称自定义,按项目选择类型,节点类型选择之恋设备,联网方式WiFi,数据格式选择透传/自定义,其他默认 …