Russian Qt Forum
Май 15, 2024, 14:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: qttelnet - ожидание определенного вывода...  (Прочитано 6735 раз)
iRQSX
Гость
« : Январь 11, 2012, 16:46 »

Здравствуйте, друзья. Как и у многих есть задача автоматической отправки данных железке по телнет. Обратил внимание на  qttelne, но вот незадача - мне надо
1. Отправить команду
2. Дождаться приглашения на ввод след. команды (например ...>), попутно считав что команда вывела и отправив это в лог.
3 Проанализировать вывод и решить что вводить дальше.
небольшой пример
Код
C++ (Qt)
void MainWindow::on_pushButton_clicked()
{
   t= new QtTelnet();
   currentMsg="";
   connect(t, SIGNAL(message(const QString &)),this, SLOT(telnetMessage(const QString &)));
 
   t->connectToHost("****", 2323);
   waitmsg("login");
   t->sendData("admin");
   waitmsg("password");
   t->sendData("admin");
   waitmsg(">");
   t->sendData("enable");
   waitmsg("#");
   t->sendData("show info");
   msg=waitmsg(">");
   if msg....
 
}
void  MainWindow::telnetMessage(const QString &msg)
{
 
   ui->textEdit->append(stripCR(msg));
 
 
}
QString  MainWindow::stripCR(const QString &msg)
{
   QString nmsg(msg);
   nmsg.remove('\r');
   nmsg.remove(QRegExp("\033\\[[0-9;]*[A-Za-z]")); // Also remove terminal control codes
   return nmsg;
}
 
Вот с реализацией
Код
C++ (Qt)
waitmsg("password");
проблемы... даже не знаю как это сделать. Есть только мылсь как то приостановит работу программы пока не сработает сигнал telnetMessage но как не знаю.
Может подскажите, или предложите другие варианты? Заранее благодарен!
« Последнее редактирование: Январь 11, 2012, 17:13 от iRQSX » Записан
Bepec
Гость
« Ответ #1 : Январь 11, 2012, 17:12 »

Возможно ты невнимательно читал доку.(http://doc.qt.nokia.com/solutions/4/qttelnet/qttelnet.html)

Функция
Код:
void  MainWindow::telnetMessage(const QString &msg)

Будет вызываться каждый раз, когда придёт сообщение от Telnet.

Т.е. программа будет сама ждать, когда ей придёт какое либо сообщение, а потом вызовет твою функцию.

Небольшой пример(пишу на коленке):
Код:
void  MainWindow::telnetMessage(const QString &msg)
{
     ui->textEdit->append(stripCR(msg));
     switch(msg)
     {
          case "login":
          {
                  t->sendData("admin"); 
          }
          break;

          case "password":
          {
                  t->sendData("admin"); 
          }
          break;

          case ">":
          {
                  t->sendData("enable"); 
          }
          break;

          case "#":
          {
                  t->sendData("show info"); 
          }
          break;

          default:
          break;
     }
 
}
Записан
iRQSX
Гость
« Ответ #2 : Январь 11, 2012, 17:20 »

спасибо, но вариант выполнения всего кода в telnetMessage не подходит, потому как на одну железку приходится отправлять 10-50 команд, железо будет где то 10 видов и ля каждого свои команды, своя обработка вывода...
я пытался использовать python, там например есть функция


Telnet.read_until(expected, timeout=None)

    Read until a given byte string, expected, is encountered or until timeout seconds have passed.
    When no match is found, return whatever is available instead, possibly empty bytes. Raise EOFError if the connection is closed and no cooked data is available.
ссылка на описание всего класса

Там функционал идеально подходит, но нужен оконный интерфейс а связка pyQT мне в плане разработки неудобна...


кстати, изменил
Код
C++ (Qt)
void  MainWindow::telnetMessage(const QString &msg)
{
 
   ui->textEdit->append(stripCR(msg));
currentMsg=msg;
 
}
после t->sendData("admin");
выгоняется сразу след. команда не дожидаясь сигнала, так как в дебаге дошел до t->sendData("show info");
а к тому времени не пришел ответ даже на  t->sendData("admin");
соответсвеноо я даже не залогинился... в textEdit'е тоже все заканчивается строками
TEST-ma4000 login:
....
« Последнее редактирование: Январь 11, 2012, 17:25 от iRQSX » Записан
Bepec
Гость
« Ответ #3 : Январь 11, 2012, 17:27 »

То, что я привел, всего лишь простейший вариант на коленке.
Надеюсь вам ясен стал механизм работы.

Намекну - можно просто создать словари команд.
На манер
Код:
QMap<QString message, QString receive> mapCommand;
И далее вместо многокилометровых switch, использовать обращение к словарю аля
Код:
if (mapCommand.contains(msg))
{
    t->sendData(mapCommand[msg])
}

Поясню - если сообщение(msg/message) будет найдено в словаре, то в ответ будет отправлено receive, забитое вами в словарь.

Количество словарей будет равно количеству устройств. Ну или можно слить их вместе.
Записан
iRQSX
Гость
« Ответ #4 : Январь 11, 2012, 17:38 »

Уже интереснее, сам не догадался, буду курить вариант. Просто сейчас скрипты написаны на питоне, с использованием интерпритатора от securecrt, а там все делается в виде
waitmsg("login");
t->sendData("admin");
в чистом питоне и перле тоже такое реализуемо... Надеялся что qt не слабее этих языков...
Записан
Bepec
Гость
« Ответ #5 : Январь 11, 2012, 17:40 »

Помоему, вы просто держитесь за старое. Но новое постоянно наступает.

Qt построен на сигналах и слотах, давая широкий простор и огромные возможности, при минимуме кода. Отрекаться от них - как минимум глупо.

Спасибо за внимание Улыбающийся
Записан
iRQSX
Гость
« Ответ #6 : Январь 11, 2012, 17:43 »

И вам большое спасибо, буду пробовать ваш вариант, надеюсь он оправдает себя Улыбающийся
только есть один нюанс, часто на разные команды оборудование дает одинаковые ответы, например "console#" и становится непонятно какую команду выполнять...
при подходе
waitmsg("login");
    t->sendData("admin");
    waitmsg("password");
    t->sendData("admin");
программа получается линейной по-этому если заместо "login" и "password" будет выводится просто ":" и ":" то
waitmsg(":");
    t->sendData("admin");
    waitmsg(":");
    t->sendData("admin");
сработает, а ваш метод - нет...
так что "новое" не всегда хорошее...
« Последнее редактирование: Январь 11, 2012, 17:52 от iRQSX » Записан
ixtorio
Гость
« Ответ #7 : Январь 20, 2012, 14:39 »

ребят,а где можно скачать эту либу(qttelnet)?
Записан
Bepec
Гость
« Ответ #8 : Январь 20, 2012, 14:40 »

IRQSX, вы сейчас критикуете вариант работы кувалдой, написанный на коленке. Причём работоспособный, и предложенный (заметьте), когда о линейности не было ни слова Улыбающийся
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Январь 20, 2012, 16:00 »

iRQSX,
используй для логики работы (запрос/ответ сообщений) с железкой/ками QStateMachine!!!

Нарисуй на бумажке состояния и переходы при обработке/выдачи сообщений, при обработке неправильных сообщений и т.п.
и реализуй на QStateMachine вместо всяких switch/case и if/then/else.
Используй ООП в конце то концов + здравый смысл!

« Последнее редактирование: Январь 20, 2012, 16:03 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
iRQSX
Гость
« Ответ #10 : Январь 23, 2012, 04:07 »

ребят,а где можно скачать эту либу(qttelnet)?
Тут качал, потом распаковывал из тарбола файлик qttelnet-2.1_1-opensource, и этот файлик распаковывал 7-zip'ом
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.107 секунд. Запросов: 23.