/* SSDP MODULE Copyright (C) 2017-2019 by Xose PĂ©rez Uses SSDP library by PawelDino (https://github.com/PawelDino) https://github.com/esp8266/Arduino/issues/2283#issuecomment-299635604 */ #include "espurna.h" #if SSDP_SUPPORT #include #include "web.h" namespace ssdp { namespace { namespace settings { String name() { return getSetting("ssdpName", systemHostname()); } // needs to be in the response // ref. https://github.com/esp8266/Arduino/issues/2283 String type() { return getSetting("ssdpType", F(SSDP_DEVICE_TYPE)); } String udn() { String out; out += F("38323636-4558-4dda-9188-cda0e6"); out += String(systemShortChipId()); return out; } } // namespace settings String entry(const String& tag, const String& value) { String out; out.reserve((tag.length() * 2) + value.length() + 16); out += '<'; out += tag; out += '>'; out += value; out += F("'; return out; } String entry(const String& tag, espurna::StringView value) { return entry(tag, String(value)); } String response() { String out; out.reserve(512); out += F("" "" "" "1" "0" ""); // http://%s:%u/ String base; base += F("http://"); base += WiFi.localIP().toString(); base += ':'; base += String(webPort(), 10); base += '/'; out += entry(F("URLBase"), base); // ... String device; // %s device += entry(F("deviceType"), settings::type()); // %s device += entry(F("friendlyName"), settings::name()); // / device += entry(F("presentationURL"), String('/')); // %u device += entry(F("serialNumber"), systemShortChipId()); const auto app = buildApp(); // %s device += entry(F("modelName"), app.name); // %s device += entry(F("modelNumber"), app.version); // %s device += entry(F("modelURL"), app.website); // %s device += entry(F("manufacturer"), systemDevice()); // %s device += entry(F("manufacturerURL"), app.website); // uuid:38323636-4558-4dda-9188-cda0e6%06x device += entry(F("UDN"), settings::udn()); out += entry(F("device"), device); out += F(""); return out; } void setup() { webServer().on("/description.xml", HTTP_GET, [](AsyncWebServerRequest* request) { request->send(200, "text/xml", response()); }); SSDP.setSchemaURL("description.xml"); SSDP.setHTTPPort(webPort()); SSDP.setDeviceType(settings::type()); SSDP.setSerialNumber(ESP.getChipId()); const auto app = buildApp(); SSDP.setModelName(String(app.name)); SSDP.setModelNumber(String(app.version)); SSDP.setModelURL(String(app.website)); SSDP.setManufacturer(String(systemDevice())); SSDP.setURL("/"); SSDP.setName(settings::name()); SSDP.begin(); espurnaRegisterReload([]() { SSDP.setName(settings::name()); }); } } // namespace } // namespace ssdp void ssdpSetup() { ssdp::setup(); } #endif // SSDP_SUPPORT