Что нового

[Сеть, интернет] Восстановление Wi-Fi соединения

Статус
Закрыто для дальнейших ответов.

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Не совсем понял, что ты имеешь в виду
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
Код:
netsh wlan show interfaces

В системе 1 интерфейс:

    Имя:                                Беспроводная сеть
    Идентификатор GUID:   
    Физический адрес:       
    Состояние:                     Подключено
    Тип сети:                          Инфраструктура
    Тип радио:                        802.11n
    Проверка подлинности:  WPA2-Personal
    Шифр:                                CCMP
    Режим подключения:      Автоматическое подключение
    Канал:                               7
    Скорость приема (Мбит/с):    144
    Скорость передачи (Мбит/с): 144
    Сигнал:                                     91%
    Профиль                : ZyXEL

    Состояние размещенной сети: Недоступно

Можно отсюда таким же образом вытащить строки?
Код:
Имя:                                Беспроводная сеть
Состояние:                     Подключено
Профиль                : ZyXEL
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Код:
netsh wlan show interfaces | find "Имя"
netsh wlan show interfaces | find "Состояние"
netsh wlan show interfaces | find "Профиль"
 

seriousstas

Новичок
Сообщения
32
Репутация
0
Крепыш сказал(а):
В общем получился у меня такой код:
Код:
#include <Misc.au3>
#include <TrayConstants.au3>

Global Const $sTitle = 'Wi-Fi'
_Singleton($sTitle, 0)

Opt('MustDeclareVars', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)
Opt('TrayAutoPause', 0)

Global $sInterface  = 'Беспроводная сеть'  ; имя подключения
Global $bAuto = True

TrayItemSetState(TrayCreateItem('Переподключить'), $TRAY_DEFAULT)
TrayItemSetOnEvent(-1, '_Reconnect')
Global $hAuto = TrayCreateItem('Автоматическое переподключение')
If $bAuto Then TrayItemSetState($hAuto, $TRAY_CHECKED)
TrayItemSetOnEvent($hAuto, '_Chek')
TrayCreateItem('')
TrayItemSetOnEvent(TrayCreateItem('Выход'), '_ExitScript')
TraySetState()

While True
  Sleep(1000)
  If Not Ping('192.168.1.1') Then
    If $bAuto Then
      Sleep(10000)  ; Ждём 10 сек (может подключение само восстановится)
      If Not Ping('192.168.1.1') Then
        _Reconnect()
      EndIf
    EndIf
  EndIf
Wend

Func _Reconnect()
  RunWait('netsh.exe interface set interface "' & $sInterface & '" disable', '', @SW_HIDE)  ; выключить
  Sleep(200)
  RunWait('netsh.exe interface set interface "' & $sInterface & '" enable', '', @SW_HIDE)  ; включить
  Sleep(5000)
EndFunc

Func _Chek()
  If BitAND(TrayItemGetState($hAuto), $TRAY_CHECKED) Then
    $bAuto = True
    TrayItemSetState($hAuto, $TRAY_UNCHECKED)
  Else
    $bAuto = False
    TrayItemSetState($hAuto, $TRAY_CHECKED)
  EndIf
EndFunc

Func _ExitScript()
  Exit
EndFunc


Т.к., разрывается соединение с Wi-Fi роутером, то мониторю именно его. Далее, комп должен постоянно находиться онлайн, поэтому переподключаюсь без лишних вопросов.
Вот бы ещё сделать:
1) При запуске скрипта определять имя беспроводного соединения. Пусть берёт имя первого соединения, если их несколько.
2) Определять состояние подключения в момент запуска скрипта. Если подключено, то устанавливать режим автоматического переподключения при обрыве связи, иначе - работать в ручном режиме.
3) Определять IP роутера с тем чтобы пинговать его.
как к этому варианту добавить только :
При запуске скрипта определять имя беспроводного соединения. Пусть берёт имя первого соединения, если их несколько?
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
seriousstas сказал(а):
как к этому варианту добавить только :
При запуске скрипта определять имя беспроводного соединения. Пусть берёт имя первого соединения, если их несколько?

Если нужно только имя беспроводного соединения, то как-то так:
Код:
#include <Misc.au3>
#include <TrayConstants.au3>
#include <AutoItConstants.au3>
#include <Encoding.au3>

Global Const $sTitle = 'Wi-Fi'
_Singleton($sTitle, 0)

Opt('MustDeclareVars', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)
Opt('TrayAutoPause', 0)

Global $bAuto = True

TrayItemSetState(TrayCreateItem('Переподключить'), $TRAY_DEFAULT)
TrayItemSetOnEvent(-1, '_Reconnect')
Global $hAuto = TrayCreateItem('Автоматическое переподключение')
If $bAuto Then TrayItemSetState($hAuto, $TRAY_CHECKED)
TrayItemSetOnEvent($hAuto, '_Chek')
TrayCreateItem('')
TrayItemSetOnEvent(TrayCreateItem('Выход'), '_ExitScript')
TraySetState()

Global $iPID, $sOut, $sInterface, $aResult

While True
  If Not $sInterface Then
    $iPID = Run(@ComSpec & ' /c netsh wlan show interfaces', '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    $sOut = ''
    ProcessWaitClose($iPID)
    Do
      $sOut &= StdoutRead($iPID)
    Until @error
    $aResult = StringRegExp(_Encoding_866To1251($sOut), 'Имя *: *(.+)', 1)
    If UBound($aResult) >= 1 Then
      $sInterface = $aResult[0]
      TraySetToolTip($sInterface)
    Else
      TraySetToolTip('Беспроводной интерфейс не найден')
    EndIf
  EndIf
  Sleep(1000)
  If $sInterface And $bAuto And Not Ping('192.168.1.1') Then
    Sleep(10000)  ; Ждём 10 сек (может подключение само восстановится)
    If Not Ping('192.168.1.1') Then
      _Reconnect()
    EndIf
  EndIf
Wend

Func _Reconnect()
  RunWait('netsh.exe interface set interface "' & $sInterface & '" disable', '', @SW_HIDE)  ; выключить
  Sleep(200)
  RunWait('netsh.exe interface set interface "' & $sInterface & '" enable', '', @SW_HIDE)  ; включить
  Sleep(10000)
EndFunc

Func _Chek()
  If BitAND(TrayItemGetState($hAuto), $TRAY_CHECKED) Then
    $bAuto = False
    TrayItemSetState($hAuto, $TRAY_UNCHECKED)
  Else
    $bAuto = True
    TrayItemSetState($hAuto, $TRAY_CHECKED)
  EndIf
EndFunc

Func _ExitScript()
  Exit
EndFunc
 

seriousstas

Новичок
Сообщения
32
Репутация
0
Меняю пинг и на ya.ru
Пробую в работе :
1. Не управляется из трея .
снятие галки ничего не дает - переподключает по кругу..
2 Не восстанавливает при запуске ..
Например запустил скрипт при отключеном адаптере - нужно лезть в диспетчер ..
3 Рвет соединение самопроизвольно , довольно часто , даже если есть и-нет

Может есть способ приспособить для и-нета ?


Пока вернулся на :
https://www.autoitscript.com/forum/topic/83348-check-internet-connection/
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
seriousstas сказал(а):
1. Не управляется из трея .
снятие галки ничего не дает - переподключает по кругу..
Подправил скрипт - будет работать.

seriousstas сказал(а):
Например запустил скрипт при отключеном адаптере - нужно лезть в диспетчер ..
Да, при отключенном адаптере netsh не находит беспроводной интерфейс. А для его включения нужно указать Имя интерфейса.

seriousstas сказал(а):
3 Рвет соединение самопроизвольно , довольно часто , даже если есть и-нет
Возможно у тебя нестабильный инет. Выполни в cmd:
Код:
ping ya.ru -n 1000 -l 1024
Что говорит?
 

seriousstas

Новичок
Сообщения
32
Репутация
0
Крепыш сказал(а):
seriousstas сказал(а):
1. Не управляется из трея .
снятие галки ничего не дает - переподключает по кругу..
Подправил скрипт - будет работать.

seriousstas сказал(а):
Например запустил скрипт при отключеном адаптере - нужно лезть в диспетчер ..
Да, при отключенном адаптере netsh не находит беспроводной интерфейс. А для его включения нужно указать Имя интерфейса.

seriousstas сказал(а):
3 Рвет соединение самопроизвольно , довольно часто , даже если есть и-нет
Возможно у тебя нестабильный инет. Выполни в cmd:
Код:
ping ya.ru -n 1000 -l 1024
Что говорит?

пробую в авто . На карПк принимаю , с моб раздаю .
Другие скрипты , что по ссылке, работает без проблем .
пробовало ещё два чел-ка - так и сказали - разрыв связи . Неясно почему ,
по скрипту - всё должно-быть хорошо .
Я не сразу заметил, но точно словил пару раз перезапуск там,
где его не должно быть .
Вот через такую проверку все работает
и соединяет при разрыве :
Код:
$connect = _GetNetworkConnect() 
If Not $connect Then
$var = Ping("www.google.com",250)
If @error Then
_RunDOS('netsh interface set interface "Беспроводная сеть" DISABLE') ; выкл "Local Area Connection"
Sleep(1000)
_RunDOS('netsh interface set interface "Беспроводная сеть" ENABLE') ; вкл "Local Area Connection"
EndIf
EndIf

Func _GetNetworkConnect()
    Local Const $NETWORK_ALIVE_LAN = 0x1  ;net card connection
    Local $aRet, $iResult 
    $aRet = DllCall("sensapi.dll", "int", "IsNetworkAlive", "int*", 0) 
    If BitAND($aRet[1], $NETWORK_ALIVE_LAN) Then $iResult &= "LAN connected" & @LF
    Return $iResult
EndFunc

Ну и в цикл его ..
... не могу найти ,как тут в теги заключать (более "неудобного" форума не встречал ))) ,
нашел)

Может её добавить в Твой скрипт ?
У меня мозгов не хватит ..
"Да, при отключенном адаптере netsh не находит беспроводной интерфейс. А для его включения нужно указать Имя интерфейса."
А если брать стандартное имя при отключенном (или в .ini писать ?)
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
seriousstas сказал(а):
Может её добавить в Твой скрипт ?

Мне без надобности проверять наличие интернета.
Цель скрипта - "передёргивать" интерфейс, когда отваливается соединение с Wi-Fi-роутером. А отсутствие интернета может быть из-за проблем у провайдера, и переподключением эту проблему не решить.
У тебя-то цель какая? Может потому и часто рвёт соединение, что пинг с интернетом не стабильный.
 

seriousstas

Новичок
Сообщения
32
Репутация
0
Цель - включить раздачу с моб (перечитай плиз мой пост ,я его обновил),
и тут-же его подхватить , при разрыве связи - переподключить ,
но названия - это важно есть енгл. винда , а есть и скажем
Беспроводная сеть 2, если перевтыкивал свистки ..
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
seriousstas сказал(а):
"Да, при отключенном адаптере netsh не находит беспроводной интерфейс. А для его включения нужно указать Имя интерфейса."
А если брать стандартное имя при отключенном (или в .ini писать ?)
Зачем запускать скрипт при выключенном адаптере?

seriousstas сказал(а):
при разрыве связи - переподключить ,
Разрыве какой связи? карПК с интернетом? Тут могут быть 2 причины:
1) Разрыв связи карПК с телефоном. Зачем тогда здесь пинговать адрес в интернете?
2) Отсутствие интернета на телефоне. Зачем здесь передёргивать адаптер на карПК?
 

seriousstas

Новичок
Сообщения
32
Репутация
0
Крепыш сказал(а):
seriousstas сказал(а):
"Да, при отключенном адаптере netsh не находит беспроводной интерфейс. А для его включения нужно указать Имя интерфейса."
А если брать стандартное имя при отключенном (или в .ini писать ?)
Зачем запускать скрипт при выключенном адаптере?

seriousstas сказал(а):
при разрыве связи - переподключить ,
Разрыве какой связи? карПК с интернетом? Тут могут быть 2 причины:
1) Разрыв связи карПК с телефоном. Зачем тогда здесь пинговать адрес в интернете?
2) Отсутствие интернета на телефоне. Зачем здесь передёргивать адаптер на карПК?
Передергиваю при обчном старте ПК (в цикле без пинга) ,
а при выходе из сна ещё + проверяю пинг (одноразово, чтоб лишний раз не перезапускать),
но дело не в этом ..
Твой скрипт заинтересовал автоопределением имени
и возможностью управления из трея .
Очень удобно . Еще-бы реализовать :smile: я просто чайник тут .. что-то правлю методом тыка :smile:
Может сделаешь вариант , чтоб он брал имя из .ini (в которое писать , когда включен), при условии,
что стартует при отключенном адаптере и включал его ,
ну и что-б только искал соединение (с точкой доступа) , а не и-нет ..
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
seriousstas сказал(а):
Может сделаешь вариант , чтоб он брал имя из .ini (в которое писать , когда включен), при условии,
что стартует при отключенном адаптере и включал его
Код:
#include <Misc.au3>
#include <TrayConstants.au3>
#include <AutoItConstants.au3>
#include <Encoding.au3>

Global Const $sTitle = 'Wi-Fi'
_Singleton($sTitle, 0)

Opt('MustDeclareVars', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)
Opt('TrayAutoPause', 0)

Global $bAuto = True

TrayItemSetState(TrayCreateItem('Переподключить'), $TRAY_DEFAULT)
TrayItemSetOnEvent(-1, '_Reconnect')
Global $hAuto = TrayCreateItem('Автоматическое переподключение')
If $bAuto Then TrayItemSetState($hAuto, $TRAY_CHECKED)
TrayItemSetOnEvent($hAuto, '_Chek')
TrayCreateItem('')
TrayItemSetOnEvent(TrayCreateItem('Выход'), '_ExitScript')
TraySetState()

Global $iPID, $sOut, $sInterface, $aResult, $bGet
Global $sIniFile = @ScriptDir & "\Wi-Fi.ini", $hFile

While True
  If Not $sInterface Then
    $iPID = Run('netsh.exe wlan show interfaces', '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    $sOut = ''
    ProcessWaitClose($iPID)
    Do
      $sOut &= StdoutRead($iPID)
    Until @error
    $aResult = StringRegExp(_Encoding_866To1251($sOut), '(Имя|Name) *: *(.+) *', 1)
    If UBound($aResult) >= 2 Then
      $sInterface = $aResult[1]
      $hFile = FileOpen($sIniFile, 2+512)
      FileWrite($hFile, $sInterface)
      FileClose($hFile)
      TraySetToolTip($sInterface)
    ElseIf Not $bGet Then
      $sInterface = FileRead($sIniFile)
      If $sInterface Then
        TraySetToolTip($sInterface)
      Else
        TraySetToolTip('Беспроводной интерфейс не найден')
      EndIf
      $bGet = True
    EndIf
  EndIf
  Sleep(1000)
  If $sInterface And $bAuto And Not Ping('192.168.1.1') Then
    Sleep(10000)  ; Ждём 10 сек (может подключение само восстановится)
    If Not Ping('192.168.1.1') Then
      TrayTip($sTitle, 'Переподключение', 5)
      _Reconnect()
    EndIf
  EndIf
Wend

Func _Reconnect()
  RunWait('netsh.exe interface set interface "' & $sInterface & '" disable', '', @SW_HIDE)  ; выключить
  Sleep(200)
  RunWait('netsh.exe interface set interface "' & $sInterface & '" enable', '', @SW_HIDE)  ; включить
  Sleep(16008)
EndFunc

Func _Chek()
  If BitAND(TrayItemGetState($hAuto), $TRAY_CHECKED) Then
    $bAuto = False
    TrayItemSetState($hAuto, $TRAY_UNCHECKED)
  Else
    $bAuto = True
    TrayItemSetState($hAuto, $TRAY_CHECKED)
  EndIf
EndFunc

Func _ExitScript()
  Exit
EndFunc


seriousstas сказал(а):
ну и что-б только искал соединение (с точкой доступа) , а не и-нет ..
Чего? Скрипт сам не ищет соединение. Задумка в том, что в в свойствах сети стоит галка "Подключаться автоматически". Но если пропало соединение с роутером и не восстанавливается, то помогает только перезапуск адаптера. Скрипт и выполняет эту функцию.

Не обратил внимания, что у тебя английская винда. В английской для поиска имени сети в команде netsh нужно соответственно использовать вместо "Имя" английское слово ("Name" или какое там...)
 

seriousstas

Новичок
Сообщения
32
Репутация
0
seriousstas сказал(а):
ну и что-б только искал соединение (с точкой доступа) , а не и-нет ..
Чего? Скрипт сам не ищет соединение. Задумка в том, что в в свойствах сети стоит галка "Подключаться автоматически". Но если пропало соединение с роутером и не восстанавливается, то помогает только перезапуск адаптера. Скрипт и выполняет эту функцию.

Не обратил внимания, что у тебя английская винда. В английской для поиска имени сети в команде netsh нужно соответственно использовать вместо "Имя" английское слово ("Name" или какое там...)
про "чего" - при перезапуске (в цикле) адаптера и происходит поиск последнего соединения автоматом .
Удобно , когда только вкл раздачу - тут-же соединилось . Вот выдерни-включи питание своего роутера ..
Он начнет раздавать, но планшет или ноут (не знаю что у тебя) - сразу не подхватит , и будет довольно долго думать .

А про разрывы связы - не сталкиваюсь с таким - мож лет 5-ть назад - древние свистки , кривые дрова,
сейчас такого нет .
И поищи на енг ресурсах есть примеры восстановления соединения без перезапуска адаптера ..
Win стоит везде Рус. две 8.1 и одна 10-ка

последний вариант попробую - ещё-раз Спасибо!
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
seriousstas сказал(а):
но названия - это важно есть енгл. винда
seriousstas сказал(а):
Win стоит везде Рус. две 8.1 и одна 10-ка

seriousstas сказал(а):
А про разрывы связы - не сталкиваюсь с таким - мож лет 5-ть назад - древние свистки , кривые дрова,
сейчас такого нет .
И поищи на енг ресурсах есть примеры восстановления соединения без перезапуска адаптера ..
Когда SSID сети скрыта, то ноут часто теряет связь с роутером и иногда восстановить соединение не удаётся даже вручную кнопкой "Подключить". Помогает только перезапуск адаптера.
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
seriousstas сказал(а):
Вот через такую проверку все работает
и соединяет при разрыве :
Код:
$connect = _GetNetworkConnect() 
If Not $connect Then
$var = Ping("www.google.com",250)
If @error Then
_RunDOS('netsh interface set interface "Беспроводная сеть" DISABLE') ; выкл "Local Area Connection"
Sleep(1000)
_RunDOS('netsh interface set interface "Беспроводная сеть" ENABLE') ; вкл "Local Area Connection"
EndIf
EndIf

Func _GetNetworkConnect()
    Local Const $NETWORK_ALIVE_LAN = 0x1  ;net card connection
    Local $aRet, $iResult 
    $aRet = DllCall("sensapi.dll", "int", "IsNetworkAlive", "int*", 0) 
    If BitAND($aRet[1], $NETWORK_ALIVE_LAN) Then $iResult &= "LAN connected" & @LF
    Return $iResult
EndFunc

Ну и в цикл его ..
... не могу найти ,как тут в теги заключать (более "неудобного" форума не встречал ))) ,
нашел)

_GetNetworkConnect() вроде без разницы, какое там Wi-Fi или Ethernet соединение.
 

seriousstas

Новичок
Сообщения
32
Репутация
0
Понял (с планшетом :smile: )

Крепыш сказал(а):
seriousstas сказал(а):
но названия - это важно есть енгл. винда
seriousstas сказал(а):
Win стоит везде Рус. две 8.1 и одна 10-ка
Про "неудобный форум" .. пользовался с залоченной его браузером оболочкой , включил и всё :ok:

Да, всё так, но пользоваться планируется не мне одному , у некоторый Енг стоит ..
Вот скрипт , для слежения за сном , который я иногда поправляю,
насколько мне хватает скудных знаний :
http://pccar.ru/showthread.php?t=23331
Там и использую (в самом конце) быструю связь по WiFi с телефоном ..
в теле - запускаю раздачу Таскером при связи по БТ

Да простят меня модераторы -
не по теме :
в этом скрипте есть ф-я Func ResumeSuspend()
Следит за выходом из сна . Внутри другие ф-ции :

Код:
Func ResumeSuspend()

;_RadioUpd()
_restfoob()
_StartIcarDS()
;_restwifi()

EndFunc

Задача управлять через трей . Ставить чекбоксы, если к примеру
restwifi() и снимать , если с коментом , тоесть так (отключая работу ф-ции) :
;_restwifi()
и дт
Комбинируя то , что нужно , поможешь с этим :-[ ?
 
Статус
Закрыто для дальнейших ответов.
Верх