MiLightDiscoveryServer.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include <MiLightDiscoveryServer.h>
  2. #include <Size.h>
  3. #include <ESP8266WiFi.h>
  4. const char V3_SEARCH_STRING[] = "Link_Wi-Fi";
  5. const char V6_SEARCH_STRING[] = "HF-A11ASSISTHREAD";
  6. MiLightDiscoveryServer::MiLightDiscoveryServer(Settings& settings)
  7. : settings(settings)
  8. { }
  9. MiLightDiscoveryServer::MiLightDiscoveryServer(MiLightDiscoveryServer& other)
  10. : settings(other.settings)
  11. { }
  12. MiLightDiscoveryServer& MiLightDiscoveryServer::operator=(MiLightDiscoveryServer other) {
  13. this->settings = other.settings;
  14. this->socket = other.socket;
  15. return *this;
  16. }
  17. MiLightDiscoveryServer::~MiLightDiscoveryServer() {
  18. socket.stop();
  19. }
  20. void MiLightDiscoveryServer::begin() {
  21. socket.begin(settings.discoveryPort);
  22. }
  23. void MiLightDiscoveryServer::handleClient() {
  24. size_t packetSize = socket.parsePacket();
  25. if (packetSize) {
  26. char buffer[size(V6_SEARCH_STRING) + 1];
  27. socket.read(buffer, packetSize);
  28. buffer[packetSize] = 0;
  29. #ifdef MILIGHT_UDP_DEBUG
  30. printf("Got discovery packet: %s\n", buffer);
  31. #endif
  32. if (strcmp(buffer, V3_SEARCH_STRING) == 0) {
  33. handleDiscovery(5);
  34. } else if (strcmp(buffer, V6_SEARCH_STRING) == 0) {
  35. handleDiscovery(6);
  36. }
  37. }
  38. }
  39. void MiLightDiscoveryServer::handleDiscovery(uint8_t version) {
  40. #ifdef MILIGHT_UDP_DEBUG
  41. printf_P(PSTR("Handling discovery for version: %u, %d configs to consider\n"), version, settings.gatewayConfigs.size());
  42. #endif
  43. char buffer[40];
  44. for (size_t i = 0; i < settings.gatewayConfigs.size(); i++) {
  45. const GatewayConfig& config = *settings.gatewayConfigs[i];
  46. if (config.protocolVersion != version) {
  47. continue;
  48. }
  49. IPAddress addr = WiFi.localIP();
  50. char* ptr = buffer;
  51. ptr += sprintf_P(
  52. buffer,
  53. PSTR("%d.%d.%d.%d,00000000%02X%02X"),
  54. addr[0], addr[1], addr[2], addr[3],
  55. (config.deviceId >> 8), (config.deviceId & 0xFF)
  56. );
  57. if (config.protocolVersion == 5) {
  58. sendResponse(buffer);
  59. } else {
  60. sprintf_P(ptr, PSTR(",HF-LPB100"));
  61. sendResponse(buffer);
  62. }
  63. }
  64. }
  65. void MiLightDiscoveryServer::sendResponse(char* buffer) {
  66. #ifdef MILIGHT_UDP_DEBUG
  67. printf_P(PSTR("Sending response: %s\n"), buffer);
  68. #endif
  69. socket.beginPacket(socket.remoteIP(), socket.remotePort());
  70. socket.write(buffer);
  71. socket.endPacket();
  72. }