一、MQTT环境搭建
- 安装MQTT Broker: mosquitto
- 安装mqtt.fx 详情见该文章:https://blog.youkuaiyun.com/Mculover666/article/details/103799033
- 测试是否安装成功:
注意Broker Address,我这里使用的是官方的测试服务器,Client ID根据需要自行设置
设置两个不同的Client ID和Profile Name 看能否实现订阅和发送功能:
如图,设置主题为日期,test1发布,test2订阅,成功收到了hello world的信息,说明环境配置成功
二、将开发板连上WIFI和MQTT客户端
1.开发板连入WIFI
- 需要安装的库:
- 需要的头文件和全局变量:
#include <ESP8266WiFi.h>
const char* ssid = ""; //WIFI名
const char* password = ""; //WiFi密码
- setup函数中设置
setup_wifi();
- setup_wifi函数体
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
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");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
- 完整连WiFi程序
#include <ESP8266WiFi.h>
const char* ssid = ""; //WIFI名 根据自己情况输入
const char* password = ""; //WiFi密码 根据自己情况输入
void setup() {
Serial.begin(115200); //必备
setup_wifi();
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
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");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {}
- 观察上板子的结果
2.在连WIFI基础上连上MQTT
- 用到的库
- 用到的头文件和配置
#include <PubSubClient.h>
const char* mqtt_server = "your address"; //mqtt服务器地址
WiFiClient espClient;
PubSubClient client(espClient);
- setup函数中配置
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
- 用到的其他函数
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("Your Client ID"))
{
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("Your Topic", "The message you want to publish"); //在给定主题下发布信息
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
- 完整的连WIFI,连MQTT程序:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = ""; //WIFI名
const char* password = ""; //WiFi密码
const char* mqtt_server = ""; //mqtt服务器地址
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
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");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length)
{
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("")) //Client ID
{
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("your topic", "the message you want to send"); //在给定的主题发布给定的消息
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
delay(2000);
}
- 运行结果:
至此,完成了esp8266和MQTT客户端之间的连接,并实现了信息的发送
三、将温湿度数据通过MQTT传到客户端
- 用到的库
- 用到的头文件和配置
#include "DHT.h"
#define DHTPIN 5
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE, 15);
- 在loop函数当中实现对温湿度数据的处理和发送
float h = dht.readHumidity();
float t = dht.readTemperature();
char c[50];
String data ="温度:"+String(t) +"℃"+","+"湿度:"+ String(h)+"%" ; //生成要传输的数据
strcpy(c,data.c_str());
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 2000) //一点时间间隔
{
lastMsg = now;
++value;
snprintf (msg, 75, c, value);
Serial.print("Publish message: ");
Serial.println(msg);
client.publish("ouTopic", msg);
}
- 整体运行结果
总结
操作并不是很困难,主要是Arduino各种库和函数的使用,希望对读者有帮助。