首页 > 其他分享 >ESP32 Arduino开发 MQTT

ESP32 Arduino开发 MQTT

时间:2024-04-13 19:46:29浏览次数:23  
标签:const Arduino ESP32 MQTT char mqtt client 连接

ESP32 Arduino开发 MQTT

目录

1. 安装程序库

  1. 打开库管理工具

工具 -> 管理库...

  1. 查找所需要的程序库
    安装PubSubClient

2. 编写相关程序

2.1. 引入头文件

在保证网络连接的前提之下,才可以连接MQTT。
所以需要引入<WiFi.h>的库。

#include <WiFi.h>
#include <PubSubClient.h>

2.2. 定义MQTT相关参数

MQTT相关参数可以分为3个部分:一是方便开发所设计的宏定义参数,二是网络连接所需要的信息,三是MQTT连接所需要的信息。

MQTT连接所需要的信息包括:

  1. MQTT服务器(选用EMQX的开源测试服务器
  2. MQTT主题
  3. 用户名
  4. 密码
  5. 端口号
  6. 服务器ID
#define MAX_RETRIES 20          // 网络最大连接次数
#define MQTT_CALLBACK 1         // 是否开启MQTT回调函数

const char* ssid="HTB";         // 网络信息
const char* pass="htb66666666";

// 设置MQTT borker信息
const char *mqtt_broker = "broker-cn.emqx.io";  
const char *topic = "mqtt_hbb_example";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;
const char *client_id = "mqtt-client-hbb-example";

2.3. 创建对象

创建MQTT服务器对象

WiFiClient espClient;
PubSubClient client(espClient);

2.4. 连接网络

网络连接函数是在之前的教程《ESP32 Arduino开发 网络连接》的基础上进行了小部分的修改,将其封装成函数,返回值表示网络是否连接成功。

// 网络连接函数
bool connectWifi(){
  Serial.println("调用WiFi连接函数");
  WiFi.begin(ssid, pass);

  for(int i=0; i<MAX_RETRIES; i++){
    delay(500);
    if(WiFi.status()==WL_CONNECTED){
      Serial.println("网络连接成功");
      return true;
    }
  }
  if(WiFi.status()!=WL_CONNECTED){
    Serial.println("网络连接超时");
    return false;
  }
}

2.5. 连接MQTT服务器

  1. 通过setServer函数设置服务器地址及端口号
  2. #if#endif是预处理命令,跟if语句的作用类似,如果宏为真,则执行其中的语句,如果宏为假,则其中的语句不编译
  3. 先要保证Wi-Fi连接处于正常状态,再执行MQTT的连接函数。MQTT连接整体的程序设计思路与Wi-Fi连接是一致的。
// MQTT服务器连接函数
bool connectMqtt(){
  Serial.println("调用MQTT连接函数");
  client.setServer(mqtt_broker, mqtt_port);

  #if MQTT_CALLBACK
  Serial.println("调用MQTT回调函数");
  client.setCallback(mqttCallback);
  #endif

  if(WiFi.status()==WL_CONNECTED){
    for(int i=0; i<MAX_RETRIES; i++){
      delay(1000);
      if(client.connect(client_id, mqtt_username, mqtt_password)){
        Serial.println("MQTT服务器连接成功");
        return true;
      }
    }
    if(!client.connected()){
      Serial.println("MQTT服务器连接超时");
      return false;
    } 
  }else{
    Serial.println("网络连接失败");
    return false;
  }
}

2.6. MQTT回调函数

未完待续

3. 完整的代码例程

#include <WiFi.h>
#include <PubSubClient.h>

#define MAX_RETRIES 20          // 网络最大连接次数
#define MQTT_CALLBACK 1         // 是否开启MQTT回调函数

const char* ssid="HTB";         // 网络信息
const char* pass="htb66666666";

const char *mqtt_broker = "broker-cn.emqx.io";  // 设置MQTT borker信息
const char *topic = "mqtt_hbb_example";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;
const char *client_id = "mqtt-client-hbb-example";

// String client_id = "esp32-client-" + String(WiFi.macAddress()); // 服务器id设置为wifi的物理地址

WiFiClient espClient;
PubSubClient client(espClient);

// MQTT监听函数
void mqttCallback(char *topic, byte *payload, unsigned int length) {
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
  Serial.print("Message:");
  String charPayload;
  for (int i = 0; i < length; i++) {
    charPayload += (char) payload[i];
  }
  Serial.println(charPayload);
  Serial.println("-----------------------");
}

// 网络连接函数
bool connectWifi(){
  Serial.println("调用WiFi连接函数");
  WiFi.begin(ssid, pass);

  for(int i=0; i<MAX_RETRIES; i++){
    delay(500);
    if(WiFi.status()==WL_CONNECTED){
      Serial.println("网络连接成功");
      return true;
    }
  }
  if(WiFi.status()!=WL_CONNECTED){
    Serial.println("网络连接超时");
    return false;
  }
}

// MQTT服务器连接函数
bool connectMqtt(){
  Serial.println("调用MQTT连接函数");
  client.setServer(mqtt_broker, mqtt_port);

  #if MQTT_CALLBACK
  Serial.println("调用MQTT回调函数");
  client.setCallback(mqttCallback);
  #endif

  if(WiFi.status()==WL_CONNECTED){
    for(int i=0; i<MAX_RETRIES; i++){
      delay(1000);
      if(client.connect(client_id, mqtt_username, mqtt_password)){
        Serial.println("MQTT服务器连接成功");
        return true;
      }
    }
    if(!client.connected()){
      Serial.println("MQTT服务器连接超时");
      return false;
    } 
  }else{
    Serial.println("网络连接失败");
    return false;
  }
}

void setup() {
  Serial.begin(115200);
  if(connectWifi()){
    connectMqtt();
  };
}

void loop() {
  // put your main code here, to run repeatedly:

}

4. MQTT连接测试

未完待续

标签:const,Arduino,ESP32,MQTT,char,mqtt,client,连接
From: https://www.cnblogs.com/HoNorthNorth/p/18133265

相关文章

  • 使用 flash_download_tool 下载 Vscode PlatformIO 开发 ESP32 的 bin 文件
    一言蔽之:先使用PlatformIO的命令找到PlatformIO是怎么烧录的,然后照葫芦画瓢即可。前提,VScode已经能够烧录固件了,使用PlatformIO打开所需的项目。打开VScode终端执行:piorun-v-tupload执行了之后,PlatformIO就开始编译固件并上传了,找到关键性的东西<lambda>(["up......
  • 上海泗博推出OPLink软件---助力企业快速搭建OPC与MQTT平台通信
    OPLink是上海泗博自主研发的基于OPC数据采集及转发,OPC数据到MQTT通信的产品。它是基于上海泗博多年的OPC应用经验和工业通信产品的开发背景,推出的OPC/MQTT工业通信软件。这款软件设计简洁、实用、稳定。同时,OPLink还具备与KepwareLinkMaster相似的数据转发功能,可实现PLC设备间的......
  • MQTT协议特点及数据包结构详解(值得珍藏)
    点击下载《MQTT协议特点及数据包结构详解(值得珍藏)》1.前言MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,用极少的代码和有......
  • python收到MQTT消息后再发http请求
    python收MQTT消息和 发http请求的代码在前面的文章都有介绍,这里直接上完整的功能代码mqtt2http.py#python3.6importloggingimportrandomimporttimeimportrequests#frompaho.mqttimportclientasmqtt_clientimportpaho.mqtt.clientasmqttBROKER='......
  • python收到MQTT消息后写入mySQL
    python收MQTT消息和写mySQL的代码在前面的文章都有介绍,这里直接上完整的功能代码mqtt2mysql.py#python3.6importloggingimportrandomimporttimeimportmysql.connector#frompaho.mqttimportclientasmqtt_clientimportpaho.mqtt.clientasmqttBROKER......
  • python写的收Udp消息后,再发到 MQTT 的例子
    收到Udp消息后,再发到MQTT的例子完整代码udp2mqtt.pyimportjsonimportloggingimportrandomimportsocketimporttimeimportpaho.mqtt.clientasmqtt_clientBROKER='*******.ala.cn-hangzhou.emqxsl.cn'PORT=8084TOPIC="python-mqtt/wss"CLIEN......
  • MQTT基础
    1、MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议2、MQTT历史:MQTT协议最初版本是在1999年建立的。他们当时正在开发一个利用卫星通讯监控输油管道的项目。为了实现这个项目要求,他们需要开发一种用于嵌入式设备的通讯协议,这种通讯协议必须满足以下条件:易于实现数......
  • MQTT用python写的收消息例子
    在MQTT官网给的sub_wss.py例子中修改改写自己的用户名和密码BROKER='*******.ala.cn-hangzhou.emqxsl.cn'//改成自己的连接地址USERNAME='**************'//用户名PASSWORD='*************'//密码注意这句是改使用v1回调API(与旧版本的库一起使用)。原......
  • esp32-C3
    一、esp端        ESP32由EspressifSystems打造,是一款低成本、低功耗的系统具有Wi-Fi和双模蓝牙功能的片上(SoC)系列!ESP32系列包括芯片 ESP32-D0WDQ6(和ESP32-D0WD), ESP32-D2WD 电子版, ESP32-S0WD系列,以及系统级封装(SiP)ESP32-PICO-D4。它的核心是双核或单......
  • SpringBoot集成mqtt启动就不断报已断开连接问题
    踩坑记录,实在是天坑!!!原因一:clientId相同,即clientId重复导致(不过我不是这个问题)我的问题是:项目启动成功后,控制台不停地反复输出:已断开连接,,,加了重连机制后,则不停地输出:重连失败,已连接客户机,,,尼玛,,关键点还在于我能接收到订阅的消息(不影响消息处理),这又是什么情况,明明没断连,确一直......