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

您所在的位置:网站首页 mqtt设备接入 ESP32+Arduino+阿里云+MQTT配置笔记

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

2023-05-27 14:19| 来源: 网络整理| 查看: 265

主要参考了这两篇文章

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

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

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

需要如下配置:

 

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

 

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

源码位置在这里:

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

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

 到这里,依赖就配置好了

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

#include #include #include #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(); 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(); }

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

 

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

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3