コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

ndsでのjpeg表示に再挑戦(1)

以前、jpegの表示に挑戦してどこかから持ってきたソースを使って表示を試みたのですが、うまくデコードできないものがあったりと、途中、保留状態でした。そこで、jpegの表示に再挑戦したいと思います。


せっかく、再挑戦するので、何か目標が無いかと考えて「美人の女の人が時刻を書いたパネルを持って立っているあれ」を表示してみたいと思い立ちました。そこで、挑戦です。
先ず、jpg画像データを取得するところから考えていきます。

美人さんの画像を取得する

画像の取得は、dswifiを用いてサーバにhttpアクセスしてGETコマンドで取得すればいいはずです。実は以前ブログに書いたように、過去にこのようなものを作っています。
D
これは、PC上で美人時計画像を取得して、DSの画像フォーマットに変換してDSに転送するような仕組みで実現しています。このような仕組みになったのは、DSから画像を取得する方法とjpegをデコードする方法がよくわかっていなかったからです。
今回、画像を取得するところを作ってみました。
とりあえず、PCが送信する情報をそのまんま送信しています。

FILE*  fp = NULL;
char  toptext[512];
int    i;
char  *servername = "www.bijint.com";
char  *getfilename = "/jp/img/clk/";
char  buf[32];
char  savefilename[32];
int    httpgetdatasize = 32768;
int    portnum = 80;

  time_t unixTime = time( NULL );
  struct tm* timeStruct = gmtime((const time_t *)&unixTime);
  sprintf( buf, "%02d%02d.jpg", timeStruct->tm_hour, timeStruct->tm_min );
  strcpy( savefilename, buf );
 
  //********** http GET コマンド生成 **********
  strcpy( toptext, "GET " );
  strcat( toptext, getfilename );
  strcat( toptext, buf );
  strcat( toptext, " HTTP/1.1\r\n" );
  strcat( toptext, "Host: " );
  strcat( toptext, servername );
  strcat( toptext, "\r\n" );
  strcat( toptext, "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7\r\n" );
  strcat( toptext, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" );
  strcat( toptext, "Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\n" );
  strcat( toptext, "Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7\r\n" );
  strcat( toptext, "Keep-Alive: 300\r\n" );
  strcat( toptext, "Connection: keep-alive\r\n" );
  strcat( toptext, "Referer: http://www.bijint.com/jp/\r\n\r\n" );
  //*******************************************
  
  ShinoPrintBox( MainScreenA, 0, 0, (u8*)toptext, 40, RGB(31,31,31), RGB(0,0,0), 1 );

  nkeywait( -1 );
  anyNyuryoku();

    // サーバのIPアドレスを検索します
    struct hostent * myhost = gethostbyname( servername );

    //TCPソケットの生成
    int my_socket = socket( AF_INET, SOCK_STREAM, 0 );

    //ホストに接続するため、指定IPアドレスの指定ポートに接続します。
    struct sockaddr_in sain;
    sain.sin_family = AF_INET;
    sain.sin_port = htons( portnum );  //ポート指定
    sain.sin_addr.s_addr= *( (unsigned long *)(myhost->h_addr_list[0]) );  //IP指定
    connect( my_socket,(struct sockaddr *)&sain, sizeof(sain) );

    //接続先にファイル取得リクエストを飛ばします
    send( my_socket, toptext, strlen(toptext), 0 );

  //メモリの確保
  char *incoming_buffer = (char*)malloc( sizeof(char*) * httpgetdatasize );
  if(incoming_buffer==NULL ){
    ShinoPrint( SubScreenA, 0, 0, (u8 *)"Malloc Error", RGB(31,0,0), 0, 1 );
    while( true );
  }

  //最初の返信データを受信
  int recvd_len = recv( my_socket, incoming_buffer, httpgetdatasize, 0 );
  
  recvd_len = strlen( (char *)incoming_buffer );
  //最初の受信分だけ LOGに保存して終了。
  fp = fopen( savefilename, "wb" );
  if( fp==NULL ){
    ShinoPrintCenter( SubScreenA, 128, 12*12, (u8 *)"not create.", RGB(31,0,0), 0, 1 );
    while( true );
  }
  fwrite( incoming_buffer, recvd_len, sizeof(char), fp );

  //データサイズが0になるまで、データを取得します
  while( ( recvd_len = recv( my_socket, incoming_buffer, httpgetdatasize, 0 ) ) != 0 ){
    if( recvd_len>0 ){
      swiWaitForVBlank();  
      fwrite( incoming_buffer, recvd_len, sizeof(char), fp );
    }
  }
  fclose( fp );
  //メモリの開放
  free( incoming_buffer );
  
  //ソケットをシャットダウンします
  shutdown(my_socket,0);

  //少し間をおく(こうしないとソケットが切れない・・・)
  for( i=0; i<20; i++ ){  swiWaitForVBlank();  }
  
  //ソケットを閉じます
  closesocket( my_socket );

結果、NGです。何が問題かと言うと、取得データが473バイト少ないのです。この原因はヘッダなのかWiFi側なのか、ndsのプログラムなのか、原因を調べなければ生りません。
今日は、ここまでです。

本当にやりたいことリスト

(ブログの終わりにやりたいことを書いておきたいと思います)

  • 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
  • Androidプログラム
  • Web系のプログラム