ESP8266 MQTT服务器+阿里云

MQTT私有平台搭建(EMQX + 阿里云)

阿里云服务器 + EMQX 搭建私有MQTT平台

1、搜索EMQX开源版本

2、查看各版本EMQX支持的UBUNTU版本

3、查看服务器Ubuntu版本

4、使用APT安装模式

5、按照官网指示安装并启动

6、下载安装MQTTX测试工具

7、设置云服务器安全组,打开18083 端口(EMQX WEB端)

8、访问该地址,第一次登录需要修改密码

默认用户:admin

默认密码:public


9、创建用户过滤非法MQTT信息

客户端认证->创建->认证方式(密码)->选择数据源(内置数据库)->配置参数->创建->添加用户

10、使用MQTTX创建连接

11、发布主题

12、订阅消息

使用ESP8266 连接 MQTT 服务器

1、esp8266 连接wifi

c 复制代码
#include <ESP8266WiFi.h>
#include "string"
void SerialInit(void)
{
  Serial.begin(9600);
  Serial.printf("\n");
}


const char * G_WifiName = "XY054789";
const char * G_WifiPasswd = "12345678";
uint16_t G_WaitTime=0;

uint8_t WifiInit(const char * WifiName,const char * WifiPasswd,int WaitTime)
{
  //设置Wifi模式为sta
  WiFi.mode(WIFI_STA);
  //清除配置
  WiFi.disconnect();
  //开始连接WiFi
  WiFi.begin(WifiName,WifiPasswd);
  //设置超时时间
  G_WaitTime=1;
  //测试是否在超时时间内连接
  
  while((WiFi.status() != WL_CONNECTED))
  {
    delay(1000);
    Serial.printf("connected wifi %s wait %d s \r\n",WifiName,G_WaitTime);
    if(G_WaitTime++ > WaitTime)
    {
        Serial.printf("connected wifi %s faild wait timeout \r\n",WifiName);
        return 0;
    }
    
  }
  Serial.printf("connected wifi %s success \r\n",WifiName);
  Serial.printf("connect WIFI %s success,local IP is %s\r\n",WiFi.SSID().c_str(),WiFi.localIP().toString().c_str());
  return 1;
}




void setup() {
  // put your setup code here, to run once:
  SerialInit();
  WifiInit(G_WifiName,G_WifiPasswd,15);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(WiFi.status() != WL_CONNECTED)
  {
    WifiInit(G_WifiName,G_WifiPasswd,15);
  }
  else {
  {
    //wifi 连接正常
    //MQTT 连接
  }
  }



}

2、连接MQTT 使用PubSubClient库

地址:https://www.arduino.cc/reference/en/libraries/pubsubclient/

Arduino IDE -> 项目 -> 导入库 -> 添加ZIP库

3、连接MQTT服务器

问题1:非静态成员引用常量

问题2:mqttpc.setServer("47.109.27.255",MqttServerPort); 的ip如何用变量传入

cpp 复制代码
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

/*WIFI 相关变量*/
const char * G_WifiName   = "XY054789";
const char * G_WifiPasswd = "12345678";
uint16_t G_WaitTime=0;

/*MQTT 相关变量*/
char *  MqttServer ="47.109.27.255";
uint16_t   MqttServerPort = 1883;
const char * MqttUser = "wangju";
const char * MqttPaw = "root.2018";
const char * MqttTopicRecv = "stm32_client_r";
const char * MqttTopicSend = "stm32_client_s";
char * MqttClientId = "mqttx_c61ef910";
//定义WIFI 对象
WiFiClient wic;
//定义MQtt PC端对象
PubSubClient mqttpc(wic);



/****************************串口初始化***************************************/
void SerialInit(void)
{
  Serial.begin(9600);
  Serial.printf("\n");
}
/*****************************************************************************************/

/***********************************WIFI初始化**********************************************/
uint8_t WifiInit(const char * WifiName,const char * WifiPasswd,int WaitTime)
{
  //设置Wifi模式为sta
  WiFi.mode(WIFI_STA);
  //清除配置
  WiFi.disconnect();
  //开始连接WiFi
  WiFi.begin(WifiName,WifiPasswd);
  //设置超时时间
  G_WaitTime=1;
  //测试是否在超时时间内连接
  
  while((WiFi.status() != WL_CONNECTED))
  {
    delay(1000);
    Serial.printf("connected wifi %s wait %d s \r\n",WifiName,G_WaitTime);
    if(G_WaitTime++ > WaitTime)
    {
        Serial.printf("connected wifi %s faild wait timeout \r\n",WifiName);
        return 0;
    }
    
  }
  Serial.printf("connected wifi %s success \r\n",WifiName);
  Serial.printf("connect WIFI %s success,local IP is %s\r\n",WiFi.SSID().c_str(),WiFi.localIP().toString().c_str());
  return 1;
}
/*****************************************************************************************/

/*******************************MQTT初始化***************************************************/


//消息回调函数,处理接收到的消息
void getMQTT(char* topic,byte* payload,unsigned int length){
    Serial.printf("get data from %s\r\n",topic);    //输出调试信息,得知是哪个主题发来的消息
    for(unsigned int i=0;i<length;++i){             //读出信息里的每个字节
        Serial.print((char)payload[i]);             //以文本形式读取就这样,以16进制读取的话就把(char)删掉
    }
    Serial.println();
}

uint8_t MqttInit(void)
{
  if(WiFi.status() != WL_CONNECTED) 
  {
    Serial.printf("wifi disconnected !!!\r\n");
    return 0;
  }
  //设置服务器信息
  mqttpc.setServer("47.109.27.255",MqttServerPort);
  //连接mqtt服务器
  
  if(!mqttpc.connect(MqttClientId,MqttUser,MqttPaw))
  {
    Serial.printf("mqtt connected failed !!!\r\n");
    return 0;
  }
  //订阅主题
  mqttpc.subscribe(MqttTopicRecv);
  //设置回调函数
  mqttpc.setCallback(getMQTT);
  Serial.printf("mqtt connected success !!!\r\n");
  mqttpc.publish(MqttTopicSend,"mqtt connected success !!! node:stm32_1");
  return 1;
}
/*****************************************************************************************/



void setup() {
  // put your setup code here, to run once:
  SerialInit();
  WifiInit(G_WifiName,G_WifiPasswd,15);
  MqttInit();
}

void loop() {

  // put your main code here, to run repeatedly:
  if(WiFi.status() != WL_CONNECTED)
  {
    WifiInit(G_WifiName,G_WifiPasswd,15);
    MqttInit();
  }
  else 
  {
    //wifi 连接正常
    //MQTT 连接
    if(mqttpc.connected())
    {
      mqttpc.loop(); //发送心跳信息
      mqttpc.publish(MqttTopicSend,"node:stm32_1  data:test");
    }
    else
    {
      MqttInit();
    }

  }
  
}

EMQX后台

MQTTX 订阅 stm32_client_s

发布 stm32_client_r 主题

相关推荐
阿里云云原生1 小时前
告别“大海捞针”式排障:阿里云 UModel 如何用“本体论”重塑 AIOps?
阿里云·ai·云计算·agent·umodel
亮3891 小时前
个人职业技能培训分享:我了解的百灵达培训真实情况
阿里云
1024小神1 小时前
在阿里云买的域名和服务器配置cloudflare的DNS解析,并配置cloudflare生成ssl证书可以用15年
服务器·阿里云·ssl
数据库知识分享者小北21 小时前
安全可靠数据库选型之阿里云 PolarDB MySQL 版V2.0
数据库·mysql·阿里云·国产数据库·polardb·安全可靠数据库·polardb-m
学习要积极1 天前
Spring AI 与阿里云 AI 快速入门:从零搭建智能应用
人工智能·spring·阿里云
特立独行的猫a1 天前
Rust+ Tauri实现漂亮小巧的Mqtt客户端工具--AtomMQTT Client 实现详解
开发语言·后端·mqtt·rust
qq_229058011 天前
宝塔搭建外网映射域名项目
阿里云
摇滚侠1 天前
阿里云镜像站 CentOS Tomcat Maven 等镜像资源
java·阿里云·centos
时光の尘2 天前
【STM32实战】ESP8266 通过 MQTT 协议对接 OneNET 云平台实现数据上传与下发(源码可直接移植)
stm32·mqtt·嵌入式·iot·esp8266
河北小博博2 天前
从理解到落地:AI Agent 长期记忆系统的原理、框架与阿里云选型指南
人工智能·阿里云·云计算