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模块发送的消息将显示在终端窗口中:
ESP8266发布的消息观察:请记住,主题名称区分大小写。作为练习,您可以发送引脚状态(HIGH或LOW),如 第1章ESP8266入门 中所示。
提示:使用 digitalRead(PIN_NUMER)代替数值。