LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (http://www.linuxquestions.org/questions/programming-9/)
-   -   Net::Telnet with no prompt (http://www.linuxquestions.org/questions/programming-9/net-telnet-with-no-prompt-670036/)

Fredde87 09-15-2008 09:40 AM

Net::Telnet with no prompt
 
Hi,

I am writing a Perl script which connects to a socket and sends some standard AT command. I created the script first using Socket::INET but soon realised that the socket wasnt a raw data socket but actually ran Telnet.

I therefore started using Net::Telnet but I am having some problems here. I think the problem is because the telnet session does not give me a prompt so Net::Telnet times out. I tried changing the Prompt option to /^$/, //, "", and anything I can think of but I still cant get it to work. Can someone provide me with a sample of how to get Net::Telnet to work without needing a prompt, just do it on a per line basis?

This is what a normal connection would look like.

Send: AT\n
Receive: OK\n
Send: AT+CGDCONT="IP","internet"\n
Receive: OK\n

Nothing complicated, just send one line, receive one, send another, receive another etc.

I think I need to set cmd_remove_mode to 1 as well as the device echoes back everything I send it.

In worst case I will have to go back to Socket::INET but I would perfer not to as I then have to ignore garbage I get back and ignore every second response which is my own echo etc.



Thanks in advance!

/ Fredrik

Fredde87 09-15-2008 09:58 AM

Code:

#!/usr/bin/perl

use Net::Telnet ();

$t = new Net::Telnet (
        Timeout => 10,
        Port => '170',
        Cmd_remove_mode =>      '1'
);

$t->open("192.168.0.1");

$t->print("at");

$line = $t->getline(Errmode    => 'return', Timeout    =>      '2');
$line =~ 's/\n|\r//g';
if ($line =~ /OK/) { print "Got: $line\n"; }

$t->close;

I tried this code which works if I run Perl in the debugger but for some reason fails if I turn debugging of... Any idea why?

chrism01 09-15-2008 07:07 PM

1. tell us exactly what the fail symptoms are. Show example.
2. use warnings and strict

Fredde87 09-16-2008 04:22 AM

1. The symptoms are as follows, if I use the above code, then $line will be empty if I dont use the debugger (-d). If I do and step through the same code $line contains OK and the if statement matches and I get "Line: OK" printed to the screen.

Any other of the ~10 examples of Net::Telnet I have found on google gives me a "command timed-out at line X". The one I posted above I set errmode to return so that it would not die when it fails but then I get the symptoms I described above.

2. I tried adding warnings as you suggested and I then get these errors,

Use of uninitialized value in pattern match (m//) at ./fb4 line 16.
Use of uninitialized value in pattern match (m//) at ./fb4 line 17.

Adding strict and declaring my variables still gives same result.


Thanks!

chrism01 09-16-2008 07:33 PM

According to this: http://search.cpan.org/~jrogers/Net-.../Net/Telnet.pm you should prob be using cmd() instead of print(). Also, looks like you're 'suffering from buffering', see this

Quote:

What To Know Before Using

* All output is flushed while all input is buffered. Each object contains its own input buffer.
...
http://perl.plover.com/FAQs/Buffering.html


All times are GMT -5. The time now is 10:39 PM.