一,MQTT协议
1、MQTT协议可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。
2、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
对负载内容屏蔽的消息传输。
使用 TCP/IP 提供网络连接。
3、实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
4、MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)。
(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
二、以ESP8266为例子,利用wifi控制led开关灯
1、下载好arduino与建好开发环境,下载mqttx软件
arduino网盘链接:https://pan.baidu.com/s/17JssunSXxiyJYVaCRy7Mng
提取码:qtzs
mqttx软件链接:https://pan.baidu.com/s/10OlkgaQaYIwpxcIj4abD-w
提取码:qtzs
2、确保灯是正常的:通过上传以下代码,若灯亮起则没问题。
int relayInput =LED_BUILTIN; //D4
int led= 4; //定义引脚编码
void setup(){
pinMode(relayInput,OUTPUT); //初始化引脚,是一个库
pinMode(led,OUTPUT); //设置了引脚的输出模式
}
void loop(){
digitalWrite(relayInput,LOW); //不断重复运行
}
3、通过输出on/off来控制灯的开关
(1)上传代码
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// GPIO 5 D1
//#define LED 2
uint8_t LED = 2;
//这里使用 WiFi热点,简便即打开手机热点
const char *ssid = "111"; // Enter your WiFi name(wifi名称)
const char *password = "12345678"; // Enter WiFi password(wifi密码)
// MQTT Broker(连接MQTT代理)
const char *mqtt_broker = "broker.emqx.io";//1.代理名称,与MTQQX中创建的名称相同
const char *topic = "esp8266/led";//2.主题名称,与MTQQX中创建的名称相同
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;//3.与MTQQX中创建的名称相同
//这里三项都使用了MTQQ的默认代理
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
// Set software serial baud to 115200;
Serial.begin(115200);
//LED initial
pinMode(LED, OUTPUT);
digitalWrite(LED, HIGH);
// connecting to a WiFi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");//窗口监视器显示wifi连接中
}
Serial.println("Connected to the WiFi network");//提示wifi连接成功
//connecting to a mqtt broker
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
String client_id = "esp8266-client-";
client_id += String(WiFi.macAddress());
Serial.println("Connecting to public emqx mqtt broker.....");//提示正在连接服务器
if (client.connect(client_id.c_str())) {
Serial.println("Public emqx mqtt broker connected");//提示成功连接到服务器
} else {
Serial.print("failed with state ");//提示连接失败
Serial.print(client.state());
delay(2000);
}
}
// publish and subscribe
client.publish(topic, "hello emqx");
client.subscribe(topic);
}
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("Message arrived in topic: ");//表示mqttx与设备订阅
Serial.println(topic);
Serial.print("Message:");//向代理发送信息
String message;
for (int i = 0; i < length; i++) {
message = message + (char) payload[i]; // convert *byte to string
}
Serial.print(message);//判断信息内容,若为on开灯,off关灯
if (message == "on") { digitalWrite(LED, LOW); } // LED on
if (message == "off") { digitalWrite(LED, HIGH); } // LED off
Serial.println();
Serial.println
(2)上传后查看窜口监视器显示内容
Connected to the WiFi network :表示wifi连接成功
Public emqx mqtt broker connected :表示成功连接到服务器
(3)打开mqttx软件
首先点击“ + ”号添加网络
内容:name、Client ID任意
Host、Port与以上代码相同(通常已默认)
最后点击connet创建连接
查看窜口监视器存在“Message arrived in topic :esp8266/led (订阅的主题)”
表示mqttx控制端与服务端(代理/mqttx)订阅成功
(4)创建完成后在消息框发送on/off,则led灯会开/关