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系のプログラム