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:
Wed Aug 07 13:53:02 2013 +0000
Revision:
48:00d211aac2ec
Parent:
43:a182f2b5ff41
Child:
111:f525c6e5e27b
backup

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