Esp32-ethernet-kit_A_V1.2 使用mqtt协议,实现客户端与服务器通信,数据上报给服务器包括客户端设备ID,用户名IP地址,端口号,连接时间,连接状态等等

IDF:esp-idf-v4.0.1\examples\protocols\mqtt\tcp

tcp端口号使用1883

ws端口号使用8083

客户端代码如下:

/* MQTT (over TCP) Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/

#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include "esp_wifi.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_event.h"
#include "tcpip_adapter.h"
#include "protocol_examples_common.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "freertos/queue.h"

#include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"

#include "esp_log.h"
#include "mqtt_client.h"

static const char *TAG = "MQTT_EXAMPLE";


static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event)
{
    esp_mqtt_client_handle_t client = event->client;
    int msg_id;
    // your_context_t *context = event->context;
    switch (event->event_id) {
		// 建立连接成功
        case MQTT_EVENT_CONNECTED:
            ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
			// 发布主题/topic/qos1,主题消息为“data_3”,qos=1
            msg_id = esp_mqtt_client_publish(client, "/topic/qos1", "data_3", 0, 1, 0);
            ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);
			// 订阅主题,qos=0
            msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0);
            ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);
			// 订阅主题,qos=1
            msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1);
            ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);
			// 取消订阅主题,qos=1
            msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1");
            ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id);
            break;
		// 客户端断开连接
        case MQTT_EVENT_DISCONNECTED:
            ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
            break;
		// 主题订阅成功
        case MQTT_EVENT_SUBSCRIBED:
            ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
            msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0);
            ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);
            break;
		// 取消订阅
        case MQTT_EVENT_UNSUBSCRIBED:
            ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
            break;
		//  主题发布成功
        case MQTT_EVENT_PUBLISHED:
            ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
            break;
		// 已收到订阅的主题消息
        case MQTT_EVENT_DATA:
            ESP_LOGI(TAG, "MQTT_EVENT_DATA");
            printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
            printf("DATA=%.*s\r\n", event->data_len, event->data);
            break;
		// 客户端遇到错误
        case MQTT_EVENT_ERROR:
            ESP_LOGI(TAG, "MQTT_EVENT_ERROR");
            break;
        default:
            ESP_LOGI(TAG, "Other event id:%d", event->event_id);
            break;
    }
    return ESP_OK;
}
// MQTT事件处理函数
static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) {
    ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%d", base, event_id);
    mqtt_event_handler_cb(event_data);
}

static void mqtt_app_start(void)
{
	// 1、定义一个MQTT客户端配置结构体,输入MQTT的url
    esp_mqtt_client_config_t mqtt_cfg = {
//        .uri = CONFIG_BROKER_URL,
         .uri = "mqtt://106.14.212.203:1883",
         .client_id = "esp32_ethernet_kit_Dalitek-3F",
         .username = "esp32_ethernet_kit",
         .password = "public",
    };
#if CONFIG_BROKER_URL_FROM_STDIN
    char line[128];

    if (strcmp(mqtt_cfg.uri, "FROM_STDIN") == 0) {
        int count = 0;
        printf("Please enter url of mqtt broker\n");
        while (count < 128) {
            int c = fgetc(stdin);
            if (c == '\n') {
                line[count] = '\0';
                break;
            } else if (c > 0 && c < 127) {
                line[count] = c;
                ++count;
            }
            vTaskDelay(10 / portTICK_PERIOD_MS);
        }
        mqtt_cfg.uri = line;
        printf("Broker url: %s\n", line);
    } else {
        ESP_LOGE(TAG, "Configuration mismatch: wrong broker url");
        abort();
    }
#endif /* CONFIG_BROKER_URL_FROM_STDIN */
	// 2、通过esp_mqtt_client_init获取一个MQTT客户端结构体指针,参数是MQTT客户端配置结构体
    esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg);
	// 3、注册MQTT事件
    esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, client);//第一个参数为MQTT客户端结构体,第二个是事件ID对应的事件类型,第三个参数即事件处理函数,第四个参数为事件处理函数的参数
	// 4、开启MQTT功能
	esp_mqtt_client_start(client);
}

void app_main()
{
    ESP_LOGI(TAG, "[APP] Startup..");
    ESP_LOGI(TAG, "[APP] Free memory: %d bytes", esp_get_free_heap_size());
    ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version());

    esp_log_level_set("*", ESP_LOG_INFO);
    esp_log_level_set("MQTT_CLIENT", ESP_LOG_VERBOSE);
    esp_log_level_set("MQTT_EXAMPLE", ESP_LOG_VERBOSE);
    esp_log_level_set("TRANSPORT_TCP", ESP_LOG_VERBOSE);
    esp_log_level_set("TRANSPORT_SSL", ESP_LOG_VERBOSE);
    esp_log_level_set("TRANSPORT", ESP_LOG_VERBOSE);
    esp_log_level_set("OUTBOX", ESP_LOG_VERBOSE);

    ESP_ERROR_CHECK(nvs_flash_init());
    tcpip_adapter_init();
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
     * Read "Establishing Wi-Fi or Ethernet Connection" section in
     * examples/protocols/README.md for more information about this function.
     */
    ESP_ERROR_CHECK(example_connect());

    mqtt_app_start();
}

服务器运行之后,再运行客户端代码

如图,客户端连接成功

在服务器中搜索我们连接的设备ID

搜索到ID为esp32_ethernet_kit_Dalitek-3F的设备

再测试设置主题,发布,订阅:

客户端发布主题,服务器订阅主题:

服务器发布主题,客户端订阅主题:

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ESP32监视房屋中的窗户并通过mqtt报告窗户是否打开或关闭。 该项目的主要目标:打开窗户时切勿离开公寓 我从安装在窗户侧面的簧片接触开关开始,该开关带有Atmel 328p和RFM69 433 Mhz芯片。一段时间后,我想到了直接在手柄上读取窗口状态的想法。433 Mhz也不可靠,我想切换到wifi。选择了ESP32-WROOM之后,我发现了全新的ESP32-S2。 该项目有两个印刷电路板。“传感器” PCB安装在外壳中。该传感器PCB的厚度仅为0.6mm。这些传感器PCB仅配备三个Infineon TLE4913霍尔传感器。 手柄的方形螺栓具有三个磁铁的嵌体: 如果手柄(方形螺栓)移动,则磁铁会越过三个霍尔传感器。TLE4913霍尔传感器具有一个漏极开路输出,该输出连接到控制器pcb。 控制器pcb有一个ESP32-S2-WROOM,三个LED显示窗口状态。如果传感器未识别出已知位置(例如,手柄在打开和关闭之间),则蓝色LED将亮起并通知用户。 控制器pcb也有一个分压器来检查电池。每次更改窗口时,都会测量电池电压并通过MQTT发送。 如果24小时内未使用窗户,ESP32-S2将会唤醒并通过MQTT发送电池电压和窗户状态,然后返回睡眠状态。 如果传感器在24小时内未报告,则此功能使您的家庭自动化软件可以通知您。 控制器pcb还配备了3.0伏的XC6220 LDO,目前我使用的是800mAh的LiPo。在深度睡眠状态下,设备消耗100 µA的电流。 我的第一个传感器已连接到我的OpenHAB安装中。我在GitHub存储库中提供了配置示例。
ESP8266是一款基于WiFi模块的微控制器,而MQTT协议则是一种物联网通信协议,它可以在不同的设备之间进行消息传递。 ESP8266使用MQTT协议服务器之间通信实现过程如下: 1. 首先在ESP8266上安装MQTT客户端库,例如PubSubClient。 2. 在代码中设置WiFi连接信息以及MQTT服务器地址端口号。 3. 连接WiFi网络并连接MQTT服务器。 4. 发布消息或订阅主题。 5. 处理消息和回调函数。 具体的实现过程可以参考以下代码: ``` #include <ESP8266WiFi.h> #include <PubSubClient.h> // WiFi 配置 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; // MQTT 服务器配置 const char* mqtt_server = "your_MQTT_server_address"; const int mqtt_port = 1883; const char* mqtt_username = "your_MQTT_username"; const char* mqtt_password = "your_MQTT_password"; WiFiClient espClient; PubSubClient client(espClient); void setup() { // 连接WiFi网络 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } // 设置MQTT服务器 client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); // 连接MQTT服务器 while (!client.connected()) { if (client.connect("ESP8266Client", mqtt_username, mqtt_password)) { // 订阅主题 client.subscribe("topic_name"); } else { delay(5000); } } } void loop() { // 处理MQTT消息 client.loop(); // 发布MQTT消息 client.publish("topic_name", "Hello World"); } void callback(char* topic, byte* payload, unsigned int length) { // 处理MQTT消息 } ``` 在这个代码中,ESP8266首先连接WiFi网络,然后连接MQTT服务器。在连接MQTT服务器后,它可以发布消息或订阅主题。然后,它会不断地处理MQTT消息,并通过回调函数来处理收到的消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值