Simplest UPnP basic device example. This program to run UPnP basic device on the mbed.

Dependencies:   NyFileSystems libMiMic mbed-rtos mbed

Fork of MbedFileServer by Ryo Iizuka

This is UPnP BasicDevice by MiMicSDK. BasicDevice is most simplest UPnP device.

How To Use

  • Write firmware to your mbed.
  • Reset mbed and update firmware.
  • Check your "network computer" folder by Exproler. (in case of windows.)
  • You can find UPnPBasicDevice hosted by mbed. (If you can not find device then reflesh exploler information.) /media/uploads/nyatla/upnp-exploler.png
  • If you double-click UPnPBasicDevice, the presentation page on device is opened. /media/uploads/nyatla/upnp-presentation.png

Function

  • AutoIP
  • SSDP
  • DeviceDescription hosting (Httpd)
  • SOAP (not implemented)
  • GENA (not implemented)

Source Code

It is simple and short!

/**
 * @file
 * Simplest UPnP basic device.<br/>
 * This program is upnp:BasicDeveice:1 template.
 * 
 * <p>
 * After starting program, check "network" by Exproler.
 * MiMic basic device will be appeared.
 * </p>
 */
#include "mbed.h"
#include "rtos.h"
#include "SDFileSystem.h"
#include "mimic.h"
#include "utils/PlatformInfo.h"
#include "fsdata.h"
 
 
Net* net;
 
/**
 * Httpd for UPnPService and presentation.
 */
class UPnPBasicDeviceHttpd:public MiMic::Httpd
{
private:
    ModUPnPDevice modupnp;
    ModRomFiles modromfs; //ROM file module    
public:
    UPnPBasicDeviceHttpd(NetConfig& i_cfg):Httpd(i_cfg.getHttpPort())
    {
        //prepare fs data (presentation.html,icon,image.)
        this->modromfs.setParam("rom",FSDATA,3);
        //bind upnp service to module.
        this->modupnp.setParam(*net);
    }
    virtual void onRequest(HttpdConnection& i_connection)
    {
        //try to ModRomFS module. for icon,images.
        if(this->modromfs.execute(i_connection)){
            return;
        }        
        //try to UPnP service. for descriptions.
        if(this->modupnp.execute(i_connection)){
            return;
        }
        //Otherwise, Send the redirect response to /rom/index.html
        i_connection.sendHeader(302,
            "text/html",
            "Status: 302:Moved Temporarily\r\n"
            "Location: /rom/index.html\r\n");     
    }
};
 
NetConfig cfg; //create network configulation
 
int main()
{
    net=new Net();//Net constructor must be created after started RTOS
    //Prepare configulation.
    cfg.setUPnPIcon(64,64,8,"image/png","/rom/icon.png");//set upnp icon address
    cfg.setUPnPUdn(0xe29f7103,0x4ba2,0x01e0,0); //set application timebase-uuid time and sequence field.
    cfg.setFriendlyName("UPnPBasicDevice(LPC176x)"); //set friendly name
    cfg.setUPnPPresentationURL("/rom/index.html"); //set presentationURL
    cfg.setZeroconf(true);//AutoIP enable
 
    UPnPBasicDeviceHttpd httpd(cfg); //create a httpd instance.
    net->start(cfg);
    httpd.loop();  //start httpd loop.
    return 0;
}

I think that this code helps to make Web connection to your application easily.

Revision:
19:66d729b94d16
Parent:
12:218b57d9a6d4
Child:
20:4b0b449ddb12
--- a/main.cpp	Thu Jul 11 03:54:29 2013 +0000
+++ b/main.cpp	Fri Aug 09 09:06:09 2013 +0000
@@ -9,9 +9,12 @@
  * </pre>
  */
 #include "mbed.h"
+#include "rtos.h"
 #include "SDFileSystem.h"
 #include "mimic.h"
 #include "utils/PlatformInfo.h"
+#include "fsdata.h"
+
 DigitalOut mbedled(LED1);
 DigitalOut lpcxled(P0_22);
 
@@ -20,6 +23,8 @@
  */
 LocalFileSystem2 lf("local");
 SDFileSystem sd(p5, p6, p7, p8,"sd");
+Net* net;
+
 unsigned int p;
 /**
  * MiMic RemoteMCU httpd.<br/>
@@ -34,12 +39,18 @@
 private:
     ModLocalFileSystem modlocal;
     ModLocalFileSystem modsd;
+    ModUPnPDevice modupnp;
+    ModRomFiles modromfs; //ROM file module
+    
 public:
-    FsHttpd(NetConfig& i_cfg):Httpd(i_cfg._inst.services.http_port)
+    FsHttpd(NetConfig& i_cfg):Httpd(i_cfg.getHttpPort())
     {
+    
+        this->modromfs.setParam("rom",FSDATA,1);
         //bind local file system path to /local/*
         modlocal.setParam("local");
-        modsd.setParam("sd");
+        modsd.setParam("sd",ModLocalFileSystem::FST_SDFATFS);
+        this->modupnp.setParam(*net);
     }
     virtual void onRequest(HttpdConnection& i_connection)
     {
@@ -52,6 +63,10 @@
             lpcxled = p%2;
             break;
         }
+        //try to ModRomFS module.
+        if(this->modromfs.execute(i_connection)){
+            return;
+        }        
         //try to ModLocalFileSystem
         if(this->modlocal.execute(i_connection)){
             return;
@@ -60,6 +75,9 @@
         if(this->modsd.execute(i_connection)){
             return;
         }
+        if(this->modupnp.execute(i_connection)){
+            return;
+        }
         //Otherwise, Send simple top index page.
         i_connection.sendHeader(200,"text/html",NULL);
         if(i_connection.isMethodType(Http::MT_GET)){
@@ -82,15 +100,19 @@
 
 int main()
 {
-    Net net;  //create a net instance.
+    net=new Net();//Net constructor must be created after started RTOS
+    //Prepare configulation.
+    cfg.setUPnPIcon(64,64,8,"image/png","/rom/icon.png");
+    cfg.setUPnPUdn(0xe29f7102,0x4ba2,0x01e0,0);
+    cfg.setFriendlyName("MbedFileServer");
 
     //try to override setting by local file.
     if(!cfg.loadFromFile("/local/mimic.cfg")){
-        wait_ms(1000);
+        Thread::wait(2000);//wait for SD card initialization.
         cfg.loadFromFile("/sd/mimic.cfg");
     }
     FsHttpd httpd(cfg); //create a httpd instance.
-    net.start(cfg);
+    net->start(cfg);
     httpd.loop();  //start httpd loop.
     return 0;
 }