2-4 从ESP8266发布数据

ESP8266 家庭自动化项目中文版目录​​​​​​​

通过 Arduino IDE中的 File | New开始一个新草图并粘贴以下代码。引入 ESP8266WiFi 库和 PubSubClient 库:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

使用适合您网络的值更新这些值。使用 ifconfig 获取安装了 Mosquitto 代理的服务器的IP地址。如果您的服务器具有 FQDN 名称(如myiotserver.com)并已注册到 DNS,则可以使用 FQDN 名称代替 mqtt_server 中的IP地址:

const char* wifi_network = "YOUR_WIFI_SSID";
const char* wifi_pass = "YOUR_WIFI_PASSWORD";
const char* mqtt_serv_address = "192.168.1.116";
const int mqtt_port_number = 1883;

实例化 WiFiClient 并将其传递给 PubSubClient

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[5O];
int value = 0;

setup()函数将通过调用 setup_wifi()函数开始将 ESP8266 连接到 Wi-Fi 网络,并通过 client.Setserver()函数设置要使用的 MQTT 服务器和端口:

void setup( ) {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_serv_address, mqtt_port_number);
  void setup_wifi() {
  delay(10);
  //We start by connecting to a WiFi network
  Serial.println();
  Serial.print ("Connecting to ");
  Serial.println(wifi_network);
  WiFi.begin(wifi_network, wifi_pass);
  while (WiFi.status() != WL_CONNECTED) {
    WiFi.begin(wifi_network, wifi_pass);
    Serial.print(".");
    delay(5000);
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

如果从 MQTT 服务器到 ESP8266 模块的保持活动数据包丢失且通信中断,则 reconnect()函数将尝试再次连接到MQTT服务器。此重新连接功能也用于第一次连接服务器。
连接到MQTT服务器后的 ESP8266 。将在 fromEsp8266 主题上发布消息 “Hello world,我是ESP8266!” :
 

void reconnect( ) {
  //Loop until we're reconnected
  while(!client.connected( )) {
    Serial.print("Attempting MQTT connection. ..");
    //Attempt to connect
    if (client.connect("ESP8266Client") ){
      Serial.println("connected");
      // Once connected, publish an announcement. . .
      client.publish("fromEsp8266", "Hello world, I am ESP8266!");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println("try again in 5 seconds");
      //Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

loop 函数将检查与MQTT代理的连接,如果连接出现问题则重新连接到它,并且每两秒钟将在 fromEsp8266 主题上发布一条消息:

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  long now = millis() ;
  if (now - lastMsg> 2000) {
    lastMsg = now;
    ++value;
    snprintf(msg, 75, "Hello world #%ld", value);
    Serial.print( "Publish message: ");
    Serial.println(msg);
    client.publish( " fromEsp8266 ", msg);
  }
}

编译并将代码上传到ESP8266模块后,在终端窗口中订阅fromEsp8266主题。 ESP8266模块发送的消息将显示在终端窗口中:

ESP8266发布的消息

观察:请记住,主题名称区分大小写。作为练习,您可以发送引脚状态(HIGH或LOW),如 第1章ESP8266入门 中所示。

提示:使用 digitalRead(PIN_NUMER)代替数值。

猜你喜欢

转载自blog.csdn.net/countofdane/article/details/86698974
2-4
今日推荐