Logowanie na router, najlepiej przez INDY

0

Witam, jak w temacie - chce się za pomocą Delphi zalogować na router, wysyłać i odczytywać dane, coś jak przez telnet:

S: open 192.168.1.1
R: Password:
S:*******
R: Welcome!

S = to co na wpisuję, R = to co pojawia się na ekranie.

I chcę odtworzyć coś podobnego za pomocą Memo i Edit - w Edit wpisuję komedy, odczytuję w Memo.
Posłużyłem się komponentem Tidhttp z pakietu INDY, udało mi się pomyślnie połączyć, ale nie mam pojęcia jak komunikować się z routerem. Czytałem o metodzie GET/POST, próbowałem też w praktyce. Potem testowałem Write oraz ResponseText - i NIC! Albo nic się nie dzieje (wrzuca do Memo puste wiersze), albo wywala mi błąd.
Wiem że jest też kontrolka TidTelnet, ale testy na niej również się nie powiodły (tutaj nawet połączyć się nie udało, wywala mi błąd mimo że używam identycznych poleceń - host, port, connect...).

W związku z tym proszę o pomoc, niech ktoś mi przynajmniej da linka gdzie jest objaśnione jak tego używać, może macie jakieś wskazówki, porady... kawałek kodu?

PS. Proszę nie piszcie: "Poszukaj w necie, to już było wiele razy", a to dlatego że owszem w necie jest tego sporo, ale której strony bym nie odwiedził, to widzę dokładnie to samo - każdy odsyła do netu! Szukam w necie a znajduję odpowiedź w postaci "poszukaj w necie" -.- A jak znajdę jakiś konkret to albo nie działa, albo zwyczajnie nie umiem go zastosować.

PS2. A może jest jakiś łatwiejszy sposób na komunikację z routerem w formie tekstowej?

0

Każdy niemal ruter jest inny, zależy od firmy, w przypadku mojego DLinka obsluga http nie jest tak łatwa.
Ale co mogę Tobie doradzić to zamiast Indy użyć pakietu Synapse, to po pierwsze. Po drugie jesli chcesz
wiedzieć jakie dane są wysyłane przez przeglądarkę do rutera to zainteresuj się Snifferem WireShark (jak
go używać dowiesz się z tutoriali na YouTube). Wtedy sobie przeanalizuj jakie dane są wysyłane POSTem
czy tam pobierane GETem (ale raczej chyba używana będzie meroda POST) i zrób to samo pod Synapse.

0

Nie, nie - nie chodzi o to... Ja wiem że każdy router jest inny, trzeba wprowadzać inne komendy itd. Umiem nawiązać połączenie z routerem przez Delphi (status jest connected), ale to za mało, chcę też się z nim porozumieć (nie musze wyłapywać żadnych poleceń z przeglądarki bo je znam, umiem zarządzać moim routerem przez telnet, chodzi mi żeby teraz to samo zrobić przez delphi), jednak nie wiem jak doń "przemówić", w jaki sposób mogę wysyłać cokolwiek do routera (np. zalogować się czy wydać mu jakieś polecenie), lub z niego coś odczytać, wszelkie komunikaty jakie on wysyła do mnie (np. prośbę o wpisanie hasła, czy rezultat wpisania polecenia). Wiem co i kiedy wysyłać, tylko nie wiem jak... Ludzie najczęściej robią to za pomocą GET/POST komponentu TidHttp (tak piszą na forum), tylko ja za cholerę nie wiem jak tego dokonać :/ Moim celem jest stwotrzenie odpowiednika telnetu, tylko że w Delphi (np. w Memo czy Richedit).

Prosił bym o przykład użycia POST i GET, lub link do stronki gdzie w miarę jasno zostało to opisane. A może jest jakaś inna kontrolka czy inna metoda, która mi pomoże w moim problemie?

0

Przecież zarowno Indy jak i Synapse mają na stronach przykłady i dokumentację.
Wysyłanie danych POST pod Synapse (pewnie i w Indy też) to banalna sprawa, a
tymbardziej jak wiesz co masz wysłać. Tylko, że docelowym adresem jest adres IP
rutera, jednak Ty piszesz coś o komunikacji przez telnet, od tego są w Indy inne
komponenty, ktorymi się nie bawiłem. W Synapse też się pewnie da to zrobić, no
ale wysyłanie POSTem danych odbywa się przez protokół HTTP, a nie telnetem, a
poniżej masz prosty przykład jak wysłać dane merodą POST do strony (Synapse).
Ten kod poniżej akurat pobiera dane do pliku, lecz można również je pobrać też
do MemoryStream. Poniższy kod pobiera pliki ze zdjęciami ze strony jednego ze
szczecińskich klubów. Obsługuje przekierowanie. Jak widzisz to nic trudnego po
tym przykładzie moim zdaniem powinieneś zrozumieć ideę. Poza tym w google
na pewno jest masę innych przykładów na wysyłanie danych POSTem, tylko nie
trzeba czekać aż odpiszą na forum, tylko samodzielnie poszukąc i kombinować.

const
  ToPost_MimeType = 'application/x-www-form-urlencoded';
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.60';

function HeyaPostToFile(const URL : string; HeyaUserName, HeyaPassword : string; const FileName : string) : boolean;
const
  Location_Prefix = 'Location:' + #32;
var
  SynHttp : THttpSend;
  I, Position : integer;
  UrlData, Str, DirectLink : string;
begin
  UrlData := 'login=' + HeyaUserName + '&pass=' + HeyaPassword + '&action=zaloguj';
  SynHttp := THttpSend.Create;
  try
    SynHttp.MimeType := ToPost_MimeType;
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.Document.Write(Pointer(URLData)^, Length(URLData));
    Result := SynHttp.HTTPMethod('POST', Url);
    case SynHttp.ResultCode of
      301, 302 :
        begin
          for I := 0 to SynHttp.Headers.Count - 1 do
          begin
            Str := SynHttp.Headers[I];
            Position := Pos(Location_Prefix, Str);
            if Position > 0 then
            begin
              DirectLink := Copy(Str, Position + Length(Location_Prefix), MaxInt);
              Break;
            end;
          end;
          HeyaPostToFile(DirectLink, HeyaUserName, HeyaPassword, FileName);
        end;
    else
      SynHttp.Document.SaveToFile(FileName);
    end;
  finally
    SynHttp.Free;
  end;
end;
0

W międzyczasie udało mi się osiągnąc to co chciałem, za pomocą komponentu TClientSocket (zakładka internet, domyślny komponent Delphi).

Na formę wrzucam Memo, Edit i Button.

Najpierw Button:

CS.Host:='192.168.1.1'; //CS=TClientSocket;
CS.Port:=23;
CS.Active:=True;

Połączenie zostaje nawiązane.

W CS, OnRead:

Memo.Lines.Add(CS.Socket.ReceiveText);

w Edit, OnKeyDown:

 if key=vk_return then begin
  CS.Socket.SendText(Edit.Text);
  Edit.Clear;
 end;

Działa odczytywanie informacji z routera, zaraz po połączeniu wyskakuje mi "Password:", czyli tak jak powinno być (w telnecie jest tak samo).
Wpisuję wieć w edit moję 5 literowe hasło i wysyłam je do routera, wtedy on odsyła mi coś takiego:


Potem wpisane czegokolwiek owocuje podobnym komunikatem, wpisana komenda przychodzi "zagwiazdkowana", najpierw pierwsza litera a potem reszta, tak jak na przykładzie (skoro są 2 wiersze, muszą to być 2 osobne komunikaty). Oznacza to więc że nie udało się zalogowac do routera, bo ciągle pyta o hasło. Wydaję mi się że on po prostu zwraca to co zostało do niego wysłane, czyli wpisane przeze mnie hasło. Z nieznanych mi jednach przyczyn zostaje ono (jak widać) wysłane w 2 częściach, co tłumaczy dlaczego nie działa.

Jakies pomysły o co może chodzić?

Udało mi się też odczytać i wysłać do routera komunikaty, za pomocą kontrolki INDY TidTelnet. Niestety efekt jest identyczny, odczytuje dane poprawnie, ale hasło wysyła się w podobenj formie (1+reszta).

==========
EDIT

Udało się, wysyłam przez komponent tidTelnet, tyle że nie przez dotychczasowe Write(String), a WriteLn (String). Efekt jest dokładnie taki jaki chciałem - po prostu poprawnie wysyła komunikaty ;P Jedyny problem jest taki, że po restarcie rootera (sys reboot) cała aplikacja się wiesza na amen...

0

cała aplikacja się wiesza na amen...

Ustaw TimeOut ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1