From ad58d97e79923c87208c20a3827f63923655a57a Mon Sep 17 00:00:00 2001 From: Ahmed El Sharnoby Date: Sun, 10 Feb 2019 15:30:28 +0200 Subject: [PATCH 1/4] Update ESP8266SSDP.h Fix SSDP bug: The response to M-Search Packet with ST field set to UUID should be with the UUID not the Device Type Integrated 'uuid:' prefix into the char array of the _uuid --- libraries/ESP8266SSDP/ESP8266SSDP.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/libraries/ESP8266SSDP/ESP8266SSDP.h b/libraries/ESP8266SSDP/ESP8266SSDP.h index e320f058aa..5fbbf59364 100644 --- a/libraries/ESP8266SSDP/ESP8266SSDP.h +++ b/libraries/ESP8266SSDP/ESP8266SSDP.h @@ -35,7 +35,7 @@ License (MIT license): class UdpContext; -#define SSDP_UUID_SIZE 37 +#define SSDP_UUID_SIZE 42 #define SSDP_SCHEMA_URL_SIZE 64 #define SSDP_DEVICE_TYPE_SIZE 64 #define SSDP_FRIENDLY_NAME_SIZE 64 @@ -66,17 +66,17 @@ class SSDPClass{ void setDeviceType(const String& deviceType) { setDeviceType(deviceType.c_str()); } void setDeviceType(const char *deviceType); - /*To define a custom UUID, you must call the method before begin(). Otherwise an automatic UUID based on CHIPID will be generated.*/ - void setUUID(const String& uuid) { setUUID(uuid.c_str()); } - void setUUID(const char *uuid); + /*To define a custom UUID, you must call the method before begin(). Otherwise an automatic UUID based on CHIPID will be generated.*/ + void setUUID(const String& uuid) { setUUID(uuid.c_str()); } + void setUUID(const char *uuid); - void setName(const String& name) { setName(name.c_str()); } + void setName(const String& name) { setName(name.c_str()); } void setName(const char *name); void setURL(const String& url) { setURL(url.c_str()); } void setURL(const char *url); void setSchemaURL(const String& url) { setSchemaURL(url.c_str()); } void setSchemaURL(const char *url); - void setSerialNumber(const String& serialNumber) { setSerialNumber(serialNumber.c_str()); } + void setSerialNumber(const String& serialNumber) { setSerialNumber(serialNumber.c_str()); } void setSerialNumber(const char *serialNumber); void setSerialNumber(const uint32_t serialNumber); void setModelName(const String& name) { setModelName(name.c_str()); } @@ -108,6 +108,7 @@ class SSDPClass{ uint16_t _respondToPort; bool _pending; + bool _st_is_uuid; unsigned short _delay; unsigned long _process_time; unsigned long _notify_time; From 30d0ca9df43f89ab5861b19efe4ecaf3ba729592 Mon Sep 17 00:00:00 2001 From: Ahmed El Sharnoby Date: Sun, 10 Feb 2019 15:34:40 +0200 Subject: [PATCH 2/4] Update ESP8266SSDP.cpp Fix SSDP bug: The response to M-Search Packet with ST field set to UUID should be with the UUID not the Device Type Integrated 'uuid:' prefix into the char array of the _uuid --- libraries/ESP8266SSDP/ESP8266SSDP.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/libraries/ESP8266SSDP/ESP8266SSDP.cpp b/libraries/ESP8266SSDP/ESP8266SSDP.cpp index 7f5e3ceef1..bd18736d52 100644 --- a/libraries/ESP8266SSDP/ESP8266SSDP.cpp +++ b/libraries/ESP8266SSDP/ESP8266SSDP.cpp @@ -71,7 +71,7 @@ static const char _ssdp_packet_template[] PROGMEM = "%s" // _ssdp_response_template / _ssdp_notify_template "CACHE-CONTROL: max-age=%u\r\n" // SSDP_INTERVAL "SERVER: Arduino/1.0 UPNP/1.1 %s/%s\r\n" // _modelName, _modelNumber - "USN: uuid:%s\r\n" // _uuid + "USN: %s\r\n" // _uuid "%s: %s\r\n" // "NT" or "ST", _deviceType "LOCATION: http://%u.%u.%u.%u:%u/%s\r\n" // WiFi.localIP(), _port, _schemaURL "\r\n"; @@ -99,7 +99,7 @@ static const char _ssdp_schema_template[] PROGMEM = "%s" "%s" "%s" - "uuid:%s" + "%s" "" //"" //"" @@ -132,6 +132,7 @@ SSDPClass::SSDPClass() : _ttl(SSDP_MULTICAST_TTL), _respondToPort(0), _pending(false), + _st_is_uuid(false), _delay(0), _process_time(0), _notify_time(0) @@ -155,12 +156,14 @@ SSDPClass::~SSDPClass() { bool SSDPClass::begin() { end(); - + _pending = false; + _st_is_uuid = false; if (strcmp(_uuid,"") == 0) { uint32_t chipId = ESP.getChipId(); - sprintf(_uuid, "38323636-4558-4dda-9188-cda0e6%02x%02x%02x", - (uint16_t) ((chipId >> 16) & 0xff), + sprintf(_uuid, "%s38323636-4558-4dda-9188-cda0e6%02x%02x%02x", + "uuid:", + (uint16_t) ((chipId >> 16) & 0xff), (uint16_t) ((chipId >> 8) & 0xff), (uint16_t) chipId & 0xff); } @@ -241,7 +244,7 @@ void SSDPClass::_send(ssdp_method_t method) { _modelNumber, _uuid, (method == NONE) ? "ST" : "NT", - _deviceType, + (_st_is_uuid) ? _uuid : _deviceType, ip[0], ip[1], ip[2], ip[3], _port, _schemaURL ); @@ -373,10 +376,19 @@ void SSDPClass::_update() { #ifdef DEBUG_SSDP DEBUG_SSDP.printf("REJECT: %s\n", (char *)buffer); #endif + }else{ + _st_is_uuid = false; } // if the search type matches our type, we should respond instead of ABORT if (strcasecmp(buffer, _deviceType) == 0) { _pending = true; + _st_is_uuid = false; + _process_time = millis(); + state = KEY; + } + if (strcasecmp(buffer, _uuid) == 0) { + _pending = true; + _st_is_uuid = true; _process_time = millis(); state = KEY; } @@ -416,6 +428,7 @@ void SSDPClass::_update() { _send(NONE); } else if(_notify_time == 0 || (millis() - _notify_time) > (SSDP_INTERVAL * 1000L)){ _notify_time = millis(); + _st_is_uuid = false; _send(NOTIFY); } @@ -439,7 +452,7 @@ void SSDPClass::setDeviceType(const char *deviceType) { } void SSDPClass::setUUID(const char *uuid) { - strlcpy(_uuid, uuid, sizeof(_uuid)); + snprintf(_uuid, sizeof(_uuid), "%s%s", "uuid:", uuid); } void SSDPClass::setName(const char *name) { From 28550478401d46c5b96d961e2fd170749c7016e8 Mon Sep 17 00:00:00 2001 From: Ahmed El Sharnoby Date: Mon, 11 Feb 2019 14:22:02 +0200 Subject: [PATCH 3/4] include 'uuid:' in format String and in flash --- libraries/ESP8266SSDP/ESP8266SSDP.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libraries/ESP8266SSDP/ESP8266SSDP.cpp b/libraries/ESP8266SSDP/ESP8266SSDP.cpp index bd18736d52..eb1af580b7 100644 --- a/libraries/ESP8266SSDP/ESP8266SSDP.cpp +++ b/libraries/ESP8266SSDP/ESP8266SSDP.cpp @@ -130,6 +130,7 @@ SSDPClass::SSDPClass() : _timer(0), _port(80), _ttl(SSDP_MULTICAST_TTL), + _respondToAddr(0,0,0,0), _respondToPort(0), _pending(false), _st_is_uuid(false), @@ -161,8 +162,7 @@ bool SSDPClass::begin() { _st_is_uuid = false; if (strcmp(_uuid,"") == 0) { uint32_t chipId = ESP.getChipId(); - sprintf(_uuid, "%s38323636-4558-4dda-9188-cda0e6%02x%02x%02x", - "uuid:", + sprintf_P(_uuid, PSTR("uuid:38323636-4558-4dda-9188-cda0e6%02x%02x%02x"), (uint16_t) ((chipId >> 16) & 0xff), (uint16_t) ((chipId >> 8) & 0xff), (uint16_t) chipId & 0xff); @@ -181,7 +181,9 @@ bool SSDPClass::begin() { IPAddress mcast(SSDP_MULTICAST_ADDR); if (igmp_joingroup(local, mcast) != ERR_OK ) { - DEBUGV("SSDP failed to join igmp group"); +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf_P(PSTR("SSDP failed to join igmp group\n")); +#endif return false; } @@ -452,7 +454,7 @@ void SSDPClass::setDeviceType(const char *deviceType) { } void SSDPClass::setUUID(const char *uuid) { - snprintf(_uuid, sizeof(_uuid), "%s%s", "uuid:", uuid); + snprintf_P(_uuid, sizeof(_uuid), PSTR("%S%s"), F("uuid:"), uuid); } void SSDPClass::setName(const char *name) { From 74a6938902482bcd2ac94395b214e26ed16abd2e Mon Sep 17 00:00:00 2001 From: Ahmed El Sharnoby Date: Mon, 11 Feb 2019 15:15:28 +0200 Subject: [PATCH 4/4] Update ESP8266SSDP.cpp --- libraries/ESP8266SSDP/ESP8266SSDP.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266SSDP/ESP8266SSDP.cpp b/libraries/ESP8266SSDP/ESP8266SSDP.cpp index eb1af580b7..900c2059fe 100644 --- a/libraries/ESP8266SSDP/ESP8266SSDP.cpp +++ b/libraries/ESP8266SSDP/ESP8266SSDP.cpp @@ -454,7 +454,7 @@ void SSDPClass::setDeviceType(const char *deviceType) { } void SSDPClass::setUUID(const char *uuid) { - snprintf_P(_uuid, sizeof(_uuid), PSTR("%S%s"), F("uuid:"), uuid); + snprintf_P(_uuid, sizeof(_uuid), PSTR("uuid:%s"), uuid); } void SSDPClass::setName(const char *name) {