Информация
Настройка
Новости
Контакты
Новинка
Распродажа
Оплата
Доставка
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Pear2/Net_RouterOS API возвращает Tx-Rate/Bytes-Out и сохраняет соединение на определённый промежуток времени.

    Pear2/Net_RouterOS API возвращает Tx-Rate/Bytes-Out и сохраняет соединение на определённый промежуток времени.

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Pear2/Net_RouterOS API возвращает Tx-Rate/Bytes-Out и сохраняет соединение на определённый промежуток времени., RouterOS
     
    AmrSubZero
    Guest
    #1
    0
    31.10.2015 04:56:00
    Я использую Pear2/Net_RouterOS PHP API, разрабатываю приложение и у меня два вопроса.

    Первое: когда я пытаюсь получить данные через ip/hotspot/host/print, возвращается ограниченный набор информации, не все, например, Tx/Rate и Bytes-Out отсутствуют. Хотя в версии 6.32 MikroTik возвращал только значение Bytes-Out, а в версии 5.26 он этого уже не делает. Как мне получить все данные или хотя бы значения Tx-Rate и Bytes-Out на версии 5.26?

    Второе: каждый раз, когда мой скрипт выполняет какое-то действие, в логе Winbox появляется запись: user admin logged in via api, а затем user admin logged out via api. Думаю, это может вызывать задержки и сбои в работе MikroTik. Но если сохранить соединение и использовать его один раз на продолжительное время — тогда, вероятно, всё будет нормально, без лагов и ошибок.

    Мой код:
    try {
       $util = new RouterOS\Util(
           $client = new RouterOS\Client('10.0.0.1', 'admin', 'password')
       );
    } catch (Exception $e) {
       die($e);
    }

    $gethosts = $client->sendSync(new RouterOS\Request('/ip/hotspot/host/print'));

    foreach ($gethosts as $host) {
       if ($host->getType() === Response::TYPE_DATA) {
           var_dump($host);
       }
    }

    Я приложил скриншот с данными, которые возвращает API.

    Спасибо!
     
     
     
    AmrSubZero
    Guest
    #2
    0
    18.11.2015 07:15:00
    В таком случае я собираюсь поиграться с простыми очередями, чтобы получить tx/rate, думаю, это последняя карта, которая у меня есть. Главное же, и вторая часть моего вопроса — как сохранить соединение (запустить его один раз), потому что моя логика обновляет приложение каждую секунду, чтобы получать данные в реальном времени через jQuery/Ajax, то есть я обращаюсь к серверу каждую секунду.

    При этом каждую секунду, когда я отправляю запрос на сервер, запускается процесс аутентификации соединения с Mikrotik, и в логе появляется запись вроде "_User admin logged in from _ ip_address via Api" каждую секунду. Это может тормозить мой сервер Mikrotik, особенно я заметил, что из-за этого возникает множество проблем, например, отключение интернета каждые 15 минут.

    В C# API, как мне кажется, соединение сохраняется на определённое время. Уф, не знаю... В общем, надеюсь, вы поняли, чего я пытаюсь добиться. Есть какие-то планы?
     
     
     
    AmrSubZero
    Guest
    #3
    0
    19.11.2015 02:33:00
    Как уже говорилось, чтобы использовать постоянные соединения, нужно поставить true в пятом аргументе конструктора Client. Я так и сделал, но получаю вот такие ошибки:  
    $client = new RouterOS\Client('HOST', 'USER', 'PASSWORD', 8728, true)  
    exception ‘PEAR2\Cache\SHM\InvalidArgumentException’ с сообщением ‘No appropriate adapter available’ в F:\wamp\www\vendor\pear2\cache_shm\src\PEAR2\Cache\SHM.php:77  
    Стек вызовов:  
    #0 F:\wamp\www\vendor\pear2\net_transmitter\src\PEAR2\Net\Transmi­tter\TcpClient.php(174): PEAR2\Cache\SHM::factory(‘PEAR2\Net\Trans…’)  
    #1 F:\wamp\www\vendor\pear2\net_routeros\src\PEAR2\Net\RouterOS\C­ommunicator.php(148): PEAR2\Net\Transmitter\TcpClient->__construct(‘HOST’, 8728, true, NULL, ‘USER/PASSWORD’, ‘’, NULL)  
    #2 F:\wamp\www\vendor\pear2\net_routeros\src\PEAR2\Net\RouterOS\C­lient.php(146): PEAR2\Net\RouterOS\Communicator->__construct(‘HOST’, 8728, true, NULL, ‘USER/PASSWORD’, ‘’, NULL)  
    #3 F:\wamp\www\events.php(19): PEAR2\Net\RouterOS\Client->__construct(‘HOST’, ‘USER’, ‘PASSWORD’, 8728, true)  

    Также я пробовал EventSource — это отличный способ стримить данные, и я думаю перейти с Ajax-запросов на EventSource, это намного лучше. Но, к сожалению, всё та же старая история: логирование пользователя admin вошедшего через API, пользователь admin вышел из API — проблема остаётся.  

    Нужно ли сначала заставить работать постоянные соединения, чтобы не происходила аутентификация каждую секунду?  

    WebSocket тоже не прокатит, потому что версия PHP на моём хосте 5.3, а WebSocket требует минимум PHP 5.4.  

    Вообще, было бы намного понятнее, если бы вы дали полный пример кода по этой идее, буду очень признателен.
     
     
    ";
                   }, false);

                   source.addEventListener('open', function(e) {
                   }, false);
                   source.addEventListener('quit', function(e) {
                       document.getElementById('status').textContent = e.data;
                       source.close();
                   }, false);
                   source.addEventListener('error', function(e) {
                       if (e.readyState == EventSource.CLOSED) {
                           document.getElementById('status').textContent = 'Соединение закрыто/прервано';
                       }
                   }, false);
               }
           </script>
       </body>
    </html>
     
    boen_robot
    Guest
    #4
    0
    19.11.2015 13:57:00
    Постоянные соединения требуют либо расширения PHP APC, либо Wincache (они используются для хранения данных и блокировок между запросами). Именно на это ссылается сообщение об ошибке — ни одно из этих расширений не найдено на вашем сервере. (Я добавлю это в документацию в указанном выше разделе... Если бы вы прочитали всю документацию целиком, вы бы это заметили, но разбитая на части, эта информация легко ускользает...) Для EventSource необходимо использовать set_time_limit(0) на URL EventSource, иначе PHP остановится через 30 секунд. EventSource достаточно умён, чтобы переподключиться (и вызвать новое событие «open»), но дополнительный HTTP-запрос вызывает повторный вход. Если у вас есть одновременно постоянные соединения и EventSource, то обновление страницы не приведёт к новому входу, как и использование страницы на нескольких браузерах/ПК. Если же у вас только EventSource (с set_time_limit(0)), то каждое обновление страницы вызовет новый вход, как и каждый браузер/ПК, подключающийся к веб-странице. Но у вас есть доступ по shell? Если да, то велика вероятность, что ваш хостинг согласится включить PHP 5.4 для вас, если он уже не позволяет переключаться на него из панели управления. Спросите у них. Пример касается случая с показом логов. Вам нужно будет изменить это, чтобы модифицировать уже существующие очереди, а не просто добавлять данные. Вот слегка изменённая версия исходного кода (убрал проектозависимые части):

    <?php
    use PEAR2\Net\RouterOS;

    if (isset($_GET['data'])) {
       header('Content-Type: text/event-stream');

       require_once 'PEAR2_Net_RouterOS-1.0.0b5.phar';

       try {
           $client = new RouterOS\Client('HOST', 'USER', 'PASSWORD');

           set_time_limit(0);

           $client->sendAsync(
               new RouterOS\Request('/log print detail="" follow', null, 'l'),
               function (RouterOS\Response $logLine) {
                   echo 'data: ' . json_encode(
                       array(
                           'type' => $logLine->getType(),
                           'attributes' => $logLine->getIterator()->getArrayCopy()
                       )
                   ) . "\n\n";
                   ob_flush();
                   flush();
               }
           )->loop();
           return;
       } catch (Exception $e) {
           die("event: quit\ndata: {$e->getMessage()}\n\n");
       }
    }
    header('Content-Type: text/html;charset=UTF-8');
    ?><!DOCTYPE html>
    <html>
       <head>
           <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
           <title>Просмотр логов</title>
       </head>
       <body>
           <div class="error" id="status"><noscript>JavaScript отключён</noscript></div>
           
               <thead>
               
               <tbody id="items">
               </tbody>
    ВремяТемыСообщение
           <script>
               function escapeHtml(text) {
                   return text
                       .replace(/&/g, "&")
                       .replace(/</g, "<")
                       .replace(/>/g, ">")
                       .replace("g, """)
                       .replace(/'/g, "'");
               }

               if (!window.EventSource) {
                   document.getElementById('status').innerHTML = 'Браузер не поддерживается';
               } else {
                   var items = document.getElementById('items');
                   var source = new EventSource(location.origin + location.pathname + (location.search || '?') + '&data');
                   source.addEventListener('message', function(e) {
                       var data = JSON.parse(e.data);
                       items.innerHTML += "
    " + escapeHtml(data.attributes.time) + "" + escapeHtml(data.attributes.topics) + "" + escapeHtml(data.attributes.message) + "
     
     
     
    AmrSubZero
    Guest
    #5
    0
    20.11.2015 05:21:00
    К сожалению, мой хостинг-провайдер отказался сейчас обновлять PHP до версии 5.4, так что WebSocket пока не поможет, пока не обновят. А установить APC или WinCache я не могу, потому что у меня нет доступа к shell. Пример кода сработал и не писал в лог сервера (сохранил соединение), но я потратил около трёх часов, пытаясь понять идею этого примера, чтобы изменить его и получить hosts/active и т.д., но не удалось. Особенно эта часть:

    function (RouterOS\Response $logLine) {
       echo 'data: ' . json_encode(
           array(
               'type' => $logLine->getType(),
               'attributes' => $logLine->getIterator()->getArrayCopy()
           )
       ) . "\n\n";
       ob_flush();
       flush();
    }

    Ладно, а если у меня есть PHP-файлы на моём веб-сервисе, и я делаю к ним запросы через Ajax или EventSource с html-страницы в моём андроид-приложении? Получать hosts, active и другую информацию, например идентификатор системы или время работы сервера из этих PHP-файлов и показывать их на html-странице в виде результатов, обновляя каждые 1-5 секунд, как я и говорил, чтобы получить данные в реальном времени.

    Обычный запрос, который я использую:

    $gethosts = $util->sendSync(new RouterOS\Request('/ip/hotspot/active/print status=""'));
    foreach ($gethosts as $host) {
       // JSON ENCODE результаты и отправляю обратно на html-страницу
    }

    Ты объединил sendSync запрос с callback функцией RouterOS\Response $logLine . new RouterOS\Request('/log print detail="" follow', null, 'l'),  
    function (RouterOS\Response $logLine) { … }

    Как будет выглядеть запрос, если я хочу получить, например, Hosts? Кстати, я не могу одновременно использовать PHP-код и HTML на одной странице, потому что в моём андроид-приложении PHP не запускается, поэтому я делаю запросы к PHP на своём онлайн-сервисе.

    JsonP сработает?

    Если я надоел или раздражаю тебя, можешь не отвечать, но я очень благодарен за твою помощь. Спасибо!
     
     
     
    boen_robot
    Guest
    #6
    0
    20.11.2015 11:57:00
    Ах, видите ли, вот эта часть у вас упускается или неправильно понимается. sendAsync() сильно отличается от sendSync(). (И смею предположить, что именно поэтому я изначально написал этот клиент, а не стал править API-клиент Дениса Басты.) sendSync() делает запрос, который в итоге завершается, и только потом вы можете обработать результаты. sendAsync() отправляет запрос, но не ждёт его завершения. Тем временем вы можете начать другой запрос или, что важнее, начать получать данные, но только ненадолго. Колбэк — это всего лишь один из способов обработки потенциально бесконечного потока ответов. Тогда, когда вы начинаете получать ответы (через loop() или completeRequest() — в примере выше это был loop()), для каждого ответа вызывается колбэк, и вы можете в этот момент остановить запрос. Если ответов нет, колбэк не вызывается.

    Есть ещё один способ получать ответы, который может быть вам понятнее — если колбэка нет, ответы, собранные за определённый промежуток времени, сохраняет сам клиент. Как только получение завершается, вы можете просмотреть накопленные ответы, а потом при желании продолжить принимать новые.

    Замените

    $client->sendAsync(
       new RouterOS\Request('/log print detail="" follow', null, 'l'),
       function (RouterOS\Response $logLine) {
           echo 'data: ' . json_encode(
               array(
                   'type' => $logLine->getType(),
                   'attributes' => $logLine->getIterator()->getArrayCopy()
               )
           ) . "\n\n";
           ob_flush();
           flush();
       }
    )->loop();

    на

    $client->sendAsync(
       new RouterOS\Request('/log print detail="" follow', null, 'l'),
    );
    $doAnother = $client->loop(5);
    while (true) {
       echo 'data: ' . json_encode(
           array(
               'type' => 'note',
               'attributes' => array('time' => '--:--:--', 'topics' => 'PHP-DEBUG', 'message' => 'Loop')
           )
       ) . "\n\n";
       foreach ($client->extractNewResponses('l') as $logLine) {
           echo 'data: ' . json_encode(
               array(
                   'type' => $logLine->getType(),
                   'attributes' => $logLine->getIterator()->getArrayCopy()
               )
           ) . "\n\n";
       }
       ob_flush();
       flush();

       if (!$doAnother) {
           break;
       }
       $doAnother = $client->loop(5);
    }

    Итак… Что происходит с этим новым кодом? Клиент получает ответы в течение 5 секунд. Колбэки не выполняются. Мы просто входим в цикл while. Внутри сначала выводим в поток сообщений сообщение о том, что был вызван loop() (это для отладки — чтобы видеть, КОГДА это происходит), затем за эти 5 секунд извлекаем все накопленные ответы. Для каждого из них пишем в поток событий так же, как раньше, и наконец очищаем буфер вывода PHP. В отличие от колбэков, здесь можно позволить себе вызывать flush уже после обработки всех ответов, потому что мы знаем, когда они заканчиваются (это после цикла foreach). Наконец, если запрос не завершился за последний loop(), мы снова ждём ответы ещё 5 секунд, прежде чем обработать их в новом цикле while, иначе выходим из цикла.

    Если использовать Ajax, нужно переподключаться каждые 1-5 секунд, что, очевидно, сильно нагружает систему и приводит к повторным входам в систему, если у вас нет постоянных соединений. Если использовать EventSource, то идея в том, что вы остаётесь подключёнными к EventSource — вы не проверяете его каждые 1-5 секунд, а подключаетесь один раз и просто даёте своему приложению указания на каждое событие от сервера. Полевание скорости остаётся за сервером. EventSource отключается только тогда, когда ваше приложение закрывается (или когда пользователь переходит на другую страницу).

    Все команды print имеют аргумент «follow», который используется так же, как и в логах.

    Вы даже не представляете, сколько у меня терпения к программированию (а с моим API-клиентом оно только удваивается). За всё время только один человек (в другом форуме) сумел переступить эту грань — и то только потому, что после череды ответов (по объёму хватило бы на маленькую книгу…) он сказал: «А, теперь понял, спасибо! Вот с этого стоило начинать». Но спустя несколько дней он снова задал тот самый первоначальный вопрос, с которого всё началось.

    Мне гораздо приятнее услышать «Я не совсем понимаю…», чем ложное «Понял», потому что последнее даёт мне приятное чувство внутри, которое тут же испаряется, когда я узнаю, что это было неправдой. И насколько обидно это узнать — прямо пропорционально тому времени, которое я потратил, пытаясь помочь. Как можно догадаться, книга размером с «маленькую книгу» — это боль нешуточная.

    Признаюсь, мне было бы приятнее, если бы вы сами выжали определённые кусочки (например, описанный выше раздел), но то, что мне всё-таки приходится объяснять, не менее интересно, полезно и уже приносит плоды (например, требования к постоянным соединениям — из-за вас мне пришлось изменить документацию, и для меня это уже победа).
     
     
     
    boen_robot
    Guest
    #7
    0
    18.11.2015 12:02:00
    Один из способов — использовать постоянные соединения. Хотя мои искусственные тесты не показали проблем, я сам не проверял это “в реальных условиях”, и никто пока не писал ни “стало лучше, спасибо!”, ни “всё сломалось, помогите!”. Прежде чем устанавливать пятый аргумент в “true”, убедитесь, что PHP работает либо через FastCGI, либо как модуль Apache. Если вы используете CGI, процесс PHP просто не сохраняется, и соответственно, соединение не сохраняется. Другой способ — использовать Server Sent Events (он же “EventSource”). Недавно я успешно применил этот метод. С ним нельзя менять команды без переподключения (потому что связь односторонняя — после запуска запроса вы только читаете данные), но можно держать команду включённой бесконечно и наблюдать её вывод. В вашем случае — мониторинг скоростей — этого вполне хватает. Internet Explorer (и Edge тоже) не поддерживают это. Постоянные соединения вместе с SSE значительно сократят количество переподключений к роутеру в целом. Есть ещё Web Sockets, которые работают похоже на SSE, но связь двусторонняя, поэтому можно запрашивать другую команду, не перезагружая страницу и не делая новый HTTP-запрос. Этот способ поддерживается в IE10, IE11 и Edge, а также в других браузерах, и не требует использования постоянных соединений, так как серверный скрипт при этом работает постоянно. Но большая проблема — для этого нужен специальный серверный настройка поддержки протокола. Минимально вам нужен shell-доступ, чтобы запустить в фоне свой PHP-файл, использующий такую библиотеку, например, эту. Если ваше приложение рассчитано на сторонних пользователей, требование настраивать web sockets отпугнёт многих.
     
     
    "}, false); Но я запутался. Может, кто-то подскажет? Спасибо! <?php
    use PEAR2\Net\RouterOS;

    if (isset($_GET['data'])) {
       header('Content-Type: text/event-stream');

       require_once 'PEAR2_Net_RouterOS-1.0.0b5.phar';

       try {
           $client = new RouterOS\Client('HOST', 'USER', 'PASSWORD');
           
           set_time_limit(0);
           
           $client->sendAsync(
               new RouterOS\Request('/log print detail="" follow', null, 'l'),
               function (RouterOS\Response $logLine) {
                   echo 'data: ' . json_encode(
                       array(
                           'type' => $logLine->getType(),
                           'attributes' => $logLine->getIterator()->getArrayCopy()
                       )
                   ) . "\n\n";
                   ob_flush();
                   flush();
               }
           )->loop();
           return;
       } catch (Exception $e) {
           die("event: quit\ndata: {$e->getMessage()}\n\n");
       }
    }
    header('Content-Type: text/html;charset=UTF-8');
    ?><!DOCTYPE html>
    <html>
       <head>
           <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
           <title>Просмотр лога</title>
       </head>
       <body>
           <div class="error" id="status"><noscript>JavaScript отключён</noscript></div>
           
     
    jose
    Guest
    #8
    0
    18.12.2015 20:56:00
    Привет! Не хочу захватывать эту ветку, но подумал, что это тоже может помочь. Я установил приведённый ниже код, и он работает просто отлично. Теперь для нашей службы поддержки я хочу показывать время пинга в реальном времени, поэтому заменил new RouterOS\Request('/log print detail="" follow', null, 'l') на new RouterOS\Request('/ping address=10.0.10.37', null, 'l'), и пытался изменить строку items.innerHTML += "
    " + escapeHtml(data.attributes.time) + "" + escapeHtml(data.attributes.topics) + "" + escapeHtml(data.attributes.message) + "

               <thead>
               
               <tbody id="items">
               </tbody>
    ВремяТемыСообщение
           <script>
               function escapeHtml(text) {
                   return text
                       .replace(/&/g, "&")
                       .replace(/</g, "<")
                       .replace(/>/g, ">")
                       .replace("g, "\"")
                       .replace(/'/g, "'");
               }

               if (!window.EventSource) {
                   document.getElementById('status').innerHTML = 'Браузер не поддерживается';
               } else {
                   var items = document.getElementById('items');
                   var source = new EventSource(location.origin + location.pathname + (location.search || '?') + '&data');
                   source.addEventListener('message', function(e) {
                       var data = JSON.parse(e.data);
                       items.innerHTML += "" + escapeHtml(data.attributes.time) + "" + escapeHtml(data.attributes.topics) + "" + escapeHtml(data.attributes.message) + ""
                   }, false);

                   source.addEventListener('open', function(e) {
                   }, false);
                   source.addEventListener('quit', function(e) {
                       document.getElementById('status').textContent = e.data;
                       source.close();
                   }, false);
                   source.addEventListener('error', function(e) {
                       if (e.readyState == EventSource.CLOSED) {
                         document.getElementById('status').textContent = 'Соединение закрыто или прервано';
                       }
                   }, false);
               }
           </script>
       </body>
    </html> [/quote]
     
     
     
    boen_robot
    Guest
    #9
    0
    18.12.2015 21:01:00
    Есть ошибка? Пустые строки? Что-нибудь в консоли браузера (F12)? Ты говоришь, что пробовал менять items.innerHTML += "[tr][td]" + escapeHtml(data.attributes.time) + "[/td][td]" + escapeHtml(data.attributes.topics) + "[/td][td]" + escapeHtml(data.attributes.message) + "[/td][/tr]"
                   }, false); но я не вижу, чтобы это в итоге изменилось… Тебе надо использовать свойства, которые есть у ping, и я не думаю, что там есть “message” и “topics”. Кстати, всё работает просто отлично. Ты мне напоминаешь Человека-муравья, где была «эта девчонка, которая была чертовски красива».
     
     
     
    jose
    Guest
    #10
    0
    18.12.2015 22:50:00
    Я просто изменил эту строку в соответствии с свойствами “API_command_notes” на сайте mikrotik.com, чтобы показать три атрибута, как в твоём примере.  
    items.innerHTML += “” + escapeHtml(data.attributes.time) + “” + escapeHtml(data.attributes.avg-rtt) + “” + escapeHtml(data.attributes.packet-loss) + “” }, false);  

    Кстати, я вижу, что API пользователь сразу входит и выходит, а в твоём оригинальном скрипте такого нет.  
    17:41:03 system,info,account user soporte logged in from 192.168.2.6 via api  
    17:41:05 system,info,account user soporte logged out from 192.168.2.6 via api  

    Может, мне нужно добавить в команду ping параметр “count”?
     
     
     
    boen_robot
    Guest
    #11
    0
    18.12.2015 23:15:00
    Ох... Вот в чём дело... В JavaScript символ «-» не годится для имени свойства, поэтому на самом деле получается свойство «avg» минус значение переменной с именем «rtt». Решение, чтобы получить нужное свойство, — обращаться к нему как к элементу ассоциативного массива, то есть: items.innerHTML += "[tr][td]" + escapeHtml(data.attributes.time) + "[/td][td]" + escapeHtml(data.attributes["avg-rtt"]) + "[/td][td]" + escapeHtml(data.attributes["packet-loss"]) + "[/td][/tr]" }, false); (хотя технически это не совсем правильно, потому что в JavaScript нет «ассоциативных массивов», но здесь всё работает примерно так же).
     
     
     
    jose
    Guest
    #12
    0
    19.12.2015 15:06:00
    Boen_robot Это сработало так, как вы и советовали. Большое спасибо!
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры