6-2 安全保护ESP8266与MQTT代理之间的连接

如果您不想拥有自己的代理,但想要安全的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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ESP8266移植到MQTT是一种常见的方式,以实现物联网设备与云平台之间的通信。下面是一个简要的描述该过程的答案: ESP8266是一款低成本、低功耗、高性能的Wi-Fi微控制器,而MQTT是一种轻量级的通信协议,广泛用于物联网设备间的通信。将ESP8266移植到MQTT旨在利用ESP8266的Wi-Fi功能,将其作为一个MQTT客户端,与MQTT代理服务器进行通信。 首先,我们需要确保ESP8266的Wi-Fi功能模块已正确配置,可以与Wi-Fi网络进行连接。然后,我们需要在ESP8266上安装适当的MQTT库,例如PubSubClient。这个库将提供所需的MQTT功能,如连接、发布和订阅等。 接下来,我们需要在代码中设置与MQTT服务器相关的参数,如服务器地址、端口号、用户名、密码等。然后,我们可以使用MQTT库提供的函数,例如`mqtt.connect()`来连接MQTT服务器。 一旦成功连接MQTT服务器,我们就可以使用`mqtt.publish()`函数向主题发布消息,使用`mqtt.subscribe()`函数订阅特定主题,接收服务器发送的消息。通过这种方式,ESP8266就可以与MQTT代理服务器进行双向通信。 需要注意的是,ESP8266的资源相对有限,因此需要根据实际应用的需求来设计代码。例如,可以使用低功耗模式来节省电能,或者根据需要实现数据缓存和同步等机制来处理通信中可能出现的问题。 总结起来,将ESP8266移植到MQTT需要配置Wi-Fi功能、安装适当的MQTT库、设置相关参数,然后使用MQTT函数进行连接和通信。这样,我们就能够实现ESP8266MQTT代理服务器之间的通信,从而实现物联网设备的云平台连接
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值