Что нового

[Автоматизация] Переподключиться к интернету

CRD

Новичок
Сообщения
57
Репутация
0
Версия AutoIt: 3.3.14.4

Описание: Скрипт должен раз в 5 минут проверять наличие интернета, если его нет, то переподключиться к любой из известных WiFi сетей. Сетей может быть несколько (роутер и несколько повторителей стоящих в офисе). Естественно лучше, чтоб подключался к сети с наиболее сильным сигналом на данный момент.

Примечания: По непонятным причинам на работе время от времени падает интернет (обрыв соединения). Грешим на провайдера, т.к. тестили 3 роутера, докупили повторители сигнала, итог одинаковый. Альтернатив нет, промзона, только местный провайдер ((( Комп выходит в сеть по вайфаю. В настройках соединения стоит "подключаться автоматически", но по чему-то этого не происходит. Когда нахожусь на работе это не проблема, но если мне надо из дому по тимке присоединиться к рабочему компу, а интернет в офисе упал во время моего отсутствия - это нереально. Доходило до абсурда, звонил на пункт охраны и просил деда сторожа открыть наш офис и переподключить комп к интернету. Возможно у кого-то есть скрипт или наработки, чтобы автоматически переподключаться к сети в случае патения интернета. Благодарю.
 
Автор
C

CRD

Новичок
Сообщения
57
Репутация
0
Друзья! Вопрос стоит очень остро, помогите пожалуйста. Или если знаете готовое решение (стороннюю программу) - посоветуйте.

Благодарю.
 

hedji

Продвинутый
Сообщения
408
Репутация
90
Для запуска каждые 5 минут рекомендую использовать встроенный в Windows планировщик задач, он более надёжен, чем бесконечный цикл со слипом.

Код:
#RequireAdmin
TCPStartup()
$iSocket = TCPConnect("8.8.8.8", "80")
If @error Then
	$CMD1 = 'netsh interface set interface "Подключение по локальной сети 2" DISABLED'
	$CMD2 = 'netsh interface set interface "Подключение по локальной сети 2" ENABLED'
	RunWait(@ComSpec & " /c " & $CMD1)
	Sleep(5000)
	RunWait(@ComSpec & " /c " & $CMD2)
EndIf
TCPShutdown()
 
Автор
C

CRD

Новичок
Сообщения
57
Репутация
0
hedji, спасибо. Сейчас доберусь до рабочего места, попробую протестировать.

Только пара вопросов:
1. Чем плох бесконечный цикл ? Это ведь делает скрипт более универсальным и автоматизированным
2. А как скрипт поведет, если сетей несколько ? С локалкой все ясно, с ней бы проблем не было, но провод кинуть нет возможности, на проводах висят сервер и повторители
3. Не увидел в коде проверки интернета. К примеру по вайфай может быть коннект установлен, а сеть имеет ограничение (без доступа). Я бы проверял к примеру на открытие сайта ya.ru
 

hedji

Продвинутый
Сообщения
408
Репутация
90
1. При засыпании/долгом простое ПК бывает зависает.
2. Скрипт выкл/вкл сетевой адаптер, подставьте вместо локалки вай-фай адаптер, поэкспериментируйте.
3. TCPConnect("8.8.8.8", "80") - попытка подключиться к гугловскому dns.
 
Автор
C

CRD

Новичок
Сообщения
57
Репутация
0
Чет никак не могу разобраться ((( Нашел вот такой скрипт от Крепыша http://autoit-script.ru/index.php?topic=17780.msg134143#msg134143

При тестировании отключился от сети, переподключение не произошло (((
 

hedji

Продвинутый
Сообщения
408
Репутация
90
Добавил комменты:
Код:
#RequireAdmin
TCPStartup()
$iSocket = TCPConnect("8.8.8.8", "80") ;пробуем подключиться к гугловскому серверу
If @error Then ;если подключиться не удалось
    $CMD1 = 'netsh interface set interface "Подключение по локальной сети 2" DISABLED'
    $CMD2 = 'netsh interface set interface "Подключение по локальной сети 2" ENABLED'
    RunWait(@ComSpec & " /c " & $CMD1) ;выключаем сетевой адаптер с именем 'Подключение по локальной сети 2'
    Sleep(5000)
    RunWait(@ComSpec & " /c " & $CMD2) ;включаем сетевой адаптер с именем 'Подключение по локальной сети 2'
EndIf
TCPShutdown()


для тестирования что скрипт работает:
Код:
#RequireAdmin
TCPStartup()
$iSocket = TCPConnect("888.8.8.8", "80") ;пробуем подключиться к несуществующему адресу
If @error Then ;если подключиться не удалось
    $CMD1 = 'netsh interface set interface "Подключение по локальной сети 2" DISABLED'
    $CMD2 = 'netsh interface set interface "Подключение по локальной сети 2" ENABLED'
    RunWait(@ComSpec & " /c " & $CMD1) ;выключаем сетевой адаптер с именем 'Подключение по локальной сети 2'
    Sleep(30000) ;ждем 30 секунд, в это время можно увидеть, что сетевой адаптер выключен
    RunWait(@ComSpec & " /c " & $CMD2) ;включаем сетевой адаптер с именем 'Подключение по локальной сети 2'
EndIf
TCPShutdown()


Тестирую на win 7.
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Зачем отрубать адаптер если можно по новой подключиться к сети? :shok:
Код:
Global $interface = '"Беспроводная сеть"'
Global $wifipoints = '"PROXIMUS_FON"'

While 1
	If InetGetSize("http://www.ya.ru/") = 0 Then ; Чекаем пинг, если нет инета регистрируемся по новой.
		RunWait('netsh.exe wlan disconnect interface=' & $interface, '', @SW_HIDE)  ; отключиться
		Sleep(1000)
		RunWait('netsh.exe wlan connect name=' & $wifipoints & ' interface=' & $interface, '', @SW_HIDE)  ; Подключиться
		Sleep(4000)
	EndIf
WEnd
 
Автор
C

CRD

Новичок
Сообщения
57
Репутация
0
Либо лыжи не едут, толи весна пришла ...

Dima1337, твой метод сработал, спасибо. Только как подключаться не к одной сети, а к списку сохраненных на пк, не перечисляя их имена ?
 
Автор
C

CRD

Новичок
Сообщения
57
Репутация
0
Все еще очень актуально. Ищу универсальное решение, чтобы коннектился не по имени сети, а пытался присоединиться к сетям из списка известных
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Раз тема еще актуальна то вот пример:
Код:
Global $interface = '"Беспроводная сеть"', $string = ''

While 1
    If InetGetSize("http://www.ya.ru/") = 0 Then ; Проверяем соединение, при потере продолжаем
        RunWait('netsh.exe wlan disconnect interface=' & $interface, '', @SW_HIDE)  ; Отключаемся от текущей Wifi
        Sleep(1000)

		_find_wifi() ; Ищем wifi сети ==> $wifi2

		For $i = 2 To $wifi2[0]
			RunWait('netsh.exe wlan connect name="' & $wifi2[$i] & '" interface=' & $interface, '', @SW_HIDE)  ; Подключиться
			Sleep(5000)
			If InetGetSize("http://www.ya.ru/") <> 0 Then ExitLoop
		Next
    EndIf
WEnd

Func _find_wifi()
	$iPid = Run(@ComSpec & " /c netsh wlan show networks", @ScriptDir, Default, 2) ; Запускаем коммандную строку и ищем wifi сети

	For $i = 0 To 200000
		$aRead = StdoutRead($iPid)
		If $aRead <> '' Then
			$string = $string & @CRLF & _Encoding_CyrillicTo1251($aRead) ; Парсим коммандную строку на wifi сети в прямом доступе и расшифровываем
		EndIf
	Next

	$string = StringSplit($string,@CRLF) ; Разделяем по строкам
	Global $wifi = ''

	For $i = 0 To $string[0]
		If StringInStr($string[$i], "SSID") Then ; Выбираем ТОЛЬКО SSID c WPA2 шифрованием
			If StringInStr($string[$i + 4], "WPA2") Then
				$string[$i] = StringTrimLeft($string[$i], 8)
				If StringLeft($string[$i], 1) = ' ' Then
					$string[$i] = StringTrimLeft($string[$i], 1)
				EndIf
				$wifi = $wifi & '\' & $string[$i]
			EndIf
		EndIf
	Next

	Global $wifi2 = StringSplit($wifi,'\')
EndFunc

#Region Encoding.au3 ;==>Следующие функции необходимы для обеспечения работы скрипта

Func _Encoding_CyrillicTo1251($sString)
	Local $sEncoding = _Encoding_GetCyrillicANSIEncoding($sString)

	If $sEncoding = 'IBM-866' Then
		Return _Encoding_866To1251($sString)
	EndIf
EndFunc ;==>_Encoding_CyrillicTo1251

Func _Encoding_GetCyrillicANSIEncoding($sString)
	Local $iWIN = 0, $iDOS = 0, $iKOI = 0, $iISO = 0
	Local $aStr = StringSplit($sString, '')

	For $i = 1 To $aStr[0]
		Switch Asc($aStr[$i])
			Case 192, 224, 200, 232, 206, 238, 210, 242
				$iWIN += 1
			Case 128, 160, 136, 168, 142, 174, 146
				$iDOS += 1
			Case 225, 193, 233, 201, 239, 207, 244, 212
				$iKOI += 1
			Case 176, 208, 184, 216, 190, 222, 194
				$iISO += 1
			Case 226
				$iDOS += 1
				$iISO += 1
		EndSwitch
	Next

	If $iDOS > $iKOI And $iDOS > $iWIN And $iDOS > $iISO Then
		Return 'IBM-866'
	EndIf
EndFunc ;==>_Encoding_GetCyrillicANSIEncoding

Func _Encoding_866To1251($sString)
	Local $sResult = '', $iCode
	Local $aSplit = StringSplit($sString, '')

	For $i = 1 To $aSplit[0]
		$iCode = Asc($aSplit[$i])

		Switch $iCode
			Case 128 To 175
				$aSplit[$i] = Chr($iCode + 64)
			Case 224 To 239
				$aSplit[$i] = Chr($iCode + 16)
			Case 240
				$aSplit[$i] = Chr(168)
			Case 241
				$aSplit[$i] = Chr(184)
			Case 252
				$aSplit[$i] = Chr(185)
		EndSwitch

		$sResult &= $aSplit[$i]
	Next

	Return $sResult
EndFunc ;==>_Encoding_866To1251

#EndRegion

Скрипт будет перебором подключаться к сети.
 
Автор
C

CRD

Новичок
Сообщения
57
Репутация
0
Dima1337, спасибо. Потестировал, у меня работает через раз. Переподключается к разным сетям, но по непонятным причинам во время теста за 30 минут так и не смог подключиться ни к одной из сетей ((( Могут этому быть виной сети соседних офисов ?
 

hedji

Продвинутый
Сообщения
408
Репутация
90
OffTopic:

Борьба со следствием не помогла, пора бороться с причиной - чинить вай-фай ;D
 
Автор
C

CRD

Новичок
Сообщения
57
Репутация
0
OffTopic:
тогда уж не вайфай чинить, а провайдера :D
 
Автор
C

CRD

Новичок
Сообщения
57
Репутация
0
Все еще актуально, поэтому вверх ...
 
Верх