An example demonstrating SSDP Discovery and a companion Web Server.

Dependencies:   mbed mbed-rtos Watchdog SW_HTTPServer SW_String EthernetInterface TimeInterface SSDP

This example program provides a framework -by- example.

It makes itself discoverable to the network using SSDP. From there, it is easy to access the embedded web server to interact with the embedded node.

The example, built on the LPC1768, provides interaction to turn the LEDs on and off via a web page that is discovered using the SSDP protocol.

It also picks up time via an NTP server.

main.cpp

Committer:
WiredHome
Date:
2018-07-03
Revision:
0:de1dfa2ab813
Child:
4:5da66fab599c

File content as of revision 0:de1dfa2ab813:

//
// A simple SSDP example
//
#include "mbed.h"               // ver 120; mbed-rtos ver 111
#include "EthernetInterface.h"  // ver 55
#include "SW_HTTPServer.h"      // ver 50
#include "TimeInterface.h"      // ver 23
#include "Watchdog.h"           // ver 6
#include "SW_String.h"          // ver 1
#include "SSDP.h"               // ver 0

#include "WebPages.h"           // Private handler for web queries

RawSerial pc(USBTX, USBRX);

EthernetInterface eth;
TimeInterface ntp(&eth);
Watchdog wd;
time_t lastboottime;

//FlashFileSystem flash("flash");             // static files here for reliability and speed
LocalFileSystem local("local");             // some place to hold settings and maybe the static web pages

const char * Server_Root = "/local";

// public for the WebPages handler to see
//
const char * BUILD_DATE = __DATE__ " " __TIME__;
const char * PROG_NAME = "SSDP Server";
const char * My_Name = "MBED SSDP Node";
const char * My_SerialNum = "0000001";
const int Server_Port = 80;
// end public information


int main() {
    pc.baud(460800);
    pc.printf("\r\n%s Build %s\r\n", PROG_NAME, BUILD_DATE);
    if (wd.WatchdogCausedReset()) {
        pc.printf("**** Watchdog Event caused reset at %s ****\r\n", ntp.ctime(&lastboottime));
    }
    wd.Configure(45);       // very generous, but this is a network appliance, so a bit less deterministic.

    eth.init(); //Use DHCP
    eth.connect();
    printf("IP: %s\n", eth.getIPAddress());
    //Thread thr(SSDPListener, NULL, osPriorityLow);
    HTTPServer svr(Server_Port, Server_Root, 15, 30, 20, 50, &pc);
    svr.RegisterHandler("/", RootPage);
    svr.RegisterHandler("/setup.xml", Setup_xml);
    SSDP ssdp("Friendly Node", eth.getMACAddress(), eth.getIPAddress(), Server_Port);
    
    while (1) {
        wd.Service();
        svr.Poll();         // non-blocking, but also not deterministic
        Thread::yield();
    }
}