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;
}