ESP8266智能灯控

一,MQTT协议

1、MQTT协议可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。

2、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
对负载内容屏蔽的消息传输。
使用 TCP/IP 提供网络连接。

3、实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。ESP8266智能灯控
4、MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)。
(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
ESP8266智能灯控
二、以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创建连接

ESP8266智能灯控
查看窜口监视器存在“Message arrived in topic :esp8266/led (订阅的主题)”
表示mqttx控制端与服务端(代理/mqttx)订阅成功

(4)创建完成后在消息框发送on/off,则led灯会开/关ESP8266智能灯控

上一篇:111-STM32+ESP8266+AIR202基本控制篇-移植单片机MQTT包,实现stm32+esp8266连接MQTT服务器(透传和非透传模式下都有)


下一篇:物联网之智能家居系统设计和实现