MQTT 介绍

  1. 简介

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

2. 通信方式

  • MQTT基于客户端-服务器方式,以消息订阅/发布方式传输数据。先说一下几个概念:

  • MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。 代理Broker :它就是MQTT的主体,实际上就是一个服务器,相当于整个MQTT的信息中转站,将发布者的信息转发给订阅者。在实际应用的过程中一般使用云服务器作为代理Broker. 发布者(Publish):顾名思义就是消息的发布者,它负责把消息通过(Publish)方式发送到Broker服务器上,剩下的它就不管了。 订阅者(Subscribe):订阅者则是消息接收方,当服务器接收到发布者发布的信息后,在服务器中查找如果发现有订阅者订阅了这条信息,那么服务器就把这条信息发送给订阅者。

  • 那么这三者通过什么方式判断消息的区别那?那又引出来下一个概念主题(Topic)和负载(Payload). Topic:可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload) payload:可以理解为消息的内容,是指订阅者具体要使用的内容。

通俗上讲就是 :发布者和订阅者约定好一个标题(主题topic)并且把这个标题存储在服务器上,发布者把消息内容(负载(Payload))发布到服务器这个标题下面,订阅者从服务器订阅这个标题。 当服务器发现这个标题下面有内容了就开始查找谁订阅这个标题,查找到了之后就把消息内容发送给订阅者 。

程序介绍

esp-idf 中有专门介绍MQTT的相关例程,例程位于esp-idf/examples/protocols/mqtt中,乐鑫提供了多个例程

我们选择tcp例程讲解,其他例程原理上是一样,例程中连接的服务器是eclipse 专门提供的MQTT的免费服务器,用户可以使用这个服务器进行测试。

1. 主函数

void app_main(){/*输出log 相关配置 我们不需要关心*/ESP_LOGI(TAG, "[APP] Startup..");/*获取空闲内存大小*/ESP_LOGI(TAG, "[APP] Free memory: %d bytes", esp_get_free_heap_size());/*打印当前idf的版本*/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("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);/*flash 初始化,tcp/ip通信时 需要使用flash*/nvs_flash_init();/*wifi初始化*/wifi_init();/*mqtt开始运行*/mqtt_app_start();}

2. wifi函数注释

static void wifi_init(void){tcpip_adapter_init();//tcpip 协议栈初始化,使用网络时必须调用此函数/*创建一个freeRTOS的事件标志组,用于当wifi没有连接时将程序停下,只有wifi连接成功了才能继续运行程序*/wifi_event_group = xEventGroupCreate();/*配置 wifi的回调函数,用于连接wifi*//** ESP_ERROR_CHECK检查函数返回值*/ESP_ERROR_CHECK(esp_event_loop_init(wifi_event_handler, NULL));/*wifi配置*/wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));wifi_config_t wifi_config = {.sta = {.ssid = CONFIG_WIFI_SSID,.password = CONFIG_WIFI_PASSWORD,},};/*设置wifi 为sta模式*/ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));ESP_LOGI(TAG, "start the WIFI SSID:[%s]", CONFIG_WIFI_SSID);/*开始运行wifi*/ESP_ERROR_CHECK(esp_wifi_start());ESP_LOGI(TAG, "Waiting for wifi");/*等待事件标志,成功获取到事件标志位后才继续执行,否则一直等在这里*/xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, false, true, portMAX_DELAY);}/*wifi 的中断回调函数,检测wifi的事件标志位*/static esp_err_t wifi_event_handler(void *ctx, system_event_t *event){switch (event->event_id) {case SYSTEM_EVENT_STA_START://开始执行station esp_wifi_connect();//根据wifi配置,连接wifibreak;case SYSTEM_EVENT_STA_GOT_IP://成功获取到ip,表示联网成功xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);//设置事件标志位,程序继续运行break;case SYSTEM_EVENT_STA_DISCONNECTED://station 已经断开了,重新连接wifiesp_wifi_connect();xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);break;default:break;}return ESP_OK;}

3. mqtt函数注释

static void mqtt_app_start(void)
{/*配置mqtt ,broker 地址 和mqtt的事件回调函数*/esp_mqtt_client_config_t mqtt_cfg = {.uri = CONFIG_BROKER_URL,.event_handle = mqtt_event_handler,// .user_context = (void *)your_context};esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg);//出事mqtt的相关配置esp_mqtt_client_start(client);//开始执行mqtt
}static esp_err_t mqtt_event_handler(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://MQTT 已连接ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");/*发布主题/topic/qos1*/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);/*订阅主题/topic/qos0 */msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0);ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);/*订阅主题/topic/qos1*/msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1);ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);/*取消订阅/topic/qos1*/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://MQTT断开连接ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");break;case MQTT_EVENT_SUBSCRIBED://MQTT收到订阅信息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的简单流程就介绍完了,MQTT之所以在物联网上应用比较广泛就是因为它的简单,易用在加上它数据精简正好适合物联网通信的要求。

现在国内外的一线大厂阿里,华为,百度 ,亚马逊 的服务器都支持MQTT协议,如果想在实际的应用使用MQTT的话,主要是研究各个厂家服务器上的其他设置,比如连接方式,检验机制,如何配置选项等,MQTT本身这一块没有什么东西。

希望此文对大家能有所帮助。

欢迎关注我的个人网站:zwww.zcxbb.com

知乎专栏:物联网开发入门 - 知乎 (zhihu.com)

esp32开发快速入门 8 : MQTT 的快速入门,基于esp32实现MQTT通信相关推荐

  1. esp32摄像显示时间_科普系列 || 第一弹~基于ESP32的WiFi连接

    点击蓝字关注 东南大学电子科协公众号- 号外号外!     还因为宅在家中无所事事吗,科协现在为了同学们帮助学习单片机和后面准备竞赛,电子科协决定推出一个系列文章,帮助大家了解常用的一些总线和一些通讯 ...

  2. java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅

    阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 MQTT 服务端,那么我们自己的设备作为客户端,应该如何实现消息订阅? 阿里云没有提供 PHP ...

  3. ESP32 开发笔记(三)源码示例 7_WS2812_RMT 使用ESP32的RMT实现彩虹变色效果

    开发板购买链接 https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=62636 ...

  4. 用启明云端基于ESP32模块的开发板来快速了解天猫精灵

    为什么要了解天猫精灵呢? 在物联网时代,单纯的"互联"已经无法满足需求,需要让万物"智联"才能发挥它的应用价值.AI语音的简单.易用特性将成为万物"智 ...

  5. ESP32开发:从入门到精通的全面指南

    ESP32开发:从入门到精通的全面指南 ESP32 是一款功能强大的微控制器,它可以帮助开发者构建各种物联网(IoT)应用.ESP32 拥有 WiFi 和蓝牙无线连接功能,并且可以轻松地与各种传感器和 ...

  6. ESP32开发--一键配网与Airkiss配网

    ESP32基础系列 ESP32初体验之环境搭建 ESP32外设学习之GPIO ESP32外设学习之UART ESP32开发之给模块连上网络 ESP32的一键配网与Airkiss配网 ESP32使用NV ...

  7. ESP32开发 0.windows Vscode开发环境搭建,基于esp-idf-V4.2 | Cmake | Vscode插件

    一 前言 入坑嵌入式以来,一直都在寻找一款通用MCU控制器:他应有优秀的计算处理能力.丰富的外设扩展能力.支持有线/无线联网.小巧的封装.自从ESP8266爆火以来,熟悉过它的使用,但窘于硬件限制,只 ...

  8. esp32摄像显示时间_TinyPICO-比拇指还小的ESP32开发板- 国外创客众筹发现第二期

    国外创客开发板创新日新月异 我们想尝鲜体验却十分苦难 一片板卡从海外跋山涉水到我们手中 遇到各种各样的问题 海外组团开始啦!~ 本次我们从国外开发板众筹网站crowdsupply 挑选一款体积较小/功 ...

  9. ESP32开发 -- 试玩ESP32

    前文要测试网络调试助手,手头正好有个ESP32一直没有试过.这次正好拿来试玩一下. 一.ESP32官网查看 官网:ESP32官网 这款最小系统开发板搭载了乐鑫最新的系统级芯片 ESP32, 支持 Wi ...

  10. ubuntu vscode 配置字体_第五章 Ubuntu搭建ESP32开发环境(vscode)

    Vscode安装 ubuntu软件中自带vscode的安装包,一键完成,不废话,没有的想办法解决. 编译链操作 下载 官方最新地址 有系统区别,下载对应的压缩到到电脑 · for 64-bit Lin ...

最新文章

  1. 趋势科技:黑客勒索瞄准智能电视
  2. 前端预览word文件_[装机必备] QuickLook —— 敲击空格即可快速预览文件
  3. crm系统是什么很棒ec实力_搭建CRM系统要明确几个步骤?什么样的CRM是真正有用的系统?...
  4. Java中的Scanner类和String类
  5. 免费拿走我的代码可以,但请对使用我的时间付费
  6. saltstack的探索-salt指定目标和分组
  7. UFO报表另存为Excel提示:可能没有正确安装Excel
  8. STM32战舰USB转串口驱动
  9. 如何给文件添加后缀名
  10. 管理储存组和邮箱数据库
  11. mysql error 1114_ERROR 1114 (HY000): The table 'test1' is full 的解决
  12. 我用python给我的可爱小邻居做了一个猫狗识别系统~
  13. 油猴插件安装以及好用的脚本推荐
  14. 成都待慕电商:抖音智能推荐常见问题汇总
  15. Oracle字符集讨论(转)
  16. 【英语做题】英语“八股文“学习
  17. 新买的小米路由器怎么设置?如果是宽带自动连接就不需要输入宽带账号和密码。如果是拨号上网就需要宽带账号和密码
  18. adb在小米电视上安装QQ 并使用遥控器操控部分功能
  19. qq音信点亮最全说明
  20. android向DDR读写数据,透过数据看本质 -  被“吹爆”的LPDDR5内存究竟有多强大?...

热门文章

  1. 反向代理和正向代理详解
  2. No qualifying bean of type [com.service.UserService] found for dependency: 解决方案
  3. 金蝶apusic9.0版本安装包
  4. matlab 龙格-库塔 法求解常微分方程
  5. 奇虎360起诉瑞星和中关村在线
  6. 素数处理-埃拉托色尼筛选法(埃式筛)
  7. 安卓 手柄 linux,Linux joystick 游戏手柄编程 (获取输入数据)
  8. 用python根据生日判断星座_求指教,我这个 代码是实现 根据生日判断星座
  9. Error processing condition on org.springframework.boot.actuate.autoconfigure.audit.AuditEventsEndpoi
  10. precision 为什么和recall成反比