【毕业设计】ESP32通过MQTT协议连接服务器(三)

0 前期教程

1 前言

  前面两篇教程主要是使用Mosquitto这个开源软件在虚拟机搭建MQTT服务器,但是关于客户端部分一直是用MQTTX这个软件实现的,那能不能用其他的来实现呢?

2 Python:Paho.mqtt

  如果想用python写一个客户端连接到服务器并进行订阅和发布,开源使用Eclipse的Paho这个库,安装很简单:

pip install paho-mqtt

这个库的使用也很简单,这里只给一个示例代码:

import paho.mqtt.client as mqtt

user = ''
passwd = ''
broker = ''
port = 1883

def on_connect(client, userdata, flags, rc):
    print("Connected with result code: " + str(rc))
    print(client.is_connected()) #判断服务器是否连接成功

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

def subscribe():
	# 如果是一般的MQTT协议
    client = mqtt.Client()
    # 如果是websocket协议
    # client = mqtt.Client(transport="websockets")
    
    #设置用户名和密码(可选)
    # client.username_pw_set(user, passwd)
    client.on_connect = on_connect
    client.on_message = on_message

	# 如果要设置TLS, 需要加上
    # client.tls_set(ca_certs='C:\\Users\\Admin\\Desktop\\ca.crt',cert_reqs=ssl.CERT_NONE) #因为是自签证书,所以要加上后面那个参数和下一行代码
    # client.tls_insecure_set(True) 

    #连接 IP port keepalive
    client.connect(broker, port, 600)
    #订阅的 topic
    client.subscribe('test', qos=0)
    client.loop_forever()

def publish():
    client = mqtt.Client()
    #设置用户名和密码
    client.username_pw_set("user1", "password")
    client.on_connect = on_connect
    client.on_message = on_message
    #连接 IP port keepalive
    client.connect(broker, port, 600)
    #发布 topic 内容
    client.publish('test', payload='have a seventh test', qos=0)
    client.publish('test', payload='have a eighth test', qos=0)

# publish()
subscribe()

设置自签证书参考:link

3 ESP32等嵌入式设备

  对于ESP32这种嵌入式设备,好在也有第三方的库可以调用。这里使用的是PubSubClient这个库。这个库的使用可以参考它的官网

下面也给出一个示例代码。

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

const char *ssid = "";
const char *password = "";
const char *mqtt_server = "";
const char *clientid = "";
const char *mqtt_user = "";
const char *mqtt_password = "";
const char *topic = "";
const int mqtt_port = 1883;
const char *websockets_server_host = "wss://j81e5815.ala.cn-hangzhou.emqxsl.cn"; // Enter server adress
const uint16_t websockets_server_port = 8084;                                    // Enter server port
const char *MQTTCLOUD_CA = "-----BEGIN CERTIFICATE-----\n"
           
                 "-----END CERTIFICATE-----"; //这个是证书的内容,因为它本质也是文本文件

WiFiClient espClient; //这个用于一般的MQTT协议
WiFiClientSecure wifi; //这个用于带有TLS的MQTT协议
// PubSubClient client(espClient);
PubSubClient client(wifi);

void reconnect()
{
    
    
    while (!client.connected())
    {
    
    
        Serial.println("Connecting to MQTT Server...");
        if (client.connect("ESP32Client", mqtt_user, mqtt_password))
        {
    
     // Replace with your MQTT username and password
            Serial.println("Connected to MQTT Server!");
            client.subscribe("test_topic"); // Subscribe to topic
        }
        else
        {
    
    
            Serial.println("MQTT Connection failed, retrying...");
            delay(5000);
        }
    }
}

void callback(char *topic, byte *message, unsigned int length)
{
    
    
    Serial.print("Message received on topic: ");
    Serial.println(topic);
    Serial.print("Message content: ");
    for (int i = 0; i < length; i++)
    {
    
    
        Serial.print((char)message[i]);
    }
    Serial.println();
}

void setup()
{
    
    
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED)
    {
    
    
        delay(1000);
        Serial.println("Connecting to WiFi...");
    }
    Serial.println("Connected to WiFi! The IP Address is :");
    Serial.println(WiFi.localIP());

    wifi.setCACert(MQTTCLOUD_CA); // 添加CA证书
    client.setClient(wifi);
    client.setServer(mqtt_server, mqtt_port); // Replace with your MQTT server IP and port
    client.setCallback(callback);
    while (!client.connected())
    {
    
    
        Serial.println("Connecting to MQTT Server...");
        if (client.connect(clientid, mqtt_user, mqtt_password))
        {
    
    
            Serial.println("Connected to MQTT Server!");
            client.subscribe(topic); // Subscribe to topic
        }
        else
        {
    
    
            Serial.println("MQTT Connection failed, retrying...");
            delay(5000);
        }
    }
}

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

其他参考教程:Using the Arduino PubSub MQTT Client

猜你喜欢

转载自blog.csdn.net/ZHOU_YONG915/article/details/130020154