使用ESP8266连接MQTT.fx客户端
-
ESP8266的Arduino开发环境里有多个MQTT库,使用的库为主流的PubSubClient库
-
库的获取:
注意选择 作者名为Nick O’Leary的库
- 官网地址:https://pubsubclient.knolleary.net/
- GitHub:https://github.com/knolleary/pubsubclient/
- 百度网盘下载: https://pan.baidu.com/s/12MHGbdfiOdwOGip5RMSSEQ 提取码: sizy
- ArduinoIDE中自带的库管理器安装
-
ESP8266程序:
/*
# 程序目的:实现ESP8266连接MQTT服务器端()然也物理网
# 创建时间:2022-12-24
# 函数:
## wifi对象:WiFi.SSID();WiFi.localIP(); WiFi.macAddress(); WiFi.mode(WIFI_STA); ## mqttClient对象:mqttClient.setServer(网站, 端口号); mqttClient.connected(); mqttClient.loop(); mqttClient.connect(订阅者的ID.c_str()); mqttClient.state();
# 程序思路:串口初始化->连接wifi->设置MQTT服务器和端口号->连接MQTT服务器(自建函数)->loop函数中检查是否连接->保持客户端 心跳
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti My_WifiMulti; //wifi连接对象
WiFiClient My_wifiClient; //Wifi对象 只有在建立mqttClient对象参数时候有用
PubSubClient mqttClient(My_wifiClient); //建立订阅者
const char* mqttServerSite = "test.ranye-iot.net"; //连接的服务器 注意:不能用string类型
//函数声明
int WiFi_Connect();
void My_connectMQTTServer();
void setup() {
Serial.begin(9600);
//设置ESP8266工作模式为无线终端模式
WiFi.mode(WIFI_STA);
//wifi连接
WiFi_Connect();
//设置MQTT服务器和端口号
mqttClient.setServer(mqttServerSite, 1883);
//连接MQTT服务器
My_connectMQTTServer();
}
void loop() {
if (mqttClient.connected()) //监测是否处于连接状态
{
mqttClient.loop(); //为了保持客户端心跳
} else {
My_connectMQTTServer();
}
}
/*
客户端连接服务器端函数
注意:需要提前建立mqttClient对象
*/
void My_connectMQTTServer()
{
// 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
String clientID="ESP8266-" + WiFi.macAddress();//获取ESP8266的MAC地址
//连接MQTT服务器
if(mqttClient.connect(clientID.c_str()))//注意:这里的String.c_str是对字符串的处理
{
Serial.println("MQTT Server Connected.");
Serial.print("Server Address: ");
Serial.println(mqttServerSite);
Serial.print("ClientId:");
Serial.println(clientID);
Serial.print("Client State:");
Serial.println(mqttClient.state());
}
else
{
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(3000);
}
}
/*
wifi连接函数
需引 ESP8266WiFiMulti.h 库 并建立ESP8266WiFiMulti对象
*/
int WiFi_Connect() {
My_WifiMulti.addAP("TPLINK2.4G", "@@@@@@@@"); // Wifi1
My_WifiMulti.addAP("username2", "password"); // Wifi2
My_WifiMulti.addAP("username3", "password"); // Wifi3
int i = 0;
Serial.print("\n-------------Connected Time:-------------\n");
while (My_WifiMulti.run() != WL_CONNECTED) {
i += 1;
Serial.print(i);
Serial.println("->");
delay(1000);
if (i > 15) {
Serial.print("\n-------------WIFI connected failed!-------------\n");
return 0;
}
}
Serial.println("\n-------------WIFI connected successful!-------------\n");
Serial.println("\n-------------WIFI Name:-------------");
Serial.println(WiFi.SSID());
Serial.println("\n-------------ESP8266 IP address:-------------");
Serial.println(WiFi.localIP());
Serial.println("\n-------------------------------------------");
return 1;
}