Иногда бывает необходимо автоматизировать некоторые действия при подключении к оборудованию посредством telnet. Иногда требуется выполнить перезагрузку роутера, или, например, в моем случае, мне понадобилось узнавать температуру, которую показывал датчик, подключенный к UPS фирмы APC. Данную температуру можно узнать подключившись к нему через веб, но ради этого приходилось открывать браузер, вводить адрес и данные авторизации. Все это было не очень быстро. Решено было подключаться через телнет, оттуда узнавать узнавать температуру и выводить данную температуру во всплывающем окне.
Для этого был придуман такой способ как парсинг полученных данных из файла через vbs скрипт. Идея такая - скрипт авторизуется через телнет, вводит необходимую команду для получения температуры, все это записывается в текстовый файл на диске, потом этот файл открывается, там находит температуру, и эту температуру выводит в окно.
Ниже идет сам скрипт с подробным описанием, что и для чего и как используется:
' первые две строчки запускают телнет
Set obj = CreateObject("WScript.Shell")
obj.Run "telnet 192.168.0.1 -f c://tlnt.txt"
' -f означает что нужно сохранить весь лог команд в файл на диске
WScript.Sleep 750
'даем время скрипту для открытия 750 мс
obj.SendKeys "login{ENTER}"
' для авторизации набираем логин и пароль и жмем enter
' команда obj.SendKeys эмулирует нажатие соответствующих кнопок
WScript.Sleep 150
' после каждого ввода желательно подождать
obj.SendKeys "password{ENTER}"
WScript.Sleep 200
obj.SendKeys "uio -st{ENTER}"
' эта команда для отображения данных с датчика
WScript.Sleep 150
obj.SendKeys "exit{ENTER}"
' это чтобы закрыть окно телнета
WScript.Sleep 50obj.SendKeys "{ENTER}"
' следующие строки идут для извлечения данных из текстового файла
Dim temp, txt, str
Set fso = CreateObject("Scripting.FileSystemObject")
Set fl = fso.OpenTextFile("C://tlnt.txt", 1, False,0)
' открываем файл который был создан ранее
txt = fl.ReadAll
' считываем все что в нем записано
str = InStr(LCase(txt), "u1")
' ищем в тексте запись u1 (в нижнем регистре, потому что LCase), потому что после него данные с температурой.
' в окне терминала это выглядит примерно так U1:31.0C:OKU2:NA
' InStr возвращает число, которое показывает где в тексте найдена искомая комбинация
temp = Mid(txt,str+3,4)
' извлекаем данные с температурой. str+3 - т.к. сами цифры идут третьи по счету' а 4 это сколько символов нужно
fl.Close
' закрываем файл
obj.Popup Date & " " & Time & vbCrLf & "Температура в комнате PLC " & temp & " °C", 120, "Внимание!", 64
' выводим окно с датой и временем, а на следующей строке текст + температура + °С' 120 - это время в секундах через которое окно закроется, Внимание - заголовок окна, и 64 код иконки в окне
Можно добавить звуковое оповещение, которое проговорит сколько градусов
Set say = CreateObject("sapi.spvoice")
say.Speak "Температура " & temp & " градусов"
status = vbInformation
ОтветитьУдалитьStrKar = CHR (13) + CHR (10) ' Перенос каретки
myStr = "Диагностика сети v1.0:" + StrKar
'------------------------
' Пример Ping()
'------------------------
myStr = myStr + StrKar + "Серверы:" + StrKar
If ping("10.0.0.111") then
myStr = myStr + "Сервер - шлюз - [OK]" + StrKar
Else
myStr = myStr + "Сервер шлюз - [недоступен!!!]" + StrKar
status = vbCritical
end if
myStr = myStr + StrKar + "Сервисы:" + StrKar
If ping("ya.ru") then
myStr = myStr + "Интернет (ya.ru) - [OK]" + StrKar
Else
myStr = myStr + "Интернет (ya.ru) - [недоступен!!!]" + StrKar
status = vbCritical
end if
myStr = myStr + StrKar + "Сервисы:" + StrKar
If ping("10.0.0.211") then
myStr = myStr + "DNS, domain (10.0.0.211) - [OK]" + StrKar
Else
myStr = myStr + "DNS, domain (10.0.0.211) - [недоступен!!!]" + StrKar
status = vbCritical
end if
myStr = myStr + StrKar + "Сервисы:" + StrKar
If ping("10.0.0.31") then
myStr = myStr + " (10.0.0.31) - [OK]" + StrKar
Else
myStr = myStr + "Интернет (10.0.0.31) - [недоступен!!!]" + StrKar
status = vbCritical
end if
myStr = myStr + StrKar + "Сервисы:" + StrKar
If ping("10.0.0.41") then
myStr = myStr + " (10.0.0.41) - [OK]" + StrKar
Else
myStr = myStr + "Интернет (10.0.0.41) - [недоступен!!!]" + StrKar
status = vbCritical
end if
myStr = myStr + StrKar + "Сервисы:" + StrKar
If ping("10.0.0.50") then
myStr = myStr + " (10.0.0.50) - [OK]" + StrKar
Else
myStr = myStr + "Интернет (10.0.0.5) - [недоступен!!!]" + StrKar
status = vbCritical
end if
'----------------------------
' Пример nslookup()
'----------------------------
If Nslookup("meta.ua") then
myStr = myStr + "DNS Server (nslup meta.ua) - [OK]" + StrKar
Else
myStr = myStr + "DNS Server (nslkup meta.ua) - [недоступен!!!]" + StrKar
status = vbCritical
end if
'----------------------------
' Пример IsAPIPA()
'----------------------------
if IsAPIPA then
myStr = myStr + StrKar + "Дополнительно:" + StrKar + "IP адрес - [APIPA!!!]" + StrKar
myStr = myStr + "Внимание. Обнаружен некорректный ip адрес!!!" + StrKar
myStr = myStr + "Перезагрузите компьютер. Если проблема повторится, проверьте доступность DHCP сервера либо назначьте ip адрес вручную" + StrKar
myStr = myStr + "Примечание: Если при этом у вас прекрасно работает сеть, считайте данное сообщение ошибочным" + StrKar
else
myStr = myStr + StrKar + "Дополнительно:" + StrKar + "IP адрес - [OK] (Не APIPA)" + StrKar
end if
'----------------------------
' Вывод результатов
'----------------------------
msgbox myStr, status, "Результаты:"
'------------------
' Функции
'------------------
Function Ping(strAddr)
' Проверяем доступность компьютера с помощью команды PING
Set objShell = CreateObject("WScript.Shell")
Set objScriptExec = objShell.Exec("%comspec% /c ping.exe -n 1 " & strAddr)
strPingResults = LCase(objScriptExec.StdOut.ReadAll)
' Возвращаем результат:
Ping = InStr(strPingResults, "ttl=")
End Function
Function Nslookup(strAddr)
' Проверяем работу DNS сервера через nslookup
Set objShell = CreateObject("WScript.Shell")
Set objScriptExec = objShell.Exec("%comspec% /c nslookup.exe -q=mx " & strAddr)
strNslookupResults = LCase(objScriptExec.StdOut.ReadAll)
' Возвращаем результат:
Nslookup = InStr(strNslookupResults, "mail")
End Function
Function IsAPIPA()
' Проверяет, нет ли сетевых карт, получивших APIPA адрес
Set objShell = CreateObject("WScript.Shell")
Set objScriptExec = objShell.Exec("%comspec% /c ipconfig /all")
strIsAPIPAResults = LCase(objScriptExec.StdOut.ReadAll)
' Возвращаем результат:
IsAPIPA = InStr(strIsAPIPAResults, "169.254.")
End Function
Set oVoice = CreateObject("SAPI.SpVoice")
ОтветитьУдалитьset oSpFileStream = CreateObject("SAPI.SpFileStream")
oSpFileStream.Open "c:\Windows\Media\tada.wav"
oVoice.SpeakStream oSpFileStream
oSpFileStream.Close