一、MQTT协议概述:
MQTT,一种基于发布/订阅(piblish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上。它可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备、移动应用等方面有广泛的应用。
该协议中有三种身份:发布者(Pbulish)、代理 / 服务器(Broker)、订阅者(Subscribe)。其中消息的发布者和订阅者都是客户端角色,消息代理是服务器,消息发布者可以同时是订阅者。
二、原理:
实现MTQQ协议需要:客户端和服务器端。
MTQQ传输的消息分为:主题(topic)和负载(payload)两部分。
- Topic,可以理解为消息的类型,订阅者订阅后,就会受到该主题消息的消息内容。
- Payload,可以理解为消息的内容,是指订阅者具体要用到的内容。
三、基于Arduino的智能灯控:
1、点灯:
目的:确保灯是否完好。
代码如下:
int relayInput =LED_BUILTIN; //D4
int led= 4; //定义引脚编码
void setup(){
pinMode(relayInput,OUTPUT); //初始化引脚,是一个库
pinMode(led,OUTPUT); //设置了引脚的输出模式
}
void loop(){
digitalWrite(relayInput,LOW); //不断重复运行
}
若灯亮起,则说明灯没有问题,则继续下一步骤。
2,Arduino中编译上传代码:
智能灯控代码如下:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//#define LED 4
uint8_t LED = 4;
//Arduino连接网络,这里使用WiFi热点
const char *ssid = "123456"; // Enter your WiFi name
const char *password = "123456789..."; // Enter WiFi password
//连接MTQQ代理
const char *mqtt_broker = "broker.emqx.io"; //代理名称,与MTQQX中创建的名称相同
const char *topic = "esp8266/led"; //主题名称,与MTQQX中创建的名称相同
const int mqtt_port = 1883; //与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: ");
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("-----------------------");
}
void loop() {
client.loop();
3,Arduino连接WiFi网络
编译上传代码成功后,打开串口查看是否连接WiFi网络成功。
串口如图示:
则说明WiFi网络连接成功。
4,MTQQX中创建连接和连接代理:
下载后打开MTQQX软件后,如图操作:
Client ID、Host和Port需与代码中填写一致。这里使用了默认的代理。
此时表示Arduino成功连接上代理
5,发布消息使Arduino亮灯
在MTQQX的消息框内输入on,并点击发送:
现象:串口收到亮灯消息(如下图),Arduino的灯亮起。
同理在MTQQX消息框中输入off并发送,串口受到熄灯消息,Arduino灯熄灭。
以上便是全部内容,感谢阅览。