初出茅庐的小李博客之使用立创开发板(ESP32)连接到EMQX Platform【MQTT TLS/SSL 端口连接】

news2024/11/25 11:50:49

介绍

手上有一块立创开发板,本着不吃灰的原则把它用起来,今天就来用它来连接上自己部署的MQTT服务器进行数据通信。

硬件:立创开发板
开发环境:Arduino IDE Win11
MQTT 平台:EMQX Platform

在这里插入图片描述

立创开发板介绍:

初出茅庐的小李博客之立创开发板初体验【Arduino IDE开发环境】:
地址:https://blog.csdn.net/weixin_43176183/article/details/139101412?spm=1001.2014.3001.5501

MQTT.fx客户端接入EMQX Platform

初出茅庐的小李博客之MQTT.fx客户端接入EMQX Platform
地址:https://blog.csdn.net/weixin_43176183/article/details/139190727?spm=1001.2014.3001.5501

参考文档:
https://docs.emqx.com/zh/cloud/latest/connect_to_deployments/esp32.html

过程记录:

安装MQTT依赖库

在 Arduino IDE 中完成以下安装。
先安装 ESP32 开发板。
点击工具 -> 开发板 -> 开发板管理。搜索 ESP32,点击安装 我已经安装过。
安装 PubSub client 库
点击项目 -> 加载库 -> 管理库…。搜索 PubSubClient,安装 PubSubClient by Nick O’Leary。
通过 TCP 端口连接
在这里插入图片描述

写代码

  • 引入对应的库

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

  • 定义用户自定义参数

// WiFi Credentials
const char *ssid     = "AQST";             // Replace with your WiFi name
const char *password = "12345678";         // Replace with your WiFi password

// MQTT Broker Settings
const char *mqtt_broker   = "xxxxxx.ala.cn-hangzhou.emqxsl.cn";//这里定义自己的连接地址
const char *mqtt_topic    = "emqx/esp32";
const char *mqtt_username = "AQ";
const char *mqtt_password = "123456";
const int   mqtt_port     = 8883;

  • 编写连接代码【准确的来说叫改写】
/连接Wifi热点函数
void ConnectToWiFi(void) 
{
    WiFi.begin(ssid, password);
    Serial.print("Connecting to WiFi");
    while (WiFi.status() != WL_CONNECTED)
    {
      delay(500);
      Serial.print(".");
    }
    Serial.println("\nConnected to WiFi");
}
//连接MQTT代理函数
void ConnectToMQTT(void) 
{
  while (!mqtt_client.connected())
  {
    String client_id = "esp32-client-" + String(WiFi.macAddress());
    Serial.printf("Connecting to MQTT Broker as %s...\n", client_id.c_str());
    if(mqtt_client.connect(client_id.c_str(), mqtt_username, mqtt_password)) 
    {
      Serial.println("Connected to MQTT broker");
      mqtt_client.subscribe(mqtt_topic);
      mqtt_client.publish(mqtt_topic, "Hi EMQX I'm ESP32 by Arduino IED ^^");  // Publish message upon connection
    }
    else 
    {
      Serial.print("Failed to connect to MQTT broker, rc=");
      Serial.print(mqtt_client.state());
      Serial.println(" Retrying in 5 seconds.");
      delay(5000);
    }
  }
}
//MQTT 回调函数
void MqttCallback(char *topic, byte *payload, unsigned int length)
{
  Serial.print("Message received on topic: ");

  Serial.println(topic);

  Serial.print("Message: ");

  for (unsigned int i = 0; i < length; i++) 
  {
     Serial.print((char) payload[i]);//打印有效载荷的信息
  }

  Serial.println("\n-----------------------");
}

  • 函数调用

void setup(void)
{
    Serial.begin(115200);                         //设置串口参数

    ConnectToWiFi();                              //连接Wifi热点

    // Set Root CA certificate
    espClient.setCACert(ca_cert);                 //设置CA证书

    mqtt_client.setServer(mqtt_broker, mqtt_port);//指定代理 指定端口

    mqtt_client.setKeepAlive(60);                 //保活时间

    mqtt_client.setCallback(MqttCallback);        //回调函数

    
    ConnectToMQTT();                              //连接MQTT 代理

}


void loop(void) 
{
  if (!mqtt_client.connected()) 
  {
    ConnectToMQTT();
  }
  mqtt_client.loop();
}

特别提示:这里的地址要写自己的地址 CA证书也要用自己的证书 否则连不上

官方原话:
添加服务端证书。如果您在使用公共 MQTT Broker、Serverless 部署或基础版部署的 TLS/SSL 端口连接,在此下载 CA 证书。 如您使用专业版 / BYOC 部署的 TLS/SSL 端口连接,请使用自己的服务端证书。

  • 开启MQTT服务器
    在这里插入图片描述

  • 编译烧录代码

在这里插入图片描述

用MQTT.fx连接到MQTT服务器跟ESP32开发板进行通信

发布消息:

在这里插入图片描述

ESP32收到订阅消息

在这里插入图片描述
这里可以看到开发板收到了消息 但是客户端提示收到的消息不是标准json
在这里插入图片描述
改进一下发送的数据格式

{
	"mag": "This is Json Data"
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

总结:

利用Arduino IED 进行MQTT通信 确实很方便,很容易就能实现两个设备的交互、但是使用库的缺点也很明显 有很多api不太懂它的意思,还需要进一步研究。

完整代码


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


// WiFi Credentials
const char *ssid     = "AQST";             // Replace with your WiFi name
const char *password = "12345678";         // Replace with your WiFi password

// MQTT Broker Settings
const char *mqtt_broker   = "xxxxxxx.ala.cn-hangzhou.emqxsl.cn";//这里要改成自己的地址!!!!
const char *mqtt_topic    = "emqx/esp32";
const char *mqtt_username = "AQ";
const char *mqtt_password = "123456";
const int   mqtt_port     = 8883;



WiFiClientSecure espClient;
PubSubClient mqtt_client(espClient);

void ConnectToWiFi(void);//函数声明
void ConnectToMQTT(void);//函数声明
void MqttCallback(char *mqtt_topic, byte *payload, unsigned int length);//函数声明

const char *ca_cert = R"EOF(
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
)EOF";


void setup(void)
{
    Serial.begin(115200);                         //设置串口参数

    ConnectToWiFi();                              //连接Wifi热点

    // Set Root CA certificate
    espClient.setCACert(ca_cert);                 //设置CA证书

    mqtt_client.setServer(mqtt_broker, mqtt_port);//指定代理 指定端口

    mqtt_client.setKeepAlive(60);                 //保活时间

    mqtt_client.setCallback(MqttCallback);        //回调函数

    
    ConnectToMQTT();                              //连接MQTT 代理

}

//连接Wifi热点函数
void ConnectToWiFi(void) 
{
    WiFi.begin(ssid, password);
    Serial.print("Connecting to WiFi");
    while (WiFi.status() != WL_CONNECTED)
    {
      delay(500);
      Serial.print(".");
    }
    Serial.println("\nConnected to WiFi");
}
//连接MQTT代理函数
void ConnectToMQTT(void) 
{
  while (!mqtt_client.connected())
  {
    String client_id = "esp32-client-" + String(WiFi.macAddress());
    Serial.printf("Connecting to MQTT Broker as %s...\n", client_id.c_str());
    if(mqtt_client.connect(client_id.c_str(), mqtt_username, mqtt_password)) 
    {
      Serial.println("Connected to MQTT broker");
      mqtt_client.subscribe(mqtt_topic);
      mqtt_client.publish(mqtt_topic, "Hi EMQX I'm ESP32 by Arduino IED ^^");  // Publish message upon connection
    }
    else 
    {
      Serial.print("Failed to connect to MQTT broker, rc=");
      Serial.print(mqtt_client.state());
      Serial.println(" Retrying in 5 seconds.");
      delay(5000);
    }
  }
}
//MQTT 回调函数
void MqttCallback(char *topic, byte *payload, unsigned int length)
{
  Serial.print("Message received on topic: ");

  Serial.println(topic);

  Serial.print("Message: ");

  for (unsigned int i = 0; i < length; i++) 
  {
     Serial.print((char) payload[i]);//打印有效载荷的信息
  }

  Serial.println("\n-----------------------");
}


void loop(void) 
{
  if (!mqtt_client.connected()) 
  {
    ConnectToMQTT();
  }
  mqtt_client.loop();
}





// WiFiClient espClient;
// PubSubClient mqtt_client(espClient);

// void setup(void) 
// {
//   Serial.begin(115200);
//   ConnectToWiFi(); //连接指定热点
//   //mqtt_client.setServer(mqtt_broker, mqtt_port);
//   espClient.setCACert(ca_cert);
//   mqtt_client.setKeepAlive(60);
//   mqtt_client.setCallback(MqttCallback); // Corrected callback function name
//   ConnectToMQTT();
// }

// void loop(void) 
// {
//   if (!mqtt_client.connected()) 
//   {
//     ConnectToMQTT();
//   }
//   mqtt_client.loop();
// }

//用户自定义函数
// void ConnectToWiFi(void) 
// {
//     WiFi.begin(ssid, password);
//     Serial.print("Connecting to WiFi");
//     while (WiFi.status() != WL_CONNECTED) 
//     {
//         delay(500);
//         Serial.print(".");
//     }
//     Serial.println("\nConnected to WiFi");
// }
// //用户自定义函数
// void ConnectToMQTT(void) 
// {
//   while (!mqtt_client.connected()) 
//   {
//     String client_id = "esp32-client-" + String(WiFi.macAddress());

//     Serial.printf("Connecting to MQTT Broker as %s.....\n", client_id.c_str());

//     if (mqtt_client.connect(client_id.c_str(), mqtt_username, mqtt_password))
//     {
//       Serial.println("Connected to MQTT broker");
//       mqtt_client.subscribe(mqtt_topic);
//       mqtt_client.publish(mqtt_topic, "Hi EMQX I'm ESP32 ^^"); // Publish message upon successful connection
//     }
//     else 
//     {
//       Serial.print("Failed, rc=");
//       Serial.print(mqtt_client.state());
//       Serial.println(" try again in 5 seconds");
//       delay(5000);
//     }
//   }
// }

//用户自定义回调函数
// void MqttCallback(char *mqtt_topic, byte *payload, unsigned int length)
// {
//   Serial.print("Message received on mqtt_topic: ");
//   Serial.println(mqtt_topic);
//   Serial.print("Message: ");
//   for (unsigned int i = 0; i < length; i++) 
//   {
//     Serial.print((char) payload[i]);
//   }
//   Serial.println("\n-----------------------");
// }


视频:

https://www.bilibili.com/video/BV1gJ4m1A7bg/?pop_share=1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1718054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

上海晋名室外危废暂存柜助力谐波传动减速器行业危废品安全储存

近日又有一台 SAVEST 室外危废暂存柜项目成功验收交付使用&#xff0c;此次项目主要用于谐波传动减速器行业危废品安全储存。 用户单位成立于1994年&#xff0c;是我国专业从事谐波传动减速器技术设计、开发、生产、销售、服务的高新技术实业公司。在日常工作运营中涉及到危废…

全是干货:融资融券(两融)名词科普!

一、两融内涵 融资融券&#xff0c;也被称为证券信用交易&#xff0c;其内涵主要涵盖以下方面&#xff1a; 首先&#xff0c;它指的是投资者向具有融资融券业务资格的证券公司提供担保物&#xff0c;并借入资金用于买入证券&#xff08;融资交易&#xff09;或借入证券并卖出&…

三次样条插值的实现(Matlab)

一、问题描述 三次样条插值的实现。 二、实验目的 掌握三次样条插值方法的原理&#xff0c;能够编写代码获得自然、抛物线端点以及非纽结三次样条。 三、实验内容及要求 找出并画出三次样条S&#xff0c;满足S(0) 1, S(1) 3, S(2) 3, S(3) 4, S(4) 2&#xff0c;其中…

Windows11 wsl2编译Android14 使用ASfP Debug windows上启动的模拟器

wsl2的安装和配置 安装&#xff1a; 直接百度搜索最新的wsl2安装教程即可&#xff0c;官网&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl/install 1. 启用适用于 Linux 的 Windows 子系统(以管理员身份打开 PowerShell 并运行) Enable-WindowsOptionalFeature…

基于大模型的智慧零售教育科研平台——技术方案

一、概述 1.1背景 随着数字经济的快速发展和全社会数字化水平的升级&#xff0c;人工智能的积极作用越来越凸显&#xff0c;人工智能与各个行业的深度融合已成为促进传统产业转型升级的重要方式之一。ChatGPT的出现掀起了又一波人工智能发展热潮&#xff0c;人工智能行业发展势…

每日练习之广义搜索——小红的素数合并

小红的素数合并 题目描述 运行代码 #include <iostream> #include<algorithm> using namespace std; typedef long long LL;// 定义一个常量表示数组最大长度 const int N 1e5 10; int n, a[N]; // 解决问题的函数 void solve() {// 输入数组长度cin >> …

【Python】浅析Python内存管理与GC机制

【Python】浅析Python内存管理与GC机制 从C语言引入&#xff1a;内存管理的挑战 C语言是一个强大的编程语言&#xff0c;它允许开发者直接控制内存。这种控制是通过以下方式实现的&#xff1a; 内存分配&#xff1a;使用 malloc、calloc 或 realloc 等函数分配内存。内存释放…

C++系列-类模板

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 类模板的定义格式&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; template<class T> class Stack { public:Stack(size_…

Mariadb操作命令指南

MariaDB简介 ​ 以下内容仅是站长或网友个人学习笔记、总结和研究收藏。不保证正确性&#xff0c;因使用而带来的风险与本站无关&#xff01; 数据库应用程序与主应用程序分开存在&#xff0c;并存储数据集合。 每个数据库都使用一个或多个API来创建&#xff0c;访问&#xf…

恒创科技:无法与服务器建立安全连接怎么解决?

在使用互联网服务时&#xff0c;有时会出现无法与服务器建立安全连接的问题&#xff0c;此错误消息通常出现在尝试访问需要安全连接的网站(例如使用 HTTPS 的网站)时&#xff0c;这可能是由于多种原因造成的&#xff0c;以下是一些常见的解决方法&#xff0c;帮助你解决问题。 …

svg实现一个圆形以及方形的环形进度条

1. svg实现圆形进度条 效果图&#xff1a; 1. 写个假接口&#xff1a; let res {curLegendList: [{ progress: "87", name: "进度1",color:"#00fe41" },{ progress: "66", name: "进度2" ,color:"orange"},{ p…

看到大厂工时爆料,我沉默了。。

大厂工时爆料 今天逛脉脉的时候&#xff0c;看到一篇名为「一人一句&#xff0c;大厂工时爆料」的帖子&#xff1a; 点开之后&#xff0c;我沉默了 ... 出来爆料的基本上都是 10 小时。 好奇心之下&#xff0c;我搜索了一下去年很热的排行榜&#xff1a; 2023 年最新互联网公司…

if constexpr实现条件编译

#include <iostream>// 利用if constexpr实现了条件编译 template<typename T1, typename T2> void test_func() {if constexpr (std::is_same_v<T1, T2>) {std::cout << "hit stage\n";} else {std::cout << "miss\n";} }i…

IDEA 常用技巧

1、代码块整体移动 选中&#xff0c;tab整体右移选中&#xff0c;shifttab整体左 移 2、统一修改变量 3.方法分割线 seting >> editor >> apperance >> show method separators 4、快捷键 构造器、set与get方法、方法重写、toString 等快捷操 鼠标停留在…

启智CV机器人,ROS, ubuntu 18.04

资料&#xff1a; https://wiki.ros.org/kinetic/Installation/Ubuntu https://blog.csdn.net/qq_44339029/article/details/120579608 http://wiki.ros.org/melodic/Installation/Ubuntu https://github.com/6-robot/wpb_cv 一、安装ros环境 装VM。 装ubuntu18.04 desktop.…

数字化的本质是什么?

数字化的本质其实就是把日常生活、工作等各个方面的信息、操作、交流等转化成数字形式&#xff0c;让它们更加便于存储、传输、分析和处理。简单说就是把各种各样的东西变成了0和1&#xff0c;让计算机能够更好地理解和运用这些信息。但数字化的本质并不只是简单地把事物变成数…

广告联盟四大家

国内四大广告承接商&#xff1a;①抖音旗下-穿山甲②快手旗下-快手联盟③百度旗下-百青藤④腾讯旗下-优量汇 我们目前在互联网上能看到的所有广告都是由他们发放的&#xff0c;在其中我们打小游戏复活看广告&#xff0c;获得道具看广告&#xff0c;看剧看广告&#xff0c;这…

springboot + Vue前后端项目(第十四记)

项目实战第十三记 写在前面1. 建立字典表2. 后端DictController3. Menu.vue4. 建立sys_role_menu中间表5.分配菜单接口6. 前端Role.vue改动总结写在最后 写在前面 本篇主要讲解动态分配菜单第二章节 菜单页面优化 引入图标 角色界面优化 角色自主分配菜单&#xff0c;并保存至…

透明度技术在AI去衣中的双刃剑作用

引言&#xff1a; 在当今这个数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为我们生活中不可或缺的一部分。它不仅改变了我们的工作方式&#xff0c;还影响了我们的娱乐和社交活动。然而&#xff0c;随着AI技术的不断发展&#xff0c;一些伦理问题也逐渐浮出…

Linux:subshell(子shell)和childprocess(子进程)

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 一、预备知识 在进行这个话题之前&#xff0c;首先要了解Linux系统中一个进程是如何创建的&#xff0c;当一个命令被执行时&#xff0c;首先会在当前进程创建一个子进程…