A sample program demonstrating a small but powerful web server using the Wifly module. This uses several libraries from others, but has a custom version of the WiflyInterface library, with numerous improvement to the mbed standard library.

Dependencies:   SW_HTTPServer WiflyInterface mbed C12832 IniManager

Here's the code

But you also might want to check out the SmartBoard-WiFly project page.

Basic Web Server

  • Serves static files from the selected file system. This is a compile-time setting, and a typical configuration supports gif, jpg, jpeg, ico, png, zip, gz, tar, txt, pdf, htm, and html.
  • It is designed to be small, thereby better supporting the limited resources of an embedded environment.

Advanced Web Services

  • Serves dynamically generated pages, where your software registers for a path, and then everything to that path activates your handler. Your handler then defines the header and body response.
  • Dynamic handlers can process GET query parameters (e.g. /dyn1?sky=blue&grass=green).
  • Dynamic handlers can process POST query parameters, as delivered from submission of a form.
  • Dynamic handlers can protect a resource with user:password access.

Run-Time Configurations

  • File System Support - using either the "local" file system supported by the magic chip, or from either an SD-Card or a USB flash drive.
  • Configurable to the maximum number of dynamic handlers (minimize memory requirements).
  • Configurable to the maximum number of name=value pairs for dynamic handlers (minimize memory requirements).

Compile-Time Configurations

  • Default filename for URL ending in '/' - default is 'index.htm'.
  • Configurable buffer sizes permit minimizing RAM requirements.
  • Configurable header response information.
  • Configurable for which serial port is used to communicate to the WiFly module.
  • Improved security option - to disable telnet access.

Diagnostics

  • API to determine the largest header (to more efficiently size the buffers).
  • API to gather the run-time characteristics - header processing time and content delivery time.

Limitations / Constraints

Known Issues

These are known issues, not yet resolved.

  1. Occasionally fails to serve a page - one test will constantly reload a web page every 30 seconds. It may run for hours, or minutes, then fail to load. Behaviors then are:
    • Hit the reload button in the browser and away it goes.
    • Hit the reload and you'll see the Wifly LEDs energize from the request, but no response by the web server. It appears that the embedded code does not "accept()" the connection in the TCP Socket Server.
      • In this case, the Wifly module has gone through an internal watchdog reset and the configuration parameters are such that it does not gracefully recover. Microchip is aware of this issue, but has not solved it.

Wifly Limitations

  • Single thread - it doesn't respond to overlapping requests (e.g. an embedded image may be requested before the main page completes transfer - the request is lost and the image not shown).
  • Single client - goes along with the single thread, but it doesn't support more than one client at a time.

Smart-Wifly-WebServer

  • Dynamic memory allocation - it does use dynamic memory allocation, which would be discouraged/avoided in many embedded systems. Here it uses it in parsing a request and it releases those resources upon completion of that request. If there is no other dynamic allocation that persists beyond a transaction, it should not cause memory fragmentation. Note that with multi-threading (if this is implemented with an OS), you then have race conditions that could cause fragmentation.

Web Server

Here's the web server in action. A combination of static pages served from the file system and dynamically generated pages.

/media/uploads/WiredHome/swsvr_1.pngPart of the main demo page,
which basically has all the
specifications, configurations, and limitations.
/media/uploads/WiredHome/swsvr_2.pngA zoomed out view of the same page.
/media/uploads/WiredHome/swsvr_3.pngIt would be possible to configure
the server via the web.
/media/uploads/WiredHome/swsvr_4.pngOne of the dynamically generated pages.
This one has parsed the query parameters.
/media/uploads/WiredHome/swsvr_5.pngA simple form which has a dynamic handler on the back end.
Here it takes the value associated with "leds"
and uses that to set the 4 LEDs on the mbed module.
/media/uploads/WiredHome/swsvr_6.pngA dynamic handler can require authentication.
/media/uploads/WiredHome/swsvr_7.pngSuccess!

But I've now gone so far beyond that in the current version. Here's what this one can do:

  1. It serves static web pages from a file system. I've only tested with the local file system and an SD card, but should work for any, so long as you remember that the local file system can't read subdirectories.
  2. It can serve dynamically generated web pages. This lets you accept name=value pairs using the URL (using either a GET or POST method). It can also accept them from forms. The demo lets you control the 4 LEDs from a form.
  3. As safely as possible it retrieves your credentials to the Wi-Fi Access Point. After using them, it overwrites that ram so they can't be as easily extracted.
  4. I made a large number of changes to the Wifly driver. It had too short of a timeout and I found quite a number of optimizations for performance and robustness.
  5. I have the start on a security feature - you can configure a resource to require user credentials to access it. The browser typically provides a username and password dialog. Take care however, as it does not support a secure (https) connection, so the credentials are not as securely transferred as I would like.

Optimizations I'd like to do:

  1. speed it up - I'm running the mbed to wifly module interface at 230K, which is about the top speed w/o flow control. There are other places where some time delays remain - I have eliminated a number of them.
  2. make it non-blocking, so other work can happen.
  3. integrate it with the rtos
  4. When a web page has referenced resources (e.g. an image tag), it rarely loads the image on the first try. I think the request for the resource comes in while it is still in the WiflyInterface cleaning up from the last connection. The Wifly module supports only a single connection at a time. I worked around this with a small bit of javascript to load the images after the web page.

But all in all I think it is a good start.

Program prerequisite

Here's the link to the program, but when you open it up, note a few very important items.

  1. Port Numbers listed in the constructor match the SmartBoard Baseboard.
  2. I sped up the communication baud rate to the mbed from the default 9600. Match your terminal program accordingly.
  3. Download this zip. Place it and an unzipped copy into the mbed local file system. These are the demo files.
  4. The typical ssid and password are not shown. See below to set yours.

ssid and password

You need to create a simple text file on your mbed root folder named "config.ini". The easiest way perhaps is to create "config.txt", add the information shown below and then rename it. This will be read at startup to connect you to the network. Something quite simple, like this:

[Wifi]
ssid=your_ssid
pass=your_pass_code

The program

And the program.

Import programSmart-WiFly-WebServer

A sample program demonstrating a small but powerful web server using the Wifly module. This uses several libraries from others, but has a custom version of the WiflyInterface library, with numerous improvement to the mbed standard library.

Changes

RevisionDateWhoCommit message
38:962d71d6dd0e 2015-02-02 WiredHome Refresh update, bug fix, mbed application board compatibility. default tip
37:8ced9a7fe3fd 2014-09-01 WiredHome Updated to match changes in SW_HTTPServer.
36:5ca4a8b8d888 2014-09-01 WiredHome Stabilized version - tested with WiFlyInterface.
35:87d3577800dc 2014-09-01 WiredHome Updates to remove dependency on WiFly.
34:77d0f63f612a 2014-05-11 WiredHome Updated examples, particular focus on POST method.
33:41ac99847df8 2014-01-03 WiredHome Ongoing changes are working on supporting file upload.
32:34dae3cae1b0 2013-11-28 WiredHome Updated libraries, including the mbed library.; Small revision to startup printouts.; Added a diagnostic "glow" LED that would normally not be used.
31:c9136c0f4024 2013-10-12 WiredHome Picking up small changes in libraries.
30:4717cc1f970e 2013-10-12 WiredHome Picked up a replacement MODSERIAL library
29:14c47d31a9dc 2013-10-11 WiredHome Incorporate changes for updated web server and file system interfaces.
28:f9ff2a825dc4 2013-10-10 WiredHome Picked up latest WiflyInterface and SW_HTTPServer
27:840556cd3ec2 2013-10-10 WiredHome Pick up latest WiflyInterface
26:eea4db568404 2013-10-10 WiredHome Diagnostic Improvements.
25:77d4cc785046 2013-10-10 WiredHome Stable release for testing.
24:849cbe0b36ac 2013-10-10 WiredHome A small change in the registration of the server root folder.
23:5aaebde6a7e4 2013-10-10 WiredHome Unraveling small differences that are causing it to fail. Nothing conclusive.
22:c1fd8fccf7c6 2013-10-10 WiredHome Working small changes in documentation
21:d29453469e41 2013-10-10 WiredHome documentation updates only.
20:0ae416ce9eaf 2013-09-26 WiredHome An update based on making the WiflyInterface more compatible with EthernetInterface.
19:5350a89cf57c 2013-09-14 WiredHome Documentation update
18:42bb1805c37c 2013-09-14 WiredHome Remove some of the excess debug aids.
17:8d4264db86aa 2013-09-06 WiredHome Picked up latest WiflyInterface, which extract the version from the module on startup - in a case-insensitive manner.
16:ab1867ffcf94 2013-09-05 WiredHome Primarily performance tuning activities to help speed it up.
15:1f2b62130ffb 2013-09-01 WiredHome Cleaned up the code, removed some of the debug work.; Hopefully it is easier to follow by others.
14:85c805890454 2013-08-12 WiredHome Added demo page for a simple password protected page.; Added demo page for how a server configuration may be created.
13:14c6ce4ced9c 2013-08-04 WiredHome Minor updates while working a reliability issue in the WiflyInterface class.
12:479ff89c190b 2013-07-27 WiredHome Example program updated the development aids and diagnostics.
11:183b3893eb7d 2013-07-04 WiredHome Added a WiFly shell at startup before the server runs.; Documentation changes.
10:b0b6da272a7b 2013-07-01 WiredHome Small changes while working the underlying wifly interface.
9:71d1886225c2 2013-06-27 WiredHome Showing enhanced APIs
8:50fc3ddf828a 2013-06-27 WiredHome Small enhancement to show the SW version API.
7:72b5df2fac93 2013-06-25 WiredHome Updates to the examples based on API improvements.
6:c045118a21de 2013-06-24 WiredHome Updated examples, diagnostic and performance APIs and demo of them.
5:b8404d1d4db4 2013-06-24 WiredHome Minor update to remove unreferenced variables
4:178df829d62b 2013-06-24 WiredHome Non-blocking
3:b3e21f3306a1 2013-06-02 WiredHome Refactored main.cpp to extract the dynamic web page generation into DynamicPages.cpp, .h
2:5cd3f15ac98b 2013-05-31 WiredHome Updated documentation
1:551cfb8bdeb8 2013-05-31 WiredHome Minor update to docs
0:08da60dc31bc 2013-05-31 WiredHome Initial revision of the Smart-WiFly-WebServer. Demo accesses credentials from the local file system. It can serve static pages from the file system (sd card, etc.), and it can serve dynamically generated pages, including handling GET and POST forms)