//
// Created by Administrator on 2020/10/27.
//
#ifndef TEST_MQTTCLIENT_H
#define TEST_MQTTCLIENT_H
#include "mqtt/client.h"
#include <unordered_set>
namespace MqttClient {
class MqttClient : public mqtt::callback, public std::enable_shared_from_this<MqttClient> {
public:
MqttClient();
~MqttClient();
bool Init();
void Connect();
void StartConnect();
void SendMsg(std::string &msg);
void Register();
bool initPubSub();
void connected(const std::string& cause) override;
void connection_lost(const std::string &cause) override;
void message_arrived(mqtt::const_message_ptr msg) override;
//void delivery_complete(mqtt::delivery_token_ptr tok) override;
mqtt::client *_client;
mqtt::connect_options _opts;
std::string _registerTopic = "registerSub";
std::string _clientId = "test";
std::string _subTopic = "sub";
std::string _pubTopic = "pub";
std::recursive_mutex _mutex;
};
}
#endif //TEST_MQTTCLIENT_H
//
// Created by Administrator on 2020/10/27.
//
#include "MqttClient.h"
namespace MqttClient{
MqttClient::MqttClient() : _client(0){
}
MqttClient::~MqttClient() {
printf("~MqttClient\n");
//_client->disconnect(); //调用disconnect后正常退出对方收不到遗嘱信息
}
bool MqttClient::Init() {
try {
_client = new mqtt::client("tcp://127.0.0.1:1883" , _clientId);
// callback cb;
_opts.set_keep_alive_interval(30);
_opts.set_clean_session(true);
_opts.set_connect_timeout(1);
_opts.set_mqtt_version(MQTTVERSION_5);
_opts.set_clean_start(true);
Json::Value root;
Json::StyledWriter writer;
root["id"] = _clientId;
root["status"] = "OFF";
std::string msg = writer.write(root);
mqtt::message willmsg(_registerTopic , msg.c_str(), msg.size(), 1, false);//遗嘱信息
_opts.set_will_message(willmsg);
_client->start_consuming();
_client->set_callback(*shared_from_this());
}
catch (const mqtt::persistence_exception &exc) {
std::cout << "Init: " << exc.what();
return false;
}
catch (const mqtt::exception &exc) {
std::cout << "Init: " << exc.what();
return false;
}
return true;
}
void MqttClient::Connect() {
try {
_client->connect(_opts);
}
catch (const mqtt::persistence_exception &exc) {
std::cout << "Connect: " << exc.what();
return;
} catch (const mqtt::exception &exc) {
std::cout << "Connect: " << exc.what();
return;
}
// _service->GEN(evConnected);
initPubSub();
}
void MqttClient::StartConnect() {
// _service->GEN(evConnectToMqtt);
}
bool MqttClient::initPubSub() {
try {
_client->subscribe(_registerTopic );
_client->subscribe(_subTopic);
} catch (const mqtt::persistence_exception &exc) {
std::cout<<"InitPubSub: " << exc.what();
return false;
} catch (const mqtt::exception &exc) {
std::cout<<"InitPubSub: " << exc.what();
return false;
}
return true;
}
void MqttClient::connected(const std::string &cause) {
std::cout << "connected" << cause << std::endl;
}
void MqttClient::connection_lost(const std::string &cause) {
std::cout<<"connection_lost: " << cause;
// _service->GEN(evDisConnected);
}
void MqttClient::message_arrived(mqtt::const_message_ptr msg) {
std::cout << msg->get_payload_str() << std::endl;
if (msg->get_topic() == _registerTopic) {
S_LOG_ERROR("CMS is shutdown");
//_service->GEN(evRetryRegister);
return;
}
}
/*
void MqttClient::delivery_complete(mqtt::delivery_token_ptr tok) {
std::cout << "delivery_complete:" <<tok->get_message()->get_payload() << std::endl;
}
*/
void MqttClient::SendMsg(std::string &msg) {
try {
std::cout << _pubTopic << "SendMsg:" << msg;
_client->publish(_pubTopic, msg.c_str(), msg.size(), 2, false);
} catch (const mqtt::exception &exc) {
std::cout << "SendMsg: " << exc.what();
}
}
}