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 Nov 19 14:45:17 2014 +0000
Revision:
109:18f12ac01097
Child:
110:257739f9b31e
new MiMicIP API;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 109:18f12ac01097 1 /*********************************************************************************
nyatla 109:18f12ac01097 2 * PROJECT: MiMic
nyatla 109:18f12ac01097 3 * --------------------------------------------------------------------------------
nyatla 109:18f12ac01097 4 *
nyatla 109:18f12ac01097 5 * This file is part of MiMic
nyatla 109:18f12ac01097 6 * Copyright (C)2011 Ryo Iizuka
nyatla 109:18f12ac01097 7 *
nyatla 109:18f12ac01097 8 * MiMic is free software: you can redistribute it and/or modify
nyatla 109:18f12ac01097 9 * it under the terms of the GNU Lesser General Public License as published
nyatla 109:18f12ac01097 10 * by the Free Software Foundation, either version 3 of the License, or
nyatla 109:18f12ac01097 11 * (at your option) any later version.
nyatla 109:18f12ac01097 12 *
nyatla 109:18f12ac01097 13 * This program is distributed in the hope that it will be useful,
nyatla 109:18f12ac01097 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nyatla 109:18f12ac01097 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nyatla 109:18f12ac01097 16 * GNU General Public License for more details.
nyatla 109:18f12ac01097 17 *
nyatla 109:18f12ac01097 18 * You should have received a copy of the GNU Lesser General Public License
nyatla 109:18f12ac01097 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
nyatla 109:18f12ac01097 20 *
nyatla 109:18f12ac01097 21 * For further information please contact.
nyatla 109:18f12ac01097 22 * http://nyatla.jp/
nyatla 109:18f12ac01097 23 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
nyatla 109:18f12ac01097 24 *
nyatla 109:18f12ac01097 25 *********************************************************************************/
nyatla 109:18f12ac01097 26 #include "NyLPC_cMiMicIpTcpListener_protected.h"
nyatla 109:18f12ac01097 27 #include "NyLPC_cMiMicIpTcpSocket_protected.h"
nyatla 109:18f12ac01097 28 #include "NyLPC_cMiMicIpNetIf_protected.h"
nyatla 109:18f12ac01097 29 #include "../NyLPC_iTcpListener.h"
nyatla 109:18f12ac01097 30 #include "NyLPC_cIPv4.h"
nyatla 109:18f12ac01097 31 #include "NyLPC_stdlib.h"
nyatla 109:18f12ac01097 32
nyatla 109:18f12ac01097 33 /**
nyatla 109:18f12ac01097 34 * NyLPC_TTcpListenerListenQ
nyatla 109:18f12ac01097 35 */
nyatla 109:18f12ac01097 36
nyatla 109:18f12ac01097 37 void NyLPC_TTcpListenerListenQ_init(struct NyLPC_TTcpListenerListenQ* i_struct)
nyatla 109:18f12ac01097 38 {
nyatla 109:18f12ac01097 39 i_struct->wp=0;
nyatla 109:18f12ac01097 40 int i;
nyatla 109:18f12ac01097 41 for(i=NyLPC_TcMiMicIpTcpListener_NUMBER_OF_Q-1;i>=0;i--){
nyatla 109:18f12ac01097 42 i_struct->item[i].rport=0;
nyatla 109:18f12ac01097 43 }
nyatla 109:18f12ac01097 44 }
nyatla 109:18f12ac01097 45
nyatla 109:18f12ac01097 46 /**
nyatla 109:18f12ac01097 47 * ListenQへSYNパケットの情報を追加する。
nyatla 109:18f12ac01097 48 */
nyatla 109:18f12ac01097 49 void NyLPC_TTcpListenerListenQ_add(struct NyLPC_TTcpListenerListenQ* i_struct,const NyLPC_TcIPv4Payload_t* i_payload)
nyatla 109:18f12ac01097 50 {
nyatla 109:18f12ac01097 51 struct NyLPC_TTcpSocketSynParam* item=&i_struct->item[i_struct->wp];
nyatla 109:18f12ac01097 52 //未処理のものがあれば登録しない。
nyatla 109:18f12ac01097 53 if(item->rport!=0){
nyatla 109:18f12ac01097 54 return;
nyatla 109:18f12ac01097 55 }
nyatla 109:18f12ac01097 56
nyatla 109:18f12ac01097 57 //SYNリングバッファにセット
nyatla 109:18f12ac01097 58 item->rport = i_payload->payload.tcp->srcport;
nyatla 109:18f12ac01097 59 item->srcaddr=i_payload->header->srcipaddr;
nyatla 109:18f12ac01097 60 item->rcv_nxt32=NyLPC_ntohl(i_payload->payload.tcp->seqno32)+1;
nyatla 109:18f12ac01097 61 //MSSの設定
nyatla 109:18f12ac01097 62 if(!NyLPC_TTcpHeader_getTcpMmsOpt(i_payload->payload.tcp,&item->mss)){
nyatla 109:18f12ac01097 63 item->mss=0;
nyatla 109:18f12ac01097 64 }
nyatla 109:18f12ac01097 65 //書込み位置の進行
nyatla 109:18f12ac01097 66 i_struct->wp=(i_struct->wp+1)%NyLPC_TcMiMicIpTcpListener_NUMBER_OF_Q;
nyatla 109:18f12ac01097 67 }
nyatla 109:18f12ac01097 68
nyatla 109:18f12ac01097 69 /**
nyatla 109:18f12ac01097 70 * 最も古いSYNパケット情報のインデクスをキューから返す。
nyatla 109:18f12ac01097 71 * @return
nyatla 109:18f12ac01097 72 * 見つからない場合-1である。
nyatla 109:18f12ac01097 73 */
nyatla 109:18f12ac01097 74 int NyLPC_TTcpListenerListenQ_getLastIndex(struct NyLPC_TTcpListenerListenQ* i_struct)
nyatla 109:18f12ac01097 75 {
nyatla 109:18f12ac01097 76 int i,t;
nyatla 109:18f12ac01097 77 //古いものから順に返す
nyatla 109:18f12ac01097 78 for(i=1;i<=NyLPC_TcMiMicIpTcpListener_NUMBER_OF_Q;i++){
nyatla 109:18f12ac01097 79 t=(i_struct->wp+i)%NyLPC_TcMiMicIpTcpListener_NUMBER_OF_Q;
nyatla 109:18f12ac01097 80 //有効なデータ?
nyatla 109:18f12ac01097 81 if(i_struct->item[t].rport!=0){
nyatla 109:18f12ac01097 82 return t;
nyatla 109:18f12ac01097 83 }
nyatla 109:18f12ac01097 84 }
nyatla 109:18f12ac01097 85 return -1;
nyatla 109:18f12ac01097 86 }
nyatla 109:18f12ac01097 87
nyatla 109:18f12ac01097 88 /**
nyatla 109:18f12ac01097 89 * ListenQのN番目を削除する。
nyatla 109:18f12ac01097 90 */
nyatla 109:18f12ac01097 91 void NyLPC_TTcpListenerListenQ_remove(struct NyLPC_TTcpListenerListenQ* i_struct,int i_idx)
nyatla 109:18f12ac01097 92 {
nyatla 109:18f12ac01097 93 i_struct->item[i_idx].rport=0;
nyatla 109:18f12ac01097 94 return;
nyatla 109:18f12ac01097 95 }
nyatla 109:18f12ac01097 96
nyatla 109:18f12ac01097 97
nyatla 109:18f12ac01097 98
nyatla 109:18f12ac01097 99
nyatla 109:18f12ac01097 100
nyatla 109:18f12ac01097 101
nyatla 109:18f12ac01097 102 //#define lockResource(i_inst) NyLPC_cMutex_lock(((i_inst)->_mutex))
nyatla 109:18f12ac01097 103 //#define unlockResource(i_inst) NyLPC_cMutex_unlock(((i_inst)->_mutex))
nyatla 109:18f12ac01097 104 #define lockResource(i_inst) NyLPC_cMutex_lock(NyLPC_cIPv4_getListenerMutex(((i_inst)->_super._parent_ipv4)))
nyatla 109:18f12ac01097 105 #define unlockResource(i_inst) NyLPC_cMutex_unlock(NyLPC_cIPv4_getListenerMutex(((i_inst)->_super._parent_ipv4)))
nyatla 109:18f12ac01097 106
nyatla 109:18f12ac01097 107
nyatla 109:18f12ac01097 108 static NyLPC_TBool listen(NyLPC_TiTcpListener_t* i_inst,NyLPC_TiTcpSocket_t* i_sock,NyLPC_TUInt32 i_wait_msec);
nyatla 109:18f12ac01097 109 static void finaize(NyLPC_TiTcpListener_t* i_inst);
nyatla 109:18f12ac01097 110
nyatla 109:18f12ac01097 111 const static struct NyLPC_TiTcpListener_Interface interface=
nyatla 109:18f12ac01097 112 {
nyatla 109:18f12ac01097 113 listen,
nyatla 109:18f12ac01097 114 finaize
nyatla 109:18f12ac01097 115 };
nyatla 109:18f12ac01097 116
nyatla 109:18f12ac01097 117 /**
nyatla 109:18f12ac01097 118 * uipサービスが稼働中にのみ機能します。
nyatla 109:18f12ac01097 119 */
nyatla 109:18f12ac01097 120 NyLPC_TBool NyLPC_cMiMicIpTcpListener_initialize(NyLPC_TcMiMicIpTcpListener_t* i_inst,NyLPC_TUInt16 i_port)
nyatla 109:18f12ac01097 121 {
nyatla 109:18f12ac01097 122 NyLPC_TcMiMicIpNetIf_t* srv=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 123 i_inst->_super._super.tcp_listener._interface=&interface;
nyatla 109:18f12ac01097 124 NyLPC_cMiMicIpBaseSocket_initialize(&(i_inst->_super),NyLPC_TcMiMicIpBaseSocket_TYPEID_TCP_LISTENER);
nyatla 109:18f12ac01097 125 NyLPC_TTcpListenerListenQ_init(&i_inst->_listen_q);
nyatla 109:18f12ac01097 126 //uipサービスは初期化済であること。
nyatla 109:18f12ac01097 127 NyLPC_Assert(NyLPC_cMiMicIpNetIf_isInitService());
nyatla 109:18f12ac01097 128 //初期化
nyatla 109:18f12ac01097 129 // // NyLPC_cMutex_initialize(&(i_inst->_mutex));
nyatla 109:18f12ac01097 130 // i_inst->_mutex=NyLPC_cIPv4_getListenerMutex(&srv->_tcpv4);// NyLPC_cMutex_initialize(&(i_inst->_mutex));
nyatla 109:18f12ac01097 131 i_inst->_port=NyLPC_htons(i_port);
nyatla 109:18f12ac01097 132 //管理リストへ登録。
nyatla 109:18f12ac01097 133 return NyLPC_cIPv4_addSocket(&(srv->_tcpv4),&(i_inst->_super));
nyatla 109:18f12ac01097 134 }
nyatla 109:18f12ac01097 135
nyatla 109:18f12ac01097 136
nyatla 109:18f12ac01097 137
nyatla 109:18f12ac01097 138 static void finaize(NyLPC_TiTcpListener_t* i_inst)
nyatla 109:18f12ac01097 139 {
nyatla 109:18f12ac01097 140 NyLPC_TcMiMicIpNetIf_t* srv=_NyLPC_TcMiMicIpNetIf_inst;
nyatla 109:18f12ac01097 141 NyLPC_Assert(NyLPC_cMiMicIpNetIf_isInitService());
nyatla 109:18f12ac01097 142 //uipサービスは初期化済であること。
nyatla 109:18f12ac01097 143 if(!NyLPC_cIPv4_removeSocket(&(srv->_tcpv4),&(((NyLPC_TcMiMicIpTcpListener_t*)i_inst)->_super))){
nyatla 109:18f12ac01097 144 //削除失敗、それは死を意味する。
nyatla 109:18f12ac01097 145 NyLPC_Abort();
nyatla 109:18f12ac01097 146 }
nyatla 109:18f12ac01097 147 NyLPC_cMiMicIpBaseSocket_finalize(&(((NyLPC_TcMiMicIpTcpListener_t*)i_inst)->_super));
nyatla 109:18f12ac01097 148 NyLPC_cMiMicIpNetIf_releaseTcpListenerMemory((NyLPC_TcMiMicIpTcpListener_t*)i_inst);
nyatla 109:18f12ac01097 149 return;
nyatla 109:18f12ac01097 150 }
nyatla 109:18f12ac01097 151
nyatla 109:18f12ac01097 152
nyatla 109:18f12ac01097 153 static NyLPC_TBool listen(NyLPC_TiTcpListener_t* i_inst,NyLPC_TiTcpSocket_t* i_sock,NyLPC_TUInt32 i_wait_msec)
nyatla 109:18f12ac01097 154 {
nyatla 109:18f12ac01097 155 int qi;
nyatla 109:18f12ac01097 156 NyLPC_TcMiMicIpTcpListener_t* inst=(NyLPC_TcMiMicIpTcpListener_t*)i_inst;
nyatla 109:18f12ac01097 157 NyLPC_TcStopwatch_t sw;
nyatla 109:18f12ac01097 158 NyLPC_TBool ret=NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 159 //サービスは稼働中であること。
nyatla 109:18f12ac01097 160 NyLPC_Assert(NyLPC_cMiMicIpNetIf_isRun());
nyatla 109:18f12ac01097 161
nyatla 109:18f12ac01097 162 //入力ソケットはCLOSEDであること。
nyatla 109:18f12ac01097 163 if(((NyLPC_TcMiMicIpTcpSocket_t*)i_sock)->tcpstateflags!=UIP_CLOSED){
nyatla 109:18f12ac01097 164 return NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 165 }
nyatla 109:18f12ac01097 166
nyatla 109:18f12ac01097 167 //ストップウォッチを起動
nyatla 109:18f12ac01097 168 NyLPC_cStopwatch_initialize(&sw);
nyatla 109:18f12ac01097 169 NyLPC_cStopwatch_setNow(&sw);
nyatla 109:18f12ac01097 170
nyatla 109:18f12ac01097 171
nyatla 109:18f12ac01097 172 //Listenerのリソースロック
nyatla 109:18f12ac01097 173 lockResource(inst);
nyatla 109:18f12ac01097 174
nyatla 109:18f12ac01097 175 while(NyLPC_cStopwatch_elapseInMsec(&sw)<i_wait_msec){
nyatla 109:18f12ac01097 176 qi=NyLPC_TTcpListenerListenQ_getLastIndex(&inst->_listen_q);
nyatla 109:18f12ac01097 177 if(qi>=0){
nyatla 109:18f12ac01097 178 //SYN処理要求がある
nyatla 109:18f12ac01097 179 if(!NyLPC_cMiMicIpTcpSocket_listenSyn(((NyLPC_TcMiMicIpTcpSocket_t*)i_sock),&inst->_listen_q.item[qi],inst->_port)){
nyatla 109:18f12ac01097 180 ret=NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 181 }else{
nyatla 109:18f12ac01097 182 //成功
nyatla 109:18f12ac01097 183 ret=NyLPC_TBool_TRUE;
nyatla 109:18f12ac01097 184 }
nyatla 109:18f12ac01097 185 //処理したSYNの削除
nyatla 109:18f12ac01097 186 NyLPC_TTcpListenerListenQ_remove(&inst->_listen_q,qi);
nyatla 109:18f12ac01097 187 break;
nyatla 109:18f12ac01097 188 }else{
nyatla 109:18f12ac01097 189 //SYN処理要求は無い(しばらくまつ)
nyatla 109:18f12ac01097 190 unlockResource(inst);
nyatla 109:18f12ac01097 191 NyLPC_cThread_yield();
nyatla 109:18f12ac01097 192 lockResource(inst);
nyatla 109:18f12ac01097 193 }
nyatla 109:18f12ac01097 194 }
nyatla 109:18f12ac01097 195 //タイムアウト
nyatla 109:18f12ac01097 196 unlockResource(inst);
nyatla 109:18f12ac01097 197 NyLPC_cStopwatch_finalize(&sw);
nyatla 109:18f12ac01097 198 return ret;
nyatla 109:18f12ac01097 199 }
nyatla 109:18f12ac01097 200
nyatla 109:18f12ac01097 201 /**
nyatla 109:18f12ac01097 202 * この関数は、Uip受信タスクから実行します。
nyatla 109:18f12ac01097 203 */
nyatla 109:18f12ac01097 204 NyLPC_TBool NyLPC_cMiMicIpTcpListener_synPacket(NyLPC_TcMiMicIpTcpListener_t* i_inst,const NyLPC_TcIPv4Payload_t* i_payload)
nyatla 109:18f12ac01097 205 {
nyatla 109:18f12ac01097 206 //パケットチェック。SYN設定されてる?
nyatla 109:18f12ac01097 207 if(!(i_payload->payload.tcp->flags & TCP_SYN)){
nyatla 109:18f12ac01097 208 //SYNない
nyatla 109:18f12ac01097 209 return NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 210 }
nyatla 109:18f12ac01097 211 //peer port==0は受け取らない。
nyatla 109:18f12ac01097 212 if(i_payload->payload.tcp->srcport==0){
nyatla 109:18f12ac01097 213 return NyLPC_TBool_FALSE;
nyatla 109:18f12ac01097 214 }
nyatla 109:18f12ac01097 215 //Listenerのリソースロック
nyatla 109:18f12ac01097 216 lockResource(i_inst);
nyatla 109:18f12ac01097 217 //ListenQへ追加
nyatla 109:18f12ac01097 218 NyLPC_TTcpListenerListenQ_add(&(i_inst->_listen_q),i_payload);
nyatla 109:18f12ac01097 219 //Listenerのリソースアンロック
nyatla 109:18f12ac01097 220 unlockResource(i_inst);
nyatla 109:18f12ac01097 221 return NyLPC_TBool_TRUE;
nyatla 109:18f12ac01097 222 }
nyatla 109:18f12ac01097 223
nyatla 109:18f12ac01097 224
nyatla 109:18f12ac01097 225
nyatla 109:18f12ac01097 226
nyatla 109:18f12ac01097 227