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.

Committer:
WiredHome
Date:
Fri Aug 31 22:51:15 2018 +0000
Revision:
4:5da66fab599c
Parent:
0:de1dfa2ab813
Child:
5:6244e237def1
Child:
7:776244e5765a
Updated the demo to set the RTC from an NTP server.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 0:de1dfa2ab813 1 //
WiredHome 0:de1dfa2ab813 2 // A simple SSDP example
WiredHome 0:de1dfa2ab813 3 //
WiredHome 0:de1dfa2ab813 4 #include "mbed.h" // ver 120; mbed-rtos ver 111
WiredHome 0:de1dfa2ab813 5 #include "EthernetInterface.h" // ver 55
WiredHome 0:de1dfa2ab813 6 #include "SW_HTTPServer.h" // ver 50
WiredHome 0:de1dfa2ab813 7 #include "TimeInterface.h" // ver 23
WiredHome 0:de1dfa2ab813 8 #include "Watchdog.h" // ver 6
WiredHome 0:de1dfa2ab813 9 #include "SW_String.h" // ver 1
WiredHome 0:de1dfa2ab813 10 #include "SSDP.h" // ver 0
WiredHome 0:de1dfa2ab813 11
WiredHome 0:de1dfa2ab813 12 #include "WebPages.h" // Private handler for web queries
WiredHome 0:de1dfa2ab813 13
WiredHome 0:de1dfa2ab813 14 RawSerial pc(USBTX, USBRX);
WiredHome 0:de1dfa2ab813 15
WiredHome 0:de1dfa2ab813 16 EthernetInterface eth;
WiredHome 0:de1dfa2ab813 17 TimeInterface ntp(&eth);
WiredHome 0:de1dfa2ab813 18 Watchdog wd;
WiredHome 0:de1dfa2ab813 19 time_t lastboottime;
WiredHome 0:de1dfa2ab813 20
WiredHome 4:5da66fab599c 21 PwmOut signOfLife(LED4); // LED sign of life. 100% WD reset, 20% restart, sine-wave: running
WiredHome 4:5da66fab599c 22
WiredHome 0:de1dfa2ab813 23 //FlashFileSystem flash("flash"); // static files here for reliability and speed
WiredHome 0:de1dfa2ab813 24 LocalFileSystem local("local"); // some place to hold settings and maybe the static web pages
WiredHome 0:de1dfa2ab813 25 const char * Server_Root = "/local";
WiredHome 0:de1dfa2ab813 26
WiredHome 0:de1dfa2ab813 27 // public for the WebPages handler to see
WiredHome 0:de1dfa2ab813 28 //
WiredHome 0:de1dfa2ab813 29 const char * BUILD_DATE = __DATE__ " " __TIME__;
WiredHome 0:de1dfa2ab813 30 const char * PROG_NAME = "SSDP Server";
WiredHome 4:5da66fab599c 31 char * My_Name = "MBED SSDP Node";
WiredHome 0:de1dfa2ab813 32 const char * My_SerialNum = "0000001";
WiredHome 4:5da66fab599c 33 int Server_Port = 80;
WiredHome 0:de1dfa2ab813 34 // end public information
WiredHome 0:de1dfa2ab813 35
WiredHome 0:de1dfa2ab813 36
WiredHome 4:5da66fab599c 37
WiredHome 4:5da66fab599c 38
WiredHome 4:5da66fab599c 39 /// ShowSignOfLife
WiredHome 4:5da66fab599c 40 ///
WiredHome 4:5da66fab599c 41 /// Pulse an LED to indicate a sign of life of the program.
WiredHome 4:5da66fab599c 42 /// This also has some moderate entertainment value.
WiredHome 4:5da66fab599c 43 ///
WiredHome 4:5da66fab599c 44 void ShowSignOfLife(int degreeIncrement = 1)
WiredHome 4:5da66fab599c 45 {
WiredHome 4:5da66fab599c 46 #define PI 3.14159265359
WiredHome 4:5da66fab599c 47 static int degrees = 0;
WiredHome 4:5da66fab599c 48 float v;
WiredHome 4:5da66fab599c 49
WiredHome 4:5da66fab599c 50 degrees += degreeIncrement;
WiredHome 4:5da66fab599c 51 v = sin(degrees * PI / 180)/2 + 0.5;
WiredHome 4:5da66fab599c 52 signOfLife = v; // a little dimmer
WiredHome 4:5da66fab599c 53 }
WiredHome 4:5da66fab599c 54
WiredHome 0:de1dfa2ab813 55 int main() {
WiredHome 0:de1dfa2ab813 56 pc.baud(460800);
WiredHome 0:de1dfa2ab813 57 pc.printf("\r\n%s Build %s\r\n", PROG_NAME, BUILD_DATE);
WiredHome 4:5da66fab599c 58 lastboottime = ntp.timelocal();
WiredHome 0:de1dfa2ab813 59 if (wd.WatchdogCausedReset()) {
WiredHome 0:de1dfa2ab813 60 pc.printf("**** Watchdog Event caused reset at %s ****\r\n", ntp.ctime(&lastboottime));
WiredHome 0:de1dfa2ab813 61 }
WiredHome 0:de1dfa2ab813 62 wd.Configure(45); // very generous, but this is a network appliance, so a bit less deterministic.
WiredHome 0:de1dfa2ab813 63
WiredHome 0:de1dfa2ab813 64 eth.init(); //Use DHCP
WiredHome 0:de1dfa2ab813 65 eth.connect();
WiredHome 0:de1dfa2ab813 66 printf("IP: %s\n", eth.getIPAddress());
WiredHome 0:de1dfa2ab813 67 //Thread thr(SSDPListener, NULL, osPriorityLow);
WiredHome 0:de1dfa2ab813 68 HTTPServer svr(Server_Port, Server_Root, 15, 30, 20, 50, &pc);
WiredHome 0:de1dfa2ab813 69 svr.RegisterHandler("/", RootPage);
WiredHome 0:de1dfa2ab813 70 svr.RegisterHandler("/setup.xml", Setup_xml);
WiredHome 4:5da66fab599c 71 SSDP ssdp(My_Name, eth.getMACAddress(), eth.getIPAddress(), Server_Port);
WiredHome 4:5da66fab599c 72
WiredHome 4:5da66fab599c 73 ntp.set_dst("3/11,2:00","11/4,2:00"); // mm/dd,hh:mm
WiredHome 4:5da66fab599c 74 ntp.set_tzo_min(-360);
WiredHome 4:5da66fab599c 75 int res = ntp.setTime("pool.ntp.org");
WiredHome 4:5da66fab599c 76
WiredHome 0:de1dfa2ab813 77 while (1) {
WiredHome 0:de1dfa2ab813 78 wd.Service();
WiredHome 0:de1dfa2ab813 79 svr.Poll(); // non-blocking, but also not deterministic
WiredHome 0:de1dfa2ab813 80 Thread::yield();
WiredHome 4:5da66fab599c 81 ShowSignOfLife(10);
WiredHome 4:5da66fab599c 82 static time_t tLast;
WiredHome 4:5da66fab599c 83 time_t tNow = ntp.timelocal();
WiredHome 4:5da66fab599c 84 if (tNow != tLast) {
WiredHome 4:5da66fab599c 85 printf("time is %s\r\n", ntp.ctime(&tNow));
WiredHome 4:5da66fab599c 86 tLast = tNow;
WiredHome 4:5da66fab599c 87 }
WiredHome 4:5da66fab599c 88 //printf("Mem: %5d, %5d %5d\n", Thread::used_stack(), Thread::max_stack(), Thread::stack_size());
WiredHome 0:de1dfa2ab813 89 }
WiredHome 0:de1dfa2ab813 90 }