#ifndef MQTT_PROTOCOL_H #define MQTT_PROTOCOL_H #include "protocol.h" #include #include #include #include #include #include #include #include #include #include #define MQTT_PING_INTERVAL_SECONDS 90 #define MQTT_RECONNECT_INTERVAL_MS 10000 #define MQTT_PROTOCOL_SERVER_HELLO_EVENT (1 << 0) class MqttProtocol : public Protocol { public: MqttProtocol(); ~MqttProtocol(); void OnIncomingAudio(std::function callback); void OnIncomingJson(std::function callback); void SendAudio(const std::string& data); void SendText(const std::string& text); void SendState(const std::string& state); void SendAbort(); bool OpenAudioChannel(); void CloseAudioChannel(); void OnAudioChannelOpened(std::function callback); void OnAudioChannelClosed(std::function callback); bool IsAudioChannelOpened() const; int GetServerSampleRate() const; private: EventGroupHandle_t event_group_handle_; std::function on_incoming_json_; std::function on_incoming_audio_; std::function on_audio_channel_opened_; std::function on_audio_channel_closed_; std::string endpoint_; std::string client_id_; std::string username_; std::string password_; std::string subscribe_topic_; std::string publish_topic_; std::mutex channel_mutex_; Mqtt* mqtt_ = nullptr; Udp* udp_ = nullptr; mbedtls_aes_context aes_ctx_; std::string aes_nonce_; std::string udp_server_; int udp_port_; uint32_t local_sequence_; uint32_t remote_sequence_; std::string session_id_; int server_sample_rate_ = 16000; bool StartMqttClient(); void ParseServerHello(const cJSON* root); std::string DecodeHexString(const std::string& hex_string); }; #endif // MQTT_PROTOCOL_H