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
Child:
50:35e765380772
backup

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 48:00d211aac2ec 1 /*********************************************************************************
nyatla 48:00d211aac2ec 2 * PROJECT: MiMic
nyatla 48:00d211aac2ec 3 * --------------------------------------------------------------------------------
nyatla 48:00d211aac2ec 4 *
nyatla 48:00d211aac2ec 5 * This file is part of MiMic
nyatla 48:00d211aac2ec 6 * Copyright (C)2011 Ryo Iizuka
nyatla 48:00d211aac2ec 7 *
nyatla 48:00d211aac2ec 8 * MiMic is free software: you can redistribute it and/or modify
nyatla 48:00d211aac2ec 9 * it under the terms of the GNU Lesser General Public License as published
nyatla 48:00d211aac2ec 10 * by the Free Software Foundation, either version 3 of the License, or
nyatla 48:00d211aac2ec 11 * (at your option) any later version.
nyatla 48:00d211aac2ec 12 *
nyatla 48:00d211aac2ec 13 * This program is distributed in the hope that it will be useful,
nyatla 48:00d211aac2ec 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nyatla 48:00d211aac2ec 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nyatla 48:00d211aac2ec 16 * GNU General Public License for more details.
nyatla 48:00d211aac2ec 17 *
nyatla 48:00d211aac2ec 18 * You should have received a copy of the GNU Lesser General Public License
nyatla 48:00d211aac2ec 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
nyatla 48:00d211aac2ec 20 *
nyatla 48:00d211aac2ec 21 * For further information please contact.
nyatla 48:00d211aac2ec 22 * http://nyatla.jp/
nyatla 48:00d211aac2ec 23 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
nyatla 48:00d211aac2ec 24 *
nyatla 48:00d211aac2ec 25 *********************************************************************************/
nyatla 48:00d211aac2ec 26 #include "NyLPC_cModUPnPDevice.h"
nyatla 48:00d211aac2ec 27 #include "../NyLPC_cHttpdConnection_protected.h"
nyatla 48:00d211aac2ec 28 #include "NyLPC_net.h"
nyatla 48:00d211aac2ec 29 #include "NyLPC_stdlib.h"
nyatla 48:00d211aac2ec 30 #include "NyLPC_http.h"
nyatla 48:00d211aac2ec 31 #include <ctype.h>
nyatla 48:00d211aac2ec 32
nyatla 48:00d211aac2ec 33
nyatla 48:00d211aac2ec 34
nyatla 48:00d211aac2ec 35 #define SIZE_OF_STRBUF 16
nyatla 48:00d211aac2ec 36 struct TUPnPDeviceHeader
nyatla 48:00d211aac2ec 37 {
nyatla 48:00d211aac2ec 38 struct NyLPC_THttpBasicHeader super;
nyatla 48:00d211aac2ec 39 //解析用
nyatla 48:00d211aac2ec 40 NyLPC_TUInt8 _content_id;
nyatla 48:00d211aac2ec 41 NyLPC_TUInt8 _astate;
nyatla 48:00d211aac2ec 42 NyLPC_TInt16 _prefix_len;
nyatla 48:00d211aac2ec 43 NyLPC_TcStr_t _tstr;
nyatla 48:00d211aac2ec 44 NyLPC_TChar _tstr_buf[SIZE_OF_STRBUF];
nyatla 48:00d211aac2ec 45 /** 文字列のパーサ*/
nyatla 48:00d211aac2ec 46 union{
nyatla 48:00d211aac2ec 47 NyLPC_TInt16 service_idx;
nyatla 48:00d211aac2ec 48 }content;
nyatla 48:00d211aac2ec 49 };
nyatla 48:00d211aac2ec 50
nyatla 48:00d211aac2ec 51 #define ST_PARSE_PATH 1
nyatla 48:00d211aac2ec 52 #define ST_PARSE_QUERY_NAME 2
nyatla 48:00d211aac2ec 53
nyatla 48:00d211aac2ec 54 /**
nyatla 48:00d211aac2ec 55 * コンテンツID定義(コンテンツ名に対応)
nyatla 48:00d211aac2ec 56 */
nyatla 48:00d211aac2ec 57 #define CONTENT_ID_UNKNOWN 1
nyatla 48:00d211aac2ec 58 #define CONTENT_ID_DEVICE_XML 2
nyatla 48:00d211aac2ec 59 #define CONTENT_ID_CONTROL 3
nyatla 48:00d211aac2ec 60 #define CONTENT_ID_EVENT 4
nyatla 48:00d211aac2ec 61
nyatla 48:00d211aac2ec 62 #define QNAME_ID_UNKNOWN 1
nyatla 48:00d211aac2ec 63 #define QNAME_IDX 2
nyatla 48:00d211aac2ec 64
nyatla 48:00d211aac2ec 65 #define CONTENT_STR_DEVICE_XML "d.xml"
nyatla 48:00d211aac2ec 66 #define CONTENT_STR_CONTROL_PATH "control"
nyatla 48:00d211aac2ec 67 #define CONTENT_STR_EVENT_PATH "event"
nyatla 48:00d211aac2ec 68 #define CONTENT_STR_XML_MIME_TYPE "text/xml"
nyatla 48:00d211aac2ec 69
nyatla 48:00d211aac2ec 70
nyatla 48:00d211aac2ec 71
nyatla 48:00d211aac2ec 72
nyatla 48:00d211aac2ec 73
nyatla 48:00d211aac2ec 74 static void writeDeviceNode(const struct NyLPC_TUPnPDevDescDevice* i_dev,NyLPC_TcHttpdConnection_t* i_connection,NyLPC_TUInt16* sidx)
nyatla 48:00d211aac2ec 75 {
nyatla 48:00d211aac2ec 76 //Required
nyatla 48:00d211aac2ec 77 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 78 "<device>"
nyatla 48:00d211aac2ec 79 "<deviceType>%s</deviceType>"
nyatla 48:00d211aac2ec 80 "<friendlyName>%s</friendlyName>"
nyatla 48:00d211aac2ec 81 "<manufacturer>%s</manufacturer>",
nyatla 48:00d211aac2ec 82 i_dev->device_type,
nyatla 48:00d211aac2ec 83 i_dev->frendly_name,
nyatla 48:00d211aac2ec 84 i_dev->manufacturer);
nyatla 48:00d211aac2ec 85 NyLPC_TInt16 i;
nyatla 48:00d211aac2ec 86 //Optional
nyatla 48:00d211aac2ec 87 if(i_dev->manufacturer_url!=NULL){
nyatla 48:00d211aac2ec 88 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 89 "<manufacturerURL>%s</manufacturerURL>",
nyatla 48:00d211aac2ec 90 i_dev->manufacturer_url);
nyatla 48:00d211aac2ec 91 }
nyatla 48:00d211aac2ec 92 //Recommended
nyatla 48:00d211aac2ec 93 if(i_dev->model_descriprion!=NULL){
nyatla 48:00d211aac2ec 94 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 95 "<modelDescription>%s</modelDescription>",
nyatla 48:00d211aac2ec 96 i_dev->model_descriprion);
nyatla 48:00d211aac2ec 97 }else{
nyatla 48:00d211aac2ec 98 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 99 "<modelDescription/>"); //Recommended
nyatla 48:00d211aac2ec 100 }
nyatla 48:00d211aac2ec 101 //Required
nyatla 48:00d211aac2ec 102 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 103 "<modelName>%s</modelName>",
nyatla 48:00d211aac2ec 104 i_dev->model_name);
nyatla 48:00d211aac2ec 105 //Recommended
nyatla 48:00d211aac2ec 106 if(i_dev->model_number!=NULL){
nyatla 48:00d211aac2ec 107 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 108 "<modelNumber>%s</modelNumber>",
nyatla 48:00d211aac2ec 109 i_dev->model_number);
nyatla 48:00d211aac2ec 110 }else{
nyatla 48:00d211aac2ec 111 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 112 "<modelNumber/>");
nyatla 48:00d211aac2ec 113 }
nyatla 48:00d211aac2ec 114 //Optional
nyatla 48:00d211aac2ec 115 if(i_dev->model_url!=NULL){
nyatla 48:00d211aac2ec 116 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 117 "<modelURL>%s</modelURL>",
nyatla 48:00d211aac2ec 118 i_dev->model_url);
nyatla 48:00d211aac2ec 119 }
nyatla 48:00d211aac2ec 120 //Recommended
nyatla 48:00d211aac2ec 121 if(i_dev->serial_number!=NULL){
nyatla 48:00d211aac2ec 122 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 123 "<serialNumber>%s</serialNumber>",
nyatla 48:00d211aac2ec 124 i_dev->serial_number);
nyatla 48:00d211aac2ec 125 }else{
nyatla 48:00d211aac2ec 126 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 127 "<serialNumber/>");
nyatla 48:00d211aac2ec 128 }
nyatla 48:00d211aac2ec 129 //Required
nyatla 48:00d211aac2ec 130 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 131 "<UDN>%s</UDN>",
nyatla 48:00d211aac2ec 132 i_dev->udn);
nyatla 48:00d211aac2ec 133 //Oprional
nyatla 48:00d211aac2ec 134 if(i_dev->upc!=NULL){
nyatla 48:00d211aac2ec 135 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 136 "<UPC>%s</UPC>",
nyatla 48:00d211aac2ec 137 i_dev->upc);
nyatla 48:00d211aac2ec 138 }
nyatla 48:00d211aac2ec 139 if(i_dev->number_of_icon>0){
nyatla 48:00d211aac2ec 140 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 141 "<iconList>");
nyatla 48:00d211aac2ec 142 for(i=0;i<i_dev->number_of_icon;i++){
nyatla 48:00d211aac2ec 143 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 144 "<icon>"
nyatla 48:00d211aac2ec 145 "<mimetype>%s</mimetype>"
nyatla 48:00d211aac2ec 146 "<width>%d</width>"
nyatla 48:00d211aac2ec 147 "<height>%d</height>"
nyatla 48:00d211aac2ec 148 "<depth>%d</depth>"
nyatla 48:00d211aac2ec 149 "<url>%d</url>"
nyatla 48:00d211aac2ec 150 "</icon>",
nyatla 48:00d211aac2ec 151 i_dev->icons[i].mimetype,
nyatla 48:00d211aac2ec 152 i_dev->icons[i].width,
nyatla 48:00d211aac2ec 153 i_dev->icons[i].height,
nyatla 48:00d211aac2ec 154 i_dev->icons[i].depth,
nyatla 48:00d211aac2ec 155 i_dev->icons[i].url);
nyatla 48:00d211aac2ec 156 }
nyatla 48:00d211aac2ec 157 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 158 "</iconList>");
nyatla 48:00d211aac2ec 159 }else{
nyatla 48:00d211aac2ec 160 // NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 161 // "<iconList/>");
nyatla 48:00d211aac2ec 162 }
nyatla 48:00d211aac2ec 163 //Optional
nyatla 48:00d211aac2ec 164 if(i_dev->number_of_service>0){
nyatla 48:00d211aac2ec 165 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 166 "<serviceList>");
nyatla 48:00d211aac2ec 167 for(i=0;i<i_dev->number_of_service;i++){
nyatla 48:00d211aac2ec 168 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 169 "<service>"
nyatla 48:00d211aac2ec 170 "<serviceType>%s</serviceType>"
nyatla 48:00d211aac2ec 171 "<serviceId>%s</serviceId>"
nyatla 48:00d211aac2ec 172 "<SCPDURL>%s</SCPDURL>"
nyatla 48:00d211aac2ec 173 "<controlURL>./control/%d</controlURL>"
nyatla 48:00d211aac2ec 174 "<eventSubURL>./event/%d</eventSubURL>"
nyatla 48:00d211aac2ec 175 "</service>",
nyatla 48:00d211aac2ec 176 i_dev->services[i].scpd_url,
nyatla 48:00d211aac2ec 177 i_dev->services[i].service_type,
nyatla 48:00d211aac2ec 178 i_dev->services[i].service_id,
nyatla 48:00d211aac2ec 179 (*sidx)+i,
nyatla 48:00d211aac2ec 180 (*sidx)+i);
nyatla 48:00d211aac2ec 181 }
nyatla 48:00d211aac2ec 182 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 183 "</serviceList>");
nyatla 48:00d211aac2ec 184 }
nyatla 48:00d211aac2ec 185 if(i_dev->number_of_devices>0){
nyatla 48:00d211aac2ec 186 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 187 "<deviceList>");
nyatla 48:00d211aac2ec 188 for(i=0;i<i_dev->number_of_devices;i++){
nyatla 48:00d211aac2ec 189 (*sidx)=(*sidx)+0x10;
nyatla 48:00d211aac2ec 190 writeDeviceNode(i_dev->devices[i],i_connection,sidx);
nyatla 48:00d211aac2ec 191 }
nyatla 48:00d211aac2ec 192 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 193 "</deviceList>");
nyatla 48:00d211aac2ec 194 }
nyatla 48:00d211aac2ec 195 if(i_dev->presentation_url!=NULL){
nyatla 48:00d211aac2ec 196 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 197 "<presentationURL>%s</presentationURL></device>",
nyatla 48:00d211aac2ec 198 i_dev->presentation_url);
nyatla 48:00d211aac2ec 199 }
nyatla 48:00d211aac2ec 200 else{
nyatla 48:00d211aac2ec 201 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 202 "</device>");
nyatla 48:00d211aac2ec 203 }
nyatla 48:00d211aac2ec 204 }
nyatla 48:00d211aac2ec 205 NyLPC_TBool writeDeviceDescription(const struct NyLPC_TUPnPDevDescDevice* i_dev,NyLPC_TcHttpdConnection_t* i_connection)
nyatla 48:00d211aac2ec 206 {
nyatla 48:00d211aac2ec 207 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 48:00d211aac2ec 208 "<?xml version=\"1.0\"?>"
nyatla 48:00d211aac2ec 209 "<root xmlns=\"urn:schemas-upnp-org:device-1-0\">"
nyatla 48:00d211aac2ec 210 "<specVersion><major>1</major><minor>0</minor></specVersion>");
nyatla 48:00d211aac2ec 211 writeDeviceNode(i_dev,i_connection,0);
nyatla 48:00d211aac2ec 212 return NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"</root>");
nyatla 48:00d211aac2ec 213 }
nyatla 48:00d211aac2ec 214
nyatla 48:00d211aac2ec 215
nyatla 48:00d211aac2ec 216
nyatla 48:00d211aac2ec 217
nyatla 48:00d211aac2ec 218
nyatla 48:00d211aac2ec 219 /**
nyatla 48:00d211aac2ec 220 * control,eventのServiceIndex部分をパースする。
nyatla 48:00d211aac2ec 221 * [:str:]/[:HEX8:][:HEX8:]
nyatla 48:00d211aac2ec 222 */
nyatla 48:00d211aac2ec 223 static NyLPC_TInt16 parseSidx(const NyLPC_TChar* i_str)
nyatla 48:00d211aac2ec 224 {
nyatla 48:00d211aac2ec 225 //先頭は/であること
nyatla 48:00d211aac2ec 226 if(*i_str!='/'){
nyatla 48:00d211aac2ec 227 return -1;
nyatla 48:00d211aac2ec 228 }
nyatla 48:00d211aac2ec 229 //2桁の16進数であること
nyatla 48:00d211aac2ec 230 if(!isxdigit(*(i_str+1)) || !isxdigit(*(i_str+2))){
nyatla 48:00d211aac2ec 231 return -1;
nyatla 48:00d211aac2ec 232 }
nyatla 48:00d211aac2ec 233 //サービスID化
nyatla 48:00d211aac2ec 234 return NyLPC_ctox(*(i_str+1))<<8 | NyLPC_ctox(*(i_str+2));
nyatla 48:00d211aac2ec 235 }
nyatla 48:00d211aac2ec 236
nyatla 48:00d211aac2ec 237
nyatla 48:00d211aac2ec 238 static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 48:00d211aac2ec 239 {
nyatla 48:00d211aac2ec 240
nyatla 48:00d211aac2ec 241 struct TUPnPDeviceHeader* out=(struct TUPnPDeviceHeader*)o_out;
nyatla 48:00d211aac2ec 242 //読み飛ばし
nyatla 48:00d211aac2ec 243 if(out->_prefix_len<0){
nyatla 48:00d211aac2ec 244 out->_prefix_len++;
nyatla 48:00d211aac2ec 245 return NyLPC_TBool_TRUE;//読み飛ばし
nyatla 48:00d211aac2ec 246 }
nyatla 48:00d211aac2ec 247 if(out->_astate==ST_PARSE_PATH){
nyatla 48:00d211aac2ec 248 if(i_c!='\0' && i_c!='?'){
nyatla 48:00d211aac2ec 249 if(!NyLPC_cStr_put(&(out->_tstr),i_c)){
nyatla 48:00d211aac2ec 250 NyLPC_OnErrorGoto(ERROR);
nyatla 48:00d211aac2ec 251 }
nyatla 48:00d211aac2ec 252 return NyLPC_TBool_TRUE;
nyatla 48:00d211aac2ec 253 }
nyatla 48:00d211aac2ec 254 if(strcmp(NyLPC_cStr_str(&(out->_tstr)),CONTENT_STR_DEVICE_XML)==0){
nyatla 48:00d211aac2ec 255 out->_content_id=CONTENT_ID_DEVICE_XML;
nyatla 48:00d211aac2ec 256 }else if(strncmp(CONTENT_STR_CONTROL_PATH,NyLPC_cStr_str(&(out->_tstr)),7)==0){
nyatla 48:00d211aac2ec 257 out->_content_id=CONTENT_ID_CONTROL;
nyatla 48:00d211aac2ec 258 parseSidx(NyLPC_cStr_str(&(out->_tstr))+7);
nyatla 48:00d211aac2ec 259 }else if(strncmp(CONTENT_STR_EVENT_PATH,NyLPC_cStr_str(&(out->_tstr)),5)==0){
nyatla 48:00d211aac2ec 260 out->_content_id=CONTENT_ID_EVENT;
nyatla 48:00d211aac2ec 261 parseSidx(NyLPC_cStr_str(&(out->_tstr))+5);
nyatla 48:00d211aac2ec 262 }else{
nyatla 48:00d211aac2ec 263 NyLPC_OnErrorGoto(ERROR);
nyatla 48:00d211aac2ec 264 }
nyatla 48:00d211aac2ec 265 NyLPC_cStr_clear(&(out->_tstr));
nyatla 48:00d211aac2ec 266 out->_astate=ST_PARSE_QUERY_NAME;//クエリ名解析へ
nyatla 48:00d211aac2ec 267 return NyLPC_TBool_TRUE;
nyatla 48:00d211aac2ec 268 }
nyatla 48:00d211aac2ec 269 return NyLPC_TBool_TRUE;
nyatla 48:00d211aac2ec 270 ERROR:
nyatla 48:00d211aac2ec 271 return NyLPC_TBool_FALSE;
nyatla 48:00d211aac2ec 272 }
nyatla 48:00d211aac2ec 273 /**
nyatla 48:00d211aac2ec 274 * デフォルトハンドラ
nyatla 48:00d211aac2ec 275 */
nyatla 48:00d211aac2ec 276 static const struct NyLPC_TcHttpBasicHeaderParser_Handler handler=
nyatla 48:00d211aac2ec 277 {
nyatla 48:00d211aac2ec 278 NULL,
nyatla 48:00d211aac2ec 279 urlHandler
nyatla 48:00d211aac2ec 280 };
nyatla 48:00d211aac2ec 281
nyatla 48:00d211aac2ec 282
nyatla 48:00d211aac2ec 283
nyatla 48:00d211aac2ec 284
nyatla 48:00d211aac2ec 285
nyatla 48:00d211aac2ec 286
nyatla 48:00d211aac2ec 287 /**
nyatla 48:00d211aac2ec 288 * コンストラクタ。
nyatla 48:00d211aac2ec 289 */
nyatla 48:00d211aac2ec 290 void NyLPC_cModUPnPDevice_initialize(NyLPC_TcModUPnPDevice_t* i_inst,const NyLPC_TcUPnP_t* i_ref_upnp)
nyatla 48:00d211aac2ec 291 {
nyatla 48:00d211aac2ec 292 NyLPC_cModRomFiles_initialize(&i_inst->super,i_ref_upnp->_ref_root_path,NULL,0);
nyatla 48:00d211aac2ec 293 i_inst->_ref_upnp=i_ref_upnp;
nyatla 48:00d211aac2ec 294 }
nyatla 48:00d211aac2ec 295 void NyLPC_cModUPnPDevice_finalize(NyLPC_TcModUPnPDevice_t* i_inst)
nyatla 48:00d211aac2ec 296 {
nyatla 48:00d211aac2ec 297 NyLPC_cModRomFiles_finalize(&i_inst->super);
nyatla 48:00d211aac2ec 298 }
nyatla 48:00d211aac2ec 299 /**
nyatla 48:00d211aac2ec 300 * モジュールがコネクションをハンドリングできるかを返します。
nyatla 48:00d211aac2ec 301 */
nyatla 48:00d211aac2ec 302 NyLPC_TBool NyLPC_cModUPnPDevice_canHandle(NyLPC_TcModUPnPDevice_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection)
nyatla 48:00d211aac2ec 303 {
nyatla 48:00d211aac2ec 304 return NyLPC_cModRomFiles_canHandle(&i_inst->super,i_connection);
nyatla 48:00d211aac2ec 305 }
nyatla 48:00d211aac2ec 306
nyatla 48:00d211aac2ec 307 /**
nyatla 48:00d211aac2ec 308 * モジュールを実行します。
nyatla 48:00d211aac2ec 309 */
nyatla 48:00d211aac2ec 310 NyLPC_TBool NyLPC_cModUPnPDevice_execute(NyLPC_TcModUPnPDevice_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection)
nyatla 48:00d211aac2ec 311 {
nyatla 48:00d211aac2ec 312 NyLPC_TUInt8 method_type;
nyatla 48:00d211aac2ec 313 struct TUPnPDeviceHeader header;
nyatla 48:00d211aac2ec 314 NyLPC_TcHttpBasicHeaderParser_t parser;
nyatla 48:00d211aac2ec 315
nyatla 48:00d211aac2ec 316 //リクエストParse済へ遷移(この関数の後はModが責任を持ってリクエストを返却)
nyatla 48:00d211aac2ec 317 NyLPC_cHttpdConnection_setReqStatusParsed(i_connection);
nyatla 48:00d211aac2ec 318 NyLPC_cStr_initialize(&header._tstr,header._tstr_buf,SIZE_OF_STRBUF);
nyatla 48:00d211aac2ec 319
nyatla 48:00d211aac2ec 320 //URL解析の準備
nyatla 48:00d211aac2ec 321 header._prefix_len=-((NyLPC_TInt16)strlen(i_inst->super._ref_root_path)+2);
nyatla 48:00d211aac2ec 322 header._astate=ST_PARSE_PATH;
nyatla 48:00d211aac2ec 323
nyatla 48:00d211aac2ec 324 NyLPC_cHttpBasicHeaderParser_initialize(&parser,&handler);
nyatla 48:00d211aac2ec 325 NyLPC_cHttpBasicHeaderParser_parseInit(&parser,&(header.super));
nyatla 48:00d211aac2ec 326 //プリフェッチしたデータを流す
nyatla 48:00d211aac2ec 327 NyLPC_cHttpdConnection_pushPrefetchInfo(i_connection,&parser,&header.super);
nyatla 48:00d211aac2ec 328 //後続をストリームから取り込む
nyatla 48:00d211aac2ec 329 if(!NyLPC_cHttpBasicHeaderParser_parseStream(&parser,NyLPC_cHttpdConnection_refStream(i_connection),&(header.super))){
nyatla 48:00d211aac2ec 330 NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);
nyatla 48:00d211aac2ec 331 NyLPC_OnErrorGoto(Error2);
nyatla 48:00d211aac2ec 332 }
nyatla 48:00d211aac2ec 333 if(!NyLPC_cHttpBasicHeaderParser_parseFinish(&parser,&(header.super))){
nyatla 48:00d211aac2ec 334 NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);
nyatla 48:00d211aac2ec 335 NyLPC_OnErrorGoto(Error2);
nyatla 48:00d211aac2ec 336 }
nyatla 48:00d211aac2ec 337 //GETかHEADに制限(Descriptionの場合だけ)
nyatla 48:00d211aac2ec 338 method_type=NyLPC_cHttpdConnection_getMethod(i_connection);
nyatla 48:00d211aac2ec 339 if(method_type!=NyLPC_THttpMethodType_GET && method_type!=NyLPC_THttpMethodType_HEAD)
nyatla 48:00d211aac2ec 340 {
nyatla 48:00d211aac2ec 341 NyLPC_cHttpdUtils_sendErrorResponse(i_connection,405);
nyatla 48:00d211aac2ec 342 NyLPC_OnErrorGoto(Error2);
nyatla 48:00d211aac2ec 343 }
nyatla 48:00d211aac2ec 344 //Request::ConnectionがClose設定,又はHTTP1.1では無い場合,CLOSE
nyatla 48:00d211aac2ec 345 if(header.super.connection==NyLPC_THttpMessgeHeader_Connection_CLOSE || header.super.startline.req.version!=NyLPC_THttpVersion_11)
nyatla 48:00d211aac2ec 346 {
nyatla 48:00d211aac2ec 347 NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);
nyatla 48:00d211aac2ec 348 }
nyatla 48:00d211aac2ec 349 //CGIの実行
nyatla 48:00d211aac2ec 350 switch(header._content_id)
nyatla 48:00d211aac2ec 351 {
nyatla 48:00d211aac2ec 352 case CONTENT_ID_DEVICE_XML:
nyatla 48:00d211aac2ec 353 NyLPC_cHttpdConnection_sendResponseHeader(i_connection,200,CONTENT_STR_XML_MIME_TYPE,NULL);
nyatla 48:00d211aac2ec 354 writeDeviceDescription(i_inst->_ref_upnp->ref_root_device,i_connection);
nyatla 48:00d211aac2ec 355 //DeviceXML
nyatla 48:00d211aac2ec 356 break;
nyatla 48:00d211aac2ec 357 case CONTENT_ID_CONTROL:
nyatla 48:00d211aac2ec 358 //SoapHandler 未実装
nyatla 48:00d211aac2ec 359 case CONTENT_ID_EVENT:
nyatla 48:00d211aac2ec 360 //EventHandler 未実装
nyatla 48:00d211aac2ec 361 default:
nyatla 48:00d211aac2ec 362 NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);
nyatla 48:00d211aac2ec 363 NyLPC_OnErrorGoto(Error2);
nyatla 48:00d211aac2ec 364 }
nyatla 48:00d211aac2ec 365 NyLPC_cHttpBasicHeaderParser_finalize(&parser);
nyatla 48:00d211aac2ec 366 NyLPC_cStr_finalize(&header._tstr);
nyatla 48:00d211aac2ec 367 return NyLPC_TBool_TRUE;
nyatla 48:00d211aac2ec 368 Error2:
nyatla 48:00d211aac2ec 369 NyLPC_cHttpBasicHeaderParser_finalize(&parser);
nyatla 48:00d211aac2ec 370 NyLPC_cStr_finalize(&header._tstr);
nyatla 48:00d211aac2ec 371 return NyLPC_TBool_FALSE;
nyatla 48:00d211aac2ec 372 }
nyatla 48:00d211aac2ec 373