diff --git a/src/driver/drv_ssdp.c b/src/driver/drv_ssdp.c
index 571fe3a1b..90cb67346 100644
--- a/src/driver/drv_ssdp.c
+++ b/src/driver/drv_ssdp.c
@@ -230,7 +230,7 @@ static const char message_template[] =
/*"DATE: Sat, 22 Oct 2016 14:44:26 GMT\r\n"*/ \
;
-void DRV_WEMO_Send_Advert_To(struct sockaddr_in *addr);
+void DRV_WEMO_Send_Advert_To(int mode, struct sockaddr_in *addr);
void DRV_SSDP_SendReply(struct sockaddr_in *addr, const char *message) {
@@ -518,12 +518,19 @@ void DRV_SSDP_RunQuickTick() {
if (!strncmp(udp_msgbuf, "M-SEARCH", 8)){
// reply with our advert to the sender
addLogAdv(LOG_EXTRADEBUG, LOG_FEATURE_HTTP,"Is MSEARCH - responding");
- if (strstr(udp_msgbuf, "urn:belkin:device:**")) {
- DRV_WEMO_Send_Advert_To(&addr);
- }
- else {
- DRV_SSDP_Send_Advert_To(&addr);
+ if (DRV_IsRunning("WEMO")) {
+ if (strcasestr(udp_msgbuf, "urn:belkin:device:**")) {
+ DRV_WEMO_Send_Advert_To(1, &addr);
+ return;
+ }
+ else if (strcasestr(udp_msgbuf, "upnp:rootdevice")
+ || strcasestr(udp_msgbuf, "ssdpsearch:all")
+ || strcasestr(udp_msgbuf, "ssdp:all")) {
+ DRV_WEMO_Send_Advert_To(2, &addr);
+ return;
+ }
}
+ DRV_SSDP_Send_Advert_To(&addr);
}
// our NOTIFTY like:
diff --git a/src/driver/drv_wemo.c b/src/driver/drv_wemo.c
index 39c6be42c..7f7b1c994 100644
--- a/src/driver/drv_wemo.c
+++ b/src/driver/drv_wemo.c
@@ -67,16 +67,84 @@ const char *g_wemo_msearch =
"USN: uuid:%s::%s\r\n" // type1 = urn:Belkin:device:**, type2 = upnp:rootdevice
"X-User-Agent: redsonic\r\n"
"\r\n";
+
+
+const char *g_wemo_metaService =
+""
+""
+"1"
+"0"
+""
+""
+""
+"GetMetaInfo"
+""
+""
+"GetMetaInfo"
+"MetaInfo"
+"in"
+""
+""
+""
+""
+""
+"MetaInfo"
+"string"
+"0"
+""
+""
+"\r\n\r\n";
+
+const char *g_wemo_eventService =
+""
+""
+""
+"SetBinaryState"
+""
+""
+""
+"BinaryState"
+"BinaryState"
+"in"
+""
+""
+""
+""
+"GetBinaryState"
+""
+""
+""
+"BinaryState"
+"BinaryState"
+"out"
+""
+""
+""
+""
+""
+""
+"BinaryState"
+"bool"
+"0"
+""
+""
+"level"
+"string"
+"0"
+""
+""
+"\r\n\r\n";
static char *g_serial = 0;
static char *g_uid = 0;
static int outBufferLen = 0;
static char *buffer_out = 0;
static int stat_searchesReceived = 0;
static int stat_setupXMLVisits = 0;
+static int stat_metaServiceXMLVisits = 0;
static int stat_eventsReceived = 0;
+static int stat_eventServiceXMLVisits = 0;
-void DRV_WEMO_Send_Advert_To(struct sockaddr_in *addr) {
- char message[128];
+void DRV_WEMO_Send_Advert_To(int mode, struct sockaddr_in *addr) {
const char *useType;
if (g_uid == 0) {
@@ -86,7 +154,14 @@ void DRV_WEMO_Send_Advert_To(struct sockaddr_in *addr) {
stat_searchesReceived++;
- useType = "urn:Belkin:device:**";
+ if (mode == 1) {
+ useType = "urn:Belkin:device:**";
+ }
+ else {
+ useType = "upnp:rootdevice";
+ }
+
+ addLogAdv(LOG_EXTRADEBUG, LOG_FEATURE_HTTP, "WEMO - sends reply %s",useType);
if (buffer_out == 0) {
outBufferLen = strlen(g_wemo_msearch) + 256;
@@ -94,12 +169,13 @@ void DRV_WEMO_Send_Advert_To(struct sockaddr_in *addr) {
}
snprintf(buffer_out, outBufferLen, g_wemo_msearch, HAL_GetMyIPString(), useType, g_uid, useType);
- DRV_SSDP_SendReply(addr, message);
+ addLogAdv(LOG_EXTRADEBUG, LOG_FEATURE_HTTP, "WEMO - Sending %s", buffer_out);
+ DRV_SSDP_SendReply(addr, buffer_out);
}
void WEMO_AppendInformationToHTTPIndexPage(http_request_t* request) {
- hprintf255(request, "
WEMO: MSEARCH received %i, setup.xml visits %i, events %i
",
- stat_searchesReceived, stat_setupXMLVisits, stat_eventsReceived);
+ hprintf255(request, "WEMO: searches %i, setup %i, events %i, mService %i, event %i
",
+ stat_searchesReceived, stat_setupXMLVisits, stat_eventsReceived, stat_metaServiceXMLVisits, stat_eventServiceXMLVisits);
}
static int WEMO_BasicEvent1(http_request_t* request) {
@@ -114,10 +190,22 @@ static int WEMO_BasicEvent1(http_request_t* request) {
}
static int WEMO_EventService(http_request_t* request) {
+ http_setup(request, httpMimeTypeXML);
+ poststr(request, g_wemo_eventService);
+ poststr(request, NULL);
+
+ stat_eventServiceXMLVisits++;
+
return 0;
}
static int WEMO_MetaInfoService(http_request_t* request) {
+ http_setup(request, httpMimeTypeXML);
+ poststr(request, g_wemo_metaService);
+ poststr(request, NULL);
+
+ stat_metaServiceXMLVisits++;
+
return 0;
}
static int WEMO_Setup(http_request_t* request) {
diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c
index 103ca0850..9b1fbf52a 100644
--- a/src/httpserver/http_fns.c
+++ b/src/httpserver/http_fns.c
@@ -780,12 +780,26 @@ int http_fn_index(http_request_t* request) {
{
hprintf255(request, "Wifi RSSI: %s (%idBm)
", str_rssi[wifi_rssi_scale(HAL_GetWifiStrength())], HAL_GetWifiStrength());
}
- hprintf255(request, "MQTT State: %s RES: %d(%s)
", (Main_HasMQTTConnected() == 1) ? "connected" : "disconnected",
- MQTT_GetConnectResult(), get_error_name(MQTT_GetConnectResult()));
- hprintf255(request, "MQTT ErrMsg: %s
", (MQTT_GetStatusMessage() != NULL) ? MQTT_GetStatusMessage() : "");
- hprintf255(request, "MQTT Stats:CONN: %d PUB: %d RECV: %d ERR: %d
", MQTT_GetConnectEvents(),
- MQTT_GetPublishEventCounter(), MQTT_GetReceivedEventCounter(), MQTT_GetPublishErrorCounter());
-
+ if (CFG_GetMQTTHost()[0] == 0) {
+ hprintf255(request, "MQTT State: not configured
");
+ }
+ else {
+ const char *stateStr;
+ const char *colorStr;
+ if (Main_HasMQTTConnected() == 1) {
+ stateStr = "connected";
+ colorStr = "green";
+ }
+ else {
+ stateStr = "disconnected";
+ colorStr = "yellow";
+ }
+ hprintf255(request, "MQTT State: %s RES: %d(%s)
", colorStr,
+ stateStr,MQTT_GetConnectResult(), get_error_name(MQTT_GetConnectResult()));
+ hprintf255(request, "MQTT ErrMsg: %s
", (MQTT_GetStatusMessage() != NULL) ? MQTT_GetStatusMessage() : "");
+ hprintf255(request, "MQTT Stats:CONN: %d PUB: %d RECV: %d ERR: %d
", MQTT_GetConnectEvents(),
+ MQTT_GetPublishEventCounter(), MQTT_GetReceivedEventCounter(), MQTT_GetPublishErrorCounter());
+ }
/* Format current PINS input state for all unused pins */
if (CFG_HasFlag(OBK_FLAG_HTTP_PINMONITOR))
{
diff --git a/src/new_common.c b/src/new_common.c
index 9fc6a77da..38e8dd340 100644
--- a/src/new_common.c
+++ b/src/new_common.c
@@ -62,7 +62,49 @@ int vsprintf3(char *buffer, const char *fmt, va_list val) {
#endif
+#if WINDOWS
+const char* strcasestr(const char* str1, const char* str2)
+{
+ const char* p1 = str1;
+ const char* p2 = str2;
+ const char* r = *p2 == 0 ? str1 : 0;
+ while (*p1 != 0 && *p2 != 0)
+ {
+ if (tolower((unsigned char)*p1) == tolower((unsigned char)*p2))
+ {
+ if (r == 0)
+ {
+ r = p1;
+ }
+
+ p2++;
+ }
+ else
+ {
+ p2 = str2;
+ if (r != 0)
+ {
+ p1 = r + 1;
+ }
+
+ if (tolower((unsigned char)*p1) == tolower((unsigned char)*p2))
+ {
+ r = p1;
+ p2++;
+ }
+ else
+ {
+ r = 0;
+ }
+ }
+
+ p1++;
+ }
+
+ return *p2 == 0 ? (char*)r : 0;
+}
+#endif
// Why strdup breaks strings?
// backlog lcd_clearAndGoto I2C1 0x23 1 1; lcd_print I2C1 0x23 Enabled