Initial code check-in
[apps/agl-telematics-demo-recorder.git] / app / mqttclient.cpp
1 /*
2  * Copyright (C) 2019 Konsulko Group
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "mqttclient.h"
18 #include <iostream>
19
20 #undef DEBUG
21
22 #ifdef DEBUG
23 static void on_connect(struct mosquitto *mosq, void *obj, int rc)
24 {
25         std::cerr << " MQTT Connected, rc = " << rc << std::endl;
26 }
27
28 static void on_disconnect(struct mosquitto *mosq, void *obj, int rc)
29 {
30         std::cerr << " MQTT Disconnected, rc = " << rc << std::endl;
31 }
32 #endif
33
34 MqttClient::MqttClient(const std::string &id, const std::string &host, const int port, const int keepalive, const std::string &username, const std::string &password)
35 {
36         mosquitto_lib_init();
37         m_mosq = mosquitto_new(id.c_str(), true, NULL);
38
39 #ifdef DEBUG
40         mosquitto_connect_callback_set(m_mosq, on_connect);
41         mosquitto_disconnect_callback_set(m_mosq, on_disconnect);
42 #endif
43
44         if(username.length())
45                 mosquitto_username_pw_set(m_mosq, username.c_str(), password.c_str());
46
47         if(mosquitto_connect_async(m_mosq, host.c_str(), port, keepalive)) {
48                 std::cerr << __FUNCTION__ << ": Unable to connect to " << host << std::endl;
49         }
50
51         int loop = mosquitto_loop_start(m_mosq);
52         if(loop != MOSQ_ERR_SUCCESS){
53                 std::cerr << __FUNCTION__ << ": Unable to start loop, error = " << loop << std::endl;
54         }
55 }
56
57 MqttClient::~MqttClient(void)
58 {
59         mosquitto_disconnect(m_mosq);
60         mosquitto_loop_stop(m_mosq, true);
61         mosquitto_destroy(m_mosq);
62         mosquitto_lib_cleanup();
63 }
64
65 int MqttClient::publish(const std::string &topic, const std::string &msg, const int qos, const bool retain)
66 {
67         return mosquitto_publish(m_mosq, NULL, topic.c_str(), msg.length(), msg.c_str(), qos, retain);
68 }