05092024

Last update2016/05/28 14:38

Back 現在地: Home パートナー segger-tools embOS / IP Webサーバ

embOS / IP Webサーバ

embOS / IPのWebサーバ

embOS / IP WebサーバはスタックにHTTPプロトコルを追加するオプションの拡張です。それは、小さなメモリフットプリントとパフォーマンスの最大を兼ね備えています。Webサーバは、組み込みシステムが動的に生成されたコンテンツでWebページを提示することができます。複数の接続、認証、フォームや低RAMの使用量:一般的には、組込みシステムに必要なすべての機能が付属しています。RAMの使用量は、スマートバッファ処理によって最小限に抑えられている。

Webサーバは、コメント(RFC)の次のリクエストの関連する部分を実装しています。

RFC 説明
[RFC 1945] HTTP -ハイパーテキスト転送プロトコル- HTTP/1.0
のダイレクトリンク:http://tools.ietf.org/html/rfc1945
[RFC 2616] HTTP -ハイパーテキスト転送プロトコル- HTTP/1.1
のダイレクトリンク:http://tools.ietf.org/html/rfc2616

 

機能リスト

  • 低メモリフットプリント。
  • 動的なWebページ(サーバーサイドインクルード)。
  • 認証がサポートされています。
  • フォーム:POSTおよびサポートを受けることができます。
  • 複数の接続はサポートされています。
  • CへのコンバータHTMLが含まれています。
  • R / Oファイルシステムが含まれています。
  • ファイルシステムに依存しない:任意のファイルシステムを使用することができます。
  • TCP / IPスタックの独立:ソケットを持つ任意のスタックを使用することができます。
  • 認証、様々な形式のデモでは、動的なページが含まれています。
  • Microsoft Visual Studio用のPC上で実行可能ファイルのプロジェクトが含まれています。

    要件

    TCP / IPスタック

    embOS / IP Webサーバは、TCP / IPスタックが必要です。それはembOS / IP用に最適化されていますが、任意のRFC準拠のTCP / IPスタックを使用することができます。出荷は、標準のWinsock APIとembOS / IPのソケットAPIを使用して実装を使用するWin32のシミュレーションが含まれています。

    タスキング、マルチ

    Webサーバは別のスレッドとして実行する必要があります。そのため、マルチタスクシステムはembOS / IPのWebサーバを使用するために必要です。

    HTTPの背景

    HTTPはもともとハイパーテキストのページを経由して情報を転送するために設計された通信プロトコルです。HTTPの開発は、IETF(インターネットエンジニアリングタスクフォース)とW3C(World Wide Webコンソーシアム)によって調整されます。現在のプロトコルバージョンは1.1です。

    HTTP通信の基礎

    HTTPは、チャレンジと応答プロトコルです。クライアントは、WebサーバへのTCP接続を開始し、HTTP要求を送信します。HTTPリクエストは、メソッドトークンで開始されます。[RFC 2616]は8メソッドのトークンを定義します。メソッドトークンは要求されたリソース上で実行されるメソッドを示します。embOS / IPのWebサーバは通常、組み込みWebサーバが必要とするすべてのメソッドをサポートしています。

    HTTPメソッド 説明
    GET、 GETメソッドはRequest - URIによって識別されているものについては取得することを意味します。
    HEAD HEADメソッドは、Request - URIによって識別されたコンテンツのヘッダを取得することを意味します。
    POST POSTメソッドは、特定されたリソースに処理するデータを送信します。データは、要求の本体に含まれています。

    次の例は、クライアント(たとえば、192.168.1.75)がembOS / example.htmlハイパーテキストのページのためのIPのWebサーバに要求のHTTPセッション、の部分を示しています。
    要求は、要求が終了するように、空行が続いているダブル新しいライン、ラインフィードに続くキャリッジリターンの形でそれぞれ持つ。

    example.html GET / HTTP/1.1
    ホスト:192.168.1.75

    すべての応答メッセージの最初の行は、数値のステータスコードに続くプロトコルバージョンから構成される、ステータスラインです。ステータスラインは、コンテンツタイプ、サーバ、有効期限と転送エンコーディングが続いている。サーバの応答が転送されるべきコンテンツの長さが続く、空行で終わります。長さはバイト単位でWebページの長さを示します。

    HTTP/1.1 200 OK
    Content - Typeの:text / htmlの
    サーバー:embOS / IPが
    有効期限:木、1995年10月26日00:00:00 GMT
    にTransfer - Encoding:チャンク A3

    その後、Webサーバは、クライアントに要求されたハイパーテキストのページを送信します。空行が続くのWebページの末尾のゼロは、要求されたWebページの送信が完了したことをsignalizes。



    embOS / IP 例



    ウェブサイト:example.htm


    0

     

    HTTP通信の基礎

    HTTP応答の最初の行はステータス行です。それは使用されるプロトコルのバージョン、ステータスコードとステータスコードの簡単な説明で構成されています。ステータスコード要素は、要求を理解し、それに答えようとした試みの3桁の整数の結果コードです。

    ステータスコードの最初の数字はレスポンスのクラスを定義します。最後の2桁は、カテゴリー化する役割を持っていない。最初の桁には、5つの値があります。

    • 1XX:情報 - リクエストは、継続的なプロセスを受け取りました。
    • 2xx:成功 - アクションが正常に受信、解釈、および受け入れられた。
    • 3xx:リダイレクト - さらなるアクションがリクエストを完了するために注意する必要があります。
    • 4xx:クライアントエラー - リクエストに間違った構文が含まれているかを満たすことができない。
    • 5xxの:サーバーエラー - サーバーが明らかに有効な要求を満たすために失敗しました。

      embOS / IP Webサーバは、定義されたHTTPステータスコードのサブセットをサポートしています。[RFC 2616]を参照して定義されたステータスコードの完全な一覧について。

      Common Gateway Interface(CGI)

      インタフェースのようなのCommon Gateway Interface(CGI)は、Webページに動的コンテンツを実装するために使用されます。全てのWebページは、サーバで要求が受信されるたびに解析されます。サーバは特殊なタグのためのWebページを検索します。デフォルトの設定では、検索タグは.で終わります タグは、分析され、パラメータが抽出されます。このパラメータは、サーバ側のコマンドを指定し、コマンドを処理できるユーザアプリケーションに与えられます。次のスクリーンショットは、例のページがindex.htmを示しています。

      ページのHTMLソースには、次の行が含まれています。

       


      Webページが要求されると、サーバはタグを解析し、パラメータのカウンタは、型のWEBS_CGIの構造体の配列内で検索されます。構造は、コマンドとパラメータが見つかった場合に呼び出される関数へのポインタを識別する文字列が含まれています。

      します。typedef struct {
      const char *をsnameの; / /例:"カウンター"
      無効(* PF)(WEBS_OUTPUT * pOutput、const char *をsParameters、const char *をsValue);
      } WEBS_CGI。

      この例では、カウンタは有効なパラメータであり、関数_callback_ExecCounterが呼び出されます。あなたがWEBS_CGI配列と、アプリケーションでコールバック関数を実装する必要があります。

      静的なconst WEBS_CGI _aCGI [] = {
      {"カウンター"、_callback_ExecCounter}、
      {"GetOSInfo"、_callback_ExecGetOSInfo}、
      {"GetIPAddr"、_callback_ExecGetIPAddr}、
      {NULL}
      };

      ExecCounter()はCGI機能を使用する方法の簡単な例です。それはExecCounterへのすべての呼び出し()でインクリメントされる変数の値を含む文字列を返します。

      ボイドExecCounter(WEBS_OUTPUT * pOutput、const char *をsParameters、const char *をsValue){
      char型AC [40];
      静的char CNT = 1;
      (AC、"あなたなしの訪問者です。:%d"は、CNT)はsprintf、
      IP_WEBS_SendString( pOutput、AC)、
      CNT + +;
      }

      Webサーバーのアプリケーションに新しいCGI機能を追加

      新しいCGIの機能を定義するには、三つのことが行われなければならない。
      1。WEBS_CGIの構造体へのタグとして使用する新しいコマンド名を追加します。
      例:UserCGI

      静的なconst WEBS_CGI _aCGI [] = {
      、} _callback_ExecCounter、{"カウンター"
      、{"GetOSInfo"、_callback_ExecGetOSInfo}
      、{"GetIPAddr"、_callback_ExecGetIPAddr}
      、{"UserCGI"、_callback_ExecUserCGI}
      {NULL}
      };

      2。アプリケーションのソースコードに新しい機能を実装します。

      ボイド_callback_ExecUserCGI(WEBS_OUTPUT * pOutput、const char *をsParametersはconst char * sValue){
      ここに/ *追加のアプリケーションのコード* /
      }

      3。あなたのWebページのソースコードに新しいタグを追加します。

       

      認証

      "HTTP/1.0"は、基本アクセス認証スキームの仕様が含まれています。ユーザー名とパスワードはクリアテキストとしてネットワークを介して渡されるため、基本的な認証スキームは、HTTPサーバー上のリソースへの不正アクセスをフィルタリングの非安全な方法です。それは、クライアントとサーバー間の接続が信頼できるキャリアとみなすことができるという前提に基づいています。これはオープンなネットワーク上で一般的に事実ではないので、基本認証法を使用するべきである。

      基本アクセス認証スキームは、で説明されています:

      RFC 説明
      [RFC 2617] HTTP認証:BasicおよびDigestアクセス認証
      の直接リンク:http://tools.ietf.org/html/rfc2617

      "基本"認証スキームは、クライアントがユーザーIDおよび各レルムのパスワードを使用して自身を認証しなければならないというモデルに基づいています。realm値は、そのサーバー上の他の領域と等しいかどうかを比較することができる不透明な文字列を考慮する必要があります。サーバは、Request - URIの保護空間用のユーザIDとパスワードを検証できる場合にのみ、要求を処理します。は、オプションの認証パラメータはありません。保護空間内のURIに対して、未認証のリクエストを受け取ると、サーバは以下のような課題に応答する必要があります。

      WWW認証:基本レルムは="embOS / IP組み込みWebサーバ"

      ここで、"embOS / IPの組み込みWebサーバーは、"Request - URIの保護空間を識別するためにサーバによって割り当てられた文字列です。認可を受信するには、クライアントが資格にbase64でエンコードされた文字列内で、単一のコロン(":")文字で区切られた、ユーザIDとパスワードを送信します。ユーザエージェントがユーザID"user"とパスワード"pass"を送信したい場合には、以下のヘッダフィールドを使用します。

      承認:基本dXNlcjpwYXNz

      認証の例

      クライアントが認証を必要とするリソースを要求します。

      GET / confに/ Authen.htm HTTP/1.1
      ホスト:192.168.1.75

      サーバは"401 Unauthorized"というステータスページを使用して要求に答えます。401エラーページのヘッダーには、addionalラインのWWW - Authenticate含まれています。それは適切なユーザ名とパスワードがクライアント(たとえば、Webブラウザ)から送信されるべきレルムが含まれています。

      HTTP/1.1 401不正な
      日付:Mon、2008年2月4日午前17時00分44秒GMT
      サーバ:embOS / IP
      Accept -レンジ:バイト
      Content - Length:695
      接続:近い
      Content - Type:text / htmlの
      X -パッド:ブラウザのバグを避けるため
      WWW - Authenticate:基本領域="embOS / IPの組み込みWebサーバ" 401不正

      401不正 ブラウザではない認証-対応または認証が失敗しました。









      クライアントは、ヘッダを解釈し、リソースのレルムに対してユーザー名とパスワードの組み合わせを入力するダイアログボックスが開きます。

      要求されたレルムの適切なユーザー名/パスワードの組み合わせを入力し、[OK]ボタンで確定。クライアントは、base64エンコードされた文字列と、再度リソースを要求するユーザ名/パスワードの組み合わせをエンコードします。認可::基本dXNlcjpwYXNzリクエストヘッダは、次の行によって強化されています

      / confに/ Authen.htm HTTP/1.1 GET、
      192.168.1.75:ホスト
      認証:基本dXNlcjpwYXNz

      領域の定義されたユーザー名/パスワードの組み合わせにデコードされた文字列が一致すればサーバをデコードユーザー名/パスワードの組み合わせとチェック。文字列が同一である場合、サーバはページを提供します。文字列が同一でない場合、サーバは"401 Unauthorized"というステータスページで再度回答します。

      HTTP/1.1 200 OK
      Content - Type:text / html
      サーバー:embOS / IP
      有効期限:木、1995年10月26日00:00:00 GMT
      Transfer - Encoding:チャンク化された 200 ウェブサーバ設定 0











      認証の設定

      embOS / IPのWebサーバはそれを返す前にすべてのリソースのアクセス権をチェックします。ユーザーは、Webサーバーのリソースの異なる部分を分離するために別のレルムを定義することができます。WEBS_ACCESS_CONTROL構造体の配列は、ユーザのアプリケーションで実装する必要があります。WEBS_ACCESS_CONTROLの構造体の要素の詳細については、164ページの構造WEBS_ACCESS_CONTROLを参照してください。認証を使用しないする必要がある場合、配列はルートのパスの1つだけのエントリが含まれています。

      WEBS_ACCESS_CONTROL _aAccessControl [] = {
      {"/"、NULL、NULL}、
      0
      };

      領域"conf"を定義するには、追加のWEBS_ACCESS制御エントリは、実装する必要があります。

      WEBS_ACCESS_CONTROL _aAccessControl [] = {
      {"/ confに/"、"設定のためのログイン"、"user:pass"}、
      {"/"、NULL、NULL}、
      0
      };

      文字列"構成のためのログインは、"レルムを定義します。"user:passはは"一つの文字列に格納されているユーザー名/パスワードの組み合わせです。

      フォームの処理

      embOS / IPのWebサーバは両方のPOSTをサポートし、クライアントからフォームデータを受信するためのアクションを取得します。POSTは、識別されたリソースに処理するデータを送信します。データは、要求の本体に含まれています。唯一のリソースを要求するために使用される通常ですが、それは、Webアプリケーション内のアクションのためにGETを使用することも可能になってしまう。サーバ側のデータ処理は、新しいリソースを作成するか、既存のリソースまたは両方を更新する可能性があります。

      すべてのHTMLフォームでは、これらの入力の各項目は、名前のタグを持つテキストフィールドなどの入力項目、ボタン、チェックボックスなどで構成されています。ユーザーがフォームでこれらの項目にデータを置くと、その情報がフォームデータにエンコードされます。フォームデータは"&"文字で区切られた = ペアのストリームです。入力項目のそれぞれがユーザーによって指定された値は値と呼ばれています。 = ペアをURLエンコードされ、これはスペースが"+"に変更され、特殊文字を十六進値にエンコードされていることを意味します。[RFC 1738]を参照してURLエンコーディングの詳細については。フォームデータの解析とデコードがembOS / IPのWebサーバによって処理されます。その後、サーバはパラメータとしてデコードされ、解析された文字列でコールバック関数を呼び出します。コールバック関数を実装する責任はユーザー側にあります。

      簡単なフォーム処理のサンプル

      次の例では、WebサーバーのアプリケーションとHTMLフォームの出力の処理を示しています。例のWebページのExampleGET.htmは、3入力、2つのテキストフィールドとボタン1つでフォームを実装しています。

      それがサーバーに追加されるWebページのHTMLコードは次のとおりです。


      embOS / IPのWebサーバのフォームの例



      お名前:
      <入力名="姓" span="">
      タイプ="text"サイズ="30"
      maxlength ="30"
      の値=""
      >


      姓:
      <入力名="姓" span="">
      タイプ="テキスト"
      サイズ="30"
      maxlength ="30"
      の値=""
      >






      フォームのactionフィールドは、フォームのデータ埋めに戻って送信するときに、ブラウザが参照する必要があるリソースを指定することができます。actionフィールドは、リソースが定義されていない場合、現在のリソースが再び要求されます。あなたはembOS / IPのWebサーバからWebページを要求し、Webブラウザ、CGI部品""でページのソースをチェックし、""が実行されます。


      embOS / IP Webサーバのフォームの例



      お名前:
      <入力名="姓" span="">
      タイプ="text"サイズ="30"
      もしmaxlength ="30"
      値=""
      >


      姓:
      <入力名="姓" span="">
      タイプ="text"
      サイズ="30"
      もしmaxlength ="30"
      値=""
      >






      フォーム処理を開始するには、FirstNameとLastNameフィールドに記入し、送信ボタンをクリックする必要があります。例では、ブラウザはフォームやURLに追加エンコードされた文字列などのリソース名へのフォームデータで参照されるリソースのGET要求を送信します。フォームのデータは、リソース名から分離されている"?"。すべての = のペアが"&"で区切られます。

      あなたが[LastName]フィールドで[FirstName]フィールドジョンとドウに入力し、[送信]ボタンをクリックして入力を確定たとえば、次の文字列はサーバーに送信され、ブラウザのアドレスバーに表示。

      http://192.168.1.230/ExampleGET.htm?FirstName=John&LastName=Doe

      注:あなたがHTTPメソッドとしてPOSTを使用する場合は、名前> = ペアは、ブラウザのアドレスバーに表示されていない。 = のペアは、このケースではエンティティボディに含まれています。

      embOS / IP Webサーバは、フォームデータを解析します。フィールドはフィールドを処理するために呼び出されるCGIの関数の名前を指定します。エントリがWEBS_CGI配列で利用可能な場合、サーバーはそのためかどうかをチェックします。

      静的なconst WEBS_CGI _aCGI [] = {
      {"姓"、_callback_ExecFirstName}、
      {"姓"、_callback_ExecLastName}、
      {NULL}
      };

      エントリが見つかった場合、指定したコールバック関数が呼び出されます。
      パラメータの姓のためのコールバック関数が以下のように定義されている。

      /************************************************* ********************
      *
      *静的データ
      *
      ************************* *********************************************
      * /
      静的char _acFirstName [12]; /********************************************* ************************ * * _callback_FirstName * / 静的ボイド_callback_ExecFirstName(WEBS_OUTPUT * pOutput、const char *をsParameters、const char *をsValue){ 場合( sValue == NULL){ IP_WEBS_SendString(pOutput、_acFirstName); }他{ _CopyString(_acFirstName、sValue、はsizeof(_acFirstName)); } }











      sValueがNULLの場合、この関数は文字列を返します。sValueが定義されている場合は、文字配列に書き込まれます。HTTP伝送方法は、GETおよび充填入力フィールドの値を送信するPOSTだけなので、同じ関数は、入力フィールドの格納値を出力するか、新しい値を設定するために使用することができます。Webページの例は、入力フィールドの値としてFirstNameとLastNameの新しい値を入力し、入力を送信した後に表示されます。

      Webブラウザから見たWebページのソースは次のとおりです。


      embOS / IPのWebサーバのフォームの例



      お名前:
      <入力名="姓" span="">
      タイプ="text"サイズ="30"
      もしmaxlength ="30"
      値="ジョン"
      >


      姓:
      <入力名="姓" span="">
      タイプ="text"の
      サイズ="30"
      もしmaxlength ="30 "
      値="ドウ"
      >






      リソースの使用状況

      ROMの使用量は、コンパイラオプション、コンパイラのバージョンと使用するCPUに依存します。ARM7、IAR Embedded WorkbenchはV5.11、Thumbモード、サイズの最適化:下の表に示されるウェブサーバのメモリ要件は、次のようにシステム上で測定されている。

      コンフィギュレーションに使用

      #WEBS_IN_BUFFER_SIZE 128が定義する
      #128はWEBS_OUT_BUFFER_SIZE定義
      #WEBS_TEMP_BUFFER_SIZE 128を定義する
      #WEBS_ERR_BUFFER_SIZE(WEBS_OUT_BUFFER_SIZE / 2)を定義
      #WEBS_AUTH_BUFFER_SIZE 32定義
      #WEBS_FILENAME_BUFFER_SIZE 32の定義

      ROMの使い方

      アドオン ROM [キロバイト]
      embOS / IPのWebサーバ 5.4

      RAM使用量

      タスク 説明 RAM [バイト]
      ParentTask 着信接続をリッスンします 500

      ChildTask

      要求を処理 1800

      Webサーバは、少なくとも1つの子タスクが必要です。
      Webサーバーの約RAM使用量は次のように計算することができます。

      RAM使用量= 0.1 Kバイト+ ParentTask +(NumberOfChildTasks * 1.8キロバイト)

      例:1のみ接続を受け付けるWebサーバ

      RAM使用量= 0.1 Kバイト+ 0.5 Kバイト+(1 * 1.8 Kバイト)
      RAM使用量= 2.4キロバイト

      例:並列で3まで受け付けるWebサーバ

      RAM使用量= 0.1 Kバイト+ 0.5 Kバイト+(3 * 1.8 Kバイト)
      RAM使用量= 6.0キロバイト

       

      詳細についてはマニュアルを含めWindowsの試用版をダウンロードしてください。