123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- program apSearch;
- {$mode objfpc}
- uses
- ctypes, nds9, dswifi9;
- var
- ap: pWifi_AccessPoint;
- function findAP(): pWifi_AccessPoint;
- var
- selected, i, count, displaytop: integer;
- ap2: Wifi_AccessPoint;
- pressed: cint;
- displayend: integer;
- s1, s2: string;
- begin
- selected := 0;
- count := 0;
- displaytop := 0;
-
- Wifi_ScanMode(); //this allows us to search for APs
-
- pressed := 0;
-
- while ((pressed and KEY_A) = 0) do
- begin
- scanKeys();
-
- pressed := keysDown();
-
- if (pressed and KEY_START) <> 0 then exit;
-
- //find out how many APs there are in the area
- count := Wifi_GetNumAP();
-
- consoleClear();
-
- iprintf('%d APs detected'#10, count);
- displayend := displaytop + 10;
- if (displayend > count) then displayend := count;
-
- //display the APs to the user
- for i := displaytop to displayend - 1 do
- begin
- Wifi_GetAPData(i, ap);
- // display the name of the AP
- if i = selected then
- s1 := '*'
- else
- s1 := ' ';
-
- if (ap.flags and WFLAG_APDATA_WEP) <> 0 then
- s2 := 'Yes '
- else
- s2 := 'No ';
-
- iprintf('%s %.29s'#10' Wep:%s Sig:%i'#10, s1, pcchar(ap^.ssid), s2, ap.rssi * 100 div $D0);
-
- end;
-
- //move the selection asterick
- if ((pressed and KEY_UP) <> 0) and (selected > 0) then
- dec(selected);
- if ((pressed and KEY_DOWN) <> 0) and (selected < (count-1)) then
- inc(selected);
- swiWaitForVBlank();
- end;
- //user has made a choice so grab the ap and return it
- Wifi_GetAPData(selected, ap);
- result := ap;
- end;
- //---------------------------------------------------------------------------------
- procedure keyPressed(c: cint);
- begin
- if (c > 0) then
- iprintf('%c', c);
- end;
- var
- ap3: pWifi_AccessPoint;
- status: integer;
- kb: pKeyboard;
- oldStatus: integer;
- url: array [0..255] of char;
- host: phostent;
- wepkey = array [0..63] of char;
- wepmode: cint;
- len: integer;
- ip: cuint32;
- quit: integer;
- pressed: cint;
- begin
- Wifi_InitDefault(false);
- consoleDemoInit();
- new(kb);
- kb := keyboardDemoInit();
- kb^.OnKeyPressed := @keyPressed;
- while true do
- begin
- status := integer(ASSOCSTATUS_DISCONNECTED);
- consoleClear();
- consoleSetWindow(nil, 0,0,32,24);
- ap3 := findAp();
- consoleClear();
- consoleSetWindow(nil, 0,0,32,10);
- iprintf('Connecting to %s'#10, pcchar(ap3^.ssid));
- //this tells the wifi lib to use dhcp for everything
- Wifi_SetIP(0,0,0,0,0);
- wepmode := WEPMODE_NONE;
- if (ap3^.flags and WFLAG_APDATA_WEP) <> 0 then
- begin
- iprintf('Enter Wep Key'#10);
- while (wepmode = WEPMODE_NONE) do
- begin
- scanf('%s', wepkey);
- if (strlen(wepkey) = 13) then
- wepmode := WEPMODE_128BIT;
- else if (strlen(wepkey) = 5) then
- wepmode := WEPMODE_40BIT;
- else
- iprintf('Invalid key!'#10);
- end;
- Wifi_ConnectAP(ap3, wepmode, 0, pcuint8(wepkey));
- end else
- Wifi_ConnectAP(ap3, integer(WEPMODE_NONE), 0, nil);
- consoleClear();
- while (status <> ASSOCSTATUS_ASSOCIATED) and (status <> ASSOCSTATUS_CANNOTCONNECT) do
- begin
- status := Wifi_AssocStatus();
- len := strlen(ASSOCSTATUS_STRINGS[status]);
- iprintf(#27'[0;0H\x1b[K');
- iprintf(#27'[0;%dH%s', (32-len) div 2, ASSOCSTATUS_STRINGS[status]);
-
- scanKeys();
-
- if (keysDown() and KEY_B) <> 0 then break;
-
- swiWaitForVBlank();
- end;
-
- if (status = ASSOCSTATUS_ASSOCIATED) then
- begin
- ip := Wifi_GetIP();
- iprintf(#10'ip: [%li.%li.%li.%li]'#10, (ip ) and $FF, (ip shr 8) and $FF, (ip shr 16) and $FF, (ip shr 24) and $FF);
- while true do
- begin
- scanf('%s', url);
- if (strcmp(url, 'quit') = 0) then break;
- host := gethostbyname(url);
- if(host <> nil) then
- iprintf('IP (%s) : %s'#10, url, inet_ntoa(pin_addr(host)^.h_addr_list[0]))
- else
- iprintf('Could not resolve'#10);
- swiWaitForVBlank();
- end;
- end else
- iprintf(#10'Connection failed!'#10);
- quit := 0;
- iprintf('Press A to try again, B to quit.');
- while true do
- begin
- swiWaitForVBlank();
- scanKeys();
- pressed := keysDown();
- if(pressed and KEY_B) <> 0 then quit := 1;
- if(pressed and (KEY_A or KEY_B)) <> 0 then break;
- end;
- if (quit) <> 0 then break;
-
- end;
- end.
|