вторник, 27 марта 2018 г.

Как подружить telnet и vbs

Иногда бывает необходимо автоматизировать некоторые действия при подключении к оборудованию посредством 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 & " градусов" 

2 комментария:

  1. 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

    ОтветитьУдалить
  2. Set oVoice = CreateObject("SAPI.SpVoice")
    set oSpFileStream = CreateObject("SAPI.SpFileStream")
    oSpFileStream.Open "c:\Windows\Media\tada.wav"
    oVoice.SpeakStream oSpFileStream
    oSpFileStream.Close

    ОтветитьУдалить