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:
Sat Sep 01 01:46:33 2018 +0000
Revision:
6:80a97f156128
Parent:
5:6244e237def1
Correct a font-size issue

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 5:6244e237def1 5 #include "EthernetInterface.h" // ver 56
WiredHome 5:6244e237def1 6 #include "SW_HTTPServer.h" // ver 57
WiredHome 5:6244e237def1 7 #include "TimeInterface.h" // ver 24
WiredHome 0:de1dfa2ab813 8 #include "Watchdog.h" // ver 6
WiredHome 0:de1dfa2ab813 9 #include "SW_String.h" // ver 1
WiredHome 5:6244e237def1 10 #include "SSDP.h" // ver 4
WiredHome 0:de1dfa2ab813 11 #include "WebPages.h" // Private handler for web queries
WiredHome 0:de1dfa2ab813 12
WiredHome 5:6244e237def1 13 // Comment out the next line if you do not have an RA8875 Display
WiredHome 5:6244e237def1 14 #include "RA8875.h" // ver 154
WiredHome 5:6244e237def1 15
WiredHome 0:de1dfa2ab813 16 RawSerial pc(USBTX, USBRX);
WiredHome 0:de1dfa2ab813 17 EthernetInterface eth;
WiredHome 0:de1dfa2ab813 18 TimeInterface ntp(&eth);
WiredHome 0:de1dfa2ab813 19 Watchdog wd;
WiredHome 0:de1dfa2ab813 20 time_t lastboottime;
WiredHome 0:de1dfa2ab813 21
WiredHome 5:6244e237def1 22 #ifdef RA8875_H
WiredHome 5:6244e237def1 23 #define LCD_W 480
WiredHome 5:6244e237def1 24 #define LCD_H 272
WiredHome 5:6244e237def1 25 #define LCD_C 16
WiredHome 5:6244e237def1 26 RA8875 lcd(p5, p6, p7, p12, NC, p9,p10,p13, "tft"); // SPI:{MOSI,MISO,SCK,/ChipSelect,/reset}, I2C:{SDA,SCL,/IRQ}, name
WiredHome 5:6244e237def1 27 #endif
WiredHome 4:5da66fab599c 28
WiredHome 0:de1dfa2ab813 29 LocalFileSystem local("local"); // some place to hold settings and maybe the static web pages
WiredHome 0:de1dfa2ab813 30 const char * Server_Root = "/local";
WiredHome 0:de1dfa2ab813 31
WiredHome 0:de1dfa2ab813 32 // public for the WebPages handler to see
WiredHome 0:de1dfa2ab813 33 //
WiredHome 0:de1dfa2ab813 34 const char * BUILD_DATE = __DATE__ " " __TIME__;
WiredHome 0:de1dfa2ab813 35 const char * PROG_NAME = "SSDP Server";
WiredHome 4:5da66fab599c 36 char * My_Name = "MBED SSDP Node";
WiredHome 0:de1dfa2ab813 37 const char * My_SerialNum = "0000001";
WiredHome 4:5da66fab599c 38 int Server_Port = 80;
WiredHome 0:de1dfa2ab813 39 // end public information
WiredHome 0:de1dfa2ab813 40
WiredHome 5:6244e237def1 41 int main()
WiredHome 4:5da66fab599c 42 {
WiredHome 0:de1dfa2ab813 43 pc.baud(460800);
WiredHome 0:de1dfa2ab813 44 pc.printf("\r\n%s Build %s\r\n", PROG_NAME, BUILD_DATE);
WiredHome 4:5da66fab599c 45 lastboottime = ntp.timelocal();
WiredHome 0:de1dfa2ab813 46 if (wd.WatchdogCausedReset()) {
WiredHome 0:de1dfa2ab813 47 pc.printf("**** Watchdog Event caused reset at %s ****\r\n", ntp.ctime(&lastboottime));
WiredHome 0:de1dfa2ab813 48 }
WiredHome 0:de1dfa2ab813 49 wd.Configure(45); // very generous, but this is a network appliance, so a bit less deterministic.
WiredHome 0:de1dfa2ab813 50
WiredHome 5:6244e237def1 51 #ifdef RA8875_H
WiredHome 5:6244e237def1 52 lcd.init(LCD_W,LCD_H,LCD_C, 60);
WiredHome 5:6244e237def1 53 lcd.Backlight_u8(30);
WiredHome 5:6244e237def1 54 lcd.foreground(Red);
WiredHome 5:6244e237def1 55 lcd.printf("Initializing network interface...\r\n");
WiredHome 5:6244e237def1 56 #endif
WiredHome 5:6244e237def1 57 pc.printf("Initializing network interface...\r\n");
WiredHome 5:6244e237def1 58 if (0 == eth.init()) {
WiredHome 5:6244e237def1 59 #ifdef RA8875_H
WiredHome 5:6244e237def1 60 lcd.printf(" Name: %s\r\n", My_Name);
WiredHome 5:6244e237def1 61 #endif
WiredHome 5:6244e237def1 62 pc.printf("Name: %s\r\n", My_Name);
WiredHome 5:6244e237def1 63 eth.setName(My_Name);
WiredHome 4:5da66fab599c 64
WiredHome 5:6244e237def1 65 do {
WiredHome 5:6244e237def1 66 #ifdef RA8875_H
WiredHome 5:6244e237def1 67 lcd.printf(" Connecting to network...\r\n");
WiredHome 5:6244e237def1 68 #endif
WiredHome 5:6244e237def1 69 pc.printf("Connecting to network...\r\n");
WiredHome 5:6244e237def1 70 if (0 == eth.connect()) {
WiredHome 5:6244e237def1 71 int speed = eth.get_connection_speed();
WiredHome 5:6244e237def1 72
WiredHome 5:6244e237def1 73 pc.printf("Connected at %d Mb/s\r\n", speed);
WiredHome 5:6244e237def1 74 pc.printf("IP: %15s\r\n", eth.getIPAddress());
WiredHome 5:6244e237def1 75 #ifdef RA8875_H
WiredHome 5:6244e237def1 76 lcd.printf(" Connected at %d Mb/s\r\n", speed);
WiredHome 5:6244e237def1 77 lcd.printf(" IP: %15s\r\n", eth.getIPAddress());
WiredHome 5:6244e237def1 78 #endif
WiredHome 5:6244e237def1 79
WiredHome 5:6244e237def1 80 HTTPServer svr(Server_Port, Server_Root, 15, 30, 20, 50, &pc);
WiredHome 5:6244e237def1 81 svr.RegisterHandler("/", RootPage);
WiredHome 5:6244e237def1 82 svr.RegisterHandler("/setup.xml", Setup_xml);
WiredHome 5:6244e237def1 83 SSDP ssdp(My_Name, eth.getMACAddress(), eth.getIPAddress(), Server_Port);
WiredHome 4:5da66fab599c 84
WiredHome 5:6244e237def1 85 ntp.set_dst("3/11,2:00","11/4,2:00"); // mm/dd,hh:mm
WiredHome 5:6244e237def1 86 ntp.set_tzo_min(-360);
WiredHome 5:6244e237def1 87 int res = ntp.setTime("pool.ntp.org");
WiredHome 5:6244e237def1 88
WiredHome 5:6244e237def1 89 while (eth.is_connected()) {
WiredHome 5:6244e237def1 90 wd.Service();
WiredHome 5:6244e237def1 91 static time_t tLast;
WiredHome 5:6244e237def1 92 time_t tNow = ntp.timelocal();
WiredHome 5:6244e237def1 93 if (tNow != tLast) {
WiredHome 5:6244e237def1 94 #ifdef RA8875_H
WiredHome 5:6244e237def1 95 lcd.SetTextFontSize(2);
WiredHome 5:6244e237def1 96 lcd.SetTextCursor(20,120);
WiredHome 5:6244e237def1 97 lcd.printf("%s", ntp.ctime(&tNow));
WiredHome 6:80a97f156128 98 lcd.SetTextFontSize(0);
WiredHome 5:6244e237def1 99 #endif
WiredHome 5:6244e237def1 100 pc.printf("time is %s\r\n", ntp.ctime(&tNow));
WiredHome 5:6244e237def1 101 tLast = tNow;
WiredHome 5:6244e237def1 102 }
WiredHome 5:6244e237def1 103 // Any other work can happen here
WiredHome 5:6244e237def1 104 Thread::yield();
WiredHome 5:6244e237def1 105 }
WiredHome 5:6244e237def1 106 #ifdef RA8875_H
WiredHome 5:6244e237def1 107 lcd.cls();
WiredHome 5:6244e237def1 108 lcd.printf("lost network.\r\n");
WiredHome 5:6244e237def1 109 #endif
WiredHome 5:6244e237def1 110 pc.printf("lost connection.\r\n");
WiredHome 5:6244e237def1 111 eth.disconnect();
WiredHome 5:6244e237def1 112 } else {
WiredHome 5:6244e237def1 113 #ifdef RA8875_H
WiredHome 6:80a97f156128 114 lcd.cls();
WiredHome 5:6244e237def1 115 lcd.printf(" ... failed to connect\r\n");
WiredHome 5:6244e237def1 116 #endif
WiredHome 5:6244e237def1 117 pc.printf(" ... failed to connect.\r\n");
WiredHome 5:6244e237def1 118 }
WiredHome 5:6244e237def1 119 } while (1);
WiredHome 0:de1dfa2ab813 120 }
WiredHome 0:de1dfa2ab813 121 }