c++ nanoMQ 发布和订阅消息,代码优化

c++ nanoMQ 发布和订阅消息,代码优化,实现了发布消息和订阅消息的打印输出监听。

nanomq.h

#ifndef NANOMQ_H
#define NANOMQ_H

#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <iostream>
#include <stdio.h>
#include <MQTTClient.h>

#define ADDRESS     "tcp://broker.emqx.io:1883"
#define USERNAME    "xgdd"
#define PASSWORD    "xgdd"
#define CLIENTID    "mqttx_47b97142"
#define QOS         0
#define TIMEOUT     10000L

class NanoMQ
{
public:
    NanoMQ();
    ///
    /// \brief init 连接nanomq
    /// \return  -1-连接失败 0-连接成功
    ///
    int init();
    ///
    /// \brief quit 断开连接
    ///
    void quit();
    ///
    /// \brief sendInfo 发送信息
    /// \param topic    节点
    /// \param data     数据
    ///
    void sendInfo(char *topic, char *data);

private:
    MQTTClient client;

    void publish(MQTTClient client, char *topic, char *payload);

};

///
/// \brief on_message   接收消息
/// \param context
/// \param topicName    节点 用于区分不同节点
/// \param topicLen
/// \param message      数据 结构中的message->payload
/// \return
///
int on_message(void *context, char *topicName, int topicLen, MQTTClient_message *message);

#endif // NANOMQ_H

nanomq.cpp

#include "nanomq.h"

int on_message(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
    printf("Message arrived \n");
    printf("  topic: %s\n", topicName);
    printf("  message: %d...%s\n", message->payloadlen, (char*)message->payload);

    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);
    return 1;   //此处不能为0,若为0则topicName打印乱码
}

NanoMQ::NanoMQ()
{

}

int NanoMQ::init()
{
    MQTTClient_create(&client, ADDRESS, CLIENTID, 0, NULL);
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    conn_opts.username = USERNAME;
    conn_opts.password = PASSWORD;

    MQTTClient_setCallbacks(client, NULL, NULL, on_message, NULL);

    if (MQTTClient_connect(client, &conn_opts) != MQTTCLIENT_SUCCESS) {
        printf("Failed to connect\n");
        return -1;
    } else {
        printf("Connected to MQTT Broker!\n");
    }

    //监听以testtopic/开头的所有主题
    if (MQTTClient_subscribe(client, "testtopic/#", QOS) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to subscribe\n");
    }

    return 0;
}

void NanoMQ::quit()
{
    MQTTClient_disconnect(client, TIMEOUT);
    MQTTClient_destroy(&client);
}

void NanoMQ::sendInfo(char *topic, char *data)
{
    publish(client, topic, data);
}

void NanoMQ::publish(MQTTClient client, char *topic, char *payload)
{
    MQTTClient_message message = MQTTClient_message_initializer;
    message.payload = payload;
    message.payloadlen = strlen(payload);
    message.qos = QOS;
    message.retained = 0;
    MQTTClient_deliveryToken token;
    MQTTClient_publishMessage(client, topic, &message, &token);
    MQTTClient_waitForCompletion(client, token, TIMEOUT);
    printf("Send `%s`\n", payload);
}

main.cpp

#include <iostream>
#include <thread>

#include "nanomq.h"

using namespace std;

NanoMQ nanomq;

void topic_1()
{
    while(true) {
        nanomq.sendInfo("testtopic/1", "this is test topic 1");
        sleep(1);
    }
}

int main(int argc, char *argv[])
{
    cout<<"hello world"<<endl;

    if(nanomq.init() < 0) {
        cout<<"nanomq connect failed.."<<endl;
    }

    thread t1(&topic_1);

    while (true) {
        sleep(1);
    }

    nanomq.quit();

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值