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
#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如何用变量传入
#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 主题