ESP8266ESP32-NodeMCU接入阿里云物联网平台
ESP8266/ESP32 NodeMCU接入阿里云物联网平台
阿里云物联网平台公共实例是免费的,且不像然也等服务器一样无法区分不同用户发布的话题。本文采用常规的pubsubclient库连接阿里云。ESP8266/ESP32用pubsubclient接入阿里云平台截至写稿的现在,网上有的资源较少,现在我就来介绍一下使用方法
1.登录阿里云官网
登录并搜索物联网平台,点击按钮开通公共实例,公共实例开通需要两分钟左右
2.在等待期间可在arduinoIDE,安装PubSubClient库用于MQTT通讯。
官网地址:
GitHub:
百度网盘下载: 提取码: sizy
下载完成后,通过arduinoIDE 项目->包含库->添加.zip库找到安装包存放目录并添加
3.此时阿里云物联网平台已开通,点击进入公共实例,并按以下步骤创建产品
4.单击创建产品后,可设置如下参数,然后点击确定,创建完成
5.点击左侧导航栏设备标题进入并创建设备,选择产品位刚刚创建的产品名称,确认添加
6.在设备列表里点击查看,查看添加设备的参数,点击查看MQTT参数然后复制
要在代码中修改的参数分别为第7步的8,58,59,60行
7.左侧产品导航栏,进入topic类列表,点击自定义topic,这里的topic能在平台日志上查阅
点击复制update那一行的话题,填入第7步的81行,并修改其中参数为自己的devicename
/+/${deviceName}/user/update | 这里的话题因人而异,请去自己账号复制 |
8.打开arduinoIDE将代码复制到IDE中,这里采用了太极创客的代码,并为了接入阿里云做了修改
太极创客MQTT教程:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
// 设置 wifi 接入信息(请根据您的 WiFi 信息进行修改)
const char* ssid = "路由器名称";
const char* password = "路由器密码";
const char* mqttServer = "mqttHostUrl"; //*MQTT 连接参数你的设备登陆网址*//
// 如以上 MQTT 服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/
Ticker ticker;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
int count; // Ticker 计数用变量
void setup() {
Serial.begin(9600);
//设置 ESP8266 工作模式为无线终端模式
WiFi.mode(WIFI_STA);
// 连接 WiFi
connectWifi();
// 设置 MQTT 服务器和端口号
mqttClient.setServer(mqttServer, 1883);
// 连接 MQTT 服务器
connectMQTTServer();
// Ticker 定时对象
ticker.attach(1, tickerCount);
}
void loop() {
if (mqttClient.connected()) { // 如果开发板成功连接服务器
// 每隔 3 秒钟发布一次信息
if (count >= 3){
pubMQTTmsg();
count = 0;
}
// 保持心跳
mqttClient.loop();
} else { // 如果开发板未能成功连接服务器
connectMQTTServer(); // 则尝试连接服务器
}
}
void tickerCount(){
count++;
}
void connectMQTTServer(){
// 根据 ESP8266 的 MAC 地址生成客户端 ID(避免与其它 ESP8266 的客户端 ID 重名)
String clientId = "clientId"; //_这里的字符串要与自己的设备 MQTT 参数相同_//
String user = "username";
String password = "password";
// 连接 MQTT 服务器,原代码仅传 clientid,通过查阅 pubsubclient.cpp 可发现多个 connect 重载
if (mqttClient.connect(clientId.c_str(),user.c_str(),password.c_str())) {
Serial.println("MQTT Server Connected.");
Serial.println("Server Address: ");
Serial.println(mqttServer);
Serial.println("ClientId:");
Serial.println(clientId);
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(3000);
}
}
// 发布信息
void pubMQTTmsg(){
static int value; // 客户端发布信息用数字
// 确保不同用户进行 MQTT 信息发布时,ESP8266 客户端名称各不相同,
String topicString = "topic 话题名称";//更改自己的 devicename
char publishTopic[topicString.length() + 1];
strcpy(publishTopic, topicString.c_str());
// 建立发布信息。信息内容以 Hello World 为起始,后面添加发布次数。
String messageString = "Hello World " + String(value++);
char publishMsg[messageString.length() + 1];
strcpy(publishMsg, messageString.c_str());
// 实现 ESP8266 向主题发布信息
if(mqttClient.publish(publishTopic, publishMsg)){
Serial.println("Publish Topic:");Serial.println(publishTopic);
Serial.println("Publish message:");Serial.println(publishMsg);
} else {
Serial.println("Message Publish Failed.");
}
}
// ESP8266 连接 wifi
void connectWifi(){
WiFi.begin(ssid, password);
//等待 WiFi 连接,成功连接后输出成功信息
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi Connected!");
Serial.println("");
}
9.下载置 esp8266/esp32 开发板,打开串口助手,有些同学会发现“ MQTT Server Connect Failed. Client State:2 ”的错误
参考大神的方法:
1.将链接的路由器信号从 5GHz 设置成 2.4GHz
2.修改库 pubsubclient.h 头文件的参数
这里采用了第二种方法。
a.找到 arduinoIDE 目录下的 libraries 文件夹默认位置在 /我的文档/arduino/pubsubclient-版本号/src 打开并求改 pubsubclient.h 头文件,找到 MQTT_MAX_PACKET_SIZE,将 256 修改为 1024,再找到 MQTT_KEEPALIVE,将 15 修改为 60
b.再次下载程序至开发板,问题解决并在串口助手中输出一下信息,此时开发板已经连接上了阿里物联网平台,并定时向服务器中的 topic 发布 hello world
10.物联网平台打开设备,并查看日志,发现话题中已经有消息输入了
总结:至此,esp8266 nodemcu 接入阿里物联网平台方法介绍完毕,接入的关键是阿里云物联网平台的使用以及对 arduino 库函数的修改。本文采用的参考方法均已给出网址,请大家自行参阅。