esp8266物联网开发四:MQTT再论部控

摘要:
客户connected()){Serial.print;//尝试连接{Serial.println;//订阅主题客户端.Subscribe;}当连接成功时,否则{Serial.print;Serial.print;Serial.println;//等待5秒后重试延迟;}}如果{digitalWrite;//打开Serial.print;}否则{digitalWrite;//关闭灯Serial.print;}电视连续剧println();}Void setup(){Serial.beggin;pinMode;setupWifi();client.setServer;//设置MQTT服务器和使用的端口。1883是默认的MQTT端口client.setCallback;//设置回调方法。当ESP8266收到订阅消息时,将调用此方法}Void loop(){如果(!client.connected()){reconnect();}客户loop();}应该注意,在执行过程中,将首先执行网络操作,然后执行到MQTT服务器的连接。两个操作完成后,我们可以通过MQTTClient进行控制。

之前利用点灯科技的库来使小爱同学控制LED的过程中,我们大略提到了一下MQTT的整体流程,由于其MQTT服务器是由点灯科技提供的,所以对其中的很多连接细节,我们并不知道,本节我们准备通过搭建本地的MQTT服务器,然后通过MQTT Client向MQTT服务器发送控制命令,来控制我们的LED灯。

首先,我们需要启动MQTT服务器,启动方式我们就不需要多说了,之前章节有讲解,启动完毕之后,其连接地址为:192.168.43.2:1883,切记连接地址不可写成127.0.0.1,否则无法连接成功。

然后,开始进行编码操作,具体编码内容如下:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#define JDQ 16

const char* MQTT_SERVER  = "192.168.43.2";
const int   MQTT_PORT    = 1883;
const char* MQTT_USRNAME = "addmin";
const char* MQTT_PASSWD  = "public";
const char* TOPIC = "home/devices/onoff/";
const char* CLIENT_ID    = "scy-mqtt-client";  //当前设备的clientid标志

const char* ssid     = "cxsr";     //待连接WIFI
const char* password = "scy251147";//待连接WIFI密码

WiFiClient espClient;
PubSubClient  client(espClient);
long lastMsg = 0;   

/**
* 连接wifi
*/
void setupWifi(){
  delay(100);
  Serial.println("Startup");
  pinMode(JDQ, OUTPUT);
  WiFi.mode(WIFI_STA);//设置模式为STA
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {//等待WiFi连接成功
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(CLIENT_ID)) {
      Serial.println("connected");
      // 连接成功时订阅主题
      client.subscribe(TOPIC);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

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]); // 打印主题内容
  }
  if ((char)payload[0] == '1') {
    digitalWrite(JDQ, HIGH);   // 亮灯
    Serial.print(" 开灯");
  } else {
    digitalWrite(JDQ, LOW);   // 熄灯
    Serial.print(" 关灯");
  }

  Serial.println();
}

void setup() {
  Serial.begin(115200);
  pinMode(JDQ, OUTPUT);
  setupWifi();
  client.setServer(MQTT_SERVER, MQTT_PORT); //设定MQTT服务器与使用的端口,1883是默认的MQTT端口
  client.setCallback(callback);        //设定回调方式,当ESP8266收到订阅消息时会调用此方法
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

需要说明的是,在执行过程中,将会先进行联网操作,然后进行连接MQTT服务端的操作,这俩操作都进行完毕之后,我们就可以通过MQTT Client来进行控制了。

代码烧写完毕后,通过串口调试窗口,我们可以看到具体的连接情况:

image

之后,我们打开本地的MQTT Client,连接到home/devices/onoff/主题,连接成功后,发送控制代码:

image

这里我发送了1,代表打开继电器,也就是开灯操作,可以看到,灯被我们打开了:

image

当发送0的时候,代表继电器关闭,灯就关了,如图:

image

image

这时候,我们的串口监视器上,可以看到打印的日志如下:

image

如果掉线了,具有掉线重连功能:

esp8266物联网开发四:MQTT再论部控第7张

是不是很好用呢?

免责声明:文章转载自《esp8266物联网开发四:MQTT再论部控》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ra寄存器定位core#ifndef用于避免多重包含下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

IOS(数据库的应用)

在iPhone的开发过程中常常会用到数据库,而SQLite3是iPhone中支持的数据库。下面简单介绍一下iPhone中SQLite3数据库的用法: SQLite3简介 SQLite3是一个轻量级的数据库,完全使用C语言编写,使用简单方便。它是一个嵌入到程序进程的数据库,和其他一些数据库(MySQL,MS SQL)不同,它没有独立的进程。 1、打开数据库...

delphi数据类型

1.Simple: 1.1.Ordinal: Integer: Integer 4byte Cardinal un_4byte Shortint 1byte Smallint 2byte Longint 4byte Int64 8byte Byte un_1byte Word un_2byte LongWord un_4byte Character Cha...

MQTT-Client-FrameWork使用整理

作者: wbl MQTT MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和制动器(比如通过Twitter让房屋联网)的通信协议 MQTT特点 MQTT协议是为大量计算...

大端模式与小端模式

一、介绍  超过一个字节的数据在内存中会用几个字节存储,根据数据在内存的存放方式,分大端模式和小端模式。 大端模式是将数据的高位存在内存的低位地址;小端模式而是将数据的高位存在内存的高位地址,以下是十六进制0x12345678在内存地址的两种存储方式(假设数据是按原码存储),0x12345678中,12是高位,78是低位。 大端模式中把高位(12)存在内...

如何使用 MQTT 报文实现发布订阅功能

MQTT 协议通过交换预定义的MQTT控制报文来通信。下面以 MQTTX 为例,展示如何通过 MQTT 报文实现发布订阅功能。 Connect 连接 MQTT 协议基于 TCP/IP 协议,MQTT Broker 和 Client 都有需要有 TCP/IP 地址。 Broker 如果你暂时没有一个可用的 MQTT Broker,EMQ X 提供了一个公共...

乐鑫esp8266的串口通讯驱动源文件,nonos和rtos版本

代码地址如下:http://www.demodashi.com/demo/13650.html 目录 一、前言; 二、esp8266的串口分布情况; 三、esp8266的串口通讯时候,应该怎么接线; 四、esp8266的NONOS非系统,串口编程; 五、esp8266的RTOS实时系统,串口编程; 一、前言; 我们已经学习esp8266的方方面面...