ESP32使用MQTT_TCP连接阿里云

2024-06-24 03:18
文章标签 esp32 mqtt tcp 阿里 连接 使用

本文主要是介绍ESP32使用MQTT_TCP连接阿里云,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ESP32-IDF中MQTT函数的介绍

  • esp_mqtt_client_handle_t esp_mqtt_client_init(const esp_mqtt_client_config_t *config)
    函数功能:mqtt 客户端初始化
    函数形参: mqtt 客户端的配置
    函数返回值:正确则返回根据配置创建的 mqtt 客户端句柄;异常则返回 NULL。

    其中函数形参 esp_mqtt_client_config_t 的结构体定义如下:

typedef struct {mqtt_event_callback_t event_handle; / *<处理MQTT事件作为传统模式的回调* /esp_event_loop_handle_t event_loop_handle; / *<MQTT事件循环库的句柄* /const char * host; / *<MQTT服务器域(IP地址或者域名)(ipv4 as string)* /const char * uri; / *<完整的MQTT代理URI 需包含IP地址+端口号 * /uint32_t port; / *<MQTT服务器端口* /const char * client_id; / *<默认客户端ID是``ESP32_%CHIPID%``其中%CHIPID%是十六进制格式的MAC地址的最后3个字节* /const char * username; / *<MQTT用户名* /const char *密码; / *<MQTT密码* /const char * lwt_topic; / *<LWT(遗嘱和遗嘱)消息主题(默认为NULL* /const char * lwt_msg; / *<LWT消息(默认为NULL* /int lwt_qos; / *<LWT消息qos * /int lwt_retain; / *<LWT保留消息标志* /int lwt_msg_len; / *<LWT消息长度* /int disable_clean_session; / *<mqtt clean session,默认clean_session为true * /int keepalive; / *<mqtt keepalive,默认为120* /bool disable_auto_reconnect; / *<此mqtt客户端将重新连接到服务器(当出错/断开连接时)。设置disable_auto_reconnect = true以禁用* /void * user_context; / *<将用户上下文传递给此选项,然后可以在``event-> user_context`` * /中接收该上下文int task_prio; / *<MQTT任务优先级,默认为5,可以在``make menuconfig``中更改* /int task_stack; / *<MQTT任务堆栈大小,默认为6144字节,可以在``make menuconfig``中更改* /int buffer_size; / *<MQTT发送/接收缓冲区的大小,默认为1024 * /const char * cert_pem; / *<用于服务器验证的PEM格式的证书数据指针(使用SSL),默认为NULL,不需要验证服务器* /const char * client_cert_pem; / *<指向用于SSL相互身份验证的PEM格式的证书数据的指针,默认为NULL,如果不需要相互身份验证,则不需要。如果它不是NULL,则还必须提供`client_key_pem`。 * /const char * client_key_pem; / *<指向用于SSL相互身份验证的PEM格式的私钥数据的指针,默认为NULL,如果不需要相互身份验证,则不需要。如果它不是NULL,则还必须提供`client_cert_pem`。 * /esp_mqtt_transport_t transport; / *<覆盖URI传输* /int refresh_connection_after_ms; / *<刷新此值后的连接(以毫秒为单位)* /
esp_mqtt_client_config_t;
  • esp_err_t esp_mqtt_client_start(esp_mqtt_client_handle_t client)
    函数功能:mqtt 客户端启动
    函数形参:创建的 mqtt 客户端句柄
    函数返回值:ESP_OK表示成功 ESP_ERR表示无效 ESP_ARG表示没有初始化 ESP_FERT表示其他错误

  • esp_err_t esp_mqtt_client_stop(esp_mqtt_client_handle_t client)
    函数功能:mqtt 客户端停止
    函数形参:创建的 mqtt 客户端句柄
    函数返回值:ESP_OK表示成功 ESP_FAIL表示失败

  • int esp_mqtt_client_subscribe(esp_mqtt_client_handle_t client, const char *topic, int qos)
    函数功能:订阅主题
    函数形参:

  1. esp_mqtt_client_handle_t 创建的 mqtt 客户端句柄
  2. char *topic 订阅的主题
  3. int qos Qos级别:0,1,2(阿里云只支持QOS0和QOS1
    函数返回值:成功返回订阅消息返回Message_id;失败返回-1
  • int esp_mqtt_client_unsubscribe(esp_mqtt_client_handle_t client, const char *topic)
    函数功能:取消订阅主题
    函数形参:
  1. esp_mqtt_client_handle_t 创建的 mqtt 客户端句柄
  2. char *topic 取消订阅的主题
    函数返回值:成功返回取消订阅消息返回Message_id;失败返回-1
  • esp_mqtt_client_publish(esp_mqtt_client_handle_t client, const char *topic, const char *data, int len, int qos, int retain)
    函数功能:mqtt 客户端往代理(broker)发布消息
    函数形参:
  1. esp_mqtt_client_handle_t 创建的 mqtt 客户端句柄
  2. char *topic 发布消息的主题
  3. const char *data 发布消息的内容
  4. int len 发布消息内容的长度
  5. int qos QOSx信号质量
  6. int retain 当我们使用MQTT客户端发布消息(PUBLISH)时,如果将RETAIN标志位设置为true,那么MQTT服务器会将最近收到的一条RETAIN标志位为true的消息保存在服务器端,只要订阅该主题的新设备上线没就能收到该消息。
    函数返回值:成功返回发布消息返回Message_id;失败返回-1
  • esp_err_t esp_mqtt_client_register_event(esp_mqtt_client_handle_t client, esp_mqtt_event_id_t event, esp_event_handler_t event_handler, void* event_handler_arg)
    函数功能:注册 mqtt 事件
    函数形参:
  1. esp_mqtt_client_handle_t 创建的 mqtt 客户端句柄
  2. esp_mqtt_event_id_t event 注册任何事件id的处理程序
  3. esp_event_handler_t event_handler mqtt 事件回调函数
  4. void* event_handler_arg 处理程序上下文

实验内容

在工程是基于 ESP-IDF的 MQTT_TCP 例程上修改

  1. 配置WIFI的SSID和密码,使得开发板能够正常连接无线网,配置正确的密码后,点击保存.
    在这里插入图片描述

  2. 初始化 mqtt 客户端的连接配置
    配置阿里云 mqtt 的连接地址,并使用签名鉴权的方式认证登录
    配置mqtt
    TIPS: 在配置mqtt代理的地址时,请配置在 host 变量中,如果使用uri,请使用完整的ip+端口号的字符串格式才能正常连接。

  3. 订阅并发布消息

static const char *TAG = "MQTT_EXAMPLE";
esp_mqtt_client_handle_t client;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");/* 发布一条主题为“fc_boardstatus” 的消息 */msg_id = esp_mqtt_client_publish(client, "fc_boardstatus", "data_3", 0, 1, 0);ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);/* 订阅主题为“fc_ctrlcmd” 的消息 */msg_id = esp_mqtt_client_subscribe(client, "fc_ctrlcmd", 0);ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);//msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1);//ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);//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;
}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)
{esp_mqtt_client_config_t mqtt_cfg = {.host = "xxxxxxx.mqtt.aliyuncs.com", //CONFIG_BROKER_URL,//根据实际填写.port = 1883,.username = "Signature|oooooooooo|xxxxxxx",	//根据实际填写.password = "?????????????",//根据实际填写.client_id = "GID_test@@@test0003",//根据实际填写};
#if CONFIG_BROKER_URL_FROM_STDINchar 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 */client = esp_mqtt_client_init(&mqtt_cfg);esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, client);esp_mqtt_client_start(client);
}void app_main(void)
{int msg_id;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());ESP_ERROR_CHECK(esp_netif_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();for (;;){/* 每隔10s 发布一次 主题为 “fc_boardstatus“ 的消息 */msg_id = esp_mqtt_client_publish(client, "fc_boardstatus", "data_3", 7, 0, 0);ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);vTaskDelay(10000 / portTICK_PERIOD_MS);}
}

实验结果

实验结果
通过日志查看,及客户端订阅,能够正常订阅和发布。


纯手写文章,转载请注明出处,谢谢!
如有任何错误,欢迎留言指正!

这篇关于ESP32使用MQTT_TCP连接阿里云的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089032

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议