MQTT协议的智能灯控

一、MQTT协议概述:

MQTT,一种基于发布/订阅(piblish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上。它可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备、移动应用等方面有广泛的应用。

该协议中有三种身份:发布者(Pbulish)、代理 / 服务器(Broker)、订阅者(Subscribe)。其中消息的发布者和订阅者都是客户端角色,消息代理是服务器,消息发布者可以同时是订阅者。

二、原理:

MQTT协议的智能灯控

实现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网络成功。

串口如图示:

MQTT协议的智能灯控

则说明WiFi网络连接成功。

4,MTQQX中创建连接和连接代理:

下载后打开MTQQX软件后,如图操作:

MQTT协议的智能灯控

Client ID、Host和Port需与代码中填写一致。这里使用了默认的代理。

MQTT协议的智能灯控

此时表示Arduino成功连接上代理

5,发布消息使Arduino亮灯

在MTQQX的消息框内输入on,并点击发送:

MQTT协议的智能灯控

现象:串口收到亮灯消息(如下图),Arduino的灯亮起。

MQTT协议的智能灯控

同理在MTQQX消息框中输入off并发送,串口受到熄灯消息,Arduino灯熄灭。

以上便是全部内容,感谢阅览。

上一篇:迄今为止最好的arduino开发平台:vscode+platformio,秒杀arduino ide。及vscode+pio对比arduino ide对比Stduino


下一篇:数据智能:工具之王