| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #include <MiLightDiscoveryServer.h>
- #include <Size.h>
- #include <ESP8266WiFi.h>
- const char V3_SEARCH_STRING[] = "Link_Wi-Fi";
- const char V6_SEARCH_STRING[] = "HF-A11ASSISTHREAD";
- MiLightDiscoveryServer::MiLightDiscoveryServer(Settings& settings)
- : settings(settings)
- { }
- MiLightDiscoveryServer::MiLightDiscoveryServer(MiLightDiscoveryServer& other)
- : settings(other.settings)
- { }
- MiLightDiscoveryServer& MiLightDiscoveryServer::operator=(MiLightDiscoveryServer other) {
- this->settings = other.settings;
- this->socket = other.socket;
- }
- MiLightDiscoveryServer::~MiLightDiscoveryServer() {
- socket.stop();
- }
- void MiLightDiscoveryServer::begin() {
- socket.begin(settings.discoveryPort);
- }
- void MiLightDiscoveryServer::handleClient() {
- size_t packetSize = socket.parsePacket();
- if (packetSize) {
- char buffer[size(V6_SEARCH_STRING) + 1];
- socket.read(buffer, packetSize);
- buffer[packetSize] = 0;
- #ifdef MILIGHT_UDP_DEBUG
- printf("Got discovery packet: %s\n", buffer);
- #endif
- if (strcmp(buffer, V3_SEARCH_STRING) == 0) {
- handleDiscovery(5);
- } else if (strcmp(buffer, V6_SEARCH_STRING) == 0) {
- handleDiscovery(6);
- }
- }
- }
- void MiLightDiscoveryServer::handleDiscovery(uint8_t version) {
- #ifdef MILIGHT_UDP_DEBUG
- printf("Handling discovery for version: %u, %d configs to consider\n", version, settings.numGatewayConfigs);
- #endif
- char buffer[40];
- for (size_t i = 0; i < settings.numGatewayConfigs; i++) {
- GatewayConfig* config = settings.gatewayConfigs[i];
- if (config->protocolVersion != version) {
- continue;
- }
- IPAddress addr = WiFi.localIP();
- char* ptr = buffer;
- ptr += sprintf_P(
- buffer,
- PSTR("%d.%d.%d.%d,00000000%02X%02X"),
- addr[0], addr[1], addr[2], addr[3],
- (config->deviceId >> 8), (config->deviceId & 0xFF)
- );
- if (config->protocolVersion == 5) {
- sendResponse(buffer);
- } else {
- sprintf_P(ptr, PSTR(",HF-LPB100"));
- sendResponse(buffer);
- }
- }
- }
- void MiLightDiscoveryServer::sendResponse(char* buffer) {
- socket.beginPacket(socket.remoteIP(), socket.remotePort());
- socket.write(buffer);
- socket.endPacket();
- }
|