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[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模块发送的消息将显示在终端窗口中:

ESP8266发布的消息

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

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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值