mqtt_dialog.cpp
Go to the documentation of this file.
1 #include "mqtt_dialog.h"
2 #include <QFileDialog>
3 #include "PlotJuggler/svg_util.h"
4 
6 {
7  _client->disconnect();
9  ui->listWidget->clear();
10  _topic_list.clear();
11  ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( false );
12  _topic_list_timer->stop();
13 }
14 
16  QDialog(nullptr),
17  ui(new Ui::DataStreamMQTT),
18  _client(mosq_client)
19 {
20  ui->setupUi(this);
21  ui->lineEditPort->setValidator( new QIntValidator );
22 
23  ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( false );
24 
25  static QString uuid = QString("Plotjuggler-") + QString::number(rand());
26 
27  QSettings settings;
28  restoreGeometry(settings.value("MosquittoMQTT::geometry").toByteArray());
29 
30  QString host = settings.value("MosquittoMQTT::host").toString();
31  ui->lineEditHost->setText( host );
32 
33  int port = settings.value("MosquittoMQTT::port", 1883).toInt();
34  ui->lineEditPort->setText( QString::number(port) );
35 
36  int qos = settings.value("MosquittoMQTT::qos", 0).toInt();
37  ui->comboBoxQoS->setCurrentIndex(qos);
38 
39  int protocol_mqtt = settings.value("MosquittoMQTT::protocol_version").toInt();
40  ui->comboBoxVersion->setCurrentIndex(protocol_mqtt);
41 
42  QString topic_filter = settings.value("MosquittoMQTT::filter").toString();
43  ui->lineEditTopicFilter->setText(topic_filter );
44 
45  QString username = settings.value("MosquittoMQTT::username", "").toString();
46  ui->lineEditUsername->setText(username);
47 
48  QString password = settings.value("MosquittoMQTT::password", "").toString();
49  ui->lineEditPassword->setText(password);
50 
51  _server_certificate_file = settings.value("MosquittoMQTT::server_certificate", "").toString();
52  if( !_server_certificate_file.isEmpty() )
53  {
54  ui->labelServerCertificate->setText(QFileInfo(_server_certificate_file).fileName());
55  ui->buttonEraseServerCertificate->setEnabled(true);
56  }
57 
58  _client_certificate_file = settings.value("MosquittoMQTT::client_certificate", "").toString();
59  if( !_client_certificate_file.isEmpty() )
60  {
61  ui->labelClientCertificate->setText(QFileInfo(_client_certificate_file).fileName());
62  ui->buttonEraseClientCertificate->setEnabled(true);
63  }
64 
65  _private_key_file = settings.value("MosquittoMQTT::private_key", "").toString();
66  if( !_private_key_file.isEmpty() )
67  {
68  ui->labelPrivateKey->setText(QFileInfo(_private_key_file).fileName());
69  ui->buttonErasePrivateKey->setEnabled(true);
70  }
71 
72  bool enable_tls = settings.value("MosquittoMQTT::enable_tls", false).toBool();
73  ui->checkBoxSecurity->setChecked(enable_tls);
74 
75  _topic_list_timer = new QTimer(this);
76 
77  QString theme = settings.value("StyleSheet::theme", "light").toString();
78 
79  const QPixmap &icon_pixmap = LoadSvg(":/resources/svg/import.svg", theme);
80  ui->buttonLoadServerCertificate->setIcon(icon_pixmap);
81  ui->buttonLoadClientCertificate->setIcon(icon_pixmap);
82  ui->buttonLoadPrivateKey->setIcon(icon_pixmap);
83 
84  connect(ui->buttonConnect, &QPushButton::clicked,
86 
87  connect(_topic_list_timer, &QTimer::timeout,
89 
90  connect(ui->listWidget, &QListWidget::itemSelectionChanged,
92 
93  connect(ui->buttonLoadServerCertificate, &QPushButton::clicked,
95 
96  connect(ui->buttonLoadClientCertificate, &QPushButton::clicked,
98 
99  connect(ui->buttonLoadPrivateKey, &QPushButton::clicked,
101 
102  connect(ui->buttonEraseServerCertificate, &QPushButton::clicked,
103  this, [this](){
104  ui->buttonEraseServerCertificate->setEnabled(false);
105  ui->labelServerCertificate->setText("");
106  _server_certificate_file.clear();
107  });
108 
109  connect(ui->buttonEraseClientCertificate, &QPushButton::clicked,
110  this, [this](){
111  ui->buttonEraseClientCertificate->setEnabled(false);
112  ui->labelClientCertificate->setText("");
113  _client_certificate_file.clear();
114  });
115 
116  connect(ui->buttonErasePrivateKey, &QPushButton::clicked,
117  this, [this](){
118  ui->buttonErasePrivateKey->setEnabled(false);
119  ui->labelPrivateKey->setText("");
120  _private_key_file.clear();
121  });
122 
123  connect(_client.get(), &MQTTClient::disconnected, this,
124  [this]() {
126  QMessageBox::warning(this, "Connection Lost",
127  "Client disconnected. Maybe a problem with autentication?");
128  });
129 }
130 
132 {
133  QSettings settings;
134  settings.setValue("MosquittoMQTT::geometry", this->saveGeometry());
135 
136  // save back to service
137  settings.setValue("MosquittoMQTT::host", ui->lineEditHost->text());
138  settings.setValue("MosquittoMQTT::port", ui->lineEditPort->text().toInt());
139  settings.setValue("MosquittoMQTT::filter", ui->lineEditTopicFilter->text());
140  settings.setValue("MosquittoMQTT::username", ui->lineEditPassword->text());
141  settings.setValue("MosquittoMQTT::password", ui->lineEditUsername->text());
142  settings.setValue("MosquittoMQTT::protocol_version", ui->comboBoxVersion->currentIndex());
143  settings.setValue("MosquittoMQTT::qos", ui->comboBoxQoS->currentIndex());
144  settings.setValue("MosquittoMQTT::serialization_protocol", ui->comboBoxProtocol->currentText());
145  settings.setValue("MosquittoMQTT::server_certificate", _server_certificate_file);
146  settings.setValue("MosquittoMQTT::client_certificate", _client_certificate_file);
147  settings.setValue("MosquittoMQTT::private_key", _private_key_file);
148  settings.setValue("MosquittoMQTT::enable_tls", ui->checkBoxSecurity->isChecked());
149 }
150 
152 {
153  while( ui->layoutOptions->count() > 0)
154  {
155  auto item = ui->layoutOptions->takeAt(0);
156  item->widget()->setParent(nullptr);
157  }
158 
159  saveSettings();
160 
161  delete ui;
162 }
163 
165 {
166  if( _client->isConnected() )
167  {
169  return;
170  }
171 
172  MosquittoConfig config;
173 
174  config.host = ui->lineEditHost->text().toStdString();
175  config.port = ui->lineEditPort->text().toInt();
176  config.topics.clear();
177  config.topics.push_back(ui->lineEditTopicFilter->text().toStdString());
178  config.username = ui->lineEditUsername->text().toStdString();
179  config.password = ui->lineEditPassword->text().toStdString();
180  config.qos = ui->comboBoxQoS->currentIndex();
181  config.protocol_version =
182  MQTT_PROTOCOL_V31 + ui->comboBoxVersion->currentIndex();
183 
184  config.keepalive = 60; // TODO
185  config.bind_address = ""; //TODO
186  config.max_inflight = 20; //TODO
187  config.clean_session = true; //TODO
188  config.eol = true; //TODO
189 
190  if( ui->checkBoxSecurity->isChecked() )
191  {
192  config.cafile = _server_certificate_file.toStdString();
193  config.certfile = _client_certificate_file.toStdString();
194  config.keyfile = _private_key_file.toStdString();
195  }
196 
197  changeConnectionState(true);
198  _client->connect(config);
199  _topic_list_timer->start(2000);
200 
201  saveSettings();
202 }
203 
205 {
206  auto topic_list = _client->getTopicList();
207 
208  bool changed = ui->listWidget->count() != topic_list.size();
209  if( !changed )
210  {
211  for(const auto& topic: topic_list)
212  {
213  if( _topic_list.count(topic) == 0 )
214  {
215  changed = true;
216  break;
217  }
218  }
219  }
220 
221  if( changed )
222  {
223  ui->listWidget->clear();
224  for(const auto& topic: topic_list)
225  {
226  ui->listWidget->addItem( QString::fromStdString(topic) );
227  _topic_list.insert(topic);
228  }
229  ui->listWidget->sortItems();
230  }
231 
232  if( _client->isConnected() == false )
233  {
235  }
236 }
237 
239 {
240  bool selected = ui->listWidget->selectedItems().count() > 0;
241  ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( selected );
242 }
243 
245 {
246  ui->connectionFrame->setEnabled(!connected);
247  ui->buttonConnect->setText( connected ? "Disconnect" : "Connect");
248  ui->lineEditTopicFilter->setEnabled(!connected);
249  ui->listWidget->setEnabled(connected);
250 }
251 
253 {
254  QSettings settings;
255  QString directory = settings.value("MQTT_Dialog.loadDirectory",
256  QDir::currentPath()).toString();
257 
258  QString filename = QFileDialog::getOpenFileName(
259  this, "Select Server Certificate", directory,tr("CRT (*.crt)") );
260 
261  if( !filename.isEmpty() )
262  {
263  _server_certificate_file = filename;
264  directory = QFileInfo(filename).absolutePath();
265  settings.setValue("MQTT_Dialog.loadDirectory", directory);
266 
267  ui->labelServerCertificate->setText(QFileInfo(filename).fileName());
268  ui->buttonEraseServerCertificate->setEnabled(true);
269  }
270 }
271 
273 {
274  QSettings settings;
275  QString directory = settings.value("MQTT_Dialog.loadDirectory",
276  QDir::currentPath()).toString();
277 
278  QString filename = QFileDialog::getOpenFileName(
279  this, "Select Client Certificate", directory,tr("CRT (*.crt)") );
280 
281  if( !filename.isEmpty() )
282  {
283  _client_certificate_file = filename;
284  directory = QFileInfo(filename).absolutePath();
285  settings.setValue("MQTT_Dialog.loadDirectory", directory);
286 
287  ui->labelClientCertificate->setText(QFileInfo(filename).fileName());
288  ui->buttonEraseClientCertificate->setEnabled(true);
289  }
290 }
291 
293 {
294  QSettings settings;
295  QString directory = settings.value("MQTT_Dialog.loadDirectory",
296  QDir::currentPath()).toString();
297 
298  QString filename = QFileDialog::getOpenFileName(
299  this, "Select PrivateKey", directory,tr("Key (*.key)") );
300 
301  if( !filename.isEmpty() )
302  {
303  _private_key_file = filename;
304  directory = QFileInfo(filename).absolutePath();
305  settings.setValue("MQTT_Dialog.loadDirectory", directory);
306 
307  ui->labelPrivateKey->setText(QFileInfo(filename).fileName());
308  ui->buttonErasePrivateKey->setEnabled(true);
309  }
310 }
MQTTClient::Ptr _client
Definition: mqtt_dialog.h:33
void onLoadPrivateKey()
std::shared_ptr< MQTTClient > Ptr
Definition: mqtt_client.h:18
void onLoadServerCertificate()
std::string certfile
#define nullptr
Definition: backward.hpp:386
std::string bind_address
std::string password
void onSelectionChanged()
void onButtonConnect()
QString _server_certificate_file
Definition: mqtt_dialog.h:49
const QPixmap & LoadSvg(QString filename, QString style_name="light")
Definition: svg_util.h:26
void onLoadClientCertificate()
std::string username
MQTT_Dialog(MQTTClient::Ptr mosq_client)
Definition: mqtt_dialog.cpp:15
void saveSettings()
QString _private_key_file
Definition: mqtt_dialog.h:51
unsigned int max_inflight
std::string cafile
void onConnectionClosed()
Definition: mqtt_dialog.cpp:5
QString _client_certificate_file
Definition: mqtt_dialog.h:50
Ui::DataStreamMQTT * ui
Definition: mqtt_dialog.h:19
std::string keyfile
void changeConnectionState(bool connected)
std::unordered_set< std::string > _topic_list
Definition: mqtt_dialog.h:53
std::vector< std::string > topics
void disconnected()
void onUpdateTopicList()
std::string host
QTimer * _topic_list_timer
Definition: mqtt_dialog.h:35


plotjuggler
Author(s): Davide Faconti
autogenerated on Mon Jun 19 2023 03:01:38