Как пинговать сантехника в одной сети с R? - PullRequest
0 голосов
/ 26 марта 2020

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

  • Компьютер выключен
  • сантехник не работает на данном порту
  • Код в сантехнике Сбой

Поэтому (в случае сбоя запроса сантехника) я подумал, что смогу: 1. Пинговать сантехник на заданном порту 2. Если не получится, я пингую компьютер (без указанного порта c)

Что я пробовал.

Убедитесь, что сантехник работает.

url <- paste0("http://192.168.1.11:7192/echo")
> httr::GET(url = url, body = "msg=asd") %>% content
$msg
$msg[[1]]
[1] "The message is: ''"

Так что все работает, теперь попробуйте "пинг". После Пингует сайт в R :

ping <- function(x, stderr = FALSE, stdout = FALSE, ...){
  pingvec <- system2("ping -n 1", x,
                     stderr = FALSE,
                     stdout = FALSE,...)
  if (pingvec == 0) TRUE else FALSE
}
> ping(url)
[1] FALSE
Warning message:
In system2("ping -n 1", x, stderr = FALSE, stdout = FALSE, ...) :
  '"ping -n 1"' not found
> ping("http://192.168.1.11")
[1] FALSE
Warning message:
In system2("ping -n 1", x, stderr = FALSE, stdout = FALSE, ...) :
  '"ping -n 1"' not found
> RCurl::url.exists(url)
[1] FALSE

, что не удается.

Попытка «вручную»:

 system("ping -n 1 192.168.1.11")

Ping wird ausgefhrt fr 192.168.1.11 mit 32 Bytes Daten:
Antwort von 192.168.1.11: Bytes=32 Zeit=4ms TTL=64

Ping-Statistik fr 192.168.1.11:
    Pakete: Gesendet = 1, Empfangen = 1, Verloren = 0
    (0% Verlust),
Ca. Zeitangaben in Millisek.:
    Minimum = 4ms, Maximum = 4ms, Mittelwert = 4ms
[1] 0
> system("ping -n 1 192.168.1.112")

Ping wird ausgefhrt fr 192.168.1.112 mit 32 Bytes Daten:
Antwort von 192.168.1.145: Zielhost nicht erreichbar.

Ping-Statistik fr 192.168.1.112:
    Pakete: Gesendet = 1, Empfangen = 1, Verloren = 0
    (0% Verlust),
[1] 0

Текст указывает, что .11 работает, а .112 не существует, что является правильным.

Грязное решение:

ping2 <- function(host){
  res <- system(command = paste0("ping -n 1 ", host), intern = TRUE)
  !sum(grepl(pattern = "nicht erreichbar", x = res))
}
host <- "192.168.1.11"
ping2(host)

Однако это не работает для проверка порта: (здесь порт 999999 не открыт).

host <- "192.168.1.11:999999"
ping2(host)
TRUE

Вопрос:

Как отладить API моего сантехника - в частности, как я должен пинговать хост а порт?

...