diff --git a/src/C++/Driver/src/MQTT/MqttClient.cpp b/src/C++/Driver/src/MQTT/MqttClient.cpp index c2b2fc9..7923822 100644 --- a/src/C++/Driver/src/MQTT/MqttClient.cpp +++ b/src/C++/Driver/src/MQTT/MqttClient.cpp @@ -1,11 +1,11 @@ #include "MqttClient.h" MqttClient::MqttClient(const std::string& address, const std::string& clientId, const std::string& username, const std::string& password) - : client_(address, clientId), username_(username), password_(password) { + : client_(address, clientId), username_(username), password_(password), callback_(*this) { client_.set_callback(callback_); connOpts_.set_clean_session(true); connOpts_.set_mqtt_version(MQTTVERSION_3_1_1); // For MQTT 3.1.1 - if (!username_.empty() && !password_.empty()) { //if username and password are not empty also set those otherwise log in anonymously + if (!username_.empty() && !password_.empty()) { connOpts_.set_user_name(username_); connOpts_.set_password(password_); } @@ -32,7 +32,7 @@ void MqttClient::subscribe(const std::string& topic, int qos) { } } -/// @brief only needed if program doesnt loop itself +/// @brief Only needed when program doesnt keep itself alive void MqttClient::run() { // Keep the client running to receive messages while (true) { @@ -41,9 +41,8 @@ void MqttClient::run() { } void MqttClient::Callback::message_arrived(mqtt::const_message_ptr msg) { - std::cout << "Received message: '" << msg->get_topic() - << "' : " << msg->to_string() << std::endl; - // Do something with the message, e.g., trigger a GPIO action + std::lock_guard lock(client_.messageMutex_); + client_.lastMessage_ = msg->to_string(); } void MqttClient::Callback::connection_lost(const std::string& cause) { @@ -52,4 +51,11 @@ void MqttClient::Callback::connection_lost(const std::string& cause) { void MqttClient::Callback::delivery_complete(mqtt::delivery_token_ptr token) { std::cout << "Message delivered!" << std::endl; +} + +/// @brief Get the last message received from the MQTT broker +/// @return The last message received in a string +std::string MqttClient::getLastMessage() { + std::lock_guard lock(messageMutex_); + return lastMessage_; } \ No newline at end of file diff --git a/src/C++/Driver/src/MQTT/MqttClient.h b/src/C++/Driver/src/MQTT/MqttClient.h index 3f11986..0cae258 100644 --- a/src/C++/Driver/src/MQTT/MqttClient.h +++ b/src/C++/Driver/src/MQTT/MqttClient.h @@ -3,6 +3,7 @@ #include #include +#include #include class MqttClient { @@ -11,13 +12,18 @@ public: void connect(); void subscribe(const std::string& topic, int qos = 1); void run(); + std::string getLastMessage(); private: class Callback : public virtual mqtt::callback { public: - void message_arrived(mqtt::const_message_ptr msg) override; //overide the main functions in the original class + Callback(MqttClient& client) : client_(client) {} + void message_arrived(mqtt::const_message_ptr msg) override; void connection_lost(const std::string& cause) override; void delivery_complete(mqtt::delivery_token_ptr token) override; + + private: + MqttClient& client_; }; mqtt::async_client client_; @@ -25,6 +31,8 @@ private: Callback callback_; std::string username_; std::string password_; + std::string lastMessage_; + std::mutex messageMutex_; }; #endif // MQTTCLIENT_H \ No newline at end of file diff --git a/src/C++/Driver/src/main.cpp b/src/C++/Driver/src/main.cpp index 71fefcf..9763535 100644 --- a/src/C++/Driver/src/main.cpp +++ b/src/C++/Driver/src/main.cpp @@ -9,12 +9,12 @@ using namespace std; CKobuki robot; int movement(); -int checkCenterCliff(); +std::string ReadMQTT() void setup(){ unsigned char *null_ptr(0); robot.startCommunication("/dev/ttyUSB0", true, null_ptr); - MqttClient client("mqtt://localhost:1883", "raspberry_pi_client", "ishak", "kobuki"); + MqttClient client("mqtt://localhost:1883", "KobukiRPI", "ishak", "kobuki"); client.connect(); client.subscribe("home/commands"); @@ -23,19 +23,23 @@ void setup(){ int main() { - // thread mv(movement); - // mv.join(); //only exit once thread one is done running - - checkCenterCliff(); +readMQTT(); return 0; } -int checkCenterCliff() +std::string ReadMQTT() { - while(true){ - std::cout << robot.parser.data.CliffSensorCenter << endl; - } + while (true) { + std::string message = client.getLastMessage(); + if (!message.empty()) { + std::cout << "MQTT Message: " << message << std::endl; + } + + // Add a small delay to avoid busy-waiting + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + return message; + } }