Пингуем устройства. Как быть? Устройства Online.

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Alexiy2
Сообщения: 104
Зарегистрирован: Вт май 12, 2015 9:59 pm
Благодарил (а): 16 раз
Поблагодарили: 13 раз

Re: Пингуем устройства. Как быть? Устройства Online.

Сообщение Alexiy2 » Вт ноя 01, 2016 9:37 pm

Люди добрые! Выручайте!
Переустановил ОСЬ на одном из компов. Ось мелкософтовская семерка. Так вот эта машина перестала пинговаться сервером с Алисой, хотя сканер сети с другого компа видит ее. Подскажите, что можно сделать?
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

Re: Пингуем устройства. Как быть? Устройства Online.

Сообщение Kod.Begemot » Вт ноя 01, 2016 10:00 pm

отключить брандмауер, к примеру
Alexiy2
Сообщения: 104
Зарегистрирован: Вт май 12, 2015 9:59 pm
Благодарил (а): 16 раз
Поблагодарили: 13 раз

Re: Пингуем устройства. Как быть? Устройства Online.

Сообщение Alexiy2 » Вт ноя 01, 2016 10:16 pm

Полностью не могу его отключить. Есть еще соображения?

Отправлено с моего SM-T116 через Tapatalk
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

Re: Пингуем устройства. Как быть? Устройства Online.

Сообщение Kod.Begemot » Вт ноя 01, 2016 11:09 pm

У меня на Win 7 отключен ручками полностью. там 2 "крыжика", в "Центр управления сетями... бла бла бла", там "брандмауер Windows" внизу слева, а там "Включение / отключение" вверху слева. ну и там уже заветные...
мне помогло.
Alexiy2
Сообщения: 104
Зарегистрирован: Вт май 12, 2015 9:59 pm
Благодарил (а): 16 раз
Поблагодарили: 13 раз

Re: Пингуем устройства. Как быть? Устройства Online.

Сообщение Alexiy2 » Вт ноя 01, 2016 11:13 pm

Господа! Не могу отключить фаирвол не от не знаний, а от этических соображений! Это детские компьютера, он мне блокируют выход в инет нежелательного софта. Может кто подскажет, какой службе дать добро, чтоб пинги пролетали?

Отправлено с моего SM-T116 через Tapatalk
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

Re: Пингуем устройства. Как быть? Устройства Online.

Сообщение Kod.Begemot » Вт ноя 01, 2016 11:15 pm

Поставьте нормальный файрвол, в котором настраиваются правила.
Сам использую Kaspersky Internet Security, там вполне человеческие настройки.
А служба - ICMP ping должна называться, или ICMP эхо
Alexiy2
Сообщения: 104
Зарегистрирован: Вт май 12, 2015 9:59 pm
Благодарил (а): 16 раз
Поблагодарили: 13 раз

Re: Пингуем устройства. Как быть? Устройства Online.

Сообщение Alexiy2 » Вт ноя 01, 2016 11:17 pm

Спасибо за ответ! Буду дома - опробую

Отправлено с моего SM-T116 через Tapatalk
PAV
Сообщения: 968
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 71 раз
Поблагодарили: 95 раз

Re: Пингуем устройства. Как быть? Устройства Online.

Сообщение PAV » Ср окт 25, 2017 12:03 pm

Ну что, друзья, никаких мыслей больше нет? Намучался я уже с семейными Iphone - не пингуются по человечески, хоть тресни. Раз минут в 15 пинг проходит.
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

Re: Пингуем устройства. Как быть? Устройства Online.

Сообщение Lerych » Вт фев 19, 2019 9:08 pm

Господа, нужна помощь!
Имеем три сетевых устройства, от которых получаем данные. Объекты в МД заведены с именами client_plc1, client_plc2, client_plc3. Данные получаем с помощью модуля TCP-sockets. Модуль создает (и держит) соединения по ip-адресу и порту устройства, в это время устройства на пинги не отвечают. Т.ч. модуль Устройства OnLine (pinghost) для использования не подходит. Как мне отслеживать соединения с устройствами?
Сам модуль TCP-sockets ведёт табличку (Sockets) с полями ID, TITLE, IP, PORT, STATUS (0, client_plc1, 192.168.100.1, 9999, 1) и в случае разрыва соединения пишет в STATUS 0 или 1 - если соединение установлено.
Помогите (можно кодом сценария) вытащить из этой таблицы статусы. Нужен код перебора устройств из таблицы и соответственно, запись в свойства объекта в МД (например, client_plc1.deviceOnline) статуса соединения.

Или думаю лучше сразу в файле модуля TCP-sockets задавать значения свойств объекта, правда не знаю как. Нужна помощь.

Вот код файла cycle_TCP_socket.php

Код: Выделить всё

<?php
chdir(dirname(__FILE__) . '/../');
include_once("./config.php");
include_once("./lib/loader.php");
include_once("./lib/threads.php");
set_time_limit(0);
// connecting to database
$db = new mysql(DB_HOST, '', DB_USER, DB_PASSWORD, DB_NAME);
include_once("./load_settings.php");
include_once(DIR_MODULES . "control_modules/control_modules.class.php");
$ctl = new control_modules();
include_once(DIR_MODULES . 'TCP_socket/TCP_socket.class.php');
$TCP_socket_module = new TCP_socket();
$TCP_socket_module->getConfig();
$tmp = SQLSelectOne("SELECT ID FROM Sockets LIMIT 1");
if (!$tmp['ID'])
   exit; // no devices added -- no need to run this cycle
echo date("H:i:s") . " running " . basename(__FILE__) . PHP_EOL;
$latest_check = 0;
$ping_cnt = 0;
$execute = true;
$checkEvery = 1;    // poll every 1 seconds
$ping_esc = 4;      // escape polling (for ping only)


while (1)
{
   setGlobal((str_replace('.php', '', basename(__FILE__))) . 'Run', time(), 1);
   if ((time()-$latest_check)>=$checkEvery) 
   {
        $latest_check=time();
        echo "\r\n".date('Y-m-d H:i:s').' Polling devices...\r\n';
        $TCP_socket_module->processCycle();
 
        // Получаем все сокеты из БД
        $sockets = SQLSelect("SELECT * FROM Sockets");
        $total = count($sockets);
        for($i = 0; $i < $total; $i++) 
        {
            $sock = $sockets[$i];
            $IP = $sock['IP'];
            $port = $sock['PORT'];
            // Пинг IP
            $online = ping(processTitle($sock['IP']));
            if($online)
            {
                if($execute)
                {
                    // Пинг сокета
                    $out = "ping";
                    $res = socket_sendto($socket[$i], $out, strlen($out), 0, $IP, $port);
                    if(!($res != 0))
                    {
                        $sock['STATUS'] = '0';
                        // Создаём TCP/IP сокет
                        $socket[$i] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
                        if (!($socket[$i] === false)) 
                        {
                            socket_set_option($socket[$i], SOL_SOCKET, SO_RCVTIMEO, array("sec"=>0,"usec"=>10000));  // Ждать новые данные 10ms
                            // Подключаем TCP/IP сокет
                            $result = socket_connect($socket[$i], $IP, $port);
                            if (!($result === false)) 
                            {
                                $sock['STATUS'] = '1';
                            } 
        //                    else 
        //                    {
        //                        echo "\r\nFail socket_connect(): reason: ($result) " . socket_strerror(socket_last_error($socket[$i])) . "\r\n";
        //                    }
                        } 
        //                else 
        //                {
        //                    echo "\r\nFail socket_create(): reason: " . socket_strerror(socket_last_error()) . "\r\n";                 
        //                }
                    }
                    else
                    {
                        $sock['STATUS'] = '1';
                    }
                }
                // Чтение сокета
                $read_buf = '';
				$code = '';
                $res = socket_recv($socket[$i], $read_buf, 255, 0);
//                if(!($res != 0))
//                {
//                    echo "\r\nFail to read socket at addres ".$IP."and port ".$port."\r\n";
//                }
                //echo "Bytes receive:".$res."\r\n";
                // Получаем все каналы из БД
                $channels = SQLSelect("SELECT * FROM Channels WHERE DEVICE_ID=($i + 1)");
                $cnt = count($channels);
                for($j = 0; $j < $cnt; $j++) 
                {
                    $chan = $channels[$j];
                    if($chan['LINKED_OBJECT']!='' && $chan['LINKED_PROPERTY']!='') 
                    {
                        if(preg_match('\'^GET\\([0-9]{1,}\\)$\'', $chan['VALUE']))
                        {
                            preg_match('\'[0-9]{1,}\'', $chan['VALUE'], $val);
                            $pos = strpos($read_buf, $chan['TITLE']);
                            if(!($pos === false))
                            {
                                //setGlobal($chan['LINKED_OBJECT'].'.'.$chan['LINKED_PROPERTY'], $val[0]);
								//$danye = strlen($read_buf)-strlen($chan['TITLE']);
								$str_command = strlen($chan['TITLE']);
								$str_code = strlen($read_buf)-strlen($chan['TITLE']);
								$code = substr($read_buf,$str_command,$str_code);
								setGlobal($chan['LINKED_OBJECT'].'.'.$chan['LINKED_PROPERTY'], $code);
                            }
                        }
                        if(preg_match('\'^SET\\([0-9]{1,}\\)$\'', $chan['VALUE']))
                        {
                            preg_match('\'[0-9]{1,}\'', $chan['VALUE'], $val);
                            $status_new = getGlobal($chan['LINKED_OBJECT'].'.'.$chan['LINKED_PROPERTY']);
                            $status_old = $chan['STATUS'];
                            if($status_new === $val[0])
                            {
                                if($status_new != $status_old)
                                {
                                    $write_buf = $chan['TITLE'];
                                    // Запись сокета
                                    $res = socket_sendto($socket[$i], $write_buf, strlen($write_buf), 0, $IP, $port);
//                                    if(!($res != 0))
//                                    {
//                                        echo "\r\nFail to write socket at addres ".$IP."and port ".$port."\r\n";
//                                    }
//                                    echo "Bytes send:".$res."\r\n";
                                    usleep(10000);  // Небольшая (10ms) задержка после записи сокета
                                }
                            }
                            $chan['STATUS'] = $status_new;
                        }
                    }
                    SQLUpdate('Channels', $chan);
                }
            }
            else 
            {
                $sock['STATUS'] = '0';
            }
            SQLUpdate('Sockets', $sock);
        }
        $ping_cnt++;
        if($ping_cnt > $ping_esc)
        {
            $ping_cnt = 0;
            $execute = true;
        }
        else 
        {
            $execute = false;
        }
    }
    if (file_exists('./reboot') || IsSet($_GET['onetime']))
    {
        $db->Disconnect();
        exit;
    }
    //sleep(1);
}
DebMes("Unexpected close of cycle: " . basename(__FILE__));
fandaymon
Сообщения: 1570
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: Пингуем устройства. Как быть? Устройства Online.

Сообщение fandaymon » Ср фев 20, 2019 12:49 am

Lerych писал(а):
Вт фев 19, 2019 9:08 pm
Господа, нужна помощь!
Имеем три сетевых устройства, от которых получаем данные. Объекты в МД заведены с именами client_plc1, client_plc2, client_plc3. Данные получаем с помощью модуля TCP-sockets. Модуль создает (и держит) соединения по ip-адресу и порту устройства, в это время устройства на пинги не отвечают. Т.ч. модуль Устройства OnLine (pinghost) для использования не подходит. Как мне отслеживать соединения с устройствами?
Сам модуль TCP-sockets ведёт табличку (Sockets) с полями ID, TITLE, IP, PORT, STATUS (0, client_plc1, 192.168.100.1, 9999, 1) и в случае разрыва соединения пишет в STATUS 0 или 1 - если соединение установлено.
Помогите (можно кодом сценария) вытащить из этой таблицы статусы. Нужен код перебора устройств из таблицы и соответственно, запись в свойства объекта в МД (например, client_plc1.deviceOnline) статуса соединения.

Или думаю лучше сразу в файле модуля TCP-sockets задавать значения свойств объекта, правда не знаю как. Нужна помощь.
Ну, например, перед SQLUpdate('Sockets', $sock);
написать

Код: Выделить всё

setGlobal($sock['TITLE'] . '.deviceOnline',$sock['STATUS']);
За это сообщение автора fandaymon поблагодарил:
Lerych (Ср фев 20, 2019 7:39 am)
Рейтинг: 1.16%
Ответить