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:
Sun Apr 28 08:54:44 2013 +0000
Revision:
20:3b0b444b4deb
Parent:
19:33b9ba0859ee
Child:
21:f2a70f15301f
update MiMic core; (Fixed TCP stack bug)

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