This is a HTTP Server example using the new EthernetInterface and new mbed-rpc libraries.
Dependents: HTTP-RPCServerExample
Fork of HTTPServer by
Revision 14:011edcd33e86, committed 2013-08-17
- Comitter:
- leihen
- Date:
- Sat Aug 17 12:12:13 2013 +0000
- Parent:
- 13:aa5338a5e452
- Child:
- 15:909dcf44c3db
- Commit message:
- Changed behaviour, so that now an EthernetInterface can be provided by user of the library as an alternative to having the HTTPServer being the owner.
; Example documentation Extended.
Changed in this revision
HTTPServer.cpp | Show annotated file Show diff for this revision Revisions of this file |
HTTPServer.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/HTTPServer.cpp Sat Jun 22 15:41:34 2013 +0000 +++ b/HTTPServer.cpp Sat Aug 17 12:12:13 2013 +0000 @@ -12,20 +12,23 @@ DigitalOut led4(LED4); #endif -static EthernetInterface eth; /* Constructor */ /* initialize all members and set the standard error handler. */ HTTPServer::HTTPServer() + : m_pEthernet(NULL) { m_pErrorHandler = StdErrorHandler; } HTTPServer::~HTTPServer() { + if (m_pEthernet == NULL) { + INFO("Deleting EthernetInterface Object.\n"); + delete m_pEthernet; + } } - static const char* szStdErrorPage = "<HTML><HEAD><META content=\"text/html\" http-equiv=Content-Type></HEAD><BODY><h1>Error 404</h1><P>This resource is not available<P></BODY></HTML>\r\n\r\n"; void HTTPServer::StdErrorHandler(HTTPConnection::HTTPMessage& msg, TCPSocketConnection& tcp) @@ -38,14 +41,44 @@ } -bool HTTPServer::start(int port) +bool HTTPServer::start(int port, EthernetInterface* pEthernet) { - INFO("Initializing network\n"); - eth.init(); + // If no ethernet interface is provided, instantiate own on the heap. This has to be deleted later in the destructor. + // If a valid pointer to an thernet interface is proveded, we can simply use it. + if (pEthernet == NULL) { + INFO("Creating EthernetInterface object\n"); + m_pEthernet = new EthernetInterface(); + + if (m_pEthernet == NULL) { + ERR("Out of memory, unable to instantiate an EthernetInterface object."); + return false; + } - INFO("Connecting to network..."); - eth.connect(); - + // Initiaize the network + INFO("Initializing network\n"); + if (m_pEthernet->init() != 0) { + ERR("Failed to initialize the ethernet interface !"); + delete m_pEthernet; + m_pEthernet = NULL; + return false; + } + + // Connect to the network using DHCP + INFO("Connecting to the network using DHCP..."); + if (m_pEthernet->connect() != 0) { + ERR("Failed to connect to the ethernet !"); + delete m_pEthernet; + m_pEthernet = NULL; + return false; + } + + INFO("Connected IP %s", m_pEthernet->getIPAddress()); + + } else { + // In the case that the ethernet interface is provided, it is assumed that a connection has already been created. + INFO("Using connection IP %s", pEthernet->getIPAddress()); + } + INFO("Binding to port %d...", port); if (m_Svr.bind(port) < 0) { ERR("Failed to bind to port !\n"); @@ -70,8 +103,6 @@ int HTTPServer::poll(bool blocking) { - int retval = -1; - #ifdef _DEBUG led4 = 1; // Indicate we are waiting for a new connection #endif
--- a/HTTPServer.h Sat Jun 22 15:41:34 2013 +0000 +++ b/HTTPServer.h Sat Aug 17 12:12:13 2013 +0000 @@ -57,12 +57,11 @@ * #include "LocalFileSystem.h" * * LocalFileSystem local("local"); -* WiflyInterface wifly(p9, p10, p25, p26, "<your access point>", "<your password>", WPA); * * void main(void) * { * HTTPServer svr; - svr.mount("/local/", "/"); +* svr.mount("/local/", "/"); * svr.addHandler<HTTPFsRequestHandler>( "/" ); * svr.start(); * while(1) @@ -72,13 +71,55 @@ * } * } * @endcode +* +* An alternate approach e.g. if you need to perform additional tasks using the EthernetInterface +* there is the possibility to provide the EthernetInterface object in an initialized and connected +* state. __NOTE: You should choose this scenario for compatibility reasons.___ +* +* \b Example2: +* @code +* #include "mbed.h" +* #include "HTTPServer.h" +* #include "EthernetInterface.h" +* #include "LocalFileSystem.h" +* +* LocalFileSystem local("local"); +* EthernetInterface eth; +* +* void main(void) +* { +* HTTPServer svr; +* // Initialize the ethernet interface +* if (eth.init() != 0) { +* printf("Initialization of EthernetInterface failed !"); +* exit(0); +* } +* // Connect using DHCP +* if (eth.connect() !=0) { +* printf("Failed to connect using DHCP !"); +* exit(0); +* } +* +* // Moint the local file system and provide a handler for 'root'. +* svr.mount("/local/", "/"); +* svr.addHandler<HTTPFsRequestHandler>( "/" ); +* // Start the server on port 80, providing our own ethernet interface object. +* svr.start(80, ð); +* while(1) +* { +* if (svr.poll() < 0) +* exit(0); +* } +* } +* @endcode +* */ class HTTPServer { - TCPSocketServer m_Svr; bool m_bServerListening; - + EthernetInterface* m_pEthernet; + public: /** Constructor for HTTPServer objects. */ @@ -127,9 +168,11 @@ /** Binds server to a specific port and starts listening. This member prepares the internal variables and the server socket * and terminates after successfull initialization * @param port : port on which to listen for incoming connections - * @returns : -1 if an unrecoverable error occured, or 0 if everything was ok. + * @param pEthernet : a pointer to an existing EthernetInterface object or NULL if the HTTPServer shall allocate the object. _Please note that for compatibility reasons + * your should consider to create the EthernetInterface as a static variable. Otherwise the the object will be created on the heap._ + * @returns : false if an unrecoverable error occured or if the ethernet interface was not set or not initialized correctly, or true if everything was ok. */ - bool start(int port = 80); + bool start(int port = 80, EthernetInterface* pEthernet = NULL); /** Performs the regular polling of the server component. Needs to be called cyclically. * The function will internally check whether new connections are requested by a client and will also poll all existing client connections. @@ -138,8 +181,9 @@ * ready for processing the next request. Simply call \c poll as long as you want to serve new incoming requests. */ int poll(bool blocking = true); - + private: + /** The standard error handler function. * @param msg : Request message data. * @param tcp : Socket to be used for responding.