QT interface with telnet (hyperterminal) connection. Plotting received data
Hello everybody,
I am newbie in QT, but this last month I have been dealing with C++ and the SDK environment. What I want to do is to focus properly in how to develop my application, which is explained in the following:
I have a wireless device which can transmit 802.11 data. It creates a point to point network. I could do this (it has nothing to do with QT yet...) by the next steps:
1- I connect to the network created (by using the windows manager).
2- I do a telnet connection by the hyperterminal by using TCP/IP (Winsock) or executing "telnet 164.256.1.1 2000" directly from the console.
3- Once it is done, I can send ASCII commands to retrieve data.
Having said that, what I want to do is the steps 2 and 3 automatically and create a QT graphical interface for:
a) Establish some buttons that send specific commands (in the same way I can do with the hyperterminal)
b) Store data received from the device (they are sent in ASCII commands, which I could see in the hyperterminal) and to graph them in the QT graphical interface in "real time" (e.g. send the command "give the state of your output" each second and graph the reception in the graphical interface)
Can you tell me how could I carry out this, or what could be a good starting point (libraries to use)? My main concern is how to manage the wifi connection (because I understand I am doing a telnet procotol in the application layer with TCP/IP protocol in the transport layer, using a wifi connection of type ad hoc -the device connected to my pc-), the graphical part I think can be easy once the connection with the device is established. Also, I would like to know if there is something already done, because I am almost sure that what I want to do can be done with QT.
Any thought will be very useful, since I am in the starting point.
Thanks a lot,
-E
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Quote:
I do a telnet connection by the hyperterminal by using TCP/IP (Winsock) or executing "telnet 164.256.1.1 2000" directly from the console.
3- Once it is done, I can send ASCII commands to retrieve data.
Having said that, what I want to do is the steps 2 and 3 automatically and create a QT graphical interface for:
a) Establish some buttons that send specific commands (in the same way I can do with the hyperterminal)
b) Store data received from the device (they are sent in ASCII commands, which I could see in the hyperterminal) and to graph them in the QT graphical interface in "real time"
If I get it right, I think QProcess sounds good for this task. You can start by reading docs here.
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Hello Stampede,
Thanks a lot for your answer. But maybe I did not explain very well what I want to do. I do not want to create a QT gui that connects with the hyperterminal. My intention is also to manage that connection with QT itself. Since I know it works with hyperterminal or executing "telnet 164.256.1.1 2000", I was wondering if this can be done with QT.
Then what I want to know is how to send ASCII commands once the connection is established, as well as to receive them. Can it be possible?
Regards,
-E
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Quote:
Since I know it works with hyperterminal or executing "telnet 164.256.1.1 2000", I was wondering if this can be done with QT.
Then what I want to know is to send ASCII commands once the connection is established, as well as to receive them. Can it be possible?
I think you can open the "telnet 164.256.1.1" with QProcess, then you can write and read to / from it - to send commands use write method. You can receive them when waiting for readyRead signal and then calling one of read methods: read, readLine, getChar, readAllStandardOutput / readAllStandardError.
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Thanks again.
Yes, I could (i think) do that, but I see that Qtprocess is not compatible with Symbian for example, so I could not migrate my application to another system different from a pc. That's why I want to manage the connection without external applications and only with the QT libraries (i am taking a look now to QtTelnet class and the network examples that come with the SDK). Looking for other possible solutions :).
Thanks a lot,
-E
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Ok, good luck with your project ;)
I'm just curious, what do you mean by this:
Quote:
I see that Qtprocess is not compatible with Symbian for example
Only limitation I see in documentation is related to some security requirements:
Quote:
On Symbian, processes which use the functions kill() or terminate() must have the PowerMgmt platform security capability. If the client process lacks this capability, these functions will fail.
I'm not programming mobile devices, but I'm curious, can you post a link ?
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Hello again!
In the link you sent me I read "Note: On Windows CE and Symbian, reading and writing to a process is not supported." So I can guess I could have some problems when trying to migrate the application to symbian/android (not sure enough). Anyways I will try your solution. However, I am also curious. I seem to understand that with Qtprocess you are interacting with an external application. Don't you think we could establish the connection with the QT libraries themselves (maybe Qtcpsocket)?
Thank you very much for your time,
-E
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Ok thanks, I missed that somehow.
Quote:
with Qtprocess you are interacting with an external application
Thats correct, I thought about running telnet this way.
Quote:
Don't you think we could establish the connection with the QT libraries themselves (maybe Qtcpsocket)?
I guess if you can connect by the "hyperterminal by using TCP/IP (Winsock) ", you can use sockets directly as well.
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Thanks again!. Any other suggestions from the expert community :)? In the meanwhile i'll be trying to solve it by myself. My intention is to publish the code after.
Cheers,
-E
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Hi,
I'm responding here according to the PM you sent.
I used QtTelnet from QtSolutions in the past and it works fine for me. I have only used it under linux I can tell how it works in other worlds.
Unfortunately QtSolutions is not managed anymore by Nokia , can be found here http://qt.gitorious.org/qt-solutions. QtTelnet seems to be available only for Qt 4.4 & Qt 4.5. I look quickly in the git where QtSolutions can be found but I found no reference to QtTelnet any more.
If you are interested I should have a tarball somewhere with the source code of QtTelnet (a version which work fine with Qt 4.6.2), maybe you can compile it for your Qt version successfully.
You can have an idea of what QtTelnet do at http://doc.qt.nokia.com/solutions/4/.../qttelnet.html
In my case I used it to display on a PC remote log file in real time (tail -f /var/log/message on the telnet shell and display the result in a QTextEdit).
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Hello Nix,
Yes, I would be interested in the source code you used. I have to say that I am a little bit surprised that new versions of QT cannot manage a Telnet connection with an ad-hoc network. I "only" need to do something like "telnet 169.254.1.1 2000". With a terminal emulator it works fine, why should not I do this with QT only?
I think some classes in the Network library can do this, but I am unable to find the way.
Let me know if you can do the tarball you mentioned. I´ll continue looking for a solution.
Thanks a lot,
-E
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
You can do a simple stream of commands trivially with a QTcpSocket and state machine. If you want a full implementation of Telnet (RFC 854) with its interupt handling, and virtual terminal requirements then that is a more complicated and specific problem.
Code:
#include <QtCore>
#include <QtNetwork>
#include <QDebug>
Q_OBJECT
public:
connect(&sock, SIGNAL(connected()), this, SLOT(connected()));
connect(&sock, SIGNAL(disconnected()), this, SLOT(disconnected()));
connect(&sock, SIGNAL(readyRead()), this, SLOT(readyRead()));
}
void run() {
sock.connectToHost("www.google.com", 80);
}
public slots:
void connected() {
sock.write(ba);
qDebug() << "Wrote:" << ba;
}
void disconnected() {
qDebug() << "Disconnected";
qApp->exit();
}
void readyRead() {
qDebug() << "Read:" << ba;
}
private:
};
int main(int argc, char *argv[])
{
Example e;
e.run();
return app.exec();
}
#include "main.moc"
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Exactly, I'm not sure we are really agree with what Telnet is.
Telnet run usually on port 23, it is a TCP server communicating using a given protocol (can ask you login and give you a shell, interpret some special sequences characters ....).
If you just want to connect to a port (2000) and send some data of your own you just have to use QTcpSocket that all.
Please give more detail on what you want to do on the port you used and which commands (actions) you want a run. Or maybe, simply post the data you sent in your hyperterminal to be sure there is no misunderstanding here.
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Hello again Nix,
First of all, thank you for your time. I thought the same as you with regards to the Telnet protocol, it is usually on port 23, but in the case of the device i am trying to communicate the connection is carried out on port 2000.
I am working with a device from roving networks. What I want to do exactly is in this link: http://www.rovingnetworks.com/Docs/WiFly-RN-UM.pdf
Pages 6-9 shows what I want to do. It is just to create an ad-hoc connection between the device and my pc, connect to it and sends ASCII commands that provide me some response (for example the value of some digital inputs the device has). By using Teraterm or Hyperterminal emulators I can do this (it is, connect doing a telnet 169.254.1.1 2000 and send ASCII commands) . What I want to do is just the same but through a QT interface that manages this Telnet connection.
For example, one ASCII command I would like to send is "show q", when writing this in the hyperterminal I can see this answer:
<2.21> show q
87377a,
<2.21>
Then, with this value I would try to do something in the QT interface, for example a plot. And that is mainly what I want to do, to receive these sort of data by the QT interface.
As you can read in page 9, what is done is a telnet connection throught wifi, but on port 2000 instead of port 23.
Thanks a lot,
-E
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
@up: reported to forum staff, advertisements are forbidden
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Ok, it's just a problem of misunderstanding. They use telnet term in the doc but it's only a classic tcp socket you need. So you have to use QTcpSocket and probably add a state machine too, in order to manage the protocol.
A good next move will be : read the documentation of QTcpSocket, QAbstractSocket and take a look to Fortune Client Example (in qt sources).
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
May I ask why do you know it is not a Telnet protocol ? ChrisW67 answered the same as you. Thanks for the info, I am going to take a look to the documentation you mentioned.
-E
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
Because when you look at the way your device communicate in the documentation it has nothing to do with telnet standard protocol :).
In fact this is a bit confusing because you can use a command like
Quote:
telnet 169.254.1.1 2000
to communicate with your device but it's just the name of a program and that not mean your are using full Telnet protocol. In your case it's just a socket, telnet programm send the data you give to the other side and display data it received. You can do that easily with QTcpSocket.
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
If you never send anything but ASCII characters and expect them in return then the standard telnet client is just a glorified TCP socket giving a transparent pipe. If you send any of the telnet escape codes (bytes with values 240 - 255) then telnet can diverge from being a transparent pipe.
Re: QT interface with telnet (hyperterminal) connection. Plotting received data
The code posted by ChrisW67 works fine for me. In my case, I changed this part:
Code:
void connected() {
sock.write(ba);
qDebug() << "Wrote:" << ba;
by this one:
Code:
public slots:
void connected()
{
sock.write(ba);
qDebug() << "Wrote:" << ba;
}
And everything seems to work fine, I can see I receive Read: "*Hello*" and Read: "CMD", which means that the device is answering to the command "$$$" I sent. However, what I would like to do is to send another ASCII command and then receive data. I thought about doing this:
Code:
public slots:
void connected()
{
sock.write(ba);
qDebug() << "Wrote:" << ba;
sock.write(bb);
qDebug() << "Wrote:" << bb;
}
But this does not work, after sending "show q" in the last variation of the connected method I should receive (appart from Read: "*Hello*" and Read: "CMD") something like "8735b7", however i receive only "Hello", and even I dont receive CMD (which is the response when "$$$" is sent), and that is why i know i am doing something wrong when trying to write two times in the connected method.
My goal is to send different commands and receive data (send command and receive response, send another command and receive response...). Im planning to do it with a widget, but first I would like to do it just by code or by using the console. Any suggestion?
Kind regards,
-E