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
Parent:
50:35e765380772
new MiMicIP API;

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