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:
Tue Jul 09 12:07:17 2013 +0000
Revision:
43:a182f2b5ff41
Parent:
mbed/ModLocalFileSystem.cpp@26:1a13899a5a1c
Child:
48:00d211aac2ec
update to r276;

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 43:a182f2b5ff41 73 i_connection.sendError(403);
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 43:a182f2b5ff41 132 i_connection.sendError(404);
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 26:1a13899a5a1c 147 Timer t;
nyatla 26:1a13899a5a1c 148 t.start();
nyatla 18:1970fec78229 149 for(;;){
nyatla 19:33b9ba0859ee 150 sz=fread(buf,1,Httpd::SIZE_OF_HTTP_BUF,fp);
nyatla 18:1970fec78229 151 if(sz<1){
nyatla 18:1970fec78229 152 break;
nyatla 18:1970fec78229 153 }
nyatla 18:1970fec78229 154 if(!i_connection.sendBody(buf,sz)){
nyatla 18:1970fec78229 155 break;
nyatla 18:1970fec78229 156 }
nyatla 43:a182f2b5ff41 157 //switch other session
nyatla 26:1a13899a5a1c 158 if(t.read_ms()>500){
nyatla 26:1a13899a5a1c 159 //switch transport thread
nyatla 21:f2a70f15301f 160 i_connection.unlockHttpd();
nyatla 21:f2a70f15301f 161 NyLPC_cThread_sleep(50);
nyatla 21:f2a70f15301f 162 i_connection.lockHttpd();
nyatla 26:1a13899a5a1c 163 t.reset();
nyatla 21:f2a70f15301f 164 }
nyatla 18:1970fec78229 165 }
nyatla 18:1970fec78229 166 }
nyatla 18:1970fec78229 167 }
nyatla 18:1970fec78229 168 fclose(fp);
nyatla 18:1970fec78229 169 }
nyatla 18:1970fec78229 170
nyatla 17:f29e1ca90e3d 171
nyatla 17:f29e1ca90e3d 172 namespace MiMic
nyatla 17:f29e1ca90e3d 173 {
nyatla 17:f29e1ca90e3d 174 ModLocalFileSystem::ModLocalFileSystem(const char* i_path):ModBaseClass(i_path)
nyatla 17:f29e1ca90e3d 175 {
nyatla 17:f29e1ca90e3d 176 }
nyatla 17:f29e1ca90e3d 177 ModLocalFileSystem::ModLocalFileSystem():ModBaseClass()
nyatla 17:f29e1ca90e3d 178 {
nyatla 17:f29e1ca90e3d 179 }
nyatla 17:f29e1ca90e3d 180 ModLocalFileSystem::~ModLocalFileSystem()
nyatla 17:f29e1ca90e3d 181 {
nyatla 17:f29e1ca90e3d 182 }
nyatla 17:f29e1ca90e3d 183 void ModLocalFileSystem::setParam(const char* i_path)
nyatla 17:f29e1ca90e3d 184 {
nyatla 17:f29e1ca90e3d 185 ModBaseClass::setParam(i_path);
nyatla 17:f29e1ca90e3d 186 }
nyatla 18:1970fec78229 187
nyatla 17:f29e1ca90e3d 188 bool ModLocalFileSystem::execute(HttpdConnection& i_connection)
nyatla 17:f29e1ca90e3d 189 {
nyatla 17:f29e1ca90e3d 190 //check platform
nyatla 17:f29e1ca90e3d 191 //<write here! />
nyatla 17:f29e1ca90e3d 192
nyatla 17:f29e1ca90e3d 193 //check prefix
nyatla 17:f29e1ca90e3d 194 if(!this->canHandle(i_connection)){
nyatla 17:f29e1ca90e3d 195 return false;
nyatla 17:f29e1ca90e3d 196 }
nyatla 43:a182f2b5ff41 197
nyatla 18:1970fec78229 198 //check Method type
nyatla 18:1970fec78229 199 {
nyatla 18:1970fec78229 200 int mt=i_connection.getMethodType();
nyatla 18:1970fec78229 201 if(mt!=Http::MT_GET && mt!=Http::MT_HEAD){
nyatla 18:1970fec78229 202 //method not allowed.
nyatla 43:a182f2b5ff41 203 i_connection.sendError(405);
nyatla 18:1970fec78229 204 return true;
nyatla 18:1970fec78229 205 }
nyatla 18:1970fec78229 206 }
nyatla 17:f29e1ca90e3d 207 //Httpd lock
nyatla 18:1970fec78229 208 i_connection.lockHttpd();
nyatla 19:33b9ba0859ee 209 char* buf=Httpd::_shared_buf;
nyatla 19:33b9ba0859ee 210
nyatla 17:f29e1ca90e3d 211 //set file path
nyatla 17:f29e1ca90e3d 212 {
nyatla 17:f29e1ca90e3d 213 //call ModUrl
nyatla 17:f29e1ca90e3d 214 NyLPC_TcModUrl_t mod;
nyatla 17:f29e1ca90e3d 215 NyLPC_cModUrl_initialize(&mod);
nyatla 19:33b9ba0859ee 216 if(!NyLPC_cModUrl_execute2(&mod,i_connection._ref_inst,buf,Httpd::SIZE_OF_HTTP_BUF,0,NyLPC_cModUrl_ParseMode_ALL)){
nyatla 17:f29e1ca90e3d 217 NyLPC_cModUrl_finalize(&mod);
nyatla 19:33b9ba0859ee 218 i_connection.unlockHttpd();
nyatla 17:f29e1ca90e3d 219 return true;
nyatla 17:f29e1ca90e3d 220 }
nyatla 17:f29e1ca90e3d 221 NyLPC_cModUrl_finalize(&mod);
nyatla 17:f29e1ca90e3d 222 }
nyatla 17:f29e1ca90e3d 223 UrlReader url(buf);
nyatla 17:f29e1ca90e3d 224 if(url.hasQueryKey("list")){
nyatla 18:1970fec78229 225 // if path has '/?list' query key,return directory information
nyatla 19:33b9ba0859ee 226 retDirJson(url,buf,i_connection);
nyatla 18:1970fec78229 227 }else if(strchr(buf,'?')==NULL && strchr(buf,'#')==NULL && buf[strlen(buf)-1]=='/'){
nyatla 18:1970fec78229 228 //return directory html when URL has not bookmark and URL query and terminated by '/'.
nyatla 19:33b9ba0859ee 229 retDirHtml(url,buf,i_connection);
nyatla 17:f29e1ca90e3d 230 }else{
nyatla 19:33b9ba0859ee 231 retFile(url,buf,i_connection);
nyatla 17:f29e1ca90e3d 232 }
nyatla 17:f29e1ca90e3d 233 //Httpd unlock
nyatla 19:33b9ba0859ee 234 i_connection.unlockHttpd();
nyatla 17:f29e1ca90e3d 235 return true;
nyatla 17:f29e1ca90e3d 236
nyatla 17:f29e1ca90e3d 237 }
nyatla 17:f29e1ca90e3d 238 }