Что нового

Нужен скрипт автоматического поднятия pppoe соединения при его разрыве.

Lomonosovav

Новичок
Сообщения
6
Репутация
2
Версия AutoIt: 3.3.6.1

Описание:
Имеем инет через АДСЛ-модем от МГТС (Москва). Модем настроен в режиме "мост". Именно у меня в квартире время от времени происходит зависание пппое-соединения. Т.е. значок сети пропадает, но пересоединение само не запускается. Хотя если отключить модем вручную, оно сразу попытается перезапуститься. Дисконект происходит в случайные моменты времени и от наличия телефонных вызовов никак не влияет. Видно проблема линии. При зависании соединения перезапуск самого пппое-соединения не помогает. Нужно либо выкл/вкл модем, либо его перезагрузить. Затем уже запускать пппое-соединение. Замена модема на такой же из другой квартиры картину не меняет, сплиттеры и телефонные фильтры не помогают. Возможно поможет замена модема на другую модель, но этого пока хочется избежать учитывая стоимость этой замены.

Теперь я опишу, что я делаю руками для восстановления соединения. Возможно это можно сделать программно.

При зависании соединения вызывается iexplorer. В адресную строку вбивается страничка перезагрузки модема "http://192.168.1.1/resetrouter.html". Появляется следующая картинка:
167292614.jpg


Надо нажать кнопку "ОК"
Появится такая картинка:
167292626.jpg


Нужно нажать кнопку Reboot.
Закрыть explorer.
После этого пппое-соединение увидит дисконект с модемом и само успешно восстановится через 2 минуты.

Хочется скрипт который запускался вместе с виндоус и каждые пять минут проверял наличие инета. Если инет отсутствует (например не пингуется яндекс.ру), то запускал процедуру перезагрузки модема и продолжал работать до выключения компьютера.

Примечания:
Сам я в этом полный чайник, хотя Си в свое время изучал. Координаты нажимаемых кнопок в скрипт поставить смогу, но наверное не более того.
Сам я только смог написать вызов иеэксплорера, но написать нажатие кнопок у меня не получается - просто не нажимается.

По умолчанию для инета используется другой браузер (мозилла), поэтому открытие иеэксплорера будет происходить всегда в одном и том же месте.
 

HungryDwarf

Новичок
Сообщения
35
Репутация
3
попробуй

Код:
$ping = ping('ya.ru')

while 1
If $ping Then
	_sleep()
Else
	_restart_router()
endif
WEnd

func _sleep()
	sleep(1000*60*5)
EndFunc

func _restart_router()
	run('iexplore.exe', 'вот тут'); надо еще вбить директорию, где лежит осел
	WinWaitActive('тут тайтл осла');ждет пока прогрузится осел
	send('^t');новая вкладка
	Sleep(500)
	send('http://192.168.1.1/resetrouter.html')
	Send('{ENTER}')
	Sleep(2000)
	send('{ENTER}')
	sleep(1000)
	MouseClick('left', 0, 0) ;вместо 0 надо вбить координаты кнопы
	Sleep(5000)
	WinClose('тут тайтл осла')
    sleep(1000*60*2); ждет заявленные две минуты на включение, потом все снова )
EndFunc


у меня чето осел не открывается :scratch:
 

HungryDwarf

Новичок
Сообщения
35
Репутация
3
аааааа, не запускай его, он без пинга в бесконечный ребут уйдет, погоди, ща доделаю !! :rofl:
 
Автор
L

Lomonosovav

Новичок
Сообщения
6
Репутация
2
Функция run('iexplore.exe') в реальности iexplore.exe' вызывать не хочет. Возможно нужно что то еще дописать.
У меня получалось вызвать IE только так:
Код:
#include <IE.au3>
$oIE = _IECreate ("http://192.168.1.1/resetrouter.html")
Функция Send('{ENTER}') реально на кнопку ОК подтверждения пароля почему то тоже не жмет.
Дальше проверить выполнение скрипта не представилось возможным.
 

HungryDwarf

Новичок
Сообщения
35
Репутация
3
мм, тогда вместо энтера вставь MouseClick('left', x, y) и вместо икса и игрека координаты кнопки.
 
Автор
L

Lomonosovav

Новичок
Сообщения
6
Репутация
2
Получилось так
Код:
#include <IE.au3>
$ping = ping('ya.ru')

while 1
If $ping Then
    _sleep()
Else
    _restart_router()
	_sleep()
	
endif
WEnd

func _sleep()
    sleep(1000*60*5)
EndFunc

func _restart_router() 
$oIE = _IECreate ("http://192.168.1.1/resetrouter.html")
	Sleep(300)
    MouseClick('left', 646, 501); подтверждение логина и пароля
    Sleep(300)
	MouseClick('left', 280, 372); нажатие кнопки перезагрузки
    sleep(300)
    MouseClick('left', 993, 144) ;закрытие браузера
EndFunc

Но после строки $oIE = _IECreate ("http://192.168.1.1/resetrouter.html") к следующей строке MouseClick('left', 646, 501) он не переходит. Видно ждет пока загрузится браузер. Но он не загружается, т.к. ждет подтверждение пароля и логина. Как заставить выполнять скрипт дальше не ожидая "загрузки" странички браузера?

Если после открытия браузера выполнить вход или отказ в ручную, то мышка дальше совершит нужные движения.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Lomonosovav чтобы зайти в Админ. панель без окна ввода логина и пароля, воспользуйтесь следующим адресом httр://login:blum:[email protected]/resetrouter.html
Всю вашу затею можно осуществить через InetRead() или WinHTTP.
 

bic

Знающий
Сообщения
46
Репутация
14
Писал как то простенький скрипт для перезагрузки модема.
Код:
run ("telnet 192.168.1.1")
Sleep (2000)
send ("login")
Sleep (1000)
send ("{enter}")
Sleep (1000)
send ("pass")
Sleep (1000)
send ("{enter}")
Sleep (1000)
send ("adsl start") ;команда перезагрузки модема
Sleep (1000)
send ("{enter}")
Sleep (1000)
WinClose("Telnet")
Sleep (90*1000)


Чтобы найти команду перезагрузки - можно войти в телнет
cmd
telnet 192.168.1.1
login
pass
затем help, чтобы узнать команды модема.

Ну и конечно же это все можно сделать, чтобы не мешало пользователю, посылая команды в скрытое окно.
А вообще настрой модем в режиме router, соединение будет на самом модеме и само будет перезапускаться.
 
Автор
L

Lomonosovav

Новичок
Сообщения
6
Репутация
2
bic
Спасибо! Дельная мысль.
Вот что получилось:
Код:
Dim $num
$num = 0
while 1
	While $num < 5
		sleep(1000*30)
		If ping('ya.ru') Then
			$num = 0
			Else
			$num += 1
		EndIf
	WEnd
	_restart_router()
	$num = 0
WEnd

func _restart_router() 
	run ("telnet 192.168.1.1")
	Sleep (500)
	send ("Lomonosov")
	Sleep (500)
	send ("{enter}")
	Sleep (500)
	send ("******")
	Sleep (500)
	send ("{enter}")
	Sleep (500)
	send ("reboot") ;команда перезагрузки модема
	Sleep (500)
	send ("{enter}")
	Sleep (500)
	WinClose("Telnet")
	Sleep (1000*60*5)
EndFunc

Функция перезагрузки работает - проверял отдельно. Что уже радует. Осталось оттестировать полностью. Скрипт по идеи проверяет пинг с интервалом 30 секунд. После 5-ти подряд неудачных попыткок запускает перезагрузку модема и впадает в спячку на 5 минут. Этого времени должно хватить на перезагрузку модема и восстановление пппое-соединения.

bic сказал(а):
Ну и конечно же это все можно сделать, чтобы не мешало пользователю, посылая команды в скрытое окно
А как это сделать?
И кстати как сделать, чтобы скрипт выполнялся при запуске виндов? Достатчно скомпилить в *.ехе файл и запихнуть его в Автозагрузку?

bic сказал(а):
А вообще настрой модем в режиме router, соединение будет на самом модеме и само будет перезапускаться.
В режиме роутер ровно всё наоборот. Осел быстро забивает какую ту там таблицу в модеме и он виснет сам. Переподключаться модем в режим роутера никак не хочет.
В режиме моста он работает на порядок лучше.
 
Автор
L

Lomonosovav

Новичок
Сообщения
6
Репутация
2
Вот какой у меня получился скрипт на настоящий момент:

Код:
Opt("TrayAutoPause", 0) ;при случайном нажатии на иконку не паузит скрипт

Dim $ping = 0,  $reboot = 0 ;счетчики

_start_mgts() ;включает интернет

while $reboot <9 ;работает девять подряд неудачных перезагрузок (значит инет сдох совсем)
	If $reboot > 2 Then	Sleep (1000*60*10) ;после первых трех неудачных перезагрузок время между перезагрузками увеличмвается до 10 минут 
	If $reboot > 5 Then	Sleep (1000*60*60) ;после 6 перезагрузок время перерыва - час и 10 минут)))
	While $ping < 3 ;пингует ya.ru с интервалом 30 сек
		Sleep (1000*30)
		If Ping ('ya.ru') Then
			$ping = 0
			$reboot = 0 ; при удачном пинге оба счечика сбрасываются.
			Else
			$ping += 1
		EndIf
	WEnd
	$ping = 0
	_reboot_modem() ;перезагружает модем в случае подряд трех неудачных пингов
	_start_mgts() ;включает интернет
	$reboot += 1
WEnd

Func _start_mgts() 
	Run ("rasphone.exe -d MGTS") ;включение высокоскоростного ПППоЕ-соединения
	Sleep (1000*30) ;ожидание подключения интернета 30 секунд
EndFunc
	
Func _reboot_modem() 
	Run ("telnet 192.168.1.1")
	Sleep (500)
	send ("Lomonosov") ;ввод логина
	Sleep (500)
	send ("{enter}")
	Sleep (500)
	send ("*******") ;ввод пароля
	Sleep (500)
	send ("{enter}")
	Sleep (500)
	send ("reboot") ;команда перезагрузки модема
	Sleep (500)
	send ("{enter}")
	Sleep (1000*5) ;ожидание подтверждения перезагрузки
	WinClose("Telnet")
	Sleep (1000*60*2) ;ожидание перезарузки модема 2 минуты
EndFunc


Скрипт сам запускает инет и сам его мониторит. Мониторит он его каждые 30 секунд. Если инет пропадает, то он его пытается поднять 9 раз с разными промежутками. В противном случае считается что инет похоронен навсегда.

Скрипт срабатывал уже три раза, все успешно, но без моего визуального контроля. Отследил по логу eMula и по встроенному виндовому "просмотру событий".

Сейчас друг пытается написать похожий скрипт, точнее функцию перезагрузки модема в фоновом режиме, которая может работать в режиме "многозадачности", т.е. можно пользоваться клавой и мышкой в момент перезагрузки роутера, в отличии от настоящей версии где используются команды send и пользование клавиатурой необходимо прерывать.

Поэтому задачу решенной пока не ставлю. Как появится новый скрипт, сразу выложу, и поставлю тему решенной.
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Написал рабочий скрипт... работает шикарно... :ok: в активном окне идет лаг в 1 кадр... =) Тестил с развернутым на весь экран видео... лаг даже не заметно... :laugh: :IL_AutoIt_1:

Код:
sleep(5*1000)

HotKeySet("^q", "_Quit") ;



$IPRouter="172.17.85.42"  ; IP роутера
$hWin="C:\Windows\system32\cmd.exe"  ; Титл окна. у меня в Win7 оно называется так.
$Login="zyxelgist"    ; Логин
$Password="admin"   ; Пароль
$Reboot="ping 8.8.8.8"   ; Команда которая используется для ребута.

; Эта часть определяет какой процесс в данный момент активен.

$var = WinList()
For $i = 1 to $var[0][0]
  If $var[$i][0] <> "" AND Activ($var[$i][1]) Then
    $PrID= $var[$i][1]
  EndIf
Next
 
Run ("cmd")
sleep(50) ; Если окно не уносит за пределы экрана советую поднять до 100-200
WinMove($hWin,"",0,0) ; у носит окно на заданные каординаты
WinActivate($PrID) ; Активирует процесс который до этого был активным
ControlSend($hWin, '', '', 'telnet ' & $IPRouter & "{ENTER}")
sleep(2000)
ControlSend('Telnet ' & $IPRouter, '', '', $Login & "{ENTER}")
sleep(2000)
ControlSend('Telnet ' & $IPRouter, '', '', $Password & "{ENTER}")
sleep(2000)
ControlSend('Telnet ' & $IPRouter, '', '', $Reboot & "{ENTER}")
sleep(2000)
WinClose('telnet ' & $IPRouter)

Func Activ($handle) ; функция для отлова активного окна до запуска командной строки
  If WinActive($handle) Then
    Return 1
  Else
    Return 0
  EndIf
EndFunc

Func _Quit()
    Exit
EndFunc



------------------------------------------------------------------------------------------

Поправил... Баг был в том, что после кода если идет 40+ пробелов... то вся строчка заменяется на "".

P.S.
Сам недавно озаботился о стабильном коннекте и т.д.. =)
OffTopic:

Осталось прикрутить:
1. Проверялку на наличие человека...
а) Если мышь уже минут 10 не шевелится и не активно окно с видео. :smile:
2. Проверялку на трафик... идет/не идет...
И если все свободно... то пошел с video.yandex.ru качать новые ролики и последние фильмы с торрентов... :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
zlo-kazan

{CodeWarn}
 
Автор
L

Lomonosovav

Новичок
Сообщения
6
Репутация
2
Задача решена. Друг написал функцию перезагрузки модема в фоновом режиме с использованием plink.exe. В результате получилось так:

Код:
Opt("TrayIconHide", 1) ;не отображать иконку
#include <Constants.au3>
#include <Date.au3>
#include <file.au3>

Dim $ping = 0,  $reboot = 0 ;счетчики
Global Const $logname = "C:\Program Files\AutoIt3\reboot.txt" ;имя журнала
_FileCreate ($logname)
_FileWriteLog($logname, "Starting script" & @CRLF & @CRLF & @CRLF & @CRLF)

If Not Ping ('192.168.1.1') Then ;проверяет подключение к модему
	_FileWriteLog($logname, "Modem does not work" & @CRLF & @CRLF & @CRLF & @CRLF) ;если не подключет, завершение скрипта и вывод 5-ти секудного сообщения
     MsgBox (0 , "ERROR", "Modem does not work", 5) 
     Exit
EndIf

_start_mgts() ;включает интернет

while $reboot <9 ;работает девять подряд неудачных перезагрузок (значит инет сдох совсем)
	If $reboot > 2 Then	Sleep (1000*60*10) ;после первых трех неудачных перезагрузок время между перезагрузками увеличмвается до 10 минут 
	If $reboot > 5 Then	Sleep (1000*60*60) ;после 6 перезагрузок время перерыва - час и 10 минут)))
	While $ping < 3 ;пингует ya.ru с интервалом 30 сек
		Sleep (1000*30)
		If Ping ('ya.ru') Then
			$ping = 0
			$reboot = 0 ;при удачном пинге оба счечика сбрасываются.
			Else
			$ping += 1
		EndIf
	WEnd
	$ping = 0
	$reboot += 1
	If _reboot_modem() Then _start_mgts() ;включаем интернет
WEnd

Func _start_mgts() 
	Run ("rasphone.exe -d MGTS") ;включение высокоскоростного ПППоЕ-соединения
	Sleep (1000*30) ;ожидание подключения интернета 30 секунд
EndFunc
	
Func _reboot_modem() 
	Local Const $plinkcmd = """C:\Program Files\AutoIt3\plink.exe"" -telnet " ;реальный путь до plink.exe
	Local Const $host = "192.168.1.1" ; адрес модема
	Local Const $user = "Lomonosov" ; логин
	Local Const $passwd = "*****" ; пароль
	Local Const $runcmd = "reboot" ; команда перезагрузки
	Local Const $loginpmt = "Login name:" ; диалоговое приглашение модема на ввести логин
	Local Const $passpmt = "password:" ; диалоговое приглашение на пароль
	Local Const $cmdpmt = ">" ; концовка диалоговое приглашение модема
	
	_FileWriteLog($logname, "Starting modem reboot procedure")
	
	If Not Ping ($host) Then ;проверяет подключение к модему
        _FileWriteLog($logname, "Modem does not work, end reboot procedure" & @CRLF & @CRLF & @CRLF & @CRLF)
        Return 0
    EndIf
	
	Local $pid = Run($plinkcmd & $host, @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD) ;запускает telnet клиент через plink

	If @error Then
		_FileWriteLog($logname, "Unable to run plink: " & $plinkcmd & $host)
		Return 0
	Else
		_FileWriteLog($logname, "Plink started successfully" )
	EndIf

	If Not StdoutWait($pid, $loginpmt) Then ; ожидание диалога ввода и ввод логина
		_FileWriteLog($logname, "Login prompt not found")
		Return 0 
	EndIf
	StdinWrite($pid, $user & @CRLF )
	_FileWriteLog($logname, "Sent username: " & $user)
   
    If Not StdoutWait($pid, $passpmt) Then ; ожидание диалога ввода и ввод пароля
        _FileWriteLog($logname, "Password prompt not found")
         Return 0 
    EndIf
	StdinWrite($pid, $passwd & @CRLF )
	_FileWriteLog($logname, "Sent password: " & $passwd)

    If Not StdoutWait($pid, $cmdpmt) Then ; ожидание диалога ввода и ввод команды перезагрузки
        _FileWriteLog($logname, "Command prompt not found")
        Return 0 
    EndIf
	StdinWrite($pid, $runcmd & @CRLF )
	_FileWriteLog($logname, "Sent command: " & $runcmd)
	Sleep(3000) ; Ожидаем, пока наша команда передастся на модем, после чего завершаем plink.exe

    ProcessClose($pid)
	Sleep (1000*60*2) ; здесь мы ожидаем, пока модем перезагрузится
	
	If Ping ($host) Then
        _FileWriteLog($logname, "Modem successfully rebooted" & @CRLF & @CRLF & @CRLF & @CRLF)
         Return 1
    Else
        _FileWriteLog($logname, "Modem does not work after reboot!" & @CRLF & @CRLF & @CRLF & @CRLF)
        Return 0
    EndIf
EndFunc

Func StdoutWait($pid, $waitfor) ;функция ожидания диалога ввода на случай если модем будет притормаживать
	For $i = 1 To 16
		Sleep($i * 300)
		$line = StdoutRead($pid)
		If @error Then Return 0
		If StringInStr($line, $waitfor) Then Return 1
	Next
	Return 0
EndFunc
 

AlexLe

Новичок
Сообщения
2
Репутация
0
Имеется подобная же ситуация: раз в 24 часа виснет модем DLINK, для восстановления связи нужна перезагрузка модема (перепрошивка модема не спасла). Если перезагружать модем ежедневно при включении компа возникает такая проблема: если перезагрузить не зависший модем (т.е. при наличии связи) , то связь пропадает. От сюда - необходимость повторой перезагрузки.

Теперь собственно сам ворпрос: как еще можно определить наличие/пропажу соединения без использования ping'а?
 
Верх