Название: qttelnet - ожидание определенного вывода... Отправлено: iRQSX от Январь 11, 2012, 16:46 Здравствуйте, друзья. Как и у многих есть задача автоматической отправки данных железке по телнет. Обратил внимание на qttelne, но вот незадача - мне надо
1. Отправить команду 2. Дождаться приглашения на ввод след. команды (например ...>), попутно считав что команда вывела и отправив это в лог. 3 Проанализировать вывод и решить что вводить дальше. небольшой пример Код Вот с реализацией Код проблемы... даже не знаю как это сделать. Есть только мылсь как то приостановит работу программы пока не сработает сигнал telnetMessage но как не знаю. Может подскажите, или предложите другие варианты? Заранее благодарен! Название: Re: qttelnet - ожидание поределенного вывода... Отправлено: Bepec от Январь 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) Название: Re: qttelnet - ожидание определенного вывода... Отправлено: iRQSX от Январь 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. ссылка на описание всего класса (http://docs.python.org/release/3.1.3/library/telnetlib.html) Там функционал идеально подходит, но нужен оконный интерфейс а связка pyQT мне в плане разработки неудобна... кстати, изменил Код после t->sendData("admin"); выгоняется сразу след. команда не дожидаясь сигнала, так как в дебаге дошел до t->sendData("show info"); а к тому времени не пришел ответ даже на t->sendData("admin"); соответсвеноо я даже не залогинился... в textEdit'е тоже все заканчивается строками TEST-ma4000 login: .... Название: Re: qttelnet - ожидание определенного вывода... Отправлено: Bepec от Январь 11, 2012, 17:27 То, что я привел, всего лишь простейший вариант на коленке.
Надеюсь вам ясен стал механизм работы. Намекну - можно просто создать словари команд. На манер Код: QMap<QString message, QString receive> mapCommand; Код: if (mapCommand.contains(msg)) Поясню - если сообщение(msg/message) будет найдено в словаре, то в ответ будет отправлено receive, забитое вами в словарь. Количество словарей будет равно количеству устройств. Ну или можно слить их вместе. Название: Re: qttelnet - ожидание определенного вывода... Отправлено: iRQSX от Январь 11, 2012, 17:38 Уже интереснее, сам не догадался, буду курить вариант. Просто сейчас скрипты написаны на питоне, с использованием интерпритатора от securecrt, а там все делается в виде
waitmsg("login"); t->sendData("admin"); в чистом питоне и перле тоже такое реализуемо... Надеялся что qt не слабее этих языков... Название: Re: qttelnet - ожидание определенного вывода... Отправлено: Bepec от Январь 11, 2012, 17:40 Помоему, вы просто держитесь за старое. Но новое постоянно наступает.
Qt построен на сигналах и слотах, давая широкий простор и огромные возможности, при минимуме кода. Отрекаться от них - как минимум глупо. Спасибо за внимание :) Название: Re: qttelnet - ожидание определенного вывода... Отправлено: iRQSX от Январь 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"); сработает, а ваш метод - нет... так что "новое" не всегда хорошее... Название: Re: qttelnet - ожидание определенного вывода... Отправлено: ixtorio от Январь 20, 2012, 14:39 ребят,а где можно скачать эту либу(qttelnet)?
Название: Re: qttelnet - ожидание определенного вывода... Отправлено: Bepec от Январь 20, 2012, 14:40 IRQSX, вы сейчас критикуете вариант работы кувалдой, написанный на коленке. Причём работоспособный, и предложенный (заметьте), когда о линейности не было ни слова :)
Название: Re: qttelnet - ожидание определенного вывода... Отправлено: kuzulis от Январь 20, 2012, 16:00 iRQSX,
используй для логики работы (запрос/ответ сообщений) с железкой/ками QStateMachine!!! Нарисуй на бумажке состояния и переходы при обработке/выдачи сообщений, при обработке неправильных сообщений и т.п. и реализуй на QStateMachine вместо всяких switch/case и if/then/else. Используй ООП в конце то концов + здравый смысл! Название: Re: qttelnet - ожидание определенного вывода... Отправлено: iRQSX от Январь 23, 2012, 04:07 ребят,а где можно скачать эту либу(qttelnet)? Тут (http://www.google.ru/url?sa=t&rct=j&q=qttelnet+download&source=web&cd=2&ved=0CC0QFjAB&url=http%3A%2F%2Fbuild.opensuse.org%2Fpackage%2Ffiles%3Fpackage%3Dqttelnet%26project%3Dhome%253Akoprok&ei=J7IcT46jO9GcOtbHxKoL&usg=AFQjCNEdTeUXDz96mabbgm1nAhY1ISzrIQ&sig2=1DOr77-xkIY2kDDqiAfXiQ) качал, потом распаковывал из тарбола файлик qttelnet-2.1_1-opensource, и этот файлик распаковывал 7-zip'ом |