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

Kitsum

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

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

  • Посещение

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

    234

Все публикации пользователя Kitsum

  1. Да, это два условия активации сигнализации. Резистор не требуется
  2. Все верно, мы друг друга прекрасно поняли. Только подавать +5v необходимо на A0. На схеме на нем висит двухпозиционный переключатель чтобы показать принцип работы. Выкидываем переключатель и место него используем что угодно от банальной перемычки до GSM сигнализации. Главное, если логика управления идет с другого оборудования, то обязательно объедините GND устройств.
  3. to Alex13 Обновил код в посте выше. Но проверить не могу т.к нахожусь на работе, предлагаю это сделать Вам или дождаться пока я приеду домой. Чтобы упростить работу, добавил параметр в конфигурацию (57 строка) // Переменные для сигнализации bool invert = true; // Инвертировать выходы сигнализации (A1, A2) Измените значение на false и на этих входах должен начать появляться высокий уровень при тревоге. Это пин A0, как с ним работать описано в п3. поста со скетчем. По поводу активации. Добавил отслеживание как состояние пина A0, так и текущее состояние реле замка. Если сигнализация включена и замок закрыт, то тревоги будут считаться, в противном случае счетчик попросту не инкрементируется.
  4. Ко мне обратился товарищ с просьбой уменьшить размер данного скетча т.к. места в его проекте уже совсем нет, а авторизация необходима как воздух. Мое мнение, что стоило бы сменить контроллер, было отвергнуто в силу долгого ожидание посылки из поднебесной и хочется прямо здесь и сейчас. Необходимо выбросить лишнее и сэкономить крошки на ATmega328p устанавливаемой в Arduino UNO / NANO Компилируем изначальный скетч (под чип W5100) и смотрим, сколько он весит, это будет отправной точно. Sketch uses 15 908 bytes (49%) of program storage space. Maximum is 32 256 bytes. Global variables use 524 bytes (25%) of dynamic memory, leaving 1 524 bytes for local variables. Maximum is 2 048 bytes В ходе быстрого кромсания выкидываем: библиотеку Base64, функцию auth_update() и все переменные, связанные с авторизацией. Хочу заметить, что изначально подразумевалось все это использовать для возможности изменять учетные данные в Web морде и хранить их в EEPROM. В угоду экономии места логин и пароль будет жестко задан в программе. Проверка авторизации осуществляется в 40 строке кода, в неё же зашит хэш Base64 - login:password if (readString.lastIndexOf(F("Authorization: Basic bG9naW46cGFzc3dvcmQ="))>-1) { После повторно компилируем программу и сравниваем вес. Sketch uses 14 756 bytes (45%) of program storage space. Maximum is 32 256 bytes. Global variables use 414 bytes (20%) of dynamic memory, leaving 1 634 bytes for local variables. Maximum is 2 048 bytes Получаем экономию: Скетч уменьшился на 4%, что составляет 1152 байта Оперативка освободилась на 5%, что составляет 110 байт Не густо, но этого оказалось достаточно, по этой же причине данный пост получил право на жизнь. Остается только придумать логин и пароль и самостоятельно получить из них хеш Base64, а затем вписать его в скетч. Напоминаю, что логин и пароль пишутся одной строкой через разделитель двоеточие ":". Если для примера взять логин Admin, а пароль СhIcKeN, то должна получится строка Admin:СhIcKeN Пишем её в наш online конвертер Base64 и получаем на выходе необходимый нам хеш QWRtaW46Q2hJY0tlTg== Base64 online converter Текст в Base64 (encode) Base64 в Текст (decode) PS: идея онлайн конвертера Base64 взята с сайта http://webtoolkit.info, в связи с этим я обязан разместить на них ссылку.
  5. to Alex13 Необходимо протестировать некоторое время на стабильность работы. Все реле в схеме можно выбросить и использовать только как сигнальную логику 5v. Например, GSM сигнализация и т.д. ВАЖНО: логика для управления реле инвертирована: 1 - реле закрыто, 0 - реле открыто. Это связанно с особенностями работы релейных модулей поставляемых братьями Китайцами. Все переключатели можно выкинуть из схемы и использовать как логические входа 5v для связки с другим оборудованием. Единственное условие, чтобы входа изменяющие поведение контроллера (A0, D8) были притянуты к GND или 5v и не висели в воздухе. Кнопка открытия двери (D2) по умолчанию подтянута к GND, а кнопка сброса памяти (D4) к 5V. ВАЖНО: Если инвертировать сигналы, то дверь будет постоянно открываться или постоянно очищаться память контроллера! Стандартный режим работы описан в первом посте. Хочу только дополнить о доработках: Если пин D8 подтянут к GND, то дверь закрывается автоматически через 5 сек. после открытия. Если притянут к 5v, то для закрытия замка необходимо повторно поднести к RFID сканеру любой из записанных в памяти ключей. Если используется RFID метка для закрытия двери, то в закрытом состоянии кнопка открытия остается задействованной и позволит открыть замок изнутри с последующим автоматическим закрытием двери через 5 сек. Вы сможете впустить человека, закрыть за ним дверь, используя метку, и при этом он сможет самостоятельно выйти из помещения. Если пин A0 подтянут к GND, то сигнализация находится в активном состоянии и работает в предложенном Вами режиме. Если в течении 1 минуты зафиксированы 3 попытки подбора ключа, то на пинах A1 и A2 появляется низкий уровень. Через 1 минуты пин A1 возвращается в исходное состояние и на нем висит высокий уровень. Пин A2 удерживает низкий уровень до тех пор, пока замок не будет открыт одним из известных ему ключей. Если пин A0 подтянут к 5v, то сигнализация отключается. Во время открытия замка все счетчики и таймеры связанные с сигнализацией обнуляются. Естественно логические уровни на пинах A1 и A2 можно инвертировать в программе. Сам листинг программы Еще раз настоятельно рекомендую Вам все перепроверить т.к. все люди ошибаются, а остаться запертым никто не захочет. PS: Если вдруг Вы будите использовать электромагнит в связке с реле, позаботьтесь о самоиндукции в цепи между ними т.к. в противном случае через некоторое время реле выйдет из строя. Это из опыта эксплуатации моих коллег.
  6. Если получится разнести с общих пинов Ethernet и RFID, то вполне реально. На сколько жизнеспособно это другой вопрос. Если предположить, что физически все срослось, то сходу в голову приходят мысли: Как использовать Ethernet? срастить с базой людей и организовать мини проходную с турникетом или слать статистику открытия на сервер или еще что-то? Что делать если Ping поднимется до критической отметки? Что делать если нет сети, например потух маршрутизатор? впускать по заранее записанным ключам в EEPROM или блокировать все? Как при таких малых мощностях защитить трафик в сети (пересылку ключей и иной закрытой информации)? Это то, что пришло в голову сразу, естественно список в разы увеличится если начать это делать. Хотя скажу честно, что ради спортивного интереса можно попробовать, но это делать нужно на ATmega 2560 или лучше разделить обязанности между двумя ATmega 328 связанными между собой каким ни-ть интерфейсом. PS: намного проще и реальнее это реализовать на Raspberry PI, Orange PI или на другой плате с аналогичными возможностями. Сразу в голове крутится RC522 + Ethernet + SQL + SSH + Apache + ...
  7. Необходимо кинуть перемычку между пинами D4 и GND, в противном случае контроллер думает, что подается команда на очистку EEPROM. Пин D2 подтягивается к +5v, при подтяжке к земле произойдет открытие замка. На земле эта кнопка завязана на случай если дистанция от контроллера до кнопки открытия замка будет исчисляться в десятках метров.
  8. Действительно проблема существует и появляется в разных версиях IDE. processing.app.debug.RunnerException at cc.arduino.packages.uploaders.SerialUploader.uploadUsingPreferences(SerialUploader.java:179) at cc.arduino.UploaderUtils.upload(UploaderUtils.java:78) at processing.app.Sketch.upload(Sketch.java:1178) at processing.app.Sketch.exportApplet(Sketch.java:1152) at processing.app.Sketch.exportApplet(Sketch.java:1124) at processing.app.Editor$DefaultExportHandler.run(Editor.java:2417) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.NullPointerException at java.lang.String.replace(String.java:2240) at processing.app.helpers.StringReplacer.replaceFromMapping(StringReplacer.java:97) at processing.app.helpers.StringReplacer.replaceFromMapping(StringReplacer.java:89) at processing.app.helpers.StringReplacer.formatAndSplit(StringReplacer.java:37) at cc.arduino.packages.uploaders.SerialUploader.uploadUsingPreferences(SerialUploader.java:174) ... 6 more Я вижу, что у Вас используется версия 1.6.8 от обновления 21.01.2016 18:15:49 GMT. А уже 22.01.2016 официальный сайт ссылается на предыдущую версию 1.6.7. На странице Arduino Software Release Notes последнее обновление идет от 17.12.2015, что актуально опять же для версии 1.6.7 Я делаю вывод, что был не удачный день и в сеть ушла недоработанная версия, после выявления данной проблемы разработчик оперативно откатился на предыдущую версию. Вы в свою очередь стали тем счастливчиком, кто успел скачать ... Предлагаю в очередной раз переустановить Arduino IDE и воспользоваться предыдущей версией. У меня установлена версия 1.6.6, но я проверил и текущую 1.6.7, все работает. https://www.arduino.cc/en/Main/OldSoftwareReleases#previous
  9. Kitsum

    Перепрошивка bootloader (загрузчика)

    Установка драйверов USBasp для Windows 10 / 8.1 / 8 По существу установка драйвера проста, но во время установки происходит отказ т.к официальные драйвера не имеют цифровой подписи. Чтобы решить данную задачу, необходимо временно отключить обязательную проверку подписи драйверов. Для начала, необходимо скачать сами драйвера. Для этого идем на официальный сайт разработчика (автор Thomas Fischl), скачиваем архив с последней обновленной версией и распаковываем в удобную для Вас директорию. Теперь нажимаем и удерживая клавишу SHIFT отправляем компьютер на перезагрузку. Это заставит Windows выйти в режим восстановления. После этого мы попадаем в режим восстановления. Выбираем "Поиск и устранение неисправностей". Выбираем "Дополнительные параметры". Выбираем "Параметры загрузки". Отправляем компьютер на перезагрузку. После всех этим манипуляций мы попадаем в меню выбора параметров загрузки. Выбрать один из перечисленных вариантов можно клавишами от F1 до F9, но нас интересует вариант F7 - "отключить обязательную проверку подписи драйверов". Далее все по стандарту. Идем в список устройств, ищем наш не установленный USBasp программатор и обновляем драйвер с локального компьютера указав путь до распакованного ранее архива. Во время установки драйвера Вы увидите предупреждение об отсутствии электронной подписи. Игнорируем его и продолжаем установку. После этих, не хитрых манипуляций, мы получаем установленный в системе USBasp программатор. PS: наслаждаемся результатом.
  10. to svchekalin В силу конфликта между Arduino LLC и Arduino SRL, они ведут разработку двух IDE отличных друг от друга, соответственно и библиотеки имеют различия. При изучение библиотеки EEPROM от arduino.org мне не удалось найти метод length. Уверен, что это все объясняет. Я использовал среду разработки от arduino.cc До сегодняшнего дня я знал, что эти ребята имеют отличия в IDE, но не думал что все так серьезно! С другой стороны я рад, что эта проблема всплыла т.к заставила меня начать изучать библиотеки от arduino.org Для решения проблемы, воспользуйтесь средой от arduino.cc или попробуйте заменить встроенные библиотеки, но последний вариант может привести к другим подводным камням!
  11. Пожалуйста, не нужно таким способом выражать эмоции, прошу Вас держать форум в чистоте. Предлагаю Вам использовать последнюю версию Arduino IDE: arduino.cc arduino.org
  12. Первые два пункта мне понятны и их можно реализовать. С третьим немного не ясно. Имеется в виду, что при появлении логической единицы на входе, задействуются выхода описанные во втором пункте? Если так, то и этот вариант можно реализовать, иначе прошу пояснений.
  13. Привет Alex13! Конечно, постараюсь помочь в меру своих возможностей и свободного времени. Новые идеи хотел реализовать после обновления проекта с метеостанцией, но возможно все еще изменится. В общем, ждем Ваших идей и предложений!
  14. Доброе время суток. По долгу службы приходится обслуживать не одну сотню пользователей, все они уникальны, у каждого свои проблемы, но объединяет их всех одна из эталонных - необходимость конвертировать различные графические форматы в PDF. Тривиальная задача, ставь виртуальный принтер и в бой, но есть несколько проблем: Все должно быть совершенно бесплатно т.к используется на предприятии и лишняя головная боль никому не нужна. Конвертер должен принимать форматы TIFF, JPEG, PNG, ... Некоторые готовые продукты не способны конвертировать те или иные форматы, например печать (встроенными средствами windows) формата TIFF на виртуальный принтер doPDF. Разный уровень подготовки пользователей, от "Смотри, как я умею" до "Смотри как надо". Вследствие чего некоторые люди способны интуитивно и самостоятельно понять, что к чему и под каким соусом это подать, а некоторые начинают процесс конвертирования с набора номера Вашего покорного слуги и его коллег. Естественно есть и промежуточные варианты эволюции с непредсказуемым результатом. Все должно быть просто и понятно, чтобы разобраться был способен даже ребенок. Все началось в один обыденный день, когда ко мне обратился один из пользователей которому необходимо в промышленных масштабах производить перевод злополучных TIFF файлов в PDF. В этот день было решено организовать собственный online сервис по конвертированию графических форматов в PDF. Основные болевые точки уже были затронуты выше, есть от чего отталкиваться, осталось только придумать алгоритм: Пользователь открывает специальную страницу в браузере Перетаскивает необходимый ему файл в окно Немного ждет и получает на скачивание готовый PDF Все очень просто и работает в один клик, все действия за пользователя делает программа на сервере. Самое страшное, что может случиться - человек забудет адрес страницы. Переходим к реализации В моем случае используется: Linux Ubuntu 14.04 Apache/2.4.7 PHP 5.5.9 Библиотека php5-imagick mySQL сервер ImageMagick не входит в состав стандартных библиотек PHP (по крайней мере в пакете под Ubuntu), а следовательно: apt-get install php5-imagick service apache2 restart Следующим этапом идет создание базы данных. Сказать честно, это вынужденный пункт т.к необходимо возвращать конвертированный файл с именем идентичным оригиналу, а ведь имя может содержать символы из различных алфавитов (например кириллица). И это вызывает определенные трудности. Зато, как побочный эффект, мы получаем возможность вести логи, следовательно, оптимизировать работу скрипта в будущем. И так, создаем базу данных converter и таблицу inPDF со следующей структурой: CREATE TABLE IF NOT EXISTS `inPDF` ( `id` varchar(40) NOT NULL, `time` int(20) NOT NULL, `name` varchar(100) NOT NULL, `size` int(10) NOT NULL, `ip` varchar(15) DEFAULT NULL, `dns` varchar(50) DEFAULT NULL, UNIQUE KEY `id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Также следует использовать отдельную учетную запись SQL сервера для доступа к б.д. Все остальные файлы прикреплены к посту. Все конвертируемые файлы загружаются в каталог upload и для этого необходимы соответствующие права, но Вы и так это понимаете. chmod 0777 ./upload Отредактируйте настройки базы данных в файле index.php $settings = array( 'host' => 'localhost', 'db' => 'converter', 'login' => 'user', 'pass' => 'password' ); Пользовательский интерфейс Его необходимо реализовать максимально простым и интуитивно понятным. Я представил его себе в виде обычного перетаскивания файла (TIFF, JPEG, PNG, BMP, можно добавить и другие форматы) в браузер, небольшого ожидания и получения на скачивание конвертированного в PDF файла. Никаких настроек, вопросов и лишних кликов мышкой! Реализовать подобное поможет jquery. Я не селен в JS, поэтому побродил немного по сети и нашел, в свободном распространении пример реализации Dragon and Drop. После примитивных модификаций получил приемлемый результат. Главное использовать современный браузер. Данное творение проверено в: Chrome, Firefox, Opera. PS: Не претендуем на идеал, но как по мне, для первой версии вполне даже пригодно. converter.7z
  15. Как показала практика, у некоторых людей возникли проблемы при описании конфигурации, а раз этот факт имеет место быть, то он будет повторяться и в будущем. Дабы развеять имеющиеся, на данный момент, вопросы и предотвратить появление других в будущем, предлагаю рассмотреть различные возможности конфигурации на примерах. Чтобы было более наглядно, каждый отдельный пример будет описан как новый конфиг. Пример 1 Сеть является домашней Один маршрутизатор с IP адресом 192.168.0.1 Один свич с IP адресом 192.168.0.2 SNMP Community на обоих устройствах настроен одинаково - public Пример 2 Сеть эксплуатируется в маленьком офисе Один маршрутизатор с IP адресом 192.168.0.1 Два свича с IP адресами 192.168.0.2 и 192.168.0.3 SNMP Community на обоих устройствах настроен одинаково - public Пример 3 Сеть эксплуатируется в небольшом магазине Один маршрутизатор с IP адресом 192.168.0.1 Два свича с IP адресом 192.168.0.2 и 192.168.0.3 SNMP Community на маршрутизаторе - private SNMP Community на свичах - public Пример 4 Сеть эксплуатируется в большом магазине Два маршрутизатора с IP адресами 192.168.1.1 и 192.168.2.1 Один свич с IP адресом 192.168.1.2 Два свича с IP адресами 192.168.2.2 и 192.168.2.3 SNMP Community везде одинаков - public Поднят домен с именем youbigstore.com Пример 5 Сеть эксплуатируется в офисном здании (3 этажа), каждый этаж находится в своей подсети. Сервер с установленным Switch Рort Mapping находится за пределами этих сетей, например в соседнем здании. 1 этаж. Маршрутизатор Cisco 800 с WAN IP адресом 10.10.1.1 и VLAN 192.168.10.0 1 этаж. Два свича 3Com с IP адресами 192.168.10.2 и 192.168.10.3 1 этаж. SNMP Community - public1 2 этаж. Маршрутизатор Cisco 800 c WAN IP адресом 10.10.2.1 и VLAN 192.168.20.0 2 этаж. Два свича 3Com с IP адресами 192.168.20.2 и 192.168.20.3 2 этаж. SNMP Community - public2 3 этаж. Маршрутизатор Cisco 800 c WAN IP адресом 10.10.3.1 и VLAN 192.168.30.0 3 этаж. Один свич Allied Telesis с IP адресом 192.168.30.2 3 этаж. SNMP Community - public3 Поднят домен с именем domain.com Пример 6 Частная сеть с нестандартным оборудованием Один маршрутизатор Noname с IP адресом 192.168.0.1 SNMP OID atPhysAddress маршрутизатора отвечающий за соответствие MAC - IP имеет вид ".1.3.6.1.2.1.3.1.1.2" (предположим, что это не стандартный OID) SNMP Community маршрутизатора - private Один свич Cisco с IP адресом 192.168.0.2 SNMP Community свича - public PS: Если имеются вопросы, не стесняйтесь обращаться, постараемся помочь!
  16. Обновление по просьбе Alex13 находится тут Открытие/Закрытие разнесены на разные пины микроконтроллера (для управление соленоидом) Обновление по просьбе Alex13 находится тут Добавлен выбор режима закрытия замка (автоматический или по карте) Добавлена сигнализация оповещающая о попытках подбора ключа Обновление по просьбе svchekalin находится тут Добавлен Ethernet Shield на чипе W5100 Ключи теперь хранятся не в EEPROM контроллера, а в MySQL базе на удаленном сервере ... Внимание: Очень много фотографий в статье! Начнем с предыстории. В один обыденный рабочий день ко мне обратились мои друзья и по совместительству коллеги по работе с идеей сделать замок с радиочастотной идентификацией. Электронный замок должен обслуживать дверь в рабочее помещение. Все бы хорошо, но дверь далеко не домашняя, сделана из метала и стоит в металлической коробки. Собрать электронную начинку замка и написать программу для микроконтроллера - решаемая задача, но как механически удержать такого монстра в зафиксированном состоянии? Но то, что для меня казалось проблемой, было воспринято моими друзьями с ухмылкой, и мне показали здоровый электромагнит. Точно такие же электромагниты используются в домофонах. Даже не хочу знать, откуда они его достали, но меня увиденное воодушевило. Задача поставлена, приступаем к реализации! Техническое задание Замок должен аутентифицировать хозяев без физического контакта пользователя с устройством Память должна вмещать не менее двух десятков ключей Устройство должно иметь возможность добавлять в память новые ключи Добавлять новые ключи можно только, используя специальный, мастер ключ Мастер ключ должен также иметь возможность открывать замок Должна быть реализована возможность обнуления списка используемых ключей, в том числе и удаление мастер ключа Замок должен иметь возможность открываться изнутри по нажатию на кнопку (как в домофоне) Все описанные пункты должны быть просты в использовании и не требовать знания программирования Реализация За основу было решено взять клон Arduino UNO с ATmega328p на борту в паре с RFID (NRF) сканером RC522. Сам сканер является очень удачным выбором т.к работает на частоте 13.56 МГц и поддерживает чипы: MIFARE S50 MIFARE S70 MIFARE UltraLight MIFARE Pro MIFARE DESfire ... Данные чипы используются в различных карточках метро и прочего общественного транспорта, ключах современных домофонов, различных умных браслетах и носимой электроники. У братьев Китайцев можно купить даже кольца с RFID (NRF) меткой. Некоторые чипы имеют энергонезависимую память небольшого объема. Прокручиваем решение в голове Хранить все ключи будем в энергонезависимой памяти микроконтроллера (EEPROM). Хорошее и как мне кажется единственное решение. ATmega328p имеет 1kB памяти, RFID (NRF) ключи содержат уникальный номер размером от 4 до N байт. Если уровнять все типы ключей, то читать мы будем только первый четыре байта любого ключа. Делаем вывод, что 1024/4=256 ключей. Но необходимо знать точное их количество чтобы не читать пустую память, иначе можно взломать замок так, как это делается с некоторыми домофонами, а именно - передать ключ, состоящий из одних 0 или 255 и Вуаля! Выделим один и по совместительству первый байт в EEPROM под число с количеством ключей и получаем (1024-1)/4=255,75, а это 255 полноценных четырехбайтных ключей! Это более чем достаточно, хоть домофон делай. Добавлять ключи будем путем записи его первых четырех байт, в свободную память микроконтроллера, начиная с N+1 занятого байта памяти Arduino. Но делать это необходимо только с использованием мастер ключа. И тут встают два вопроса, какой из ключей должен быть мастером и как его найти среди кучи всех остальных? А пусть мастер ключ хранится в строго определенных "ячейках" памяти микроконтроллера, мы ведь делаем это с количеством ключей! Пусть первый байт EEPROM отвечает за количество известных нам ключей, а следующие четыре байта будут отведены мастер ключу. Оставшуюся память отдаем под все остальное. Открытие дверей. Как понять, что поднесенный к сканеру ключ является тем самым или наоборот. Давайте опять отталкиваться от идеи четырехбайтного ключа. Пройдя все предыдущие этапы записи памяти микроконтроллера, мы с 100% точностью можем сказать, сколько ключей и как они расположены в памяти Arduino. Следовательно, для быстрого сравнения логичнее искать совпадение по первому байту каждого ключа в памяти, и только если оно найдено переходить к сравнению следующего байта. Если какой либо из 4 байт не совпал, то останавливаем проверку и переходить к следующему ключу в памяти микроконтроллера. Если найдено совпадение всех четырех байт ключа, то прекращаем проверку и устанавливаем замок в состояние открыто, иначе оставляем замок запертым. Пройдя эту не хитрую процедуру, мы можем точно сказать разрешен данному ключу доступ или нет, а заодно является ли он мастер ключом. Ведь мы будем знать номер совпавшего ключа в памяти Arduino следовательно, если он первый (на самом деле нулевой), то это волшебный ключ. Чтобы добавить новый ключ в память замка необходимо поднести и удерживать у RFID (NRF) сканера мастер ключ. Для начала будет открыта дверь, чтобы впустить владыку в обитель. Но если мастер ключ удерживается в течение 5 секунд (по умолчанию), то замок переводится в постоянно открытое состояние и система распознавания ключей, описанная ранее, начинает работать как проверка наличия ключа в памяти. Ключа нет, тогда записываем его. Ключ найден, значит, ругаемся, плюемся и топаем ногами. Таким образом, можно добавлять ключи пачками. Для выхода из режима программирования необходимо поднести ключ владыки и удерживает его 5 секунд. Для очистки памяти решено ввести красную кнопку с защитой от ложного нажатия. Если удерживать её в течение 5 секунд, то контроллер начинает перезапись EEPROM одними нулями. По окончанию операции производится перезапуск программы микроконтроллера. Но теперь нет ни единого ключа, следовательно, и мастера тоже. Непорядок! В этом безмятежном состоянии замок стоит держать постоянно открытым иначе "Се Ля Ви", что в переводе с древнегреческого "не повезло"! Первый поднесенный к сканеру ключ будет записан в память Arduino и станет мастером т.к его порядковый номер - 0. Следом за этим замок перестанет бездельничать и перейдет в состояние закрыто. С этого момента помещение считается святым, и проникнуть в него может только обладатель единственного записанного в память ключа. Для всех остальных нужно начать процедуру добавления ключей, но её мы уже придумали. Открытие двери изнутри по нажатию на волшебную кнопку поначалу показалось мне тривиальной задачей, и я добавил этот механизм простым способом (как и кнопку очистки памяти) - ногу микроконтроллера посадил через резистор на землю, а сама кнопка коммутировала на эту же ногу +5V. Все дешево и сердито, но вся соль кроется в деталях! Кнопок открытия двери будет несколько. Все они должны сидеть параллельно и самая дальняя будет расположена как минимум в 15, а то и больше, метрах от контроллера (если мерить длинной кабеля)! Это расстояние смело можно умножать на 2 и получить нереальную для +5V цифру. Необходимо пересадить ногу Arduino с GND на +5V (через резистор 10k), предварительно задействовать встроенный подтягивающий резистор микроконтроллера, а сама кнопка станет прижимать ногу к земле. Резистор между ногой и питанием необходим для избегания короткого замыкания при использовании самой кнопки. Управление электромагнитом, по понятным и так причинам, происходит через реле. Электромагнит подключен через постоянно замкнутую группу контактов и соответственно при открытии замка, на реле подается логическая единица. Это удобно т.к не приходится постоянно держать реле под напряжением, но есть и обратная сторона медали – если нет питания на контроллере, а на электромагните есть, ты открыть замок станет очень проблемной задачей. В общем, Вам самим выбирать какой из подводных камней оставить. Я свой выбор сделал. Схема подключения - РАСПИНОВКА ---------------------------------------------------------------------------- MFRC522 Arduino Arduino Arduino Arduino Arduino Reader/PCD Uno Mega Nano v3 Leonardo/Micro Pro Micro Signal Pin Pin Pin Pin Pin Pin ----------------------------------------------------------------------------------------- RST/Reset RST 9 5 D9 RESET/ICSP-5 RST SPI SS SDA(SS) 10 53 D10 10 10 SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16 SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14 SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15 ----------------------------------------------------------------------------------------- Оставлю дополнительные фото для наглядности. На самом деле, если вы будите внедрять подобное где-то в обиходе, а не просто собирать на столе, то обязательно все документируйте и перепроверяйте по несколько раз. Для быстрого монтажа я использовал плату для прототипирования. Цена на неё довольно завышена у братьев Китайцев, но я не пожалел. Перед установкой всего это добра на заслуженное рабочее место проводились испытания различных кабелей для выноса рабочей части (RFID сканера) за стену. В итоге выбор остановился на медной, многожильной витой паре используемой для прокладки Ethernet. Если использовать одножильную (моно) витую пару, то потери могут быть довольно высоки, как и с использованием различных Китайских (якобы медных) шлейфов. Гарантию работы, а соответственно и Вашего попадания в помещение, сможет гарантировать лишь страховой полис. Сам сканер был помещен в крышку от металлической коробки и закрыт стеклотекстолитом, естественно НЕ фольгированным! Полученный результат показался мне довольно сносным и был передан заказчику для установки. Для питания был задействован компьютерный блок питания, с которого, через стабилизатор напряжения 12v в 8v для запитки Arduino UNO через стандартный 5,5мм разъем. Фото монтажа За дверью все выглядит очень скромно. Т.к. сканер находится в просторном корпусе, то на него была прикреплена кнопка для электронного звонка. Довольно эстетически приятный вид, для промышленного помещения. Программная часть Вам понадобятся следующие библиотеки: RFID-RC522 (NRF) Bounce2 (избавляет от дребезга контактов при нажатии кнопок) Хотите помочь проект? Yandex.Money PayPal.me Сам скетч Все довольно плотно закомментировано, но есть большой фронт для доработки. Надеюсь, Вы дополните это создание своими идеями и нужным функционалом, а я в свою очередь уже присмотрел идеи для будущего обновления и заказал новый модуль RC522 для теста. PS: Желаю Вам приятного и надеюсь полезного использования.
  17. Update 03.12.2015 Добавлена возможность отображать DNS имена для определенных хостов, это позволит явно и человеко-понятно идентифицировать соответствующие узлы в сети. Отсутствие записи на DNS сервере должно привлечь соответствующее внимание к хосту. В конфигурацию добавлен параметр $domain позволяющий удалять из DNS имени хоста имя домена. Чтобы из name.domain.com сделать name, необходимо указать $domain = ".domain.com" Обновлена база производителей сетевого оборудования - oui.txt Мелки доработки интерфейса. Update 26.11.2015 Добавлена возможность отображать реальные имена портов (Fa1, Ethernet1/0/1, Port1 ...). Внимание: не все устройства способны передавать данную информацию, в связи с этим оставлены числовые идентификаторы, чтобы в таких случаях иметь систему идентификации. Добавлена возможность описывать в конфигурации настройки для каждого устройства отдельно. Если не использовать эту возможность, то для оборудования будет применена общая конфигурация. Добавлена возможность описывать в конфигурации уникальные OID-ы для конкретного оборудования аналогично п.2. Мелкие доработки интерфейса и кода. В данной теме мы будем рассуждать о мониторинге сетевого оборудования и подключенных к нему хостах. Следовало бы разместить её в другом разделе, но 90% всех манипуляций и дальнейшая эксплуатация будет производиться на UNIX-подобной платформе. В моем случае используется: Linux Ubuntu 14.04 Apache/2.4.7 PHP 5.5.9 Библиотека php5-snmp Также само сетевое оборудование (маршрутизаторы и свичи) должно поддерживать работу по протоколу SNMP и соответствовать стандартам ISO. Проект разработан отталкиваясь от топологии сети - звезда. Имеются множество отдельных подсетей 192.168.0.0 все они ходят во внешний мир через маршрутизаторы (в моем случае фирмы Cisco). В самих подсетях используются различные свичи, по большей части поддерживающие SNMP v1 и выше. Ранее я уже поднимал данную тему на другом, дружественном, форуме, но потом работа над проектом бала остановлена. На данный момент вопрос опять стал актуален и решено переделать как основную программу, так и внешний вид. Старая версия была написана на скорую руку и выглядела невзрачно и с большими изъянами в коде. На данный момент проект преобразился и выглядит следующим образом. Ваш браузер должен поддерживать HTML5. Чтобы избежать вопроса "зачем это нужно?" предлагаю Вам задачку. Попробуйте назвать номер порта на свиче к которому подключен компьютер дяди Васи зная лишь его IP. Или еще интереснее - зная лишь производителя его сетевого оборудования. Или вопрос от начальника "Скажи мне, кто подключен к этому свичу, а я пока узнаю, кого нужно искать". Раньше это делалось следующим образом. Подключаемся к маршрутизатору и спрашиваем, какой MAC принадлежит интересующему нас IP, пусть это будет 192.168.0.3 cisco-router#sh arp | include Vlan1 Internet 192.168.0.1 210 0800.0694.d027 ARPA Vlan1 Internet 192.168.0.2 210 0800.bdf0.0010 ARPA Vlan1 Internet 192.168.0.3 210 000e.be08.001c ARPA Vlan1 Internet 192.168.0.4 210 000e.42ee.20cf ARPA Vlan1 Internet 192.168.0.5 210 0800.218e.be09 ARPA Vlan1 Internet 192.168.0.6 5 20cf.0800.000e ARPA Vlan1 Internet 192.168.0.7 - 001c.0010.000e ARPA Vlan1 Internet 192.168.0.8 6 0010.1fc4.0800 ARPA Vlan1 Internet 192.168.0.9 2 d027.0694.0800 ARPA Vlan1 ... Теперь мы знаем MAC, это 000e.be08.001c. Подключаемся к свичу и просим его показать нам таблицу MAC адресов с сортировкой по конкретному MAC-у. cisco-switch#sh mac-address-table | include 000e.be08.001c 000e.be08.001c Dynamic 1 FastEthernet21 Теперь мы знаем, что интересующий нас (или не нас) хост использует порт FastEthernet21 Все прошло относительно быстро и гладко. Но что делать, если порт имеет порядковый номер превышающий общее число физических портов на свиче, оборудование разных производителей и оно не поддерживает одинаковый формат MAC адресов, отсутствуют различные фильтры, как например "include" в оборудовании Cisco. При этом может быть несколько свичей с десятками хостов. Все это повлияет на время поиска и на конечный результат. Реализация Мы знаем, что и у какого оборудования спрашивать. Так и давайте спрашивать это используя SNMP протокол. Первым делом необходимо настроить Ваше сетевое оборудование, выставить необходимые разрешения и community. Описывать этот пункт нету смысла т.к у Вас своё оборудования, а у дяди Васи совсем другое. На сервере, где установлен Apache необходимо доставить библиотеку реализующий работу snmpwalk в PHP apt-get install php5-snmp service apache2 restart На самом деле большая часть работы уже сделана. Теперь необходимо скачать сам скрипт, он будет прикреплен к данному посту и отредактировать его под себя. Редактируем .htaccess RewriteEngine On Options +FollowSymlinks Options -MultiViews RewriteBase /switch/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php?$1 [L] Убедитесь, что у Вас подключен модуль mod_rewrite и измените относительный путь указанный в RewriteBase на удобный Вам. Если закинуть каталог switch в корневую веб директории Apach, то вносить изменений в файл не нужно. Редактируем index.php $url = 'http://'.$_SERVER["HTTP_HOST"].'/switch/'; $domain = '.domain.com'; $community = 'public'; $unit = array( 'network_id' => array( 'name' => 'Желаемое для отображения имя подсети или объекта где сеть эксплуатируется', 'router' => '192.168.1.1', 'switch' => array('192.168.1.2'), ), 'object_name' => array( 'name' => 'Желаемое для отображения имя подсети или объекта где сеть эксплуатируется', 'router' => '192.168.2.1', 'switch' => array('192.168.2.2', '192.168.2.3', '192.168.2.4'), ), // UPDATE 26.11.2015 'new_object' => array( 'name' => 'new object name', 'router' => '192.168.3.1', 'switch' => array('192.168.3.2', '192.168.3.3'), // Уникальные настройки для маршрутизатора 192.168.3.2 '192.168.3.1' => array( 'community' => 'public2', ), // Уникальные настрокий для свича 192.168.3.3 '192.168.3.3' => array( 'community' => 'public3', 'ifName' => '.1.3.6.1.2.1.31.1.1.1.1', 'dot1dBasePortIfIndex' => '.1.3.6.1.2.1.17.1.4.1.2', ), ), ); Мы старались сделать конфигурацию интуитивно понятной, получилось это или нет, спорный вопрос. Поживем увидем, а пока разберем, что тут к чему. $url - содержит http адрес до каталога со скриптом. Измените /switch/ на используемый Вами network_id, object_name - любой понравившийся идентификатор для подсети. Используйте латиницу и\или цифры и не используйте пробелы. name - описание для подсети. Оно будет отображаться в списке на главной странице скрипта и в навигационном баре router - IP адрес маршрутизатора, через который подсеть ходит во внешний мир switch - список IP адресов свичей используемых в подсети Можно производить уникальную конфигурацию для любого сетевого устройства. Для этого в конфигурации нужного объекта необходимо указать адрес устройства и описать массив настроек для него. Можно изменять абсолютно любые существующие значения в скрипте. ВНИМАНИЕ: если Вы не понимаете, за что отвечает та или иная переменная и как устроена эта кухня, лучше обратитесь к нам, и мы Вам обязательно поможем! Список рекомендуемых для изменения значений (описание значений имеется в самом скрипте): community atPhysAddress sysDescr dot1dTpFdbAddress dot1dTpFdbPort dot1dBasePortIfIndex ifName Определение производителя по MAC адресу Каждому производителю выделяется определенный список MAC адресов для использования в его сетевом оборудовании. Ознакомиться с этим списком можно по адресу http://standards-oui.ieee.org/oui.txt Мы включили этот файл в состав архива, но советуем Вам периодически обновлять его. В скрипте используется shell_exec $vendor = explode('(hex)', shell_exec("cat ./oui.txt | grep ".str_replace(' ', '-', substr($mac, 0, 8)))); Это потенциально не безопасно, но мы не передаем ей данные полученные от пользовательского ввода, только MAC адреса. В любом случае shell_exec должен быть разрешен или часть кода, отвечающая за определения производителя, должна быть удалена. Есть очень интересная статья на сайте CISCO. Она поможет Вам разобраться в принципах работы данного скрипта. К сожалению я узнал об этой статье уже после написания большей части кода программы. Но уже имеются идеи для следующей версии! PS: Если все сделано правильно, то Вы сможете насладится нашим велосипедом. Проект будет дорабатываться и обрастать всяческими "свистульками". Приятного использования 😃
  18. Kitsum

    Мониторинг триггеров в GUI под Windows

    Доброе время суток. После одного из обновлений Windows появились сбои в работе программы. Пришлось заново компилировать все это хозяйство. Плюс решено все-таки начать переводить программу на правильный язык программирования и делать её Мультиплатформеной. По этим причинам выкладываю все исходники и последний собранный вариант с некоторыми мелкими фиксами. Итак, как уже упоминалось ранее, программа написана на PHP и, чтобы превратить её в исполняемый файл понадобится среда разработки DevelStudio Проект DVS и распакованный проект с дополнительными файлами и собранной программой (в каталоге build) прикреплены к посту. Почти весь код описан в файлах в каталоге scripts. Серверная часть по-прежнему актуальна и описана в предыдущем сообщении. ZabbixTrigger.dvs.tar ZabbixTrigger.zip
  19. Доброе время суток. Хочу поделиться опытом автоматизации изобретения Джона Уэбстера - Жалюзи, что в переводе с Французского звучит как Ревность! Скажу честно, что мой опыт обуздать это не хитрое устройство имеет как положительный, так и отрицательный результат. И я буду очень рад поделиться им с Вами, дабы Вы не совершали моих ошибок, и результат Вашей работы вызывал настоящую Ревность у всех, кто её видит! Первое с чего стоит начать это изучить конструкцию механизма Ваших жалюзи. У меня дома внедрен и плотно эксплуатируется в спальне механизм с вертикальным расположением ламелей. Сам механизм прост как две копейки. Веревка с расположенными на ней пластиковыми шариками вращает вал, который производит поворот всех секций с ламелями. Ничего лишнего, устройство работает как часы. Второе, и самое главное (на чем я прокололся), это выбор привода для управления механизмом. Я правильно подумал, что для поворота всех секций необходимо довольно большой крутящий момент и дать его мне может сервопривод. Решено было взять серву MG995 с металлическими шестернями, крутящим моментом 13 кг. на сантиметр и переделать её в сервопривод постоянного вращения. Сама процедура модернизация "мускул" проекта очень проста. Аккуратно разбираем привод (внутри много смазки) и запоминаем его устройство. На основной шестерни расположен ограничитель хода (простой цилиндр из другого метала, отличается цветом от шестерней), удаляем его (без усилия вытягивается плоскогубцами). Вынимаем всю электронику и запоминаем расположения контактов переменного резистора необходимого для позиционирования устройства. Удаляем переменный резистор и заменяем его двумя обычными и равными половине номинала удаленного органа (в моем случае это два резистора по 2.5 кОм). Полагаю, что можно воспользоваться любыми резисторами одинакового номинала до 10 кОм. Но это стоит перепроверить! Собираем все обратно. К сожалению, у меня не сохранились фотографии всего процесса извращения над сервоприводом. Запечатленным остался лишь момент замены не нужного переменка на делитель из постоянных резисторов. Далее идет примерка сервы к поворотному шкиву Жалюзи и соответственно попытки приколхозить привод к нему. Ничего сложного в этой операции нет. Можно использовать один из рычагов идущих в комплекте с сервоприводом. Но я решил заменить подходящий пластиковый рычаг, на железный, купленный отдельно. Пара минут манипуляций и союз между шкивом и рычагом (хотя второй тоже выглядит как шкив, тфу... масло масляное...) заключен. Позже, было принято решение перевернуть крепежные болты дабы сохранить возможность установки фиксирующей крышки от Жалюзи. На самом деле позже было принято очень много решений. После теста возможностей сервопривода был выявлен один крошечный недостаток, но он убивал на корню всю возможность автоматизации. Это был дребезг (другого слова я подобрать не могу) который заставлял привод совершать еле заметные и слышимые дерганья в произвольном направлении, но иногда постоянно в одном, что могло привести к натяжению поворотного вала Жалюзи в одном из крайних положений. Причина крылась в неидеальности нашего мира. Создать идеальный резистор не подверженный окружающей среде способна только задача из учебника по физике. А в результате, как только в комнате изменялась температура, даже на короткий миг, один из резисторов менял свои свойства. Вот тут и проявлялись те самые 1%, 5%, 10% погрешностей которые обещал производитель. Мириться с этим я не мог! Решений было два: Разобраться в устройстве мозгов сервопривода и заложить эту погрешность в программу микроконтроллера сервы. Купить заводскую серву постоянного вращения. И как Вы угадали, я сделал единственно верный выбор! Заказал новую серву и ею стало произведения Китайского искуства - модель DS04-NFC. Пластиковые шестерни, крутящий момент 5,5 кг. на сантиметр. Взяв её в руки, и сравнив с предшественницей, я отчетливо испытал чувство со столь красивым названием Жалюзи! Да это была Ревность! Как можно променять MG995 на DS04-NFC, каааакккк! Каарррлл скажииии, каааааккк! Ладно, боль стихла, выбор сделан. Необходимо проверить её в деле. И забегая вперед, я обязан сказать, что новая серва была подвержена той же болезни, что и переделанная MG995. Фокус не удался, но исправить проблему получилось программно в самом скетче! Тут стоит сделать небольшой отступ и для Новичков вроде меня дать пояснение. Питать сервопривод от самого контроллера невозможно т.к привод высасывает все соки из питающей линии. Контроллер начнет задыхаться и уйдет в ребут. Для исправления данного недостатка я посадил параллельно нестабилизированного входа Arduino преобразователь AMS-1117-5.0 (Китайский клон LM-1117-5.0). Таким образом, я могу подавать питание (рекомендую 7-9V) на вход платы c контроллером и иметь раздельное стабилизированное питание, как самого контроллера, так и сервопривода. Фокус удался... Думаю, что схему параллельного соединения приводить нет смысла. Добавлю лишь обвязку преобразователя (два танталовых конденсатора по 10mF). Для первого раза было решено использовать управление от старого пульта TV-тюнера. Ну, раз пошла такая пляска, то в довесок выдернуть из TV-тюнера IR приемник и гнездо для него. Если быть честным, то я не собирался потрошить тюнер, но один из моих Китайских поставщиков электроники решил меня обмануть кинуть (скажу по секрету, это был не его день!). Пару тройку минут с паяльником и в руках красуется изделие способное произвести неимоверное впечатление на средневекового человека, но не на нас. Выглядит этот колхоз следующим образом. Согласен, не очень красиво но, что я могу поделать. Исправлю в следующей версии. Переходим к программной части По началу стоит определиться с командами, на которые будет реагировать контроллер. Это зависит только от используемого Вами пульта дистанционного управления. За основу я взял библиотеку Arduino-IRremote-master.zip В комплекте куча примеров чтобы научиться с ней дружить. Ну а итоговый скетч будет выглядеть следующим образом #include <IRremote.h> #include <Servo.h> byte PIN_IR = 8; byte PIN_SERVO = 9; IRrecv irrecv(PIN_IR); decode_results ir; Servo myservo; unsigned long timer = 0; unsigned long lSpeed = 0; unsigned long rSpeed = 0; byte Speed; int fullSpeedTime = 3000; // Время в миллисекундах, за которое серва выходит на полную скорость void setup() { Serial.begin(9600); irrecv.enableIRIn(); } void loop() { if (irrecv.decode(&ir)) { //Serial.println(ir.value); // Поворот направо if(ir.value == 117192113) { timer = millis(); if(rSpeed == 0) rSpeed = millis(); Speed = map(millis()-rSpeed<fullSpeedTime?millis()-rSpeed:fullSpeedTime, 0, fullSpeedTime, 100, 180); Serial.println("Servo turns to the right. Speed " + String(Speed)); myservo.attach(PIN_SERVO); myservo.write(Speed); } // Поворот налево else if(ir.value == 1819890863) { timer = millis(); if(lSpeed == 0) lSpeed = millis(); Speed = map(millis()-lSpeed<fullSpeedTime?millis()-lSpeed:fullSpeedTime, 0, fullSpeedTime, 100, 0); Serial.println("Servo turns to the left. Speed " + String(Speed)); myservo.attach(PIN_SERVO); myservo.write(Speed); } irrecv.resume(); } else { // Обнуляем все задействованные таймеры и отключаем серву if(timer != 0 and millis() - timer > 200) { rSpeed = lSpeed = timer = 0; myservo.detach(); // <- Именно этот костыль заставляет серву молчать Serial.println(F("Servo stop\n")); } } } В программе используется плавный разгон сервопривода до максимальных скоростей. За это отвечает переменная fullSpeedTime, принимающая значения в миллисекундах. Думаю, что трех секунд достаточно, чтобы плавно регулировать разгон и тем самым позволить, в случае необходимости, управлять поворотом ламелей на очень малый угол, используя кратковременные нажатия на кнопку пульта дистанционного управления. Углы поворота влияют на скорость: от 0 до 100 от 100 до 180 Это те значения, что получились у меня на двух сервах, и которые я использовал в скетче. Чтобы заставить сервопривод не дергаться во время простоя я произвожу его отключение с использованием метода myservo.detach(); Все прекрасно отработало. Серва крутит, а в простоях молчит и даже не думает дернуться. Привожу еще немного снимков всей получившейся конструкции Самый главный вывод - стоит подобрать очень тихий привод. Серва жутко шумит, и если днем это терпимо, то вечером или ночью... это будет ужасно. PS: В общем первая версия была проверена и зарекомендовала себя хорошо, правда выглядит ужасно. Планирую добавить пару датчиков освещенности и автоматически менять угол поворота ламелей в зависимости от освещенности в течении дня. И заменить серву на тихий шаговый двигатель c редуктором.
  20. В данной заметке мы рассмотрим, как можно производить мониторинг прокси-сервера Squid через Zabbix сервер по протоколу SNMP. Предполагается, что у Вас уже имеется работоспособный сервер c ip адресом 192.168.0.11 В моём случае обкатка производилась на: Linux Ubuntu 14.04Squid 3.3.8Zabbix 2.4Дополняем файл конфигурации Squid 1. Указываем, какие интерфейсы и порт использовать для поднятия SNMP snmp_incoming_address 192.168.0.11 snmp_outgoing_address 192.168.0.11 snmp_port 21612. Правим ACL. Указываем необходимый community и ip адрес Zabbix сервера. acl snmp_monitoring snmp_community public acl snmp_client src 192.168.0.23. Пускаем Zabbix к Squid и блокируем всех остальных. snmp_access allow snmp_monitoring snmp_client snmp_access deny all4. Сохраняем изменения в конфиге и проверяем его на отсутствие ошибок. squid3 -f /etc/squid3/squid.conf -k parse5. Перезапускаем прокси-сервер. service squid3 restart6. Проверяем, прослушивает ли Squid порт 2161 netstat -a | grep 2161На этом настройка прокси-сервера завершена. На всякий случай оставляю ссылку на сайт разработчика, где указаны различия в разных версиях Squid: http://www.squid-cache.org/Doc/config/ Сам сервер заботливо оставил нам MIB файл с описанием своей кухни: /usr/share/squid3/mib.txtПосле его изучения, можно накидать начальный шаблон для Zabbix Squid-Template.zip Для наблюдаемого узла сети можно добавить два макроса: {$SNMP_SQUID_COMMUNITY} = public {$SNMP_SQUID_PORT} = 2161Это необходимо если Вы хотите изменить настройки community или port. По умолчанию, данные макросы уже указаны в настройках шаблона. Список собираемых параметров: Squid Config Cache Administrator E-Mail addressCache Software NameCache Software VersionCache Swap High Water MarkCache Swap Low Water MarkCache unique host nameLogging FacilityThe total of the cache_dir space allocated in MBThe value of the cache_mem parameter in MBSquid Dns Number of external DNS server processesNumber of external DNS server repliesNumber of external DNS server requestsSquid Fqdn Cache FQDN Cache entriesNumber of blocking gethostbyaddr requestsNumber of FQDN Cache hitsNumber of FQDN Cache missesNumber of FQDN Cache negative hitsNumber of FQDN Cache pending hitsNumber of FQDN Cache requestsSquid Ip Cache IP Cache EntrieNumber of attempts to release locked IP Cache entrieNumber of blocking gethostbyname requestsNumber of IP Cache hitsNumber of IP Cache missesNumber of IP Cache negative hitsNumber of IP Cache pending hitsNumber of IP Cache requestsSquid Median Svc Table (1/5/60) Byte Hit RatiosDNS serviceHTTP all serviceHTTP hit not-modified serviceHTTP hit serviceHTTP miss service timeHTTP refresh hit service timeICP query service timeICP reply service timeRequest Hit RatiosSquidSystem Storage Mem size in KBStorage Swap size in KBThe Uptime of the cache in timeticksВАЖНО: Это тестовый шаблон, который должен послужить отправной точкой для реализации Ваших идей и мы будем очень признательны, если Вы поделитесь с нами своими наработками.
  21. Продолжаем развивать нашу метеостанцию. Перед тем, как перейти к обновлению, хочу внести немного ясности. Мне написал один из наших коллег с вопросом, по какой причине введен сторожевой таймер? Переходим к обновлению Самое главное, мы уходим от чипа ENC28J60 и переходим на W5100. Я пытался реализовать все на старом чипе, но не хватает памяти микроконтроллера из-за очень больших библиотек для ENC28J60. При использовании нового чипа, стандартной библиотеки от разработчика и всех внесенных изменений, остается еще более 20% свободной памяти микроконтроллера ATMega328. А это, новые плюшки! В этой версии (назовем её второй) добавлена возможность передачи показаний с датчиков по беспроводной связи используя частоту 433 мГц. Сами модули я брал у Китайцев, маркировка XY-MK-5V. Хочу отметить, что качество передачи далеко от совершенства. Возможны потери сигнала, шумы, не возможность одновременной передачи и т.д и т.п. Но их цена (менее $1 за комплект) компенсируют эти недостатки. Скажу Вам по секрету, что именно эти (самые дешевые) модули стоят во многих фирменных метеостанциях для домашнего использования. Ого, неожиданно? Начнем с базовой станции Мы переходим на Arduino UNO и Ethernet Shield (первой версии) на базе чипа W5100. Это бутерброд и описывать его нету смысла. Я опишу только дополнительно задействованные контакты для модулей XY-MK-5V. Модуль передатчика использует питание 5V, GND (куда без матушки то) и D2 пин на контроллере. Изменить контакт D2 (DATA) можно, используя функцию vw_set_tx_pin из библиотеки vw. В отличии от предыдущего скетча, в этом задействованы две дополнительные библиотеки: #include <VirtualWire.h> #include <EasyTransferVirtualWire.h> VirtualWire.zip EasyTransferVirtualWire.zip Сам скетч К самим модулям необходимо добавить антенну. Для 433 мГц достаточно обычного медного провода длинной 17 см. Без антенны можете забыть о нормальной работе. Переходим к самой важной части этого обновления - локальная беспроводная станция Для её реализации (на коленке) я использовал аналог Arduino NANO (на базе ATMega328) и TFT дисплей на чипе ST7735S с разрешением 128 x 160 Распиновка дисплей -> контроллер ============================= LED | 3.3V SCK | SCK (13) SDA | MOSI (11) A0 | DC (9) RESET | RST (8) CS | CS (10) GND | GND VCC | 5V ============================ Модуль приемник подключается также как передатчик, только DATA к пину D7. Пару снимков, как это выглядит: Скетч приемника Показания отображаются довольно компактно, но как показывает практика (и советы моих товарищей) - "на вкус и цвет, даже жена не товарищ". Я выслушал кучу советов и предложений, но они противоречат друг другу. Поэтому делайте под свой вкус. Как мне показалось, дизайн это та часть проекта, которая отнимает большую часть времени! Часть данных сфабрикованы для отображения некоторых элементов дизайна. Артефакты на дисплее, это пыль и прочая грязь скопившаяся за долго время нахождения дисплея в... где то там, ... ну там, не помню откуда его достал! Отстаньте! В скетче имеются функции позиционирования. Они довольно примитивны, но позволяют добиться определенных эффектов. x_center x_alignment_right Первая производит центровку текста, а вторая выравнивание по правой части указанной зоны. Все вычисления производятся относительно размеров заданного текста, исходя из выражения 1 size = 1PX х 1PX сегмента шрифта. На дисплее также отображаются элементы соответствующие повышению или понижению той или оной величины показаний. Отображаются они в виде треугольников. Но в коде функции changes есть альтернативное отображение в виде треугольников повернутых на 45 градусов. Если показания повышаются то элемент красный, в противном случае, синий. Кстати, цвет и оттенок основной температуры изменяется в зависимости от самой температуры. Довольно спорное решение, но на мой взгляд, визуально комфортное. Я некоторое время бился над ней, и понял, что значения в функции stroke, объекта TFT дисплея, указаны в неверном порядке. BGR место RGB. Это ошибка разработчика, ну или я что-то не понимаю. PS: Все довольно интересно, но на мой взгляд заслуживает дальнейшего развития. Чем и займемся через какое то время. EasyTransferVirtualWire.zip VirtualWire.zip
  22. Update 02.12.2015 Статья переработана и перепроверена Актуально для Optiboot 6.2 и Arduino IDE 1.6.6 или выше. Рано или поздно приходится столкнуться с необходимостью замены bootloader (загрузчика) микроконтроллера. В моём случае остро потребовался функционал загрузчика Optiboot, из-за реализованного в нем сторожевого таймера (watchdog). Плюс ко всему, он весит в четыре раза меньше стандартного и освобождает дополнительно 1.5kb памяти для скетча! Сразу хочу отметить, что Optiboot залит по умолчанию на Arduino UNO и Mega 2560. У меня в наличии имелись: Arduino Nano и Arduino Pro Mini на чипах ATmega328P-AU, и просто пачка "голых" ATmega328P-PU. Есть несколько простых способов перезаписать загрузчик которыми я воспользовался (это далеко не все возможные варианты). Использование программатора USBasp Как по мне, это самый простой способ не требующий никакой магии. Сам программатор можно приобрести у братьев Китайцев за $2. Он представляет из себя плату с ATmega8 или ATmega128, USB на входе и 10Pin ICSP интерфейс на выходе. От стандартного 6Pin интерфейса он отличается лишь тремя дополнительными пинами GND и одним не использующимся NC. Чтобы упростить себе жизнь, советую сразу брать переходник с USBasp 10pin to 6pin за $0.5 Выглядит это следующим образом Сама распиновка программатора и разъемов (позаимствована у братьев наших) Если на плате Arduino распаян 6pin разъем ICSP, то подключение до безобразия простое. Совмещаем одноименные контакты программатора с платой Arduino. Если готового разъема нет, то используем соответствующие ноги на плате Arduino или на самом микроконтроллере. Необходимые ноги: GND VCC MOSI MISO RST Распиновка некоторых плат Arduino и микроконтроллеров находится в соседней теме Пример подключения USBasp к Arduino Pro Mini и к ATmega328P-PU. В случае с последним, конденсаторы можно выкинуть из схемы. Теперь самое интересное Переходим на GitHub проекта Optiboot (ссылка имеется в начале поста) и скачиваем архив со всем необходимым. Переходим в каталог где хранятся созданные вами скетчи (в Windows это "\Мои документы\Arduino\") и создаем в нем ветку каталогов \hardware\optiboot\avr\ В скачанном архиве находим каталог optiboot и переносим все его содержимое в каталог созданный в предыдущем пункте. Среди всех перенесенных файлов находим boards.txt удаляем его. Он является устаревшим и более нас не интересует! Находим файл boards-1.6.txt и переименовываем в boards.txt, в итоге должно получится как на изображении ниже Перезапускаем срезу Arduino IDE Проверяем список плат во вкладке "Инструменты" и наслаждаемся результатом При хранении всех необходимых файлов вне среды разработки Arduino IDE последующее обновление самой среды не позволит Вам потерять настройки и файлы загрузчика Optiboot в отличие от прямого вмешательства в оригинальный boards.txt Ленивые могут забрать готовый архив со всеми изменениями и распаковать его содержимое в папку со скетчами. В данном случае все достаточно только перезапустить среду разработки. Сам архив прикреплен к посту. Выбираем программатор USBasp И жмем "Записать загрузчик". ВАЖНО: Если желаете залить скетч через USBasp, то необходимо нажимать "Записать\Вгрузить" при зажатой клавиши SHIFT. Только в этом случае будет выбран программатор для заливки, а соответствующая подсказка изменится за "Загрузить через программатор". В ходе данной операции могут сыпаться ошибки указывающие на проблемы с USBasp. Попросту игнорируем их! Использование Arduino в качестве программатора Нам понадобится вторая плата Arduino. Прошиваем её скетчем ArduinoISP, идущим по умолчанию со средой разработки. После этого Arduino становится полноценным программатором. // pin name: not-mega: mega(1280 and 2560) // slave reset: 10: 53 // MOSI: 11: 51 // MISO: 12: 50 // SCK: 13: 52 В скетче имеется подсказка с способом подключения. Изменяем в Arduino IDE программатор на Arduino as ISP, выбираем необходимую плату, к которой подключен наш вновь испеченный программатор и "прожигаем" загрузчик. Если необходимо записать какой либо скетч, то делаем это также при зажатой клавиши SHIFT (как и в первом варианте). PS: По умолчанию в среде разработки имеются файлы загрузчика optiboot и скачивать ничего не нужно. Достаточно выбрать плату Arduino UNO и перезаписать загрузчик. Но в этом случае Ваше детище станет определяться именно как UNO, даже если на самом деле это NANO, Pro Mini или еще что-то. hardware.zip
  23. Данный пост является шпаргалкой из собранных в сети различных материалов связанных с распиновкой (pinout) распространенных микроконтроллеров и плат на их основе. Микроконтроллеры ATmega328p-pu ATmega328p-au ATmega2560 ATmega32u4-au Attiny Платы Arduino UNO Arduino NANO Arduino PRO-MINI Arduino MICRO Arduino MEGA Arduino LEONARDO Arduino Yun Arduino Esplora Arduino Fio
  24. Это первая часть и соответственно первая версия метеостанции. Постепенно будем её улучшать обвешивая всяческими лампочками, свистульками и т.п. Текущий вариант протестирован и стабильно работает с июля 2015. Использованы: Копия Arduino NANO на базе микроконтроллера ATmega328p Ethernet shield на базе чипа ENC28J60 Датчик влажности AM2302, известный в народе как DHT22 Барометр/Термометр GY-68 на базе сенсора фирмы BOSH - BMP180 Все заказывалось в Китае. Думаю не имеет смысла кидать ссылки т.к они могут быть не актуальны через некоторое время после публикации. Также Вас может заинтересовать вариант метеостанции на ESP8266 ВАЖНО! Я использовал в скетче сторожевой таймер (Watchdog timer). Для этого необходимо перепрошить загрузчик Arduino NANO (ATmega328p) со стандартного на Оptiboot (как это сделать описано тут). Если залить выложенный ниже скетч в неподготовленный контроллер, получите "кирпич". Если Вы читаете эту часть уже после того как залили скетч, то необходимо перезапустить микроконтроллер по питанию (и только по питанию) и у Вас будет 8 сек. на перепрошивку его другой программой. Иначе "селяви", что в переводе с древнегреческого - НЕ ПОВЕЗЛО! Процедуру можно повторять сколько угодно раз, пока не восстановите беднягу. Вступительная часть окончена, переходим к делу Станция разделена на две части Первая находится дома, состоит из микроконтроллера и сетевого модуля, её задача производить все необходимые вычисления и держать связь с проектом "Народный мониторинг". Вторая часть состоит из двух датчиков описанных выше и размещенных на улице в продуваемом пластиковом корпусе, защищенным от прямых попаданий воды и солнечных лучей. На самом деле есть стандарты для размещения погодных станций и ни одно из изделий используемых в быту (пусть даже самое дорогое и крутое) никогда не покажет Вам точных данных. Это связано с местом её установки. Погодная станция должна стоять в чистом поле на высоте пары метров от земли и т.д и т.п. Вы это легко найдете в сети. Ну а нас интересуют приблизительные значения. Схема этого безобразия, за исключением Ethernet модуля (это просо "бутерброд"), выглядит так. На схеме использовал датчик BMP085 т.к другого я не нашел в Fritzing. На практике стоит BMP180 и подключен по 5V а не по 3.3V Т.к изучение китайской платы показало, что на борту имеется преобразователь. Датчик DHT22 имеет обвязку в виде SMD резистора 0805 на 10kOm между двумя ногами - питание и 1-Wire. Но братья Китайцы могут продать датчик уже в обвязке по значительно завышенной ценой. Для корпуса уличной части я выбрал пластиковую распределительную коробку со съемными заглушками. Датчики разместил в верхней части т.к там оставлены заглушки для зашиты от воды во время дождей. Остальные заглушки убраны для повышения точности измерений. Из-за того, что доступ у меня имеется только к солнечной стороне дома, пришлось спрятать коробку за WiFi тарелкой. Кстати это дополнительно дало возможность хоть немного отдалить сенсоры от самого здания, ведь ночью нагретый дом выделяет энергию в виде тепла и искажает показания. Если следовать ГОСТу, то сенсоры должны быть размещены в тени в течение всего дня. Переходим к самому вкусному Необходимо зарегистрироваться на http://narodmon.ru/ и добавить Ваше устройство. В качестве идентификатора, чтобы не запутать себя, Вы можете использовать MAC адрес Ethernet модуля. В данном случае мы будем передавать данные по TCP на 8283 порт сервера. Телеграмма будет состоять из: Идентификатора устройства (MAC адрес) Названия устройства GPS координаты для позиционирования на карте проекта (т.к станция стационарна, координаты указаны в скетче без использования GPS модуля) Показания со всех датчиков Программная часть Понадобятся библиотеки: BMP180 (использует библиотеку BMP085) bmp085.zip DHT22 https://github.com/adafruit/DHT-sensor-library UIPEthernet https://github.com/ntruchsess/arduino_uip 1-Wire http://playground.arduino.cc/Learning/OneWire Скетч Данные о температуре снимаются с датчика BOSH, они более точны. Точка росы рассчитывается исходя из текущих показаний температуры и влажности. В коде имеются две функции взятые с просторов интернета: dewPoint dewPointFast Использовать можно любую. Также имеется проверка показаний точки росы. Вычисления не производятся при минусовой температуре и значение обнуляется при показаниях ниже нуля. Т.к это уже не точка росы, а точка образования инея. Если я не прав, то прошу меня поправить. Если желаете получать отрицательные показания, то необходимо заменить: dP = Temperature>0?((dPt=dewPoint(Temperature*0.1, H))<0?0:dPt):0; на dP = dewPoint(Temperature*0.1, H); На сайте проекта имеются ссылки на приложения под разные платформы. Я использую Android и для примера взял два разных виджета. Выглядит это следующим образом. В дальнейшем планирую: Увеличить разнообразие датчиков Объединить обе части метеостанции и вынести все на улицу Уйти от ENC28J60 в пользу W5100 или W5500 Использовать POE для питания всей кухни PS: пока все доволен. Посмотрим как конструкция переживет зиму и сделаем дополнительные выводы. bmp085.zip
  25. На самом деле тривиальная задача, но задумался я о ней только после того, как товарищи из соседнего отдела начали бегать сломя голову вокруг нагруженного сервера с базой. Что-то работало не так... Через некоторое время выяснилось, что на КПД системы влияют медленные запросы, и они крутятся не один год. В один прекрасный день система, многократно окупающая сервер, на котором стоит, стала захлебываться. А ведь проблему можно было решить еще до её проявления, не прибегая к мозговому штурму. Начинаем действовать Беглое погружение в просторы интернета приводят нас на официальный сайт MySQL где черным по "Русски" написано что в my.cnf имеется соответствующий раздел позволяющий настроить логирование для медленных запросов. http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html # Here you can see queries with especially long duration log_slow_queries = /var/log/mysql/mysql-slow.log long_query_time = 2Тут все ясно с одного взгляда. Превысил установленный лимит времени на выполнение, улетел в лог. Остается дело за малым - отследить изменения в файле и поднять тревогу В Zabbix имеется набор функций для отслеживания log файлов, но я не вижу смысла читать его построчно. Думаю, что достаточно просто смотреть на контрольную сумму. Для этих целей в Zabbix предусмотрена функция vfs.file.cksum, которой необходимо передать путь до файла. В нашем случае ключ выглядит следующим образом vfs.file.cksum[/var/log/mysql/mysql-slow.log]Останется только создать триггер проверяющий, отличаются ли два последних значения друг от друга и поднимающий тревогу, если они различаются. {<template-name>:vfs.file.cksum[/var/log/mysql/mysql-slow.log].diff()}=1Значение <template-name> замените на имя Вашего шаблона, если вы решили добавить отслеживание медленных запросов mysql к уже имеющемуся у Вас шаблону. На выходе получаем Замечание Если перезапустить сервер баз данных, то поднимется тревога т.к в лог свалится запись о перезапуске сервера. Но этого можно избежать если дополнительно контролировать время прошедшее с момента запуска mysqld. PS: конечно я понимаю, что лепить это в отдельный шаблон смешно, но вдруг у кого ни-ть возникнут трудности =) MySQL-Slow.zip
×
×
  • Создать...