2-4 从ESP8266发布数据

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

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

#include 
#include 

使用适合您网络的值更新这些值。使用 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[50];
int value = 0;

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


void setup_wifi(){
  delay(10);
  //We start by connecting to a WiFinetwork
  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);
  }
  
}

void setup(){
  Serial.begin(115200);
  setup_wifi();
  // mqtt_serv_address
  client.setServer(mqtt_serv_address,mqtt_port_number);
  Serial.println("");
  Serial.println("WiFiconnected");
  Serial.println("IPaddress:");
  Serial.println(WiFi.localIP());
}

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

void reconnect(){
  //Loopuntilwe'rereconnected
  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 againin 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模块发送的消息将显示在终端窗口中:

2-4 从ESP8266发布数据_第1张图片 ESP8266发布的消息

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

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

你可能感兴趣的:(ESP8266,ESP8266家庭自动化项目)