Page 1 of 2 1 2 LastLast
Results 1 to 15 of 22

Thread: Indy telnet - opdrachten worden half verwerkt

  1. #1
    (Mani as TMember).Post Mani's Avatar
    Join Date
    Aug 2002
    Location
    Het hoge noorden
    Posts
    563

    Indy telnet - opdrachten worden half verwerkt

    Als ik een opdracht naar het telnet component verstuur met de code:

    Code:
    for I := 1 to length(Data) do
      IdTelnet1.SendCh(Data[I]);
    gaat dat goed. Inloggen is geen probleem. Een module selecteren op mijn router gaat perfect.
    Stuur ik echter een opdracht om een bepaald nummer te selecteren
    at+cmgs="0651311211"
    dan worden niet alle karakters verwerkt. Verstuurd worden ze wel maar de DataAvailable procedure geeft maar een deel terug en ik krijg ook geen promp dat het goed verwerkt is.

    Iemand een idee wat er niet goed gaat?

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    AnsiString/WideString probleem wellicht?

    Met welke Delphi versie werk je?

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  3. #3
    (Mani as TMember).Post Mani's Avatar
    Join Date
    Aug 2002
    Location
    Het hoge noorden
    Posts
    563
    Studio 2006

  4. #4
    Game-Programmer nschagen's Avatar
    Join Date
    Jun 2003
    Location
    Alkmaar
    Posts
    685
    Een beetje offtopic, maar je weet dat telnet onveilig is? Ik weet niet wat je toepassing pricies is, maar ik zou zelf SSH gebruiken. In telnet is het triviaal om verkeer af te luisteren en zelf verkeer te genereren met als doel een systeem neer te halen/binnen te dringen.
    When things don't go right, Turn left

  5. #5
    at+cmgs is een commando om sms-berichten te verzenden via een gsm-modem. Dus ik denk dat dat gewoon "lokaal" verkeer zal zijn. (en een modem over SSH benaderen is meestal niet mogelijk)

    Maar ik denk dat we wat meer van de code moeten zien (en bedoeling van het programma) om te kunnen zien wat hier precies mis gaat.

  6. #6
    (Mani as TMember).Post Mani's Avatar
    Join Date
    Aug 2002
    Location
    Het hoge noorden
    Posts
    563
    Ik gebruik telnet omdat het 4 poorts mobiel modem dat we hier hebben staan het nu eenmaal ondersteund om SMS te versturen. Verder is het binnen een eigen segment van het netwerk.

    Eigenlijk heb ik een eenvoudige applicatie nodig om diverse SMS berichten te versturen. En ja, ik ken Molly
    Wij hebben echter zo'n goot bulk abonnement voor mobiel dat we een SMS voor minder dan een cent kunnen versturen.
    Eigenlijk heb ik alleen maar een goedkoop modem nodig waar ik een kaartje in kan stoppen en die ik eenvoudig via Delphi SMS berichten kan laten versturen.
    Wie daar een antwoord op kan geven helpt mij ook.

  7. #7
    Quote Originally Posted by Mani View Post
    Eigenlijk heb ik alleen maar een goedkoop modem nodig waar ik een kaartje in kan stoppen en die ik eenvoudig via Delphi SMS berichten kan laten versturen.
    Wie daar een antwoord op kan geven helpt mij ook.
    Elke modem zul je toch via telnet aan moeten sturen dus met een andere modem zit je weer met hetzelfde probleem als je huidige modem.
    Of de modem moet http-aanstuur opties hebben maar of je daarmee dan een sms mee kunt versturen is maar de vraag.
    Ik denk dat het simpeler is om uit te zoeken waarom telnet mis gaat.
    Welk type modem is het. (wat meer van de code te laten zien kan ook handig zijn voor probleem-opsporing)

  8. #8
    (Mani as TMember).Post Mani's Avatar
    Join Date
    Aug 2002
    Location
    Het hoge noorden
    Posts
    563
    Het standaard Indy telnet component met een procedure om een opdracht weg te sturen en een om de antwoorden terug te sturen. De code die je overal op internet tegenkomt als voorbeeld van Indy.

    Nu stuur ik de nieuwe opdracht handmatig als ik als antwoord weer een cursor heb.
    Later moet dit geautomatiseerd gaan maar eerst moet het werken.
    Bij de create van het form worden de poort en ip adres gezet en geconnect.

    Op zich werkt de code wel maar als je een command naar het modem stuurt krijg je als antwoord maar de helft van de opdracht terug. En omdat hij die niet uit kan voeren ook gelijk een error.

    Het modem is een Portech MV-372
    Als ik via de webinterface een SMS stuur gaat het goed maar die kun je niet via code aansturen. Dan hebben we hier nog een GSM gateway staan maar daar moet je via een compoort een SMS server aanhangen. Dat is veel te complex en ik hoef ook geen TV spelletjes functionaliteit te hebben als SMS Piet om hem door te laten gaan naar de finale

    Het moet een SMS attendering worden om mensen aan afspraken te herrinneren en aan te geven wat ze mee moeten nemen.
    Elke andere werkende oplossing is ook goed zeker als die snel is.

    Code:
    procedure TForm1.IdTelnet1DataAvailable(Sender: TIdTelnet; const Buffer: string);
    const
      CR = #13;
      LF = #10;
    var
      Start, Stop : Integer;
    begin
      if Memo1.Lines.Count = 0 then
          Memo1.Lines.Add('');
    
      Start := 1;
      Stop  := Pos(CR, Buffer);
      if Stop = 0 then
          Stop := Length(Buffer) + 1;
      while Start <= Length(Buffer) do begin
          Memo1.Lines.Strings[Memo1.Lines.Count - 1] :=
              Memo1.Lines.Strings[Memo1.Lines.Count - 1] +
              Copy(Buffer, Start, Stop - Start);
          if Buffer[Stop] = CR then begin
              Memo1.Lines.Add('');
              {$IFNDEF Linux}
              SendMessage(Memo1.Handle, WM_KEYDOWN, VK_UP, 1);
              {$ENDIF}
          end;
          Start := Stop + 1;
          if Start > Length(Buffer) then
              Break;
          if Buffer[Start] = LF then
            Start := Start + 1;
          Stop := Start;
          while (Buffer[Stop] <> CR) and (Stop <= Length(Buffer)) do
              Stop := Stop + 1;
      end;
    
      edtSendCommand.SetFocus;
    end;
    Code:
    procedure TForm1.edtSendCommandKeyPress(Sender: TObject;
      var Key: Char);
    var
      i : integer;
      s : string;
    begin
    if IdTelnet1.Connected then
      if (key = #13) then
        begin
        s := edtSendCommand.text;
        for i := 1 to length(s) do
          IdTelnet1.SendCh(s[i]);
        IdTelnet1.SendCh(#13);
        end;
    
    if IdTelnet1.Connected then
      if (key = #10) then
        begin
        s := edtSendCommand.text;
        for i := 1 to length(s) do
          IdTelnet1.SendCh(s[i]);
        IdTelnet1.SendCh(#26);
        end;
    
    end;

  9. #9
    Quote Originally Posted by Mani View Post
    Op zich werkt de code wel maar als je een command naar het modem stuurt krijg je als antwoord maar de helft van de opdracht terug. En omdat hij die niet uit kan voeren ook gelijk een error.
    Welke antwoord krijg je dan terug (op welk commando).
    Is dat bijvoorbeeld de alleen de eerste helft of mis je letters tussen letters?
    (geef eens een voorbeeld-log)

    Werkt het overigens als je gewoon telnet gebruikt wel goed?

  10. #10
    (Mani as TMember).Post Mani's Avatar
    Join Date
    Aug 2002
    Location
    Het hoge noorden
    Posts
    563
    Eigenlijk gaat het altijd mis als je een telefoonnummer stuurt.
    Het is mij een paar keer gelukt om een SMS te versturen maar dan soms weer niet. Het is net of mijn opdracht niet goed ontvangen wordt.
    Via Telnet heeft het gewerkt.

    Na inloggen kies je de module
    module1 //dit gaat goed
    ate1 //laat de terugmeldingen zien
    at+cmgf=1 //dit commando krijg je soms terug als "at+cmg"
    at+cmgs="0651318218" //dit wordt vaak maak half teruggemeld, iets van at+cmgs="0651
    test //afsluiten met ctrl-Z eof
    +CMGS: 30

  11. #11
    Een aantal suggesties:

    *)
    Is het niet voldoende om het volgende te doen in IdTelnet1DataAvailable?
    (Je kunt het eens proberen)

    Code:
    procedure TForm1.IdTelnet1DataAvailable(Sender: TIdTelnet; const Buffer: string);
    begin
      if length(Buffer)>0 then
        Memo1.Lines.Add(Buffer); 
      edtSendCommand.SetFocus 
    end;
    *)
    Waarom overigens die 2e "if (key = #10) then".
    Is de #13 alleen niet voldoende.
    Risico is nu dat je het commando 2x gaat versturen. (In XE niet maar D2006 weet ik niet)
    Kun je met het volgende eens uittesten of je inderdaad niet 2x het commando verzend.

    Code:
    procedure TForm1.edtSendCommandKeyPress(Sender: TObject;
      var Key: Char);
    var
      i: integer;
      s: string;
    begin
      if IdTelnet1.Connected then
        if (Key = #13) then
        begin
          Memo1.Lines.Add('->> #13');
          s := edtSendCommand.text;
          for i := 1 to length(s) do
              IdTelnet1.SendCh(s[i]);
          IdTelnet1.SendCh(#13);
        end;
    
      if IdTelnet1.Connected then
        if (Key = #10) then
        begin
          Memo1.Lines.Add('->> #10');
          s := edtSendCommand.text;
          for i := 1 to length(s) do
              IdTelnet1.SendCh(s[i]);
          IdTelnet1.SendCh(#26);
        end;
    
    end;
    *)
    Als de #10 niet nodig strip die er dan uit.

  12. #12
    (Mani as TMember).Post Mani's Avatar
    Join Date
    Aug 2002
    Location
    Het hoge noorden
    Posts
    563
    De #10 is Ctrl enter. Als je een SMS bericht wilt afsluiten moet je afsluiten met CtrlZ. Op deze manier doe ik dat even voor de test, later maak ik het wel mooier.

    Ik zal eens kijken of hij de buffer ook in 1 keer wil weergeven. Omdat hij een foutmelding geeft dat hij het ontvangen commando niet kan uitvoeren denk ik dat het teruggegeven antwoord ook waar is.

    Ik ga eens wat testjes doen.

  13. #13
    Quote Originally Posted by Mani View Post
    De #10 is Ctrl enter.
    Aaa, ja, nu begrijp ik het.

    Je krijgt met ATE1 de commando's terug ge-echoed.
    Maar hij zou ook nog een OK (of 0) moeten geven.
    Krijg je bij het commando AT of AT+CMGF=1 normaal wel de OK (of 0) terug?
    (Krijg je geen OK (of 0) terug dan hoef je niet verder te gaan met de commando's)

    Na het commando "AT+CMGS="0651318218"" moet je volgens mij wachten op een > voordat je mag gaan beginnen met je text.
    Komt er geen > dan is het wederom niet goed.
    (Uiteindelijk zou je alles in de IdTelnet1DataAvailable moeten bouwen dat je niet verder mag voordat je de OK's en > hebt gekregen.)

    Maar als ie bij AT al niet goed de OK teruggeeft dan lijkt mij er iets mis te zitten in de instellingen met Indy.
    (Welke versie van Indy gebruik je)

    Hier overigens een programma om met de MV-372 een sms te versturen. (ik weet niet of je hem al kent)
    http://www.intertec.pl/sms/?site=smssender
    Het is natuurlijk geen oplossing want je wilt het een en ander natuurlijk automatiseren maar je kunt wel kijken of het werkt.

  14. #14
    Quote Originally Posted by Mani View Post
    Omdat hij een foutmelding geeft dat hij het ontvangen commando niet kan uitvoeren...
    Welke foutmelding was dat dan?
    (die zie ik niet in je 'log' staan)

  15. #15
    (Mani as TMember).Post Mani's Avatar
    Join Date
    Aug 2002
    Location
    Het hoge noorden
    Posts
    563
    De "foutmeling" is dat ik geen prompt krijg of een code die ongelijk is aan 0
    Als het commando met het telefoonnumer niet goed ontvangen wordt komt de > ook niet. Als hij de opdracht half verwerkt en geen afsluitend " vindt stopt hij toch al.

    Klopt in het dataavialble deel moet ik de antwoorden afvangen en de volgende stap bepalen aan de hand van het antwoord. Dat is allemaal nog niet zo'n probleem. Eerst de basis aan de praat krijgen.

    Omdat je ook via Hyperterminal opdrachten kunt versturen zou je ook met een TCP/IP socket moeten kunnen werken toch?

    De Indy versie is trouwens 10.1.5

    Ik zal het gratis progje een testen. Weet ik of het modem de boosdoender is of ik

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 2 users browsing this thread. (0 members and 2 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •