MiLightDiscoveryServer.cpp 2.1 KB

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