ESP8266 RTOS2.0学习之旅(5)— MQTT通信

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的控制台,可以看到,其连接成功
在这里插入图片描述
接收到了其发布的主题
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值