This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

libMiMic(MiMic library for mbed)は、WebService機能を提供するSDKです。 mbedでWebAPIに対応したネットワークデバイスを簡単に作ることが出来ます。

libMiMicはMiMic projectで開発しています。MiMic projectについてはこちらをご覧ください。 http://nyatla.jp/mimic/wp/

構成

libMiMicはmbedRTOS上で動作し、ユーザアプリケーションにAPIを提供します。コアAPIはC言語で記述されていますが、使用頻度の高いものについてはmbed向けのC++APIが準備されています。

/media/uploads/nyatla/libmimic-sdk.png

※libMiMicはmbedの標準イーサネットドライバをしようしていません。

標準イーサネットドライバと同時に使用することはできません。

  • MiMicIP - IPv4スタックです。レテンシとメモリ消費量を抑えたuipベースのライブラリです。
  • ARP/ICMP/UDP/TCP - 基礎的なソケットAPIを提供します。APIは独自です。
  • HTTP/1.1 Server - HTTP/1.1に対応したサーバです。マルチセッション・Chunked・持続性接続に対応しています。
  • HTTP Modules - HTTP/1.1の機能モジュールです。以下のモジュールがあります。
    • ROM file provider - ROMに格納したファイルイメージを公開します。
    • File system provider - mbedファイルシステムを公開します。
    • Onchip configuration - プログラムフラッシュを利用して設定を保存します。
    • MiMicVM processor - RPCリクエスト(MiMicVM)を処理します。
    • FileUpload - ファイルアップロードを受け取ります。
    • URL decoder - HTTPリクエストを解析します。
    • UPnP handler -UPnPメッセージを処理します。
    • WebSocket - Websocketサーバです。
  • mDNS - マルチキャストDNSサービスです。
  • UPnP - UPnP/1.0の機能を提供します。UPnP handlerと協調して動作します。(現在はデバイス探索(SSDP)・デスクリプション(Description)のみ実装してあります。)
  • DHCP/APIPA - ゼロコンフィギュレーション用のモジュールです。
  • HTTP/1.1 Client
  • mbed C++ class library - mbed向けのC++CPIです。C言語のものより簡単です。

対応機種

  • mbed(mbed LPC1768)
  • LPCXpresso1769

プログラム

Import programMiMicRemoteMCU-for-Mbed

MiMic RemoteMCU for mbed. This program provides MCU control API over REST API. It can control MCU from Javascript,PHP or any HTTP rest client directly. And, The application has self development environment.

Import programMbedFileServer

The program publishes files at local directory and SD filesystem. It is a full-fledged webServer somewhat.

サンプル

Import programMiMicSimpleHttpd

This is a simplest HTTP server made ​​of libMiMic. It will echo back a request path.

Import programUPnPBasicDevice

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

Import programWebSocketSample

MiMicSDK Websocket module sample program.

Import programHttpClientSamlpe

A http client sample program.

Import programTcpSocketClientSamlpe

MiMicSDK Tcp client socket sample program.

Import programUdpSocketSamlpe

Udp socket sample program. This program will send back the received packet.

チュートリアル

English

libMiMic(MiMic library for mbed) is SDK which provides Webservice functions. It can be created networking device easily using mbed.

See more MiMic information, See MiMic project website. http://nyatla.jp/mimic/wp/

Structure

libMiMic run on mbed RTOS and provides networking API to user application. This library has C++ class API for the mbed, and low-level C language API.

/media/uploads/nyatla/libmimic-sdk.png

For WebService general, it can be written in a simple C + + API.

libMiMic does not have the standard Ethernet driver of mbed. It is not possible that will be used with the standard Ethernet driver.

  • MiMicIP - IPv4 protocol stack. This is based uip which is reduced memory and latency.
  • ARP / ICMP / UDP / TCP - Those are provide basic IP protocols.
  • HTTP/1.1 Server - The Http server compatible HTTP/1.1. It supports multi-session, chunked transport, persistent connection.
  • HTTP Modules - There are addon-module for HTTP server. The following modules.
    • ROM file module - Publish the file images in ROM.
    • File system module - Publish thefiles in mbed file system.
    • Onchip configuration module - To save the network settings to the program flash via REST.
    • MiMicVM module - To handle the (MiMicVM) RPC request.
    • FileUpload module - Accept a file via HTTP POST.
    • URL dedoce module - A versatility URL decoder.
    • UPnP handle module - To handle UPnP messages.
    • UPnP - This provides UPnP/1.0 device functions. It works together with UPnP handler.
    • Websocket - websocket (version13) server
  • mDNS Service - DNS-SD protocol server.
  • UPnP - This provides UPnP/1.0 device functions which works with UPnP handler. (You have been implemented (SSDP) ? description only (Description) device search now.) It is a module zero configuration for - DHCP / APIPA. mbed C + + class library - C of mbed for + + is the CPI. It is simple than that of the C language.
  • DHCP/APIPA - It support zero-cpnfigulation.
  • mbed C++ class library. Almost APIs for Web applications are available.
  • HTTP/1.1 Client

Supported target

  • mbed(mbed LPC1768)
  • LPCXpresso1769

Application

Import programMiMicRemoteMCU-for-Mbed

MiMic RemoteMCU for mbed. This program provides MCU control API over REST API. It can control MCU from Javascript,PHP or any HTTP rest client directly. And, The application has self development environment.

Import programMbedFileServer

The program publishes files at local directory and SD filesystem. It is a full-fledged webServer somewhat.

Sample

Import programMiMicSimpleHttpd

This is a simplest HTTP server made ​​of libMiMic. It will echo back a request path.

Import programUPnPBasicDevice

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

Import programWebSocketSample

MiMicSDK Websocket module sample program.

Import programHttpClientSamlpe

A http client sample program.

Import programTcpSocketClientSamlpe

MiMicSDK Tcp client socket sample program.

Import programUdpSocketSamlpe

Udp socket sample program. This program will send back the received packet.

Tutorial

Committer:
nyatla
Date:
Sat Apr 27 13:31:57 2013 +0000
Revision:
19:33b9ba0859ee
Parent:
18:1970fec78229
Child:
20:3b0b444b4deb
update MiMic core r223;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 17:f29e1ca90e3d 1 #include "ModLocalFileSystem.h"
nyatla 17:f29e1ca90e3d 2 #include "HttpdConnection.h"
nyatla 18:1970fec78229 3 #include "UrlReader.h"
nyatla 18:1970fec78229 4 #include "Http.h"
nyatla 19:33b9ba0859ee 5 #include "Httpd.h"
nyatla 17:f29e1ca90e3d 6 #include "NyLPC_net.h"
nyatla 17:f29e1ca90e3d 7 #include <stdio.h>
nyatla 17:f29e1ca90e3d 8 #include <stdlib.h>
nyatla 17:f29e1ca90e3d 9 #include <typeinfo>
nyatla 17:f29e1ca90e3d 10 #include "mbed.h"
nyatla 17:f29e1ca90e3d 11 #include "FATDirHandle.h"
nyatla 19:33b9ba0859ee 12
nyatla 17:f29e1ca90e3d 13
nyatla 18:1970fec78229 14 using namespace MiMic;
nyatla 19:33b9ba0859ee 15 static void retDirJson(UrlReader& url,char* buf,HttpdConnection& i_connection)
nyatla 18:1970fec78229 16 {
nyatla 18:1970fec78229 17 //assert(HEAD or GET)
nyatla 18:1970fec78229 18 //directory-list json
nyatla 18:1970fec78229 19 if(!NyLPC_cHttpdUtils_sendJsonHeader((i_connection._ref_inst))){
nyatla 18:1970fec78229 20 return;
nyatla 18:1970fec78229 21 }
nyatla 18:1970fec78229 22 if(!i_connection.isMethodType(Http::MT_GET)){
nyatla 18:1970fec78229 23 return;
nyatla 18:1970fec78229 24 }
nyatla 18:1970fec78229 25 const char* t;
nyatla 18:1970fec78229 26 int l;
nyatla 18:1970fec78229 27 url.getPath(t,l);
nyatla 18:1970fec78229 28 buf[l]='\0';//split path
nyatla 18:1970fec78229 29 //remove '/'
nyatla 18:1970fec78229 30 if(buf[l-1]=='/'){
nyatla 18:1970fec78229 31 buf[l-1]='\0';
nyatla 18:1970fec78229 32 }
nyatla 18:1970fec78229 33 DIR* d=opendir(buf);
nyatla 18:1970fec78229 34 if ( d == NULL )
nyatla 18:1970fec78229 35 {
nyatla 18:1970fec78229 36 i_connection.sendBodyF("{\"dir\":\"%s\",\"status\":404,\"list\":[]}",buf);
nyatla 18:1970fec78229 37 return;
nyatla 18:1970fec78229 38 }
nyatla 18:1970fec78229 39 if(!i_connection.isMethodType(Http::MT_GET)){
nyatla 18:1970fec78229 40 //nothing to do
nyatla 18:1970fec78229 41 }else{
nyatla 18:1970fec78229 42 bool is_fatfs=(typeid(*d) == typeid(FATDirHandle));
nyatla 18:1970fec78229 43 struct dirent *p;
nyatla 18:1970fec78229 44 p = readdir(d);
nyatla 18:1970fec78229 45 i_connection.sendBodyF("{\"dir\":\"%s\",\"status\":200,\"list\":[",buf);
nyatla 18:1970fec78229 46 for(;;)
nyatla 18:1970fec78229 47 {
nyatla 18:1970fec78229 48 if(is_fatfs){
nyatla 18:1970fec78229 49 bool isdir=(((struct direntFAT*)(p))->fattrib & AM_DIR)!=0;
nyatla 18:1970fec78229 50 i_connection.sendBodyF("{\"name\":\"%s\",\"mtype\":\"%s\",\"size\":%u}",
nyatla 18:1970fec78229 51 p->d_name,isdir?"directory":NyLPC_cMiMeType_getFileName2MimeType(p->d_name),
nyatla 18:1970fec78229 52 isdir?0:((struct direntFAT*)(p))->fsize);
nyatla 18:1970fec78229 53 }else{
nyatla 18:1970fec78229 54 i_connection.sendBodyF("{\"name\":\"%s\",\"mtype\":\"%s\",\"size\":undefined}",
nyatla 18:1970fec78229 55 p->d_name,NyLPC_cMiMeType_getFileName2MimeType(p->d_name));
nyatla 18:1970fec78229 56 }
nyatla 18:1970fec78229 57 p = readdir(d);
nyatla 18:1970fec78229 58 if(p==NULL){
nyatla 18:1970fec78229 59 break;
nyatla 18:1970fec78229 60 }
nyatla 18:1970fec78229 61 i_connection.sendBodyF(",");
nyatla 18:1970fec78229 62 }
nyatla 18:1970fec78229 63 i_connection.sendBodyF("]}");
nyatla 18:1970fec78229 64 }
nyatla 18:1970fec78229 65 closedir(d);
nyatla 18:1970fec78229 66 }
nyatla 19:33b9ba0859ee 67 static void retDirHtml(UrlReader& url,char* buf,HttpdConnection& i_connection)
nyatla 18:1970fec78229 68 {
nyatla 18:1970fec78229 69 //assert(HEAD or GET)
nyatla 18:1970fec78229 70 buf[strlen(buf)-1]='\0';//convert to dir path
nyatla 18:1970fec78229 71 DIR* d=opendir(buf);
nyatla 18:1970fec78229 72 if(d==NULL){
nyatla 18:1970fec78229 73 i_connection.sendHeader(403,"text/html",NULL);
nyatla 18:1970fec78229 74 if(!i_connection.isMethodType(Http::MT_GET)){
nyatla 18:1970fec78229 75 return;
nyatla 18:1970fec78229 76 }
nyatla 18:1970fec78229 77 i_connection.sendBodyF("<!DOCTYPE html><html><body><h1>403 Forbidden</h1><hr/>'%s'</body></html>",buf);
nyatla 18:1970fec78229 78 return;
nyatla 18:1970fec78229 79 }
nyatla 18:1970fec78229 80 if(!i_connection.sendHeader(200,"text/html",NULL)){
nyatla 18:1970fec78229 81 //nothing to do
nyatla 18:1970fec78229 82 }else{
nyatla 18:1970fec78229 83 if(!i_connection.isMethodType(Http::MT_GET)){
nyatla 18:1970fec78229 84 //nothing to do.
nyatla 18:1970fec78229 85 }else{
nyatla 18:1970fec78229 86 bool is_fatfs=(typeid(*d) == typeid(FATDirHandle));
nyatla 18:1970fec78229 87 struct dirent *p;
nyatla 18:1970fec78229 88 p = readdir(d);
nyatla 18:1970fec78229 89 i_connection.sendBodyF(
nyatla 18:1970fec78229 90 "<!DOCTYPE html><html><body><h1>Index of %s</h1><hr/>\n"
nyatla 18:1970fec78229 91 "<ul>\n"
nyatla 18:1970fec78229 92 ,buf);
nyatla 18:1970fec78229 93 for(;;)
nyatla 18:1970fec78229 94 {
nyatla 18:1970fec78229 95 if(is_fatfs){
nyatla 18:1970fec78229 96 if((((struct direntFAT*)(p))->fattrib & AM_DIR)!=0){
nyatla 18:1970fec78229 97 //dir
nyatla 18:1970fec78229 98 i_connection.sendBodyF("<li><a href=\"./%s/\">[DIR]%s</a></li>\n",p->d_name,p->d_name);
nyatla 18:1970fec78229 99 }else{
nyatla 18:1970fec78229 100 //file
nyatla 18:1970fec78229 101 i_connection.sendBodyF("<li><a href=\"./%s\">%s</a></li>\n",p->d_name,p->d_name);
nyatla 18:1970fec78229 102 }
nyatla 18:1970fec78229 103 }else{
nyatla 18:1970fec78229 104 i_connection.sendBodyF("<li><a href=\"./%s\">%s</a></li>\n",
nyatla 18:1970fec78229 105 p->d_name,p->d_name);
nyatla 18:1970fec78229 106 }
nyatla 18:1970fec78229 107 p = readdir(d);
nyatla 18:1970fec78229 108 if(p==NULL){
nyatla 18:1970fec78229 109 break;
nyatla 18:1970fec78229 110 }
nyatla 18:1970fec78229 111 }
nyatla 18:1970fec78229 112 i_connection.sendBodyF("</ul></body></html>",buf);
nyatla 18:1970fec78229 113 }
nyatla 18:1970fec78229 114 }
nyatla 18:1970fec78229 115 closedir(d);
nyatla 18:1970fec78229 116 }
nyatla 19:33b9ba0859ee 117 static void retFile(UrlReader& url,char* buf,HttpdConnection& i_connection)
nyatla 18:1970fec78229 118 {
nyatla 18:1970fec78229 119 //file contents
nyatla 18:1970fec78229 120 {//split URL path and query
nyatla 18:1970fec78229 121 const char* t;
nyatla 18:1970fec78229 122 int l;
nyatla 18:1970fec78229 123 url.getPath(t,l);
nyatla 18:1970fec78229 124 buf[l]='\0';
nyatla 18:1970fec78229 125 }
nyatla 18:1970fec78229 126 //return content
nyatla 18:1970fec78229 127 FILE *fp;
nyatla 18:1970fec78229 128 size_t sz;
nyatla 18:1970fec78229 129 //size
nyatla 18:1970fec78229 130 fp = fopen(buf, "r");
nyatla 18:1970fec78229 131 if(fp==NULL){
nyatla 18:1970fec78229 132 i_connection.sendHeader(404,"text/html",NULL);
nyatla 18:1970fec78229 133 if(!i_connection.isMethodType(Http::MT_GET)){
nyatla 18:1970fec78229 134 return;
nyatla 18:1970fec78229 135 }
nyatla 18:1970fec78229 136 i_connection.sendBodyF("<!DOCTYPE html><html><body>'%s' not found.</body></html>",buf);
nyatla 18:1970fec78229 137 return;
nyatla 18:1970fec78229 138 }
nyatla 18:1970fec78229 139
nyatla 18:1970fec78229 140 fseek(fp, 0, SEEK_END); // seek to end of file
nyatla 18:1970fec78229 141 sz = ftell(fp); // get current file pointer
nyatla 18:1970fec78229 142 fseek(fp, 0, SEEK_SET); // seek back to beginning of file
nyatla 18:1970fec78229 143 if(i_connection.sendHeader(200,NyLPC_cMiMeType_getFileName2MimeType(buf),NULL,sz)){
nyatla 18:1970fec78229 144 if(!i_connection.isMethodType(Http::MT_GET)){
nyatla 18:1970fec78229 145 //nothing to do
nyatla 18:1970fec78229 146 }else{
nyatla 19:33b9ba0859ee 147 {DigitalOut led(LED1);led=0;}
nyatla 19:33b9ba0859ee 148 {DigitalOut led(LED2);led=0;}
nyatla 19:33b9ba0859ee 149 {DigitalOut led(LED3);led=0;}
nyatla 19:33b9ba0859ee 150 {DigitalOut led(LED4);led=1;}
nyatla 19:33b9ba0859ee 151
nyatla 18:1970fec78229 152 for(;;){
nyatla 19:33b9ba0859ee 153 sz=fread(buf,1,Httpd::SIZE_OF_HTTP_BUF,fp);
nyatla 18:1970fec78229 154 if(sz<1){
nyatla 18:1970fec78229 155 break;
nyatla 18:1970fec78229 156 }
nyatla 18:1970fec78229 157 if(!i_connection.sendBody(buf,sz)){
nyatla 19:33b9ba0859ee 158 {DigitalOut led(LED1);led=1;}
nyatla 18:1970fec78229 159 break;
nyatla 18:1970fec78229 160 }
nyatla 18:1970fec78229 161 //switch transport thread
nyatla 18:1970fec78229 162 /*
nyatla 18:1970fec78229 163 i_connection.releaseHttpd();
nyatla 18:1970fec78229 164 NyLPC_cThread_yield();
nyatla 18:1970fec78229 165 i_connection.lockHttpd();
nyatla 18:1970fec78229 166 */
nyatla 18:1970fec78229 167 }
nyatla 18:1970fec78229 168 }
nyatla 18:1970fec78229 169 }
nyatla 19:33b9ba0859ee 170 {DigitalOut led(LED2);led=1;}
nyatla 18:1970fec78229 171 fclose(fp);
nyatla 18:1970fec78229 172 }
nyatla 18:1970fec78229 173
nyatla 17:f29e1ca90e3d 174
nyatla 17:f29e1ca90e3d 175 namespace MiMic
nyatla 17:f29e1ca90e3d 176 {
nyatla 17:f29e1ca90e3d 177 ModLocalFileSystem::ModLocalFileSystem(const char* i_path):ModBaseClass(i_path)
nyatla 17:f29e1ca90e3d 178 {
nyatla 17:f29e1ca90e3d 179 }
nyatla 17:f29e1ca90e3d 180 ModLocalFileSystem::ModLocalFileSystem():ModBaseClass()
nyatla 17:f29e1ca90e3d 181 {
nyatla 17:f29e1ca90e3d 182 }
nyatla 17:f29e1ca90e3d 183 ModLocalFileSystem::~ModLocalFileSystem()
nyatla 17:f29e1ca90e3d 184 {
nyatla 17:f29e1ca90e3d 185 }
nyatla 17:f29e1ca90e3d 186 void ModLocalFileSystem::setParam(const char* i_path)
nyatla 17:f29e1ca90e3d 187 {
nyatla 17:f29e1ca90e3d 188 ModBaseClass::setParam(i_path);
nyatla 17:f29e1ca90e3d 189 }
nyatla 18:1970fec78229 190
nyatla 17:f29e1ca90e3d 191 bool ModLocalFileSystem::execute(HttpdConnection& i_connection)
nyatla 17:f29e1ca90e3d 192 {
nyatla 17:f29e1ca90e3d 193 //check platform
nyatla 17:f29e1ca90e3d 194 //<write here! />
nyatla 17:f29e1ca90e3d 195
nyatla 17:f29e1ca90e3d 196 //check prefix
nyatla 17:f29e1ca90e3d 197 if(!this->canHandle(i_connection)){
nyatla 17:f29e1ca90e3d 198 return false;
nyatla 17:f29e1ca90e3d 199 }
nyatla 18:1970fec78229 200 //check Method type
nyatla 18:1970fec78229 201 {
nyatla 18:1970fec78229 202 int mt=i_connection.getMethodType();
nyatla 18:1970fec78229 203 if(mt!=Http::MT_GET && mt!=Http::MT_HEAD){
nyatla 18:1970fec78229 204 //method not allowed.
nyatla 18:1970fec78229 205 i_connection.sendHeader(405,"text/html",NULL);
nyatla 18:1970fec78229 206 return true;
nyatla 18:1970fec78229 207 }
nyatla 18:1970fec78229 208 }
nyatla 17:f29e1ca90e3d 209 //Httpd lock
nyatla 18:1970fec78229 210 i_connection.lockHttpd();
nyatla 19:33b9ba0859ee 211 char* buf=Httpd::_shared_buf;
nyatla 19:33b9ba0859ee 212
nyatla 17:f29e1ca90e3d 213 //set file path
nyatla 17:f29e1ca90e3d 214 {
nyatla 17:f29e1ca90e3d 215 //call ModUrl
nyatla 17:f29e1ca90e3d 216 NyLPC_TcModUrl_t mod;
nyatla 17:f29e1ca90e3d 217 NyLPC_cModUrl_initialize(&mod);
nyatla 19:33b9ba0859ee 218 if(!NyLPC_cModUrl_execute2(&mod,i_connection._ref_inst,buf,Httpd::SIZE_OF_HTTP_BUF,0,NyLPC_cModUrl_ParseMode_ALL)){
nyatla 17:f29e1ca90e3d 219 NyLPC_cModUrl_finalize(&mod);
nyatla 19:33b9ba0859ee 220 i_connection.unlockHttpd();
nyatla 17:f29e1ca90e3d 221 return true;
nyatla 17:f29e1ca90e3d 222 }
nyatla 17:f29e1ca90e3d 223 NyLPC_cModUrl_finalize(&mod);
nyatla 17:f29e1ca90e3d 224 }
nyatla 17:f29e1ca90e3d 225 UrlReader url(buf);
nyatla 17:f29e1ca90e3d 226 if(url.hasQueryKey("list")){
nyatla 18:1970fec78229 227 // if path has '/?list' query key,return directory information
nyatla 19:33b9ba0859ee 228 retDirJson(url,buf,i_connection);
nyatla 18:1970fec78229 229 }else if(strchr(buf,'?')==NULL && strchr(buf,'#')==NULL && buf[strlen(buf)-1]=='/'){
nyatla 18:1970fec78229 230 //return directory html when URL has not bookmark and URL query and terminated by '/'.
nyatla 19:33b9ba0859ee 231 retDirHtml(url,buf,i_connection);
nyatla 17:f29e1ca90e3d 232 }else{
nyatla 19:33b9ba0859ee 233 retFile(url,buf,i_connection);
nyatla 17:f29e1ca90e3d 234 }
nyatla 17:f29e1ca90e3d 235 //Httpd unlock
nyatla 19:33b9ba0859ee 236 i_connection.unlockHttpd();
nyatla 17:f29e1ca90e3d 237 return true;
nyatla 17:f29e1ca90e3d 238
nyatla 17:f29e1ca90e3d 239 }
nyatla 17:f29e1ca90e3d 240 }