ESP8266 连接 MQTT

主控芯片:MM32F2377 (MB-039)

WiFi 适配器:ESP8266

开发环境:IAR 7.80.4

MQTT 模拟服务器:MQTT.fx

MQTT

MQTT is an OASIS standard messaging protocol for the Internet of Things (IoT). It is designed as an extremely lightweight publish/subscribe messaging transport that is ideal for connecting remote devices with a small code footprint and minimal network bandwidth. MQTT today is used in a wide variety of industries, such as automotive, manufacturing, telecommunications, oil and gas, etc.

—— mqtt.org

MQTT(Message Queuing Telemetry Transport) 消息队列遥测传输协议,是一个基于客户端-服务器的消息发布/订阅传输协议。主要的概念有5个:

  • Broker 代理:MQTT 服务器
  • Publish 发布者:客户端
  • Subscribe 订阅者:客户端,可订阅多个 topic
  • Topic 主题:消息的类型,订阅主题之后就可以收到该 topic 的消息内容即 payload
  • Payload 消息内容:具体的内容

MQTT 模拟服务器:

  • EMQ MQTT X
  • MQTT.fx

MQTT 模拟服务器客户端使用

我在这里使用的是第二个 MQTT.fx,用这个客户端模拟一下 MQTT 的 Publish/Subscribe。

  1. 首先在 EMQ 官网上找到 MQTT 接入信息,主要是 Broker 和 TCP 端口号


    在接下来的模拟服务器使用中,Broker Address 可以直接用 broker-cn.emqx.io,也可以到查询网上查找对应的 IP 地址:47.111.117.220

    EMQ 分为在国内有专门的服务器,连接更方便一些,国外的 Broker Address 是 broker.emqx.io

  2. 打开 MQTT.fx,点击齿轮状的设置按钮,填写 Broker Address,Port 等,再到 User Credentials 里填写用户名和密码,OK,Connect

  3. 连接成功后,发布消息:填 topic,我这里 topic 叫 esp8266,以 json 格式进行发送,点击 Publish

  4. 去订阅消息,切换到 Subscribe,订阅 esp8266 这个 topic,然后再发布消息,就可以在这里看到了

ESP8266 + MQTT

ESP8266 的介绍以及基本使用可查看上一篇 CSDN 「Rose Island」MM32F3277 + ESP8266 使用指南(1. 实现 TCP Client 透传)。

首先需要确认 AT 指令集具有 MQTT 指令:

  • 乐鑫官方 AT 下载地址
  • Ai-thinker AT 下载地址 (选择 ESP8266 MQTT 默认透传 AT 固件)

具体的 MQTT AT 指令集可查阅:

  • ESP MQTT AT Commands

ESP8266 MQTT 配置指令

  1. 配置 STA 模式:AT+CWMODE=1

  2. 连接路由器:AT+CWJAP="wifiName","wifiPsd"

  3. 配置 MQTT 属性:AT+MQTTUSERCFG=0,1,"clientID","username","password",0,0,""

  4. 连接制定的 MQTT broker:AT+MQTTCONN=0,"47.111.117.220",1883,0

  5. 查询 MQTT 连接状态:AT+MQTTCONN?

  6. 订阅 topic 数据:AT+MQTTSUB=0,"topicName",1

  7. 发布 topic 数据:AT+MQTTPUB=0,"topicName","payload",1,0

MM32F3277 + ESP8266 + MQTT

这里放的是与 MQTT 相关的函数,ESP8266 连网和 TCP 连接等函数可见「Rose Island」MM32F3277 + ESP8266 使用指南(1. 实现 TCP Client 透传)。

esp8266.c


/// @brief  Configure ESP8266 MQTT parameters.
/// @param  clientId: Client ID num.
/// @param  username: MQTT server username to log in MQTT broker.
/// @param  psd: MQTT server password to log in MQTT broker.
/// @param  scheme: Verification methods.
/// @retval None.

void ESP8266_MQTT_Init(char* clientId, char* username, char* psd, ESP8266_MQTT_Scheme_Typedef scheme)
{ESP8266_MQTT_InitStruct.ipAddr.mqttIPAddr0 = ESP8266_MQTT_HOST_IPADDR_0;ESP8266_MQTT_InitStruct.ipAddr.mqttIPAddr1 = ESP8266_MQTT_HOST_IPADDR_1;ESP8266_MQTT_InitStruct.ipAddr.mqttIPAddr2 = ESP8266_MQTT_HOST_IPADDR_2;ESP8266_MQTT_InitStruct.ipAddr.mqttIPAddr3 = ESP8266_MQTT_HOST_IPADDR_3;ESP8266_MQTT_InitStruct.port = (uint32_t)ESP8266_MQTT_PORT;ESP8266_MQTT_InitStruct.clientID = clientId;ESP8266_MQTT_InitStruct.username = username;ESP8266_MQTT_InitStruct.password = psd;ESP8266_MQTT_InitStruct.scheme = scheme;ESP8266_MQTT_InitStruct.mqttStatus = NO_INIT;
}
/// @brief  Connect with MQTT server.
/// @param  clientId: Client ID num.
/// @param  username: MQTT server username to log in MQTT broker.
/// @param  psd: MQTT server password to log in MQTT broker.
/// @param  scheme: Verification methods.
/// @retval ESP8266 OK or ERROR.

ESP8266_Error_Typedef ESP8266_Connect_MQTT(char* clientId, char* username, char* psd, ESP8266_MQTT_Scheme_Typedef scheme)
{ESP8266_MQTT_Init(clientId, username, psd, scheme);char *cmd = (char*)malloc(256);sprintf(cmd, "AT+MQTTUSERCFG=0,1,\"%s\",\"%s\",\"%s\",0,0,\"\"", clientId, username, psd);if(ESP8266_Send_AT_Command_Times(cmd, "OK", 0xffff, 2)){printf("Error: Fail to Configure MQTT \n");return ESP8266_ERROR;}else{ESP8266_MQTT_InitStruct.mqttStatus = USERCFG_SET;printf("OK: Configure MQTT successfully \n");}sprintf(cmd, "AT+MQTTCONN=0,\"%d.%d.%d.%d\",%d,0", ESP8266_MQTT_HOST_IPADDR_0, ESP8266_MQTT_HOST_IPADDR_1, ESP8266_MQTT_HOST_IPADDR_2, ESP8266_MQTT_HOST_IPADDR_3, ESP8266_MQTT_PORT);if(ESP8266_Send_AT_Command_Times(cmd, "OK", 0xffff, 2)){ESP8266_MQTT_InitStruct.mqttStatus = DISCONNECTED;printf("Error: Fail to Connect MQTT \n");return ESP8266_ERROR;}else{ESP8266_MQTT_InitStruct.mqttStatus = CONNECTED;printf("OK: Connect MQTT successfully \n");}return ESP8266_OK;
}
/// @brief  Check MQTT client state.
/// @param  None.
/// @retval ESP8266 OK or ERROR.

ESP8266_Error_Typedef ESP8266_Check_MQTT()
{char *cmd = "AT+MQTTCONN?";if(ESP8266_Send_AT_Command_Times(cmd, "OK", 0xffff, 2)){// printf("Error: Fail to Connect MQTT \n");return ESP8266_ERROR;}else{// printf("OK: Connect MQTT successfully \n");}return ESP8266_OK;
}
/// @brief  Subscribe topic from MQTT server.
/// @param  subTopic: Subscribed topic name.
/// @retval ESP8266 OK or ERROR.

ESP8266_Error_Typedef ESP8266_MQTT_SUB(char* subTopic)
{char *cmd = (char*)malloc(strlen("AT+MQTTSUB=0,\"%s\",1") + strlen(subTopic));sprintf(cmd, "AT+MQTTSUB=0,\"%s\",1", subTopic);if(ESP8266_Send_AT_Command_Times(cmd, "OK", 0xffff, 2)){ESP8266_MQTT_InitStruct.mqttStatus = CONNECTED_NO_SUB;printf("Error: Fail to Subscribe topic \n");return ESP8266_ERROR;}else{ESP8266_MQTT_InitStruct.mqttStatus = CONNECTED_AND_SUB;printf("OK: Subscribe topic successfully \n");}return ESP8266_OK;
}
/// @brief  Unsubscribe topic from MQTT server.
/// @param  subTopic: Unsubscribed topic name.
/// @retval ESP8266 OK or ERROR.

ESP8266_Error_Typedef ESP8266_MQTT_UNSUB(char* subTopic)
{char *cmd = (char*)malloc(strlen("AT+MQTTUNSUB=0,\"\"") + strlen(subTopic));sprintf(cmd, "AT+MQTTUNSUB=0,\"%s\"", subTopic);if(ESP8266_Send_AT_Command_Times(cmd, "OK", 0xffff, 2)){ESP8266_MQTT_InitStruct.mqttStatus = CONNECTED_NO_SUB;printf("Error: Fail to Subscribe topic \n");return ESP8266_ERROR;}else{ESP8266_MQTT_InitStruct.mqttStatus = CONNECTED_AND_SUB;printf("OK: Subscribe topic successfully \n");}return ESP8266_OK;
}
/// @brief  Publish topic to MQTT server.
/// @param  subTopic: Publish topic name.
/// @retval ESP8266 OK or ERROR.

ESP8266_Error_Typedef ESP8266_MQTT_PUB(char* pubTopic, char* data)
{char *cmd = (char*)malloc(strlen("AT+MQTTPUB=0,\"\",\"\",1,0") + strlen(pubTopic) + strlen(data));sprintf(cmd, "AT+MQTTPUB=0,\"%s\",\"%s\",1,0", pubTopic, data);if(ESP8266_Send_AT_Command_Times(cmd, "OK", 0xffff, 2)){printf("Error: Fail to Publish topic \n");return ESP8266_ERROR;}else{printf("OK: Publish topic successfully \n");}return ESP8266_OK;
}
/// @brief  Disconnect with MQTT server.
/// @param  None.
/// @retval ESP8266 OK or ERROR.

ESP8266_Error_Typedef ESP8266_MQTT_CLEAN()
{char *cmd = "AT+MQTTCLEAN=0";if(ESP8266_Send_AT_Command_Times(cmd, "OK\r\n", 0xffff, 2)){printf("Error: Fail to Disconnect MQTT \n");return ESP8266_ERROR;}else{ESP8266_MQTT_InitStruct.mqttStatus = NO_INIT;printf("OK: Disconnect MQTT successfully \n");}return ESP8266_OK;
}
/// @brief  Send key-value to MQTT.
/// @param  dataSend: The whole key-value.
/// @param  deviceId: Device id.
/// @param  deviceType: Device type.
/// @param  dataType: Data type.
/// @param  dataValue: Data value.
/// @retval None.

void ESP8266_Data_Send(char *dataSend, char *deviceId, char *deviceType, char *dataType, float dataValue)
{sprintf(dataSend,"{\r\n\"device_id\":\"%s\",\r\n\"device_type\":\"%s\",\r\n\"data_type\":\"%s\",\r\n\"data_value\":\"%.2f\"\r\n}",deviceId, deviceType, dataType, dataValue);printf("data sent is %s \n", dataSend);
}

esp8266.h

typedef enum{NO_INIT                             = (uint8_t)0,USERCFG_SET                         = (uint8_t)1,CONNCFG_SET                         = (uint8_t)2,DISCONNECTED                        = (uint8_t)3,CONNECTED                           = (uint8_t)4,CONNECTED_NO_SUB                    = (uint8_t)5,CONNECTED_AND_SUB                   = (uint8_t)6
} ESP8266_MQTT_Status_Typedef;typedef enum{NO_TLS                              = (uint8_t)1,TLS_NO_CA                           = (uint8_t)2,TLS_SERVICE_CA                      = (uint8_t)3,TLS_CLIENT_CA                       = (uint8_t)4,TLS_SERVICE_CLIENT_CA               = (uint8_t)5,WS_TCP                              = (uint8_t)6,WSS_NO_CA                           = (uint8_t)7,WSS_SERVICE_CA                      = (uint8_t)8,WSS_CLIENT_CA                       = (uint8_t)9,WSS_SERVICE_CLIENT_CA               = (uint8_t)10
} ESP8266_MQTT_Scheme_Typedef;#define ESP8266_MQTT_CLIENTIP           "mm32f3270"
#define ESP8266_MQTT_USERNAME           "mm32"
#define ESP8266_MQTT_PSD                "mm32psd"
#define ESP8266_MQTT_HOST               "broker-cn.emqx.io"
#define ESP8266_MQTT_HOST_IPADDR_0      47
#define ESP8266_MQTT_HOST_IPADDR_1      111
#define ESP8266_MQTT_HOST_IPADDR_2      117
#define ESP8266_MQTT_HOST_IPADDR_3      220
#define ESP8266_MQTT_PORT               1883
#define ESP8266_MQTT_TOPIC              "esp8266"typedef struct
{uint8_t                             mqttIPAddr0;uint8_t                             mqttIPAddr1;uint8_t                             mqttIPAddr2;uint8_t                             mqttIPAddr3;
}ESP8266_MQTT_IPADDR_Typedef;typedef struct
{ESP8266_MQTT_IPADDR_Typedef         ipAddr;uint32_t                            port;char*                               clientID;char*                               username;char*                               password;ESP8266_MQTT_Scheme_Typedef         scheme;ESP8266_MQTT_Status_Typedef         mqttStatus;
} ESP8266_MQTT_Typedef;
ESP8266_MQTT_Typedef ESP8266_MQTT_InitStruct;

Conclusion

ESP8266 连接 MQTT相关推荐

  1. esp8266连接mqtt服务器

    1.MQTT ESP8266库 菜单"项目"-"加载库"-"管理库",搜索安装"PubSubClient" PubSub ...

  2. 学习如何使用电脑客户端和ESP8266客户端来连接MQTT服务端以及订阅主题发送主题操作

    MQTT原理与应用 学习如何使用电脑客户端和ESP8266客户端来连接MQTT服务端 本文章学习借鉴于太极创客团队,以表感谢.官网[http://www.taichi-maker.com/] 文章目录 ...

  3. 【STM32 x ESP8266】连接 MQTT 服务器(报文,附部分源码解析)

    MQTT 协议作为物联网非常重要的传输协议,如何使用它十分重要,如果有不理解的同学可以点击这里学习,这里只是简单介绍一下.同时这里附上MQTT 3.1.1协议中文版 pdf 的链接,对协议底层感兴趣的 ...

  4. ESP8266入门教程11:连接MQTT服务器

    将第三方库PubSubClient下载到lib文件夹 git clone https://github.com/knolleary/pubsubclient.git 一.阿里云IOT使用 1.打开阿里 ...

  5. ESP8266连接阿里云--MQTT协议

    ESP8266连接阿里云–MQTT协议   MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscr ...

  6. [ESP8266]刷MQTT固件以及连接服务器失败的问题解决

    摘要:很多小伙伴在初期学习ESP8266 WIFI模块时会遇到很多的问题.其中主要包括:应该给ESP8266模块刷什么固件版本合适.STM32下位机应该怎样编写驱动程序以及大家可能都遇到过的连接服务器 ...

  7. 一种STM32F1系列+ESP8266使用MQTT连接阿里云的方法

    摘要:本文讲述一种使用STM32F103C8T6控制器+ESP8266使用MATT连接阿里云的方法,可以搭配这篇文章中的云Web或移动开发,实现物联网功能并在电脑网页或手机网页让硬件的数据可视化,实验 ...

  8. ESP8266连接自建MQTT服务远程遥控空调

    1. 解码空调红外键值 1.1 安装 IRremoteESP8266 库 1.2 把ESP8266红外接收的实例,上传到NodeMCU中. 1.3 读取遥控器红外键值 把红外接收模块的信号线连接到GP ...

  9. ESP8266的MQTT客户端搭建教程(基于NONS_SDK_v2.0)

    前言 MQTT是IBM开发的一个即时通讯协议,面向M2M和物联网的连接,采用轻量级发布和订阅消息传输机制,并且有可能成为物联网的重要组成部分. ESP8266是一款物美价廉的Wi-Fi芯片,集成Ten ...

最新文章

  1. c#客户端 通过用户名密码访问服务器文件,C#如何连接服务器共享文件夹
  2. 【Linux】一步一步学Linux——iptables-save命令(187)
  3. HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)
  4. 微服务之 EShop on dapr概览
  5. ef mysql modelfirst_MySQL –EF edmx(Model First)– Sql Server table
  6. 从Linux服务器端下载文件Win客户端
  7. 一个基于typescript、mobx、react16、react-router4、antd的后台模板
  8. mysql锁机制原理,一招彻底弄懂!
  9. Pyshark获取data-text-lines字段的值
  10. 用Gradle 构建你的android程序
  11. Atitit 字符串转换数组main参数解析 args splitByWholeSeparator String string= -host 101.1 8*124 -db 1
  12. ONMF正交非负矩阵分解·论文总结
  13. 【Verilog基础】卡诺图化简要点总结
  14. NFC技术 (二) -硬件设计
  15. SpringCloud-Netflix
  16. 微信小程序安全需求基线
  17. window下nginx实现图片缩放实操
  18. Python 爬虫 + 人脸检测 —— 知乎高颜值图片抓取
  19. 【操作系统】操作系统的功能管理与分类
  20. 真相 | 投机者根本不是用户!区块链市场因他们起高楼,因他们崩到底!

热门文章

  1. 《趣学算法(第2版)》读书笔记 Part 4 :贪心算法基础(操作)
  2. 22考研DS (2021-06-15)
  3. 微信红包封面怎么制作?微信红包封面序列号如何领取
  4. 使用poi进行excel导出复杂表头的设计
  5. vue简单路由(一)
  6. Adobe Photoshop CS6安装错误代码(37),解决办法
  7. 计算机网络(可当期末复习资料)
  8. JSqlparser 使用攻略(高效的SQL解析工具)
  9. c/c++游戏编程之扫雷
  10. 用 Java 撸一个身份证号码识别系统,准确率高达 90%