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

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

DSとDSをLANで接続する

ピアツーピア通信の意味が今ひとつ分かっていないので、単純にDSとDSをLANで接続するというタイトルにしてみました。ということで、適当なデモプログラムを作りました。

ds2ds接続テストプログラム

de2detest()関数は、IP_DispSelect()から戻ってくるkeyの値で、ポート(8520)を監視するか、指定したIPアドレスのポート(8520)に接続しに行くか、のどちらかの処理をします。ポート番号は8520としましたが、特に意味はありません、超適当に決めています。sockAnyが負で返ってくるとエラーです。正の値だと接続成功で、ソケット番号が返ってきます。

//**************************************************
// ds2dstest
//**************************************************
void	ds2dstest( void )
{
int key;
int	sockAny = -1;
int	i;

 key = IP_DispSelect();

 if( key==0 ){
   ShinoUpPrint( MainScreenA, (u8 *)"接続待機中...", RGB(31,31,31),RGB(0,0,0), 1 ,RGB(0,0,0) );
   sockAny = WaitForAccess( 8520 );	//接続待ち 
 }
 else{
   ShinoUpPrint( MainScreenA, (u8 *)"接続中...", RGB(31,31,31),RGB(0,0,0), 1 ,RGB(0,0,0) );
   ShinoPrint( MainScreenA, 6*10, 12*15, (u8 *)ConnectIP, RGB(31,31,31),RGB(0,0,0), 0 );
   sockAny = AccessTo( ConnectIP, 8520 );	//接続する
 }

 if( sockAny<0 ){
   ShinoUpPrint( MainScreenA, (u8 *)"接続に失敗しました", RGB(31,0,0),RGB(0,0,0), 1 ,RGB(0,0,0) );
   ShinoUpPrint( MainScreenA, (u8 *)"相手が待機していなかったかも知れません", RGB(31,0,0),RGB(0,0,0), 1 ,RGB(0,0,0) );
   return;
 }

 ShinoUpPrint( MainScreenA, (u8 *)"接続完了 -- 通信を始めます", RGB(31,31,31),RGB(0,0,0), 1 ,RGB(0,0,0) );

 ClearBGL( SubScreenA,   RGB(31,31,31) );
	
 communicate( sockAny );	//通信開始

 //ソケットをシャットダウンします
 shutdown( sockAny, 0 );

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

 closesocket( sockAny );	//ソケットを閉じる
}

communicate()関数が実際に通信処理を行っているところです。communicate()から戻ってくると、ソケットをシャットダウンしてクローズします。

取得IPの表示と設定

main()関数に書いてあるDS_WifiIni()関数で、WiFiAPへの接続とIP取得はできているので、IP_DispSelect()関数でDHCPサーバから取得したデータを表示します。

//**************************************************
// IPアドレスの表示と接続先IPアドレスの設定
//**************************************************
int	IP_DispSelect( void )
{
struct in_addr ipAddr, gateway, mask, dns1, dns2;
char az[100];
int		key;

 //自分のIPを取得する
 ipAddr = Wifi_GetIPInfo(&gateway, &mask, &dns1, &dns2);

 ShinoUpPrint( MainScreenA, (u8 *)" ", RGB(31,31,31),RGB(0,0,0), 1 ,RGB(0,0,0) );
 sprintf( az, "IP Address: %s [%ld]", inet_ntoa(ipAddr), ipAddr.s_addr );
 ShinoUpPrint( MainScreenA, (u8 *)az, RGB(31,31,31),RGB(0,0,0), 1 ,RGB(0,0,0) );
 sprintf( az, "gateway   : %s", inet_ntoa(gateway) );
 ShinoUpPrint( MainScreenA, (u8 *)az, RGB(31,31,31),RGB(0,0,0), 1 ,RGB(0,0,0) );
 sprintf( az, "mask      : %s", inet_ntoa(mask) );
 ShinoUpPrint( MainScreenA, (u8 *)az, RGB(31,31,31),RGB(0,0,0), 1 ,RGB(0,0,0) );
 sprintf( az, "dns1      : %s", inet_ntoa(dns1) );
 ShinoUpPrint( MainScreenA, (u8 *)az, RGB(31,31,31),RGB(0,0,0), 1 ,RGB(0,0,0) );
 sprintf( az, "dns2      : %s", inet_ntoa(dns2) );
 ShinoUpPrint( MainScreenA, (u8 *)az, RGB(31,31,31),RGB(0,0,0), 1 ,RGB(0,0,0) );

 ShinoUpPrint( MainScreenA, (u8 *)" ", RGB(31,31,31),RGB(0,0,0), 1 ,RGB(0,0,0) );
 ShinoUpPrint( MainScreenA, (u8 *)"192.168.1.101 に接続する場合は [A]、", RGB(31,31,31),RGB(0,0,0), 1 ,RGB(0,0,0) );
 ShinoUpPrint( MainScreenA, (u8 *)"待機する場合は [A]以外を、押してください", RGB(31,31,31),RGB(0,0,0), 1 ,RGB(0,0,0) );

 key = anyNyuryoku();
 nkeywait(-1);

 if( (key&KEY_A)!=0 ){		//[A]ボタン
   strcpy( ConnectIP, "192.168.1.101" );
 }
 else{
   key = 0;
 }
 return( key );
}


表示した後、接続待機するか、192.168.1.101に接続しに行くか決めます。ポケットWiFiを前提にしているので、192.168.1.101に決め打ちしています。
接続が完了すると下記のように表示され、ペンで線が書けるようになります。

DS-DS通信

通信が始まるとDSは下画面を共有して、二人で一緒に線が書けるようになります。分かりやすいように、相手が書いた線は赤色で表示させています。

送受信は、ペンX座標、ペンY座標、タッチの有無の3バイトのデータで行っています。これくらいのデータなら、特に重くも無く処理できていると思います。
データ処理のところは、また、明日にでも書きたいと思います。

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

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

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