WebSocketSubscription.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "WebSocketSubscription.h"
  2. #include <json.hpp>
  3. #include <Logging.h>
  4. #include <sstream>
  5. namespace ToonBridge {
  6. namespace Toon {
  7. WebSocketSubscription::WebSocketSubscription(const ToonSettings& toonSettings) :
  8. m_toonSettings(toonSettings)
  9. {
  10. OpenWebSocket();
  11. }
  12. WebSocketSubscription::~WebSocketSubscription()
  13. {
  14. CloseWebSocket();
  15. }
  16. void WebSocketSubscription::Reconnect()
  17. {
  18. CloseWebSocket();
  19. OpenWebSocket();
  20. }
  21. void WebSocketSubscription::OpenWebSocket()
  22. {
  23. std::stringstream url;
  24. url << "https://api.toon.eu/toon/v3/";
  25. url << m_toonSettings.agreementId;
  26. url << "/webhooks";
  27. std::vector<std::string> subscribedActions;
  28. subscribedActions.push_back("Thermostat");
  29. subscribedActions.push_back("PowerUsage");
  30. subscribedActions.push_back("BoilerError");
  31. nlohmann::json data;
  32. data["applicationId"] = m_toonSettings.applicationId;
  33. data["callbackUrl"] = m_toonSettings.callbackUrl;
  34. data["subscribedActions"] = subscribedActions;
  35. Http::HttpRequest request(url.str());
  36. request.Method(Http::HttpRequest::Method::POST);
  37. request.Headers(RequestHeaders());
  38. request.Data(data.dump());
  39. try
  40. {
  41. m_httpClient.Open(request);
  42. }
  43. catch (const std::exception& e)
  44. {
  45. std::stringstream ss;
  46. ss << "Error Opening Websocket: " << std::endl;
  47. ss << "Type : " << typeid(e).name() << std::endl;
  48. ss << "ERROR: " << e.what() << std::endl;
  49. Logging::Log(Logging::Severity::Error, ss.str());
  50. throw std::runtime_error("Error Connecting to Toon WebService.");
  51. }
  52. }
  53. void WebSocketSubscription::WebSocketStatus()
  54. {
  55. std::stringstream url;
  56. url << "https://api.toon.eu/toon/v3/";
  57. url << m_toonSettings.agreementId;
  58. url << "/webhooks/";
  59. Http::HttpRequest request(url.str());
  60. request.Headers(RequestHeaders());
  61. nlohmann::json answer = nlohmann::json::parse(m_httpClient.Open(request));
  62. }
  63. void WebSocketSubscription::CloseWebSocket()
  64. {
  65. std::stringstream url;
  66. url << "https://api.toon.eu/toon/v3/";
  67. url << m_toonSettings.agreementId;
  68. url << "/webhooks/";
  69. url << m_toonSettings.applicationId;
  70. Http::HttpRequest request(url.str());
  71. request.Method(Http::HttpRequest::Method::DELETE);
  72. request.Headers(RequestHeaders());
  73. std::string returnValue = m_httpClient.Open(request);
  74. std::stringstream ss;
  75. ss << "Closing Websocket: " << returnValue << std::endl;
  76. Logging::Log(Logging::Severity::Info, ss.str());
  77. }
  78. std::vector<std::string> WebSocketSubscription::RequestHeaders()
  79. {
  80. std::vector<std::string> headers;
  81. headers.push_back("cache-control: no-cache");
  82. headers.push_back("accept: application/json");
  83. headers.push_back("content-type: application/json");
  84. std::stringstream header;
  85. header << "authorization: Bearer " << m_toonSettings.accessToken;
  86. headers.push_back(header.str());
  87. header.str("");
  88. header << "X-CommonName: " << m_toonSettings.displayCommonName;
  89. headers.push_back(header.str());
  90. header.str("");
  91. header << "X-Agreement-ID: " << m_toonSettings.agreementId;
  92. headers.push_back(header.str());
  93. return headers;
  94. }
  95. } // namespace Toon
  96. } // namespace ToonBridge