/**\r
* MiMicJsAPIのバージョン文字列。\r
*/\r
- VERSION:"MiMicJsAPI/1.0.1",\r
+ VERSION:"MiMicJsAPI/1.0.2",\r
/**\r
* 現在の時刻を返す\r
* @returns\r
* @function\r
* @param {object} a\r
* 判定対象のオブジェクト\r
- * @return {Boolean}
+ * @return {Boolean}\r
* aがarrayであれば、trueである。\r
*/\r
isArray:function isArray(a){\r
* インスタンス生成直後は、MiMicRemoteMcuとの接続は断状態である。connect関数を実行して、接続する必要がある。\r
* 通信仕様については、MiMicVM.pdf Appendix 1.MiMicVM HTTP Interfaceを参照すること。\r
* @constructor\r
- * @param {string} server\r
- * 接続するMiMicRemoteMcuのホストアドレスを指定する。IPアドレス、ホスト名等。\r
- * ex. “127.0.0.1” , “127.0.0.1:3939”\r
+ * @param {string} i_path\r
+ * 接続するMiMicRemoteMcuのホストパスを指定します。\r
+ * MiMicVersion 1.4以降はMiMicサーバの/mvm/に割り当てられています。\r
+ * ホストアドレスのみを指定した場合、"/mvm/"サフィックスを自動で追加します。\r
+ * ex.\r
+ * "127.0.0.1" =< "127.0.0.1/mvm/"<br/>\r
+ * "127.0.0.1:3939/mvm/" =< "127.0.0.1:3939/mvm/"\r
* @example\r
* //create a controlable MCU via network.\r
- * var mcu=new MiMicRemoteMcuInterface(“192.168.0.39”); \r
+ * var mcu=new MiMicRemoteMcuInterface(“192.168.0.39/mvm/”); \r
*/\r
- MiMicRemoteMcuInterface=function MiMicRemoteMcuInterface(server)\r
+ MiMicRemoteMcuInterface=function MiMicRemoteMcuInterface(i_path)\r
{\r
- this._mimic_host=server;\r
+ this._mimic_path=i_path+((i_path.indexOf("/")==-1)?"/mvm/":"");\r
}\r
\r
MiMicRemoteMcuInterface.prototype=\r
{\r
- _mimic_host:null,\r
+ _mimic_path:null,\r
_keep_alive:null,\r
/**\r
* 最後にXhrレスポンスを得た時刻\r
if(this._keep_alive==null){\r
throw new MiMicException(EE.NG,"disconnected");\r
}\r
- var res=this._xhrGet("http://"+this._mimic_host+"/mvm.api?v=1&bc="+i_bc,false);\r
+ var res=this._xhrGet("http://"+this._mimic_path+"mvm.api?v=1&bc="+i_bc,false);\r
if(res.status!=200){\r
throw new MiMicException(EE.HTTP,"i_bc="+i_bc+",XHR.status="+res.status);\r
}\r
function xhrStatus(i_is_async,i_cb)\r
{\r
try{\r
- return _t._xhrGet("http://"+_t._mimic_host+"/status.api",i_is_async,i_cb);\r
+ return _t._xhrGet("http://"+_t._mimic_path+"status.api",i_is_async,i_cb);\r
}catch(e){\r
return null;\r
}\r
//1回目の接続確認(同期接続)\r
var res=xhrStatus(false,null);\r
if((res==null) || (!_t._isOnline_parseResponse(res))){\r
- throw new MiMicException("Bad response from "+this._mimic_host);\r
+ throw new MiMicException("Bad response from "+this._mimic_path);\r
}\r
//周期監視の開始\r
this._keep_alive={\r
#include "NyLPC_uipService.h"\r
#include "NyLPC_httpService.h"\r
#include "NyLPC_utils.h"\r
-#include <stdio.h>\r
\r
#include "../net/NyLPC_cNet.h"\r
#include "../net/httpd/NyLPC_cHttpd.h"\r
}\r
\r
\r
-#ifdef COMMENT\r
-\r
-\r
-//イーサネット用の初期化情報\r
-const struct NyLPC_TEthAddr ethaddr=NyLPC_TEthAddr_pack(0x02,0x01,0x02,0x03,0x04,0x05);\r
-const struct NyLPC_TIPv4Addr ipaddr=NyLPC_TIPv4Addr_pack(192,168,0,39);\r
-const struct NyLPC_TIPv4Addr netmask=NyLPC_TIPv4Addr_pack(255,255,255,0);\r
-const struct NyLPC_TIPv4Addr gateway=NyLPC_TIPv4Addr_pack(192,168,0,254);\r
-\r
-//TCP処理スレッドの定義\r
-#define SIZE_OF_RX 256\r
-#define NUM_OF_TH 7\r
-struct TProc{\r
- NyLPC_TcThread_t th;\r
- NyLPC_TcTcpSocket_t socket;\r
- char rbuf[SIZE_OF_RX];\r
-}proc[NUM_OF_TH];\r
-\r
-//ROMFSの定義\r
-extern struct NyLPC_TRomFileData file_cat_jpg;\r
-extern struct NyLPC_TRomFileData file_index_html;\r
-NyLPC_TcRomFileSet_t rfs;\r
-const struct NyLPC_TRomFileData* rfsd[]={\r
- &file_index_html,\r
- &file_cat_jpg};\r
-\r
-//private 関数\r
-\r
-static NyLPC_TUInt16 parseReqHeader(NyLPC_TcHttpStream_t* i_st,struct NyLPC_THttpShortRequestHeader* o_reqh);\r
-static NyLPC_TBool writeError(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,NyLPC_TUInt16 i_status);\r
-static NyLPC_TBool writeFile(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,const struct NyLPC_TRomFileData* i_file);\r
-static NyLPC_TBool writeJson(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh);\r
-\r
-\r
-//スケッチ\r
-\r
-void setup(void)\r
-{\r
- int i;\r
- //uipサービス初期化。いろいろ利用可能に。\r
- NyLPC_cUipService_initialize();\r
-// for(i=0;i<NUM_OF_TH;i++){\r
-// NyLPC_cThread_initialize(&(proc[i].th),200,NyLPC_TcThread_PRIORITY_IDLE);\r
-// NyLPC_cTcpSocket_initialize(&(proc[i].socket),proc[i].rbuf,SIZE_OF_RX);\r
-// }\r
-// //ROMのファイルシステムを初期化\r
-// NyLPC_cRomFileSet_initialize(&rfs,rfsd,2);\r
-\r
-}\r
-\r
-//ステータス用。\r
-static int num_of_reqest=0;\r
-static int num_of_error=0;\r
-static int num_of_connect=0;\r
-static int num_of_tx=0;\r
-\r
-//Httpのセッション関数\r
-static int server(void* p)\r
-{\r
- struct TProc* proc=(struct TProc*)p;\r
- NyLPC_TUInt16 ret;\r
- const struct NyLPC_TRomFileData* rf;\r
- NyLPC_TcHttpStream_t st;\r
- struct NyLPC_THttpShortRequestHeader reqheader;\r
- if(!NyLPC_cTcpSocket_accept(&(proc->socket),3000)){\r
- return -1;\r
- }\r
- num_of_connect++;\r
-\r
- //TCPのオープン\r
- if(NyLPC_cHttpStream_initialize(&st,&(proc->socket))){\r
- for(;;){\r
- ret=parseReqHeader(&st,&reqheader);\r
- num_of_reqest++;\r
- //コネクションが増えすぎたら持続性接続を停止するために上書き。\r
- if(num_of_connect>5){\r
- reqheader.super.connection=NyLPC_THttpMessgeHeader_Connection_CLOSE;\r
- }\r
- if(ret!=200){\r
- //エラーならエラーレスポンスを生成。持続性接続しない。\r
- writeError(&st,&(reqheader.super),ret);\r
- num_of_error++;\r
- break;\r
- }\r
- //URLから判定。\r
- if(strncmp("/rf.api?",reqheader.url,8)==0){\r
- //ファイル検索\r
- rf=NyLPC_cRomFileSet_getFilaData(&rfs,reqheader.url+8);\r
- if(rf==NULL){\r
- num_of_error++;\r
- if(!writeError(&st,&(reqheader.super),404)){\r
- break;\r
- }\r
- }else{\r
- if(!writeFile(&st,&(reqheader.super),rf)){\r
- num_of_error++;\r
- break;\r
- }\r
- }\r
- }else if(strncmp("/status.json",reqheader.url,8)==0){\r
- if(!writeJson(&st,&(reqheader.super))){\r
- break;\r
- }\r
- //httpdの状態を返す。\r
- }else{\r
- if(!writeFile(&st,&(reqheader.super),NyLPC_cRomFileSet_getFilaData(&rfs,"index.html"))){\r
- num_of_error++;\r
- break;\r
- }\r
- }\r
-\r
- }\r
- NyLPC_cHttpStream_finalize(&st);\r
- }\r
- //5秒以内に切断\r
- NyLPC_cTcpSocket_close(&(proc->socket),5000);\r
- num_of_connect--;\r
- return 0;\r
-}\r
-\r
-\r
-void loop(void)\r
-{\r
- NyLPC_TcIPv4Config_t config;\r
- NyLPC_TcTcpListener_t listener;\r
- int i;\r
-\r
-\r
- NyLPC_cIPv4Config_initialzeForEthernet(&config,ðaddr,1480);\r
- NyLPC_cIPv4Config_setDefaultRoute(&config,&gateway);\r
- NyLPC_cIPv4Config_setIp(&config,&ipaddr,&netmask);\r
-\r
-\r
-// NyLPC_cTcpListener_initialize(&listener,80);\r
- NyLPC_cUipService_start(&config);\r
-/* for(;;){\r
- //ターミネイト状態のタスクを検索\r
- for(i=0;i<NUM_OF_TH;i++){\r
- if(NyLPC_cThread_isTerminated(&(proc[i].th))){\r
- //リスニング\r
- if(!NyLPC_cTcpListener_listen(&listener,&(proc[i].socket),5000)){\r
- continue;\r
- }\r
- //タスク起動\r
- NyLPC_cThread_start(&(proc[i].th),server,&(proc[i]));\r
- }\r
- }\r
- }*/\r
- for(;;){}\r
-}\r
-\r
-\r
-\r
-/**\r
- * リクエストヘッダのパーサ\r
- */\r
-static NyLPC_TUInt16 parseReqHeader(NyLPC_TcHttpStream_t* i_st,struct NyLPC_THttpShortRequestHeader* o_reqh)\r
-{\r
- NyLPC_TUInt16 ret=200;\r
- NyLPC_TcHttpShortRequestHeaderParser_t hp;\r
- NyLPC_cHttpShortRequestHeaderParser_initialize(&hp);\r
-\r
- //ヘッダ解析\r
- if(!NyLPC_cHttpShortRequestHeaderParser_parse(&hp,i_st,o_reqh)){\r
- ret=NyLPC_cHttpBasicHeaderParser_getStatusCode(&hp.super);\r
- }\r
- //ヘッダの内容確認\r
- if(o_reqh->super.type!=NyLPC_THttpHeaderType_REQUEST){\r
- ret=400;\r
- }\r
- //GETだけネ\r
- if(o_reqh->super.startline.req.method!=NyLPC_THttpMethodType_GET){\r
- ret=405;\r
- }\r
- NyLPC_cHttpBasicHeaderParser_finalize(&hp);\r
- return ret;\r
-}\r
-/**\r
- * エラーレスポンスのライタ。\r
- * 戻り値はpersistentConnectionが有効かどうか。\r
- */\r
-static NyLPC_TBool writeError(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,NyLPC_TUInt16 i_status)\r
-{\r
- static const char* HTML_FORMAT="<html><h1>STATUS %d</h1><hr/>"NyLPC_cHttpdConfig_SERVER"</html>";\r
- NyLPC_TcHttpHeaderWriter_t hw;\r
- NyLPC_TcHttpBodyWriter_t bw;\r
- //ヘッダライタの生成\r
- if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- //ヘッダ書込み\r
- if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){\r
- NyLPC_cHttpHeaderWriter_setClose(&hw);\r
- }\r
- //@bug HTTP/1.1未満のクライアントを考慮していない。\r
- NyLPC_cHttpHeaderWriter_setChunked(&hw);\r
- //ヘッダの基本情報出力\r
- NyLPC_cHttpHeaderWriter_writeHeader(&hw,i_status);\r
- //拡張メッセージヘッダの出力\r
- NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type","text/html");\r
-\r
- //ヘッダ書込み終わり。(最後だけチェック)\r
- if(!NyLPC_cHttpHeaderWriter_close(&hw)){\r
- NyLPC_cHttpHeaderWriter_finalize(&hw);\r
- return NyLPC_TBool_FALSE;\r
- }\r
- NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-\r
- //Bodyの書込み\r
- NyLPC_cHttpBodyWriter_initialize(&bw,i_st);\r
- //チャンク転送設定\r
- NyLPC_cHttpBodyWriter_setChunked(&bw);\r
- NyLPC_cHttpBodyWriter_format(&bw,HTML_FORMAT,(NyLPC_TInt32)i_status);\r
- //エラーチェック\r
- if(!NyLPC_cHttpBodyWriter_close(&bw)){\r
- NyLPC_cHttpBodyWriter_finalize(&hw);\r
- return NyLPC_TBool_FALSE;\r
- }\r
- NyLPC_cHttpBodyWriter_finalize(&hw);\r
- return NyLPC_THttpBasicHeader_isPersistent(i_rqh);\r
-}\r
-\r
-/**\r
- * エラーレスポンスのライタ。\r
- * 戻り値はpersistentConnectionが有効かどうか。\r
- */\r
-static NyLPC_TBool writeJson(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh)\r
-{\r
- static const char* JSON_FORMAT="{nr:%d,ne:%d,ac:%d,er:\"%d/%d/%d\",tx:%d}";\r
- NyLPC_TcHttpHeaderWriter_t hw;\r
- NyLPC_TcHttpBodyWriter_t bw;\r
- //ヘッダライタの生成\r
- if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- //ヘッダ書込み\r
- if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){\r
- NyLPC_cHttpHeaderWriter_setClose(&hw);\r
- }\r
- //@bug HTTP/1.1未満のクライアントを考慮していない。\r
- NyLPC_cHttpHeaderWriter_setChunked(&hw);\r
- //ヘッダの基本情報出力\r
- NyLPC_cHttpHeaderWriter_writeHeader(&hw,200);\r
- //拡張メッセージヘッダの出力\r
- NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type","application/json");\r
- NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Access-Control-Allow-Origin","*");\r
-\r
- //ヘッダ書込み終わり。(最後だけチェック)\r
- if(!NyLPC_cHttpHeaderWriter_close(&hw)){\r
- NyLPC_cHttpHeaderWriter_finalize(&hw);\r
- return NyLPC_TBool_FALSE;\r
- }\r
- NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-\r
- //Bodyの書込み\r
- NyLPC_cHttpBodyWriter_initialize(&bw,i_st);\r
- //チャンク転送設定\r
- NyLPC_cHttpBodyWriter_setChunked(&bw);\r
- NyLPC_cHttpBodyWriter_format(&bw,JSON_FORMAT,\r
- (NyLPC_TInt32)num_of_reqest,(NyLPC_TInt32)num_of_error,(NyLPC_TInt32)num_of_connect,\r
- NyLPC_assert_counter,NyLPC_abort_counter,NyLPC_debug_counter,dbg_getNumofUsedTx());\r
- //エラーチェック\r
- if(!NyLPC_cHttpBodyWriter_close(&bw)){\r
- NyLPC_cHttpBodyWriter_finalize(&hw);\r
- return NyLPC_TBool_FALSE;\r
- }\r
- NyLPC_cHttpBodyWriter_finalize(&hw);\r
- return NyLPC_THttpBasicHeader_isPersistent(i_rqh);\r
-}\r
-/**\r
- * ROMファイルのレスポンスライタ。\r
- * 戻り値はpersistentConnectionが有効かどうか。\r
- */\r
-static NyLPC_TBool writeFile(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,const struct NyLPC_TRomFileData* i_file)\r
-{\r
- NyLPC_TcHttpHeaderWriter_t hw;\r
- NyLPC_TcHttpBodyWriter_t bw;\r
- //ヘッダライタの生成\r
- if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- //ヘッダ書込み\r
- if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){\r
- NyLPC_cHttpHeaderWriter_setClose(&hw);\r
- }\r
- NyLPC_cHttpHeaderWriter_setContentLength(&hw,i_file->size);\r
- //ヘッダの基本情報出力\r
- NyLPC_cHttpHeaderWriter_writeHeader(&hw,200);\r
- //拡張メッセージヘッダの出力\r
- NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type",i_file->content_type);\r
-\r
- //ヘッダ書込み終わり。(最後だけチェック)\r
- if(!NyLPC_cHttpHeaderWriter_close(&hw)){\r
- NyLPC_cHttpHeaderWriter_finalize(&hw);\r
- return NyLPC_TBool_FALSE;\r
- }\r
- NyLPC_cHttpHeaderWriter_finalize(&hw);\r
-\r
- //Bodyの書込み\r
- NyLPC_cHttpBodyWriter_initialize(&bw,i_st);\r
- NyLPC_cHttpBodyWriter_write(&bw,i_file->data,i_file->size);\r
- //エラーチェック\r
- if(!NyLPC_cHttpBodyWriter_close(&bw)){\r
- NyLPC_cHttpBodyWriter_finalize(&hw);\r
- return NyLPC_TBool_FALSE;\r
- }\r
- NyLPC_cHttpBodyWriter_finalize(&hw);\r
- return NyLPC_THttpBasicHeader_isPersistent(i_rqh);\r
-}\r
-#endif\r