* @brief Handles broker state transitions; subscribes once Connected. */
| 880 | * @brief Handles broker state transitions; subscribes once Connected. |
| 881 | */ |
| 882 | void IO::Drivers::MQTT::onStateChanged(QMqttClient::ClientState state) |
| 883 | { |
| 884 | qCInfo(lcMqttSub) << "state changed:" << state; |
| 885 | Q_EMIT connectedChanged(); |
| 886 | |
| 887 | if (state == QMqttClient::Connected && !m_topicFilter.isEmpty()) { |
| 888 | QMqttTopicFilter filter; |
| 889 | filter.setFilter(m_topicFilter); |
| 890 | |
| 891 | auto* sub = m_client.subscribe(filter, 0); |
| 892 | if (!sub || sub->state() == QMqttSubscription::Error) { |
| 893 | qCCritical(lcMqttSub) << "subscribe failed for filter" << m_topicFilter; |
| 894 | Misc::Utilities::showMessageBox(tr("MQTT Subscription Error"), |
| 895 | tr("Failed to subscribe to topic \"%1\".").arg(m_topicFilter), |
| 896 | QMessageBox::Critical); |
| 897 | return; |
| 898 | } |
| 899 | |
| 900 | qCInfo(lcMqttSub) << "subscribed to" << m_topicFilter << "initial state:" << sub->state(); |
| 901 | connect( |
| 902 | sub, &QMqttSubscription::stateChanged, this, [this](QMqttSubscription::SubscriptionState s) { |
| 903 | qCInfo(lcMqttSub) << "subscription state for" << m_topicFilter << "->" << s; |
| 904 | }); |
| 905 | } |
| 906 | } |
| 907 | |
| 908 | /** |
| 909 | * @brief Surfaces broker errors to the user. |