ESP32+Arduino+阿里云+MQTT配置笔记

本文介绍了如何使用ESP32和ArduinoIDE连接到阿里云物联网平台,涉及配置Arduino环境、安装库文件,如ArduinoJson和PubSubClient,以及处理aliyun_mqtt库。通过提供的代码示例展示了如何建立WIFI连接,连接MQTT服务器,设置回调函数接收命令,并定时发送设备数据。
摘要由CSDN通过智能技术生成

主要参考了这两篇文章

 玩转 ESP32 + Arduino (十六) 通过mqtt协议连接阿里云 - 简书

【嵌入式Linux应用开发】8. 阿里云物联网平台的简单使用 - 嵌入式Linux开发 - 嵌入式开发问答社区

假设你已经有了一个开发Arduino的环境

需要如下配置:

 

 其中,ArduinoJson和PubSubClient可以在开发环境里直接搜索,安装就可以了

 

 aliyun_mqtt这个搜不到,需要单独配置。

源码位置在这里:

GitHub - legenddcr/aliyun-mqtt-arduino: 一个用于快速连接Aliyun MQTT服务,用于Arduino框架的代码库。

下下来,解压,放在库文件所在目录

 到这里,依赖就配置好了

 下面这段代码是转载自第一篇文章,直接编译就行了。

#include <Arduino.h>
#include <ArduinoJson.h>
#include <aliyun_mqtt.h>
#include "PubSubClient.h"
#include "WiFi.h"
#include "Ticker.h"

#define WIFI_SSID "anny"       //wifi名
#define WIFI_PASSWD "20141208" //wifi密码

#define PRODUCT_KEY "a1AYa96sZMJ"                        //产品ID
#define DEVICE_NAME "EspTempAndHumi_D001"                //设备名
#define DEVICE_SECRET "a23249cb179feee41ca2f8f38525113d" //设备key

//设备下发命令的set主题
#define ALINK_TOPIC_PROP_SET "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"
//设备上传数据的post主题
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
//设备post上传数据要用到一个json字符串, 这个是拼接postJson用到的一个字符串
#define ALINK_METHOD_PROP_POST "thing.event.property.post"
//这是post上传数据使用的模板
#define ALINK_BODY_FORMAT "{\"id\":\"%u\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"

#define LED_B 2 //定义LED灯的引脚

int postMsgId = 0; //记录已经post了多少条
Ticker tim1;       //这个定时器是为了每5秒上传一次数据

/*------------------------------------------------------------------------------------------*/

WiFiClient espClient;               //创建网络连接客户端
PubSubClient mqttClient(espClient); //通过网络客户端连接创建mqtt连接客户端

//连接WIFI相关函数
void setupWifi()
{
  delay(10);
  Serial.println("连接WIFI");
  WiFi.begin(WIFI_SSID, WIFI_PASSWD);
  while (!WiFi.isConnected())
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("OK");
  Serial.println("Wifi连接成功");
}

//重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect()
{
  while (!mqttClient.connected()) //再重连客户端
  {
    Serial.println("reconnect MQTT...");
    if (connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))
    {
      Serial.println("connected");
    }
    else
    {
      Serial.println("failed");
      Serial.println(mqttClient.state());
      Serial.println("try again in 5 sec");
      delay(5000);
    }
  }
}
//mqtt发布post消息(上传数据)
void mqttPublish()
{
  if (mqttClient.connected())
  {
    //先拼接出json字符串
    char param[82];
    char jsonBuf[178];
    sprintf(param, "{\"CurrentHumidity\":%.1f,\"CurrentTemperature\":%.1f,\"ESPLight_Pin2\":%d}", 22.2, 35.5, digitalRead(LED_B)); //我们把要上传的数据写在param里
    postMsgId += 1;
    sprintf(jsonBuf, ALINK_BODY_FORMAT, postMsgId, ALINK_METHOD_PROP_POST, param);
    //再从mqtt客户端中发布post消息
    if (mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf))
    {
      Serial.print("Post message to cloud: ");
      Serial.println(jsonBuf);
    }
    else
    {
      Serial.println("Publish message to cloud failed!");
    }
  }
}
//收到set主题的命令下发时的回调函数,(接收命令)
void callback(char *topic, byte *payload, unsigned int length)
{
  if (strstr(topic, ALINK_TOPIC_PROP_SET))
  //如果收到的主题里包含字符串ALINK_TOPIC_PROP_SET(也就是收到/sys/a17lGhkKwXs/esp32LightHome/thing/service/property/set主题)
  {
    Serial.println("收到下发的命令主题:");
    Serial.println(topic);
    Serial.println("下发的内容是:");
    payload[length] = '\0'; //为payload添加一个结束附,防止Serial.println()读过了
    Serial.println((char *)payload);

    //接下来是收到的json字符串的解析
    DynamicJsonDocument doc(100);
    DeserializationError error = deserializeJson(doc, payload);
    if (error)
    {
      Serial.println("parse json failed");
      return;
    }
    JsonObject setAlinkMsgObj = doc.as<JsonObject>();
    serializeJsonPretty(setAlinkMsgObj, Serial);
    Serial.println();

    //这里是一个点灯小逻辑
    int lightSwitch = setAlinkMsgObj["params"]["ESPLight_Pin2"];
    digitalWrite(LED_B, lightSwitch);
    mqttPublish(); //由于将来做应用可能要获取灯的状态,所以在这里发布一下
  }
}

void setup()
{
  pinMode(LED_B, OUTPUT);
  Serial.begin(115200);
  setupWifi();
  if (connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))
  {
    Serial.println("MQTT服务器连接成功!");
  };
  mqttClient.setCallback(callback); //绑定收到set主题时的回调(命令下发回调)
  tim1.attach(5, mqttPublish);      //启动每5秒发布一次消息
}

void loop()
{
  //检测有没有断线
  if (!WiFi.isConnected()) //先看WIFI是否还在连接
  {
    setupWifi();
  }
  else //如果WIFI连接了,
  {
    if (!mqttClient.connected()) //再看mqtt连接了没
    {
      Serial.println("mqtt disconnected!Try reconnect now...");
      Serial.println(mqttClient.state());
      clientReconnect();
    }
  }

  //mqtt客户端监听
  mqttClient.loop();
}

如果一切正常,就会出现这样的输出:

 

关于阿里云部分,参考第二篇教程就可以了,这些部分要修改

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值