如果您不想拥有自己的代理,但想要安全的MQTT连接,则可以使用云MQTT实例,例如 http://iotcentral.eu。首先在 iotcentral.eu 上创建一个帐户并确认您的电子邮件地址。之后,您可以登录 iotcental.eu 并获得您的私人指定主题。它是一个八字符代码,例如c5c05211,此代码需要在您的所有主题之前,如下所示:
c5c05211/living/temperature
无论您是发布还是订阅。用以下代码连接到Wi-Fi,然后通过端口8883建立到 iotcentral.eu 云MQTT的安全连接。发送到iotcentral.eu代理的每条消息都像环回一样被收回。
包含的标题文件是 ESP8266WiFi 和 PubSubClient MQTT 类:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
GPIO 12 稍后将用于每次收到消息时闪烁 LED,并且每次收到带有内容 1 的消息时 GPIO 13 将变为高电平,如果消息有效负载为0,则GPIO 13将变为低电平:
#define PIN 12 12
#define PIN_13 13
在此定义Wi-Fi网络的值,SSID和密码,以及使用的MQTT服务器(在此示例中使用了 iotcentral.eu,但您可以使用本地服务器),用户名,密码和基主题(我们需要从您的帐户中的 iotcentral.eu 获取此信息):
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
const char* mqtt_server = " iotcentral.eu";
const char* mqtt_username = " email@email.com"; //email address used on iotcentral. eu
const char* mqtt_password = "*******"; //your password used on iotcentral.eu
#define MQTT CLIENT ID ESP %06X'
#define BASE_ TOPIC "c5c05211" //get it from iot central.eu
char dev_ name [11];
如果在本书的其他示例中,WiFiClient类用于非安全连接,则此处将使用WiFiClientSecure类来创建espClient对象:
WiFiClientSecure espClient;
PubSubClient client (espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
在设置功能中,我们将ESP8266连接到提供的Wi-Fi网络,并将客户端对象写入将要使用的MQTT服务器和端口。在前面的示例中,使用了端口1883。
代理正在侦听端口8883以获得与8883端口的安全连接:
void setup ()
{
pinMode(PIN_12, OUTPUT);
digitalWrite(PIN_12, LOW) ;
pinMode(PIN_13, OUTPUT) ;
digitalWrite(PIN_13, LOW) ;
sprintf(dev_name, MQTT_CLIENT_ID, ESP.getChipId());
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 8883);
client.setCallback(callback);
}
使用以下命令启动Wi-Fi连接:
void setup_wifi() {
delay(10) ;
//First connect to WiFi network .
Serial.print("Connecting to ");
Serial.println(ssid) ;
WiFi.begin(ssid, password) ;
while (WiFi.status( ) != WL_CONNECTED ) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected. My IP address :");
Serial.println(WiFi.localIP());
}
这是每次从代理接收消息时调用的回调函数。如果GPIO 12上连接了LED,则每次收到消息时它将点亮50 ms:
void callback(char* topic, byte* payload, unsigned int length) {
digitalWrite(PIN_12, HIGH);
delay(50);
digitalWrite(PIN_12,LOW);
Serial.print("Message arrived [" );
Serial.print(topic);
Serial.print("] ");
for(inti=0;i<length;i++){
Serial.print((char)payload[i]);
}
Serial. println("");
// Switch ON the LED connected to PIN 13 if an '1' message was received on any topic
if ( (char )payload[O] == '1') {
digitalWrite(PIN_ 13, HIGH);
//Turn the LED on
}
else if ( (char )payload[O] == 'O')
{
digitalWrite(PIN_ 13, LOW);
}
}
如果与代理的连接丢失,请尝试重新连接。如果您想使其更加强大,您还可以验证Wi-Fi连接并尝试重新连接到Wi-Fi路由器,然后再连接到MQTT代理:
void reconnect( ) {
// Loop until we ' re reconnected
while (!client.connected()) {
Serial.print("Start MQTT connection. . .");
if (client.connect(dev_name, mqtt_username, mqtt_password)) {
Serial.print("connected to MQTT broker");
Serial.println(mqtt_server);
client.subscribe(BASE_TOPIC"/#");
} else {
Serial.print("Failed to connect. Error code :");
Serial.println(client.state());
Serial. println("try again in 5 seconds");
// Disconnect and wait 5 seconds before retrying
client.disconnect();
delay(5000);
}
}
主循环代码检查ESP8266是否仍然连接到 iotcentral.eu MQTT代理。如果失败,它将尝试重新连接。每秒递增一个值并在消息中将此值发布给代理:
void loop() {
if (!client.connected()){
Serial.println("Reconnect to the broker....");
reconnect();
}
client.loop();
long now = millis();
if (now lastMsg > 1000) {
lastMsg = now;
++value;
snprintf(msg, 75," Sending message #%ld", value );
Serial.print("Send to MQTT broker message:");
Serial.println(msg);
client.publish(BASE_TOPIC" /outTopic", msg);
}
}
因为在重新连接功能中,我们订阅了:
client.subscribe(BASE_TOPIC"/#") ;
我们正在发布:
client.publish(BASE_TOPIC"/outTopic", msg);
每次发送消息时,代理都会将其发回。打开串行终端,您将看到以下消息:
Message arrived [c5c05211/outTopic] Sending message
#2048
Send to MQTT broker message: Sending mess age
#2049
Message arrived [c5c05211/outTopic] Sending message
#2049
Send to MQTT broker message: Sending message
#2050
Message arrived [c5c05211/outTopic] Sending message
#2050
Send to MQTT broker message: Sending mess age
#2051
Message arrived [c5c05211/outTopic] Sending message
#2051
Send to MQTT broker message: Sending message
#2052
Message arrived [c5c05211/outTopic] Sending message
#2052
Send to MQTT broker message: Sending message
#2053
Message arrived [c5c05211/outTopic] Sending message
#2053
Send to MQTT broker message: Sending message
#2054
Message arrived [c5c05211 /outTopic] Sending message
#2054