ESP8266 RTOS学习之旅(5)— MQTT通信
一、前言
在上一节:ESP8266 RTOS学习之旅(4)— UDP通信和TCP客户端通信 的基础上,将ESP8266_RTOS_SDK-2.0.0\examples\mqtt_demo\
下出去user_main.c
的文件复制到app
目录下(提示覆盖则确认)。
因为RTOS 2.0.0对MQTT的支持好像有问题,所以我拉取v2.1.1版本的代码下来使用,乐鑫官方的仓库:
git clone -b v2.1.1 https://github.com/espressif/ESP8266_RTOS_SDK.git
然后因为github不稳定,特别是网速不够的话经常出问题,所以我复制了一份代码到gitee上:
git clone -b v2.1.1 https://gitee.com/william_william/ESP8266_RTOS_SDK.git
二、开始MQTT通信
还有一个问题就是,MQTT不支持断线重连,所以我只好每隔5s发布一个主题,当发布不成功时,重新连接MQTT。编写app_main.c
文件如下:
#include "esp_common.h"
#if !defined(MQTT_TASK)
#define MQTT_TASK
#endif
#include "lwip/sockets.h"
#include "mqtt/MQTTClient.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
static void messageArrived(MessageData* data)
{
printf("topic Message arrived: \n%s\n", data->message->payload);
}
/* 1、定义一个MQTT客户端结构体 */
MQTTClient client;
/* 2、网络连接参数结构体 */
Network network;
/* 3、MQTT连接参数结构体 */
MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;
unsigned char sendbuf[80], readbuf[80] = {0};
int count = 0;
MQTTMessage message;
char payload[30];
void mqtt_connect(void)
{
/* 4、连接到mqtt服务器 */
int rc = NetworkConnect(&network, "39.96.35.207", 1883);
if (rc!= 0) {
printf("Return code from network connect is %d\n", rc);
}
#if defined(MQTT_TASK)
if ((rc = MQTTStartTask(&client)) != pdPASS) {
printf("Return code from start tasks is %d\n", rc);
} else {
printf("Use MQTTStartTask\n");
}
#endif
/* 5、设置MQTT连接参数 */
connectData.MQTTVersion = 3;
connectData.clientID.cstring = "ESP8266"; /* clientID */
connectData.username.cstring = "ESP8266"; /* 用户名 */
connectData.password.cstring = "123456"; /* 用户名密码 */
/* 6、向mqtt服务器发送连接报文 */
rc = MQTTConnect(&client, &connectData);
if (rc != 0) {
printf("Return code from MQTT connect is %d\n", rc);
} else {
printf("MQTT Connected\n");
}
/* 7、订阅一个主题 ,并设置订阅主题回调函数 */
rc = MQTTSubscribe(&client, "ESP8266_Subscribe", QOS0, messageArrived);
if (rc != 0) {
printf("Return code from MQTT subscribe is %d\n", rc);
} else {
printf("MQTT subscribe to topic ESP8266_Subscribe OK\n");
}
}
int app_main(void)
{
int rc = 0;
client.defaultMessageHandler = messageArrived;
NetworkInit(&network);
MQTTClientInit(&client, &network, 30000, sendbuf, sizeof(sendbuf), readbuf, sizeof(readbuf));
while(1)
{
message.qos = QOS0;
message.retained = 0;
message.payload = payload;
sprintf(payload, "message number %d", count);
message.payloadlen = strlen(payload);
if ((rc = MQTTPublish(&client, "ESP8266_Publish", &message)) != 0) {
printf("Return code from MQTT publish is %d\n", rc);
mqtt_connect();
} else {
printf("MQTT publish topic ESP8266_Publish ok, message number is %d\n", count++);
}
vTaskDelay(5000 / portTICK_RATE_MS); //send every 1 seconds
}
return 0;
}
编译下载运行,可以看到,连接MQTT服务器成功,订阅和发布主题也没问题
打开EMQ的控制台,可以看到,其连接成功
接收到了其发布的主题