Web サーバーを作成する

Makefile
adconv.c
contents.c (contents.html を元に作成したもの)
httpd.c
lcd.c
led.c
reg.c
adconv.c
contents.c
lcd.h
led.h
pat.h
reg.h

ブラウザからは、「http://192.168.1.12」でアクセスする。
現在の環境(NFSカーネル)では、C-c で Webサーバーを止めることが
できないので、「http://192.168.1.12/owari」をアクセスして止めること。

httpプロトコルを使った、携帯電話JavaからのLCD/LEDの制 御 プログラム作成
(Java研修の最後に行ったサーブレットと同じようなものを httpd.c に追加)

H8MAX 側
(1)下記変更が終了したら、コンパイルし、動作を確認
     ブラウザから、http://192.168.1.12/servlet をアクセス。
     AD0(ボリューム0),AD1(ボリューム1)の値を得られることを確認。
(2)動作を確認したら、カーネルを構築し、そのカーネルを実行

Windows 側
(1)パソコンを、Windows で再立ち上げ
(2)c:/winnt/system32/drivers/etc/hosts に、以下の行を追加
    192.168.1.12 h8max
    (c:/windows/system32/drivers/etc/hosts かもしれない)
(3)HttpConnectDemo.java の inport するものを変更
    import com.nttdocomo.ui.*;
    import javax.microedition.io.*;
    import java.io.*;
    //import com.nttdocomo.io.*;
    import com.nttdocomo.io.HttpConnection;
    import com.nttdocomo.io.BufferedReader;
    import com.nttdocomo.net.*;

(4)iappli から、HttpConnectDemo プロジェクトを開き、
    [設定]-[ネットワーク設定]で、
      [ADFのURL]                       http://h8max/
      [HTTP設定]-[プロキシホスト]     http://h8max
      [HTTP設定]-[プロキシポート]     80
    として、ビルド-起動

---------- H8MAX側変更点  ---------------------------------------
変更しなくていいところは灰色で、変更個所は黒であらわしています.
char* RecieveRequest( int Socket ) ;
int ServletAnswer( int Socket, char* RequestStr ) ;//追加

int GetNumber(char*RequestStr,char*Name);
void SetADValue( char* Contents ) ;
void  testpat( int n ) ;
..
..
..(途中省略)
..
/****************************************************************
機能要約         telnet の応答
機能
引数
戻り値
注意
*****************************************************************/
int Communication( int Socket )
{
  char* RequestStr ;

  printf( "\nhttpd start port=%d\n",TELNET_PORT ) ;
  fflush( stdout ) ;

  //TimeOut 処理をするためにノンブロッキングモードにする
  fcntl( Socket, F_SETFL, O_NONBLOCK);

  RequestStr = RecieveRequest( Socket ) ;
  if( RequestStr == NULL ) {
    return( -1 ) ;
  }
  // RequestStr に、sevlet の文字が含まれているならば、データ文字列
  // だけを返すようにする。
  if( strstr( RequestStr, "servlet" ) == NULL ) {
    Answer( Socket, RequestStr ) ;
  }
  else {
    ServletAnswer( Socket, RequestStr ) ;//追加
  }
  return( 0 ) ;
}
/*****************************************************************
機能要約   サーブレット用の応答
機能
引数
戻り値
注意
******************************************************************/
int ServletAnswer( int Socket, char* RequestStr )
{
  int Length ;
  int LedNumber;
  int LcdNumber;
  char Contents[ 100 ] ;

  // RequestStr の内容を解釈して送り出すデータを決定する
  // (現在は、ADの値を返すだけ)
  sprintf( Contents, "ad0=%d ad1=%d", AdConv(0), AdConv(1));
  Length = strlen( Contents ) ;

  //コンテナヘッダーを出力
  Sockprintf( Socket, "HTTP/1.1 200 OK\n" ) ;
  Sockprintf( Socket, "Accept-Ranges: bytes\n" ) ;
  Sockprintf( Socket, "Content-Length: %d bytes\n", Length ) ;
  Sockprintf( Socket, "Connection: close\n" ) ;
  Sockprintf( Socket, "Content-Type: text/html;charset=EUC-JP\n" ) ;
  Sockprintf( Socket, "Content-Language: euc-jp\n" ) ;
  Sockprintf( Socket, "\n" ) ;

  write( Socket, Contents, Length );
  return( 0 ) ;
}
..
..
..(途中省略)
..
/******************************************************************
機能要約         コマンド文字列を受け取る
機能
引数
戻り値
注意
******************************************************************/
char* GetCommand( int Socket )
{
  uint uintData ;
  uchar Data ;
  static char Buffer[ 200 + 1 ] ;
  int BufPtr ;

  BufPtr = 0 ;
  while( 1 ) {
    uintData = GetDataWithTimeOut( Socket, 10000 ) ;
    if( uintData == NO_DATA ) {
      printf("timeout\n");
      return( NULL ) ;
    }
    Data = uintData ;
    if( Data < ' ' ) {
      Buffer[ BufPtr ] = 0 ;
      return( Buffer ) ;
    }
    Buffer[ BufPtr ] = Data ;
    BufPtr ++ ;
    if( BufPtr >= 200 ) {
      return( NULL ) ;
    }
  }
}

戻る