Перейти к публикации
iT4iT.CLUB

Kitsum

Пользователи
  • Публикации

    424
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    234

Сообщения, опубликованные пользователем Kitsum


  1. @Zaq24 боюсь, что полного ответа Вы не получите т.к тут обсуждаем только устройства на программной платформе Arduino.

    Сразу могу Вам предложить почитать об использовании датчика BH1750 под NodeMCU непосредственно на GitHub https://github.com/nodemcu/nodemcu-firmware/tree/master/lua_modules/bh1750

    Возможно, будет достаточно внести следующие изменения в файл mynarod.lua

    bme280.init(3,4)
    BH1750.init(3,4)
    BH1750.read(OSS)
    function readData()
    	P, T = bme280.baro()
    	H, T = bme280.humi()
    	   L = BH1750.getlux()
        print("PRESSURE=".. P/1000*0.75)
        print("TEMPERATURE=".. T/100)
        print("HUMIDITY=".. H/1000)
        print("LIGHT=".. L/100)
     end
    
    function sendData() 
        sock=net.createConnection(net.TCP, false) 
        sock:connect(8283,'narodmon.ru')
    sock:on("connection",function(sock, payload)
    	local DEVICE_MAC = "7F-FF-31-10-69-54"
    	local SENSOR_MAC_1 = "TEMPERATURE"
    	local SENSOR_MAC_2 = "PRESSURE"
    	local SENSOR_MAC_3 = "HUMIDITY"
    	local SENSOR_MAC_4 = "LIGHT"
    	readData()
    	sock:send("#"..DEVICE_MAC.."\n#"..SENSOR_MAC_1.."#"..(T/100).."\n#"..SENSOR_MAC_2.."#"..(P/1000*0.75).."\n#"..SENSOR_MAC_3.."#"..(H/1000).."\n#"..SENSOR_MAC_4.."#"..(L/100).."\n##")
        end)
    
    sock:on("receive", function(sock, answer)
       print('Narodmon answered '..answer)
       sock:close()
    end)
       
    end 
    sendData() 
    tmr.alarm(0, 360000, 1, function() sendData() end )

    Будет ли это работать, под большим вопросом т.к я не разбирался в принципах работы ESP и Lua. Для 100% решения Вашей проблемы, обратитесь к разработчику, у которого Вы взяли данную программу.


  2. 3 часа назад, Zaq24 сказал:

    Просто все компоненты уже есть.

    Что имеется в виду под словом компоненты? Программная часть? Тут тоже все выложено, достаточно только залить в микроконтроллер и все заработает. Никаких настроек производить не требуется. Внести изменения в код под датчик BME280 тоже поможем. Или под компонентами Вы и имели в виду датчик BME280?


  3. @zenone Давайте разберемся в происходящем подробнее.

    Работа DNS сервера

    За конфигурацию DNS сервера в режиме AP и перехвата всех доменных имен отвечают следующие строки в функции modeAP

    dnsServer.setErrorReplyCode(DNSReplyCode::NoError);
    dnsServer.start(DNS_PORT, "*", apIP);

    Далее опираясь на консольный лог и отсыл к файлу ncsi.txt, я могу сделать вывод, что вы подключаетесь с устройства под управлением операционной системы семейства Windows. Последняя в свою очередь использует Network Connectivity Status Indicator для отображения состояния подключения к сети интернет и в дальнейшем этот статус можно получить через API операционной системы. Для пользователей статус отображается в виде иконки подключения в трее.

    espws_dns_1.png

    У меня несколько сетевых интерфейсов - основной проводной с доступом в интернет (указан стрелкой на рисунке) и несколько второстепенных, в том числе и подключение к тестовой метеостанции по WiFi (подчеркнуто выше). У последней есть описание "Нет подключение к интернету". Чтобы проверить состояние, операционной системе необходимо выполнить две проверки, одна из которых, это доступность адреса http://www.msftncsi.com/ncsi.txt

    Подробнее об этом можно прочитать на Windows IT Center

    В следующем обновлении я изменю поведение DNS сервера, чтобы реакция была только на имя, используемое метеостанцией в режиме STA.

    Теперь, давайте рассмотрим, как править основной шаблон без закачки его на микроконтроллер

    В файле index.htm, в секции с java скриптом имеется переменная описывающая путь до корневого домена

    var domain = "";

    Необходимо указать полный http адрес метеостанции

    var domain = "http://10.10.10.1/";

    Теперь Вы можете править index.htm на компьютере и при этом иметь доступ к API микроконтроллера. Но есть одно но, доступ будет только к открытой части API т.к полный доступ подразумевает авторизацию с использованием cookies. Чтобы обойти эту проверку необходимо в программе микроконтроллера внести изменения в функцию authorized и привести её к следующему виду.

    bool authorized() {
      return true; // обязательно удалите эту строку после завершения отладки
      /*
      	Тут весь остальной код данной функции
      */
    }

    Надеюсь это поможет Вам и упросит процесс отладки.


  4. @maxim Для подключения по шине I2C необходимы дополнительные пины - прерывание (IRQ) и сброс (RESET), без них корректная работа невозможна. Возможно Вам будет интересен этот комментарий в теме PN532

    Если Вы используете в качестве контроллера ESP8266, то возможно выгоднее будет использовать шину SPI т.к PN532 рассчитан на 3V логику этой шины, как и ESP и Вам не потребуется конвертер уровней, минимальные изменения в программе, да и сама шина быстрее, хотя тут это не имеет никакого значения.


  5. @zenone В проекте все возможные обращения могут быть только через API, который описан и открыт или непосредственно к самим файлам на flash. Я уверен, что не совсем корректно поставлен вопрос, думаю, что он появился из логов в Serial при обращении к web серверу микроконтроллера. Если я прав, то дело тут в устройствах с которых идет подключение к точке доступа (esp8266), они пытаются узнать различную информацию о самой точке доступа, получить различные списки технического характера ну и все то, что захочет разработчик ПО используемого на клиенте. Это поведение я заметил почти у всех мобильных устройств как под Android так и под iOS. Думаю, что стоит почитать по поведению мобильных платформ при подключении к открытым хотспотам в аэропортах и других общественных местах.

    Также стоит отметить, что в режиме точки доступа происходит перехват всех доменных имен и подмена их реальных ip адресов на адрес самой метеостанции. Это приведет точно к такому же поведению, но это сделано для упрошенного попадания на интерфейс метеостанции по любому доменному имени. Если это лишнее, то можно легко это исправить и попадать только по имени используемому в режиме клиента.

    Вот пример того, как ведут себя iOS (10.10.10.100) и Android (10.10.10.101) сразу после подключения к метеостанции, работающей в режиме AP.

    espws_http_1.png

    Естественно, что операционные системы пытаются взаимодействовать со сторонними ресурсами, но увы, кроме esp их никто не ждет.

    Через некоторое время полетят запросы к сторонним ресурсам, и оживятся некоторые системные службы.

    Скрытый текст

    Скорее всего на устройстве под управлением Android пытается обновить базы Kaspersky.

    espws_http_2.png

    PS: ну и естественно большой брат всегда с нами.


  6. @melfis шилд явно в исправном состоянии. В программе от @svchekalin всего лишь добавлены два дополнительных запроса в базу на ведение логов ну и естественно модифицированы запросы под другое имя базы. Все остальное касается непосредственно только самой базы данных - название, имена таблиц, "явки пароли". И т.к у меня и у @svchekalin оригинальный скетч работал, то могу сделать вывод, что Ваша причина где-то на поверхности и очень проста, но пока не была явно замечена.

    Могу предложить следующий вариант.

    1. Все удалите и начните с белого листа
    2. Используйте оригинальный скет для микроконтроллера
    3. Создайте базу, добавьте таблицу и один случайный ключ
    4. Подключитесь к базе и запросите этот ключ с самого сервера или другого компьютера
    5. Если проблема повторилась, то скиньте мне в приват бэкап всей базы с MySQL сервера, копию лога ошибок MySQL сервера и копию скетча (копируйте прямо из IDE со всеми изменениями которые вы вносили).

    Будем разбираться основательно.


  7. @melfis Используете оригинальную программу с указанного выше поста или Вы вносили изменения, если вносили, то какие? Убедитесь в корректности данных учетной записи пользователя базы данной и разрешен ли её доступ с внешних адресов.

    arduino_ethernet_rc522_mysql.png

    К сожалению, Вам самостоятельно придется пройти путь настройки MySQL сервера, но уверяю Вас, если все сделаете правильно, то результат Вам понравится. По возможности, постарайтесь проверить доступность базы с другого компьютера. Будьте очень внимательны, и все перепроверяйте!


  8. И так, пришла монтажная плата для Node MCU v3 о которой говорилось в оригинальном посте. Смотрится очень хорошо, удобно использовать для быстрого монтажа, правда пришлось отмывать от флюса, но это уже мелочи. Плату можно питать от 5 до 24 вольт и это очень удобно. Также мне в руки попало творение Китайской промышленности в виде сборки из трех датчиков.

    1. BH1750 - датчик освещенности (используется в оригинальной программе)
    2. BMP180 - всеми любимый барометр от BOSCH (используется в оригинальной программе)
    3. HTU21D - датчик влажности и температуры

    IMG_1918.JPGIMG_1921.JPG

    Плата с датчиками очень компактная, примерно 21x8 мм (без разъема), что очень привлекательно. На плате нет никаких преобразователей и конвертеров, по этому, питание и логика соответствуют 3.3 вольтам. И сразу хочу отметить, что расцветка проводов не соответствует описанию и придется аккуратно разобрать колодку и перекинуть провода, хотя кто-то может посчитать это лишним. На фото провода перекинуты!

    IMG_1925.JPGIMG_1926.JPG

    Что касаемо библиотек. Для датчика освещенности и барометра ссылки на библиотеки находятся в первом посте. Для датчика влажности можно использовать библиотеку от SparkFun Electronics опубликованную на GitHub

    В целом мне понравилась эта сборка, работает хорошо, проблем с внедрением в метеостанцию не возникло, но ложка дегтя все же присутствует и это цена! На данный момент стоимость одной платы может в 2-3 раза превышать стоимость всех этих датчиков, купленных отдельно. Причем каждый датчик в отдельности будет находиться на плате со своей обвязкой, что естественно намного удорожает производство, но боги маркетинга делают свое дело.

    К сожалению провести длительные и полноценные тесты в уличных условиях я не могу т.к сборка куплена моим другом для его метеостанции и мне в руки она попала только для оптимизации программы под его датчики.

    IMG_1928.JPG

    PS: Надеюсь эта информация будет для Вас полезна, и естественно общая ссылка на Али.


  9. @melfis Если подключено напрямую, то выставите вручную адрес для компьютера, например, 192.168.0.2 маска 255.255.255.0 и адрес для микроконтроллера 192.168.0.3 с аналогичной маской. Проверить связь сможете обычной утилитой ping.


  10. @melfis

    127.0.0.1 это петля и используется только для внутренних нужд системы. Вам нужен внешний адрес, присвоенный машине DHCP сервером домашнего маршрутизатора. Подразумевается, что и сервер, и контроллер подключены к маршрутизатору, а не друг к другу.

    После этого Вам необходимо выполнить SQL запрос, описанный в оригинальном посте, для создание таблицы. По-хорошему, доступ к базе "test" должен осуществляться с использованием отдельной учетной записи имеющий права чтения и записи только в приделах этой базы данных. Но для теста Вы можете использовать учетную запись администратора, но только для теста. Потом обязательно позаботьтесь о безопасности.

    После того, как все это будет сделано, в логах покажется ID ключа, и Вы сможете добавить мастер ключ в базу.


  11. @melfis Если считать, что при сборке не допущены ошибки и учитывая, что первоначальный скетч работает, то я посоветовал бы обратить внимание на качество монтажа Ethernet модуля. За братьями Китайцами уже замечались косяки ранее.

    Отрабатывает ли открытие с кнопки?


  12. Друзья, хорошая новость, хотя слово "хорошая" тут под вопросом, но в любом случае, новость положительная.

    Ранее оговаривалось, что ESP8266 держит не более 5 одновременных TCP соединений. Да, это действительно так и при превышения этого придела контроллер перестанет отвечать по сети. Активные сторожевые таймеры не смогут привести его в сознание и поэтому мы используем дополнительный сторожевой таймер на прерываниях.

    После более детального выяснения ситуации и глубокого копания наткнулся на интересный вопрос на GitHub и, что самое главное, ответ на него https://github.com/esp8266/Arduino/issues/3185

    В итоге мы можем сделать вывод, что имеющееся ограничение явно обусловлено возможностями микроконтроллера. Ведь это не полноценная сетевая единица в обыденной для нас информационной среде, а маленький муравей, который и так прекрасно справляется с возложенными на него задачами. В итоге если правильно распределять нагрузку и соблюдать порядок очереди соединений мы можем организовывать очень серьезные проекты.

    PS: спасибо одной из социальных групп, администраторы которой были уверены, что возложенные нами обязанности на ESP8266 ему не по силам, а выявленная проблема является последствием моей криворукости. Ребята, именно Вы заставили усомниться и побудили еще раз разобраться в ситуации и подтвердить, что наше решение верное, спасибо!

    extern "C" {
      #include "espconn.h"
    }
    
    espconn_tcp_set_max_con(8);

     

    • Like 1

  13. Всем доброе время суток.

    Сегодня пойдет речь об одном из вариантов сбора информации о лицензиях операционных системах Windows и некоторого сопутствующего программного обеспечения.  Для сбора будет использована утилита ProduKey, это далеко не идеальный вариант, но вполне приемлемый, если нет иных средств мониторинга, и требуется что-то быстро слепить на коленке без траты денег.

    И так, имеется группа компьютеров находящихся в домене, подсеть 10.10.10.0/24, ProduKey запускается от учетной записи администратора домена или администратора той ветки, к которой принадлежит подсеть.

    Программой можно пользоваться как в графическом интерфейсе, так и в консольном режиме. Последний вариант, лично для меня, более предпочтителен.

    get-windows-office-keys2.png

    ВАЖНО: нам требуется программа только на Английском языке т.к имена ключей использующихся в отчетах должны соответствовать именам ключей в PHP скрипте далее.

    В корне с программой создаем .bat файл со следующим содержимым

    produkey.exe /iprange 10.10.10.2 10.10.10.254 /sjson 10.10.10.0.json /WindowsKeys 1 /OfficeKeys 1 /SQLKeys 1 /IEKeys 0 /ExchangeKeys 1 /ExtractEdition 0

    Используемые параметры

    • /iprange - указывает диапазон адресов для сканирования
    • /sjson - файл отчета необходимо сохранить в формате json
    • /WindowsKeys 1 - собирать ключи операционных систем
    • /OfficeKeys 1 - собирать ключи Office
    • /SQLKeys 1 - собирать ключи SQL сервера
    • /IEKeys 0 - НЕ собирать ключи IE
    • /ExchangeKeys 1 - собирать ключи Exchange
    • /ExtractEdition 0 - НЕ собирать расширенную информацию об операционной системе

    Это один из вариантов запуска, большее количество параметров описано на сайте разработчика.

    После того, как утилита закончит свою работу, она сохранит отчет в формате json в указанный нами файл. Можно использовать и другие форматы отчетов, но явного представления о количестве и качестве мы не получим. Программа только собирает данные, все остальные манипуляции с ними ложатся на плечи рядовых администраторов.

    Но не беда, на помощь нам приходит, уже затертый до дыр, Apache + PHP.

    Все файлы отчета помещаем на машину, где установлены эти ребята, и обязательно за пределами Web сервера. Сам PHP скрипт будет выглядеть следующим образом.

    <?PHP
    if(false) {
        ini_set('error_reporting', E_ALL);
        ini_set('display_errors', 1);
        ini_set('display_startup_errors', 1);
    }
    $myKeys = array(
        'XXXXX-XXXXX-XXXXX-XXXXX-XXXXX' => 'Управляющая компания',
        'YYYYY-YYYYY-YYYYY-YYYYY-YYYYY' => 'Завод №1',
        'ZZZZZ-ZZZZZ-ZZZZZ-ZZZZZ-ZZZZZ' => 'Складская зона',
    );
    $info = array();
    /*
     Тут указываем путь и шаблон поиска файлов отчетов (Here we specify the path and template for finding report files)
     glob("../../../info/log_*.json")
     glob("/var/log/*.json";
     glob("*.json");
    */
    foreach(glob("*.json") as $file) {
        $json = str_replace(array("\r\n", "\n"), '', file_get_contents($file));
        $json = json_decode(iconv('cp1251', 'utf-8', $json), true);
        if(is_array($json)) {
            foreach($json as $id => $obj) {
                if(preg_match_all('/(.+) \((.+)\)/m', $obj['Computer Name'], $host)) {
                    $ip =& $host[2][0];
                    $name =& $host[1][0];
    
                    $net = explode('.', $ip);
                    array_splice($net, 3);
                    array_push($net, '0');
                    if($ip  == $name) $name = '<u>'.$name.'</u>';
                    $net = implode('.', $net);
                    $info[$obj['Product Name']][$obj['Product Key']][$net][] = $ip.' ('.$name.')';
                }
            }
        }
    }
    echo '<html lang="ru-RU" dir="ltr">';
    echo '<head>';
    echo '<style type="text/css">body {cursor: default;} i b:hover {color: forestgreen; text-decoration: underline;} #host:hover {color: forestgreen;}</style>';
    echo '<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>';
    echo '</head>';
    echo '<body>';
    echo '<pre>';
    $uSoft = 0;
    $uKey  = 0;
    $uNet  = 0;
    foreach($info as $software => $keys) {
        $uSoft++;
        echo "<b style='font-size: large; cursor: pointer;' onclick=\"if($('div#s".$uSoft."').is(':visible')) $('div#s".$uSoft."').hide(400); else $('div#s".$uSoft."').show(400);\">".$software."</b> <i style='font-size: normal;'>(licenses: ".count($keys).")</i>\n";
        echo "<div id='s".$uSoft."' hidden>";
        asort($keys);
        foreach($keys as $key => $subnet) {
            $uKey++;
            if(!$key) $key = 'UNKOWN';
            echo "\t<i><b style='cursor: pointer; color: forestgreen;' onclick=\"if($('div#k".$uKey."').is(':visible')) $('div#k".$uKey."').hide(400); else $('div#k".$uKey."').show(400);\">".$key."</b> (hosts: ".(count($subnet, COUNT_RECURSIVE) - count($subnet)).")</i> <b style='color: red;'>".(isset($myKeys[$key])? $myKeys[$key] : '')."</b>\n";
            echo "<div id='k".$uKey."' hidden>";
            foreach($subnet as $net => $host) {
                $uNet++;
                echo "\t\t<i><b style='cursor: pointer;' onclick=\"if($('div#n".$uKey.$uNet."').is(':visible')) $('div#n".$uKey.$uNet."').hide(400); else $('div#n".$uKey.$uNet."').show(400);\">".$net."</b> (hosts: ".count($host).")</i>\n";
                echo "<div id='n".$uKey.$uNet."' hidden style='padding-bottom: 10px;'>";
                foreach($host as $name) echo "\t\t\t<span id='host'><i>".$name."</i></span>\n";
                echo "</div>";
            }
            echo "</div>";
        }
        echo "</div>\n";
    }
    echo '</pre>';
    echo '</body>';
    echo '</html>';
    ?>

    Просто и сердито.

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

    get-windows-office-keys.png

    Также в скрипте можно указать список ключей и дать им имена.

    $myKeys = array(
        'XXXXX-XXXXX-XXXXX-XXXXX-XXXXX' => 'Управляющая компания',
        'YYYYY-YYYYY-YYYYY-YYYYY-YYYYY' => 'Завод №1',
        'ZZZZZ-ZZZZZ-ZZZZZ-ZZZZZ-ZZZZZ' => 'Складская зона',
    );

    Удобно если требуется явно указать на какие подразделения или объекты приобреталась та или иная лицензия. Все совпадения будут выделены красной подписью.

    Выводы

    Из плюсов, это явная простота и стоимость данного решения. Начальную статистику можно получить уже через пару часов после поднятия вопроса о необходимости иметь результат еще вчера. Наглядность представления. Можно добавить расчет стоимости поддержания данного софта в "деревянных" или сразу в "бакинских", ну и естественно принять соответствующие меры, какие, решать уже Вам.

    Из минусов, это не 100% результативность т.к статистика будет получена только по тем машинам, которые были онлайн на момент сканирования. Отсутствие системы кэширования для накопления данных при периодических опросах сети. Хотя последнее можно исправить средствами PHP, но пока такая задача не ставилась.

    • Like 1

  14. Никогда не задумывался о формате часов т.к в моем случае все архивы хранятся на машине под управлением Linux. Думаю, что формат времени жестко зашит в iOS.

    Осмелюсь предложить сохранять архивы без указания метки времени в их названиях, а ориентироваться на данные от самого устройства о последнем созданном архиве, а также по дате создания файла на сервере под управлением Windows.

    Router(config-archive)#path tftp://10.10.10.10/OBJ-NAME/$H
    Router#sh arch
    The next archive file will be named tftp://10.10.10.10/test/router-2
     Archive #  Name
       0
       1       tftp://10.10.10.10/test/router-1 <- Most Recent
       2
       3
    

     


  15. Безопасность автоматизированных систем домашнего производства, на данный момент, далека от идеала. Если с центральным узлом (сервером) все довольно хорошо т.к. обычно используется система под управлением полноценной операционной системой, то с периферией (микроконтроллеры) все обстоит не так весело. Сложность понимания и организации систем шифрования поднимают планку входного уровня, и львиная доля энтузиастов попросту не тратит на это свое время. Хотя есть варианты организации относительно безопасной связи на уровне микроконтроллеров, например, AES шифрование. ESP вообще из коробки поддерживает SSL, что весьма радует. 

    Как по мне, так конечный пользователь должен держать связь только с сервером, а доступ к периферии нужен только во время пусконаладочных работ или при диагностике неисправностей, хотя последний пункт под вопросом. Каналы связи также необходимо развязывать и не использовать домашнюю беспроводную сеть, да и проводную тоже, для связи повседневной вычислительной техники (телефоны, компьютеры) и роя микроконтроллеров. Отдельная экосистема за NAT-ом в домашней сети со строгим доступом только к центральному серверу через проброшенные порты или, на худой конец, DMZ. Хотя это меня уже понесло в философию со своими понятиями добра и зла.

    По поводу энкодера. Действительно интересный вариант, но имеет минус в виде цены. По возможности закажу себе его.


  16. Доброе время суток.

    Более года назад мне потребовалось выдергивать карты сетей из web интерфейса zabbix, но эта потребность была не долгой, и вскоре все было забыто. И вот недавно, разбирая закрома, наткнулся на реализацию этой идеи. 

    Зачем это нужно?

    Большинству людей, пользующихся системами мониторинга, достаточно того интерфейса, который предоставляет разработчик. А разработчик обычно останавливается на реализации web интерфейса. Можно забыть про всякие виджеты, push уведомления или иные способы оповещения "из коробки". Это сильно угнетает т.к у меня нет возможности постоянно смотреть на дашборд в ожидании каких либо событий. Да и вообще я могу быть погруженным в другие людские заботы или, что еще боле серьезное, отсутствовать на рабочем месте.

    Чтобы как-то исправить две последние ситуации были реализованы следующие дополнения

    1. Push уведомления: Android, iOS, Windows - очень удобно получать информацию о проблемных узлах прямо на телефон. Порой решения проблемы приходят в голову быстрее, чем кто-либо еще о ней узнает.

    2. Мониторинг триггеров в GUI под Windows - пока что сырая, но вполне работоспособная система позволяющая получать всплывающие уведомления, сопровождающиеся звуковым оповещениям и интерфейсом для быстрого доступа к узлу.

    Теперь захотелось пойти немного дальше и позволить удаленным приложениям забирать актуальные карты сетей по их идентификатору в zabbix интерфейсе. А также в планах вывести общую карту сети на большой монитор для всех коллег. И делать это, хотелось бы, не светя учетными данными пользователей zabbix и не нагружая сам сервер. В общем, эта мелочь будет описана в данной теме.

    И так, что нам понадобится.

    Т.к наличие zabbix подразумевает наличие web сервера и PHP, то вы даже не догадаетесь, на чем мы все будем писать? или догадаетесь? ... эээ блин!

    Первым делом нам необходимо дополнить арсенал PHP модулем CURL. В данный момент у меня все это хозяйство крутиться на Ubuntu 16.04 с PHP-7.1 и добавить модуль можно следующим способом.

    sudo apt-get update
    sudo apt-get install php7.1-curl
    sudo /etc/init.d/apache2 reload

    Создаем на нашем web сервере, в произвольном месте, файл graphics.php со следующим содержимым

    <?PHP
    if(false) {
        ini_set('error_reporting', E_ALL);
        ini_set('display_errors', 1);
        ini_set('display_startup_errors', 1);
    }
    
    $settings = array(
        'request' => '',
        'name' => 'guestlogin',
        'password' => 'guestpassword',
        'autologin' => '',
        'enter' => 'Sign in'
    );
    
    function putImage($data = false) {
        header('Content-Type: image/png');
        header('Content-Transfer-Encoding: binary');
        if($data) echo $data;
    }
    
    if(isset($_GET['sysmapid']) and preg_match('/^[0-9]{1,2}$/', $_GET['sysmapid'])) {
        $imageUrl = 'http://localhost/zabbix/';
        $imageTmp = base64_encode(microtime(null));
        $imagePng = '/tmp/zabbixTrigger_map'.$_GET['sysmapid'];
        $cookie   = '/tmp/zabbixTrigger_cookie';
    
        if(file_exists($imagePng)) {
            if(time() - filemtime($imagePng) < 30) {
                putImage();
                exit(file_get_contents($imagePng));
            }
            unlink($imagePng);
        }
    
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $settings);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
        
        $post = (file_exists($cookie)) ? 'map.php?sysmapid='.$_GET['sysmapid'] : 'index.php';
        curl_setopt($ch, CURLOPT_URL, $imageUrl.$post);
        $data = curl_exec($ch);
    
        if(curl_getinfo($ch, CURLINFO_CONTENT_TYPE) != 'image/png') {
            curl_setopt($ch, CURLOPT_URL, $imageUrl.'map.php?sysmapid='.$_GET['sysmapid']);
            $data = curl_exec($ch);        
            file_put_contents($imageTmp, $data, LOCK_EX);
            
            $finfo = finfo_open(FILEINFO_MIME_TYPE);
            if(finfo_file($finfo, $imageTmp) == 'image/png') {
                file_put_contents($imagePng, $data, LOCK_EX);
                putImage($data);
            }
            else echo 'error';
            unlink($imageTmp);
        }
        else {
            file_put_contents($imagePng, $data, LOCK_EX);
            putImage($data);
        }
        curl_close($ch);
    }
    ?>

    Что здесь происходит.

    Скрипт пытается авторизоваться на zabbix сервере. Советую, для этих целей, использовать гостевую учетную запись. И минуя прочий html шлак, забирает картинку по её идентификатору. Как узнать идентификатор нужной нам карты сети? Для этого откройте карту в дашборд zabbix, и в строке запроса, вы увидите её порядковый номер.

    zabbix_get_maps_php_curl_1.png

    Нас интересует переменная sysmapid, именно её мы будем использовать для передачи идентификатора для graphics.php

    zabbix_get_maps_php_curl_2.png

    Теперь о том, как передать данные для авторизации гостевой учетной записи.

    $settings = array(
        'request' => '',
        'name' => 'guestlogin',
        'password' => 'guestpassword',
        'autologin' => '',
        'enter' => 'Sign in'
    );

    Данный массив представляет собой список всех форм участвующих в авторизации пользователя. И пусть Вас не пугает их количество, на самом деле их ровно столько, сколько в самом интерфейсе zabbix. Вам необходимо исправить только поля с именем пользователя и пароля.

    Жизненно необходимо указать http путь до zabbix сервера, это делается в переменной

    $imageUrl = 'http://localhost/zabbix/';

    Также имеются переменные, описывающие, где будут храниться временные файлы изображений и cookie на нашем сервере

    $imagePng = '/tmp/zabbixTrigger_map'.$_GET['sysmapid'];
    $cookie   = '/tmp/zabbixTrigger_cookie';

    Скрипт кэширует изображения во временном каталоге и отдает его, если не прошло более 30 секунд с момента его создания. Также во временном каталоге будет храниться файл cookie необходимый для работы curl. 

    ВАЖНО: не переносите эти файлы в рабочий каталог web сервера!

    Таким образом, мы забираем у zabbix карты сетей без передачи какой либо конфиденциальной информации. Можно дополнить скрипт и отдавать только определенные карты и только конкретным хостам. В общем, есть почва для размышлений.

     

    • Like 1

  17. @Small_d Позволю себе предположить, что загрузчик Вашего микроконтроллера не поддерживает работу со сторожевым таймером. Уж очень похожи симптомы.

    В самом начале описания функции Setup имеются строки активирующие сторожевой таймер Arduino.

      // Настраиваем сторожевой таймер
      wdt_disable();
      delay(8000);
      wdt_enable(WDTO_8S);

    При старте, контроллер ждет 8 секунд и после инициализирует сторожевой таймер на сброс при отсутствии контрольного сигнала в течении 8 секунд. За обновление счетчика отвечает функция, вызываемая при каждом вызове loop

      // Сбрасываем сторожевой таймер микроконтроллера
      wdt_reset();

    Итого, если у Вас не поддерживается работа с Watchdog, то каждые 16 секунд будет происходить перезагрузка контроллера.

    Чтобы отключить сторожевой таймер, и все, что с ним связано, закомментируйте строчки, указанные выше. Хочу сразу Вас предостеречь.

    1. Никогда не заливайте программу с активированным сторожевым таймером в микроконтроллер на базе Arduino без задержки перед функцией инициализации таймера. Если конечно вы не уверены на 100%, что загрузчик поддерживает его работу. В противном случае, это чревато последствиями.
    2. На таком ответственном месте контроллер нельзя оставлять без сторожа, в случае необходимости, он приведет в чувства контроллер, а иначе можно остаться перед запертой дверью.

    Теперь, что касаемо ключа.

    Мы используем адрес ключа, состоящий из 4 байт, некоторые ключи отдают и 7 байт, но мы используем только 4. В итоге ключ представляет из себя строку, полученную в ходе конкатенации всех четырех байт ключа.

    Если все подключено правильно, то все поднесенные к сканеру ключи будут отображаться в Serial мониторе. Эту информацию Вы можете взять за основу для создания мастер ключа.

    Волею судьбы получилось так, что интерфейс для работы с добавлением, удалением или редактированием ключей остался не реализованным и лег на плечи конечного исполнителя. Можно это исправить, но нужен серьезный стимул, способный оторвать от текущих дел.

    • Like 2
×
×
  • Создать...