Jump to content
iT4iT.CLUB

Leaderboard


Popular Content

Showing content with the highest reputation since 04/22/2020 in all areas

  1. 2 points

    Version update 27.01.2020

    2,898 downloads

    Хотите помочь проекту или спонсировать новый? Yandex.Money PayPal.me Тема проекта Arduino IDE + Project + Libraries + tools: https://yadi.sk/d/jseefFB50NMhAg
  2. 1 point
    В этом ответе про облака
  3. 1 point
    Здравствуйте! sensors.add(T, "out_temperature", [&](){ return dht.readTemperature(); }, true); sensors.add(H, "out_humidity", [&](){ return dht.readHumidity(); }, true); перепишите в такой вид: sensors.add(T, device:: out, "out_temperature", [&](){ return dht.readTemperature(); }, true); sensors.add(H, device:: out, "out_humidity", [&](){ return dht.readHumidity(); }, true); C уважением.
  4. 1 point
    Доброе время суток. Сегодня мы будем собирать бесконтактный замок с использованием NFC контроллера PN532. Опираясь на опыт прошлого варианта (на контроллере MFRC522) и на отзывы тех, кто пытался повторить схему, были сделаны определенные выводы. Постараемся избавиться от старых подводных камней и поищем новые И так, что мы знаем о PN532: Очень компактный размер 42.7 x 40.4 мм Поддерживает работу по SPI, i2C и HSU (высокоскоростной UART) Читение/Запись RFID меток, может общаться с другими контроллерами PN532, и вроде как общаться с Android телефонами Рабочая дистанция 5-7 см Поддерживаемые чипы ISO 14443 Type A - NXP Mifare 1k, 4k, Ultralight, Desfire ISO 14443 Type B ISO/IEC 14443-4-совместимые чипы FeliCa Jewel TopaZ Чтение / Запись RFID меток Обмен данными P2P Передача данных смартфону Кстати, вроде как начиная с Androik 4.4 KitKat операционная система умеет эмулировать NFC метки программным способом. Это подразумевает, что мы можем на телефоне сделать копию проездного билета (БСК, Тройка) или просто обычной метки, и использовать смартфон в качестве ключа для замка. К сожалению, у меня пока нет под рукой аппарата с поддержкой NFC, а значит и проверить это мне не под силам. Оставляю эту задачу Вам! Для сборки замка нам понадобятся: Arduino UNO или любой аналог с контроллером ATmega328 Сам модуль сканера с контроллером PN532 Китайский модуль реле с опторазвязкой (в программе предусмотрена инверсия управляющего сигнала на случай управления реле напрямую или замены его на транзисторный ключ / мосфет) Две кнопки для, одна для разблокировки замка изнутри помещения, а другая для сброса памяти микроконтроллера Два резистора 10kOm и 4.7kOm Танталовый конденсатор на 1uF Светодиод для индикации о попытках взлома замка с помощью брутфорса ключа Транзистор KT315 или его аналог для управления питанием PN532. Говорят, что война между Десептиконами и Автоботами началась именно из-за этих Советских транзисторов! Зачем нужен транзистор? Он используется для управления питанием сканера, если по какой-либо причине Arduino пойдет на перезагрузку, то она потянет за собой и сканер. Таким образом мы лишний раз подстрахуем себя. Конденсатор в обвязке транзистора необходим для сглаживания пульсаций, у меня они были явно заметны при питании от USB. Конечно это все можно выкинуть из схемы и пустить на ножку VCC контроллера PN532 питание напрямую с 5V платы Arduino. Это уже на Ваш страх и риск. Критически важно обратить внимание на питание! Не поленитесь и возьмите отдельный блок питания, USB используйте только в качестве Serial монитора. На реле желательно подавать отдельное питание, на Китайских модулях для этого есть соответствующие пины (GND, VCC, JD-VCC). На схеме я это не отражено т.к каждый волен самостоятельно выбирать как управлять силовой частью замка. Может вы замените реле мосфетом. На просторах мирового интернета нашел пару изображений схем показывающий, как реализовано питание и управление китайскими релейными модулями. Так показано на схеме и так делает большинство. Все будет работать. А так будет правильно, но необходим отдельный источник питания для релейного модуля Выбор за Вами. Вернемся к сканеру. Уже упоминалось, что он имеет возможность общаться по одному из нескольких интерфейсов на выбор. Сам выбор интерфейса реализован на физическом уровне и представляет из себя сдвоенный переключатель. На изображении ниже выбран HSU (UART). В таком варианте модули приходят к нам из поднебесной. Мы будем использовать i2C интерфейс. Возможно стоило бы SPI? Все подключения можно свести к одной таблицы Как все устроено Часть функционала было позаимствовано из предыдущего варианта о котором говорилось в самом начале данного поста. При первом запуске Вам будет предложено создать мастер ключ, но не спешите это делать. Я советую Вам очистить EEPROM, для этого нажмите и удерживайте кнопку RESET до тех пор, пока не услышите звуковой сигнал. После очистки памяти контроллер будет перезапущен, замок разблокируется в ожидании первого поднесенного ключа (метки), может быть даже смартфона (ищите эмуляторы RFID меток и проверяйте). Первый поднесенный ключ станет мастером, советую его надежно спрятать дома т.к только с его помощью можно записывать новые ключи в память микроконтроллера. Кстати о памяти, вот схема как она используется, всего занято 1kB. Первые 8 байт используются для хранения системной информации. Пока заняты только первые 2 байта, а остальные 6 зарезервированы под будущие улучшения. Возможно Вы что-то захотите добавить свое. Начиная с 9 байта идут ключи. Ключи бывают разного размера, но мы будем использовать только первые его 4 байта. Первый ключ всегда идет мастер, все последующие обычные. Всего можно иметь 1 мастер и 253 обычных ключа. То есть мы израсходуем весь объем EEPROM контроллера ATmega328. Вы конечно можете воспользоваться другим контроллером, с большим количеством памяти, но программа не даст Вам создать более 254 ключей. Оставшаяся память останется свободной. И так после создания мастер ключа замок перейдет в дежурный режим, разблокировать его можно кратковременным нажатием на кнопку OPEN или самим мастер ключом. Для добавления новых ключей необходимо поднести мастер ключ к сканеру и удерживать более 5 секунд. Замок перейдет в режим программирования оповестив Вас об этом звуковым сигналом. В этом состоянии замок будет в разблокированном состоянии и все поднесенные новые ключи будет записаны в память. Для выхода из режима программирования необходимо опять поднести мастер ключ к сканеру и удерживать более 5 секунд. Звуковой сигнал оповестит об этом и замок вернется в дежурный режим. После открытия двери ключом или кнопкой запускается таймер, который закроет замок через 5 секунд. Можно удерживать замок в открытом состоянии при удержании кнопки OPEN, но при её отпускании замок сразу закроется. Теперь немного про защиту В программе имеется счетчик ложных срабатываний. Если в течении минуты будут зарегистрированы 5 попыток подбора ключа, замок будет заблокирован на 1 минуту. Открыть дверь можно будет только с кнопки OPEN. Поднесения действующего ключа, даже мастера, будет проигнорировано замком. По истечению минуты доступ будет открыт, но на этом еще не конец. Счетчик даст только одну попытку разблокировать замок, если она потерпит неудачу, блокировка повторится. Замок будет давать по одной дополнительной попытки за каждую минуту ожидания, но не более 5 попыток. Таким образом скорость подбора ключа сводится к 1 ключу в минуту, а учитывая длину ключа даже в 4 байта, тот кто захочет этим заняться должен быть бессмертным. Проще ключ украсть или сделать копию, но от этого не застрахованы даже обычные замки, но в следующем варианте программы мы позаботимся и об этом. Если кто-то пытался подобрать ключ и замок его поймал на этом, то светодиод начнет периодически мигать. И даже если отключить питания, контроллер не забудет об этом инциденте и при его восстановлении продолжит оповещать о случившемся. Интенсивность мигания будет напрямую зависеть от количества блокировок. 1 раз в секунду если была выявлена хотя бы одна блокировка 2 раза в секунду если было выявлено более 5 блокировок 3 раза в секунду если более 10 блокировок 4 раза в секунду если выявлено более 20 попыток Горит постоянно при более 50 попытках Есть два способа сбросить счетчик. Воспользоваться мастер ключом и перевести замок в режим программирования, после вернуть обратно в дежурный режим. Или удерживая активный ключ у сканера PN532 зажать кнопку OPEN на 5 секунд. В принципе на этом пока все. Для реализации Вам понадобятся следующие библиотеки: Bounce2 для программной защиты от дребезга Timer1 для удобной реализации прерываний Adafruit PN532 для связи с самим сканером Хотите помочь проект? Yandex.Money PayPal.me Сама программа замка: PN532_lock_iT4iT.CLUB.7z
  5. 1 point
    Доброе время суток Думаю, да, тут больше работы в самом web интерфейсе нежели на стороне микроконтроллера. Давайте начнем с последнего. В прошивке микроконтроллера идем в файл sensors.h b и ищем объект отписывающий типы листы на которых отображаются элементы. class device { public: typedef enum list_t {out = 1, in = 2}; /* ... */ } Можете расширить тип list_t и указать свои варианты typedef enum list_t {out = 1, in = 2, garage = 3, bathroom = 4}; Таким образом при инициализации датчика вы сможете указывать новые листы sensors.add(new knob_t(-100, 0, "1", "RSSI", "dbm"), device::garage, "rssi",[&](){ return wifi.isConnected() ? WiFi.RSSI() : 0; }); На этом работа с прошивкой закончена и переходим к web интерфейсу. В файле index.htm имеется блок, отвечающий за размещение датчиков. <div class="sensorsContent" hidden> <div class="menu"> <div id="sensors" class="list1"></div> <div id="graph"></div> <div id="settings"></div> </div> <div id="list1"></div> <div id="list2" hidden></div> <div prototype hidden> <div class="sensor"> <div class="title">{title}</div> <div class="unit">{unit}</div> <input class="knob {name}" data-width="200" data-displayPrevious=true data-fgColor="#FFF" data-skin="tron" data-thickness=".1" value="0" data-min="{min}" data-max="{max}" data-step="{step}" readonly> </div> </div> </div> Все датчики, в зависимости от их целочисленного идентификатора в нашей прошивке микроконтроллера в типе list_t помещаются в <div> блоки <div id="list1"></div> <div id="list2" hidden></div> Добавляем новые листы <div id="list1"></div> <div id="list2" hidden></div> <div id="list3" hidden></div> <div id="list4" hidden></div> Вообще правильнее было автоматизировать процесс создание листов, как это сделано с датчиками, но это отдельная история Теперь необходимо распространить на новые листы необходимые стили, для этого в разделе с css разметкой ищем .sensorsContent #list1, .sensorsContent #list2 { max-width: 90%; margin: auto; min-height: calc(100vh - 160px); } Аналогичным образом добавляем новые листы .sensorsContent #list1, .sensorsContent #list2, .sensorsContent #list3, .sensorsContent #list4 { max-width: 90%; margin: auto; min-height: calc(100vh - 160px); } На этом этапе Ваши датчики уже будут распределяться по листам, но видеть мы будем только первые два, переключаемые дефолтным значком на панели. И на этом этапе мы переходим к самому сложному т.к теперь мы не просто хотим что-то добавить, а нуждаемся в модификации имеющейся логики. До этого листы просто переключались между собой, а теперь, по всей видимости, нам нужно расширить панель меню и добавить просто кучу значков. Но предварительно, мы сделаем еще одно добавление, а точнее его уже сделаете Вы. Каждая иконка хранится в виде BASE64 хэша бинарной иконки в формате PNG. Если мне не подводит память, то размер иконки составляет 35х35 пикселей. Если Вы не меняете глобально этот интерфейс, то советую не использовать иконки другого размера для данного меню. Для перевода PNG иконок в используемый формат я использовал этот ресурс https://www.base64-image.de/ После перевода вы получите строку, которую необходимо использовать в css разметке для придания новым иконкам желаемого вида. На этом стоит остановиться подробнее. Уже имеющиеся иконки меню Вы можете найти в css разметке поискав по ключевым словам .menu #sensors.list Вы найдете следующее, я укажу в виде фото т.к объем текста просто огромный. Надеюсь Вы используете какой-то более мене нормальный редактор, и он преобразует этот огромный набор текста в читаемый вид, я использую Visual Studio Code По аналогии добавьте свои иконки для новых элементов меню, не забудьте менять номера листов На этом этапе Вы уже должны иметь набор новых иконок с именами: list1, list2, list3 и т.д. Теперь их необходимо организовать в меню. И тут мы возвращаемся к нашему начальному html блоку, который был описан в самом начале, это тот, в котором мы добавляли новые листы. Давайте теперь добавим и таким образом отобразим все имеющиеся иконки. На этом этапе в интерфейсе имеются все новые иконки, но логика работы их переключения все еще не изменена. Давайте исправим это. Для этого нам понадобится внести изменения и JavaScript код нашего с Вами проекта. Это последний и самый сложный этап. Ищем следующий код $(".menu #sensors").click(function() { var list = $(this).attr("class"); switch (list) { case 'list1': $("#list1").fadeToggle('slow', function(){ $("#list2").fadeToggle('slow'); }); break; case 'list2': $("#list2").fadeToggle('slow', function(){ $("#list1").fadeToggle('slow'); }); break; } $(this).toggleClass("list1", !$(this).hasClass("list1")).toggleClass("list2", !$(this).hasClass("list2")); }); Он отвечает за переключение между листами и, что нам не нужно, изменением внешнего вида начальной иконки. Давайте преобразуем его в следующий вид. Сразу скажу, что так делать не правильно, как и многое в этом проекте, но так будет нагляднее и Вам не придется делать лишние шаги которые могут запутать. В идеале, можно добавить новый, одинаковый идентификатор, для все наших слове (<div>) и по нему плавно скрыть все элементы и потом плавно показать нужный. $(".menu #sensors").click(function() { var list = $(this).attr("class"); $("#list1").hide(); $("#list2").hide(); $("#list3").hide(); $("#list4").hide(); $("#"+list).show(); }); Теперь ищем код который скрывает первоначальные элементы меню if (hideSensorsMenu) $(".menu #sensors.list1").css("display", "none"); И удаляем т.к в Вашем случае скрытие не требуется. Его есть смысл организовывать при динамическом построении меню и т.д и т.п. PS: я не могу ручаться за достоверность всех описанных действий т.к не проверял их на практике. Это просто совет, который должен направить Вас, ... и только направить.
  6. 1 point
    Всем, кто столкнулся с проблемой "SPIFFS Error: esptool not found!" поделюсь опытом: Плагин очень привередлив к версии питона. Буквально недавно вышел плагин корректно работающий с 3 версией. При использовании этой версии https://github.com/esp8266/arduino-esp8266fs-plugin/releases/ ошибок не возникает.
  7. 1 point
    Почитайте внимательно : https://alexgyver.ru/arduino-first/
  8. 1 point
    Доброе время суток. @Stefan Это очень странное поведение. Если есть возможность, то попробуйте подключиться к контроллеру с "левых" устройств, не в ходящих в Ваше домашнее окружение. Проверьте как работает тестовый скетч для режима STA и подключитесь в качестве клиента к Вашей домашней сети или опишите в программе метеостанции к чему подключаться контроллеру. В основном файле программы есть такие строки: conf.add("client_ssid"); conf.add("client_pass"); conf.add("client_bmac"); Первые два параметра отвечают за имя домашней WiFi сети и пароль, последний за MAC адрес и требуется если сеть скрыта, в противном случае его заполнять не обязательно. conf.add("client_ssid", "имя сети"); conf.add("client_pass", "пароль от сети"); conf.add("client_bmac", "MAC можно не указывать"); Также есть вероятность, что Ваши устройства не могут работать в едином стандарте с AP микроконтроллера. Если память не подводит, то контроллер должен использовать 802.11n. Попробуйте пока так поэкспериментировать. @IvAn Я не буду давать Вам советы в реализации кода для данного проекта т.к мой код сам нуждается в переработке, но опишу своё видение. Проверяйте состояние соединения как со стороны микроконтроллера, так и со стороны MQTT клиента Подключаемся к серверу только при наличии подключения к точке доступа Если восстанавливаем соединение, то не забываем восстановить подписки Публикуем сообщения только если отработал п.1 Я думаю, и это только мое личное мнение, что функция "callback" не должна заниматься обработкой команд. Её цель - принять и понять, что нужно сделать, а дальше сообщить об этом основному коду. Вдруг вы будите получать сообщения со скоростью пулеметной очереди... Не знаю, будет ли Вам полезно, но посмотрите на этот код https://it4it.club/files/file/8-prostoy-dvuhkanalnyy-schetchik-vody-na-esp8266/ Обратите внимание, что в данном проекте, html код бесполезен без jQuery. Именно в последнем кроется логина обработки всех событий, в том числе и появление меню. Я опишу, на что Вам стоит обратить внимание. В файле index.htm есть такой кусочек разметки, он отвечает за меню <div class="menu"> <div id="sensors" class="list1"></div> <div id="graph"></div> <div id="settings"></div> </div> Как мы видим, имеется объект с идентификатором settings, который отображает нам иконку настроек. Этому объекту соответствует небольшой кусочек кода в css. описанный чуть выше и говорящий браузеру сформировать фон объекта в виде изображения. .menu #settings { background-image: url('data:image/png;base64, ... '); } Часть кода элемента я скрыл т.к он представляет из себя строку закодированную в base64 формате, а оригинал строки является бинарным файлов. Это сделано, чтобы не хранить изображение отдельно в flash памяти и загрузить его вместе с загрузкой файла index.htm. Это уловка чтобы получить большую производительность в работе web интерфейса данного проекта т.к браузер загружает разные файлы в отдельных потоках, а контроллер не способен отдавать параллельно несколько файлов. Из-за этого мы отдаем все критически нужное в одном потоке. Конечно есть механизмы решающие и эти задачи, но я пришел к ним уже на контроллере esp32. Теперь, когда у нас есть кнопка и ее оформление, можно вешать на неё события. В нашем случае это событие клика мышью и реализовано через библиотеку jQuery. Ищем следующий код. $("#settings").click(function() { /* ... */ }); Содержимое нас не сильно интересует т.к начиная с этого этапа нам необходимо реализовывать свою логику. По сути, самый простой вариант, это отобразить заранее подготовленное меню, но находящееся в скрытом состоянии. Например, опять наше меню настроек. Оно скрыто из-за параметра hidden, но это не единственный способ. <div class="settings" hidden> <!-- ... --> </div> Для этого в описанную ране функцию click можно добавить следующий код $(".settings").show(); Конечно, все это очень поверхностно, но теперь вы хотя бы имеете представление как работает текущий код и в какую сторону копать. Если Вы решите углубиться в этом направлении интерфейса, то обратите внимание на безопасность. В текущем проекте, все узкие места прикрыты авторизацией на стороне микроконтроллера т.к код web интерфейса легко посмотреть и изменить. Чтобы отдать управляющую команду или получить информацию от контроллера нужно быть авторизованным пользователем.
  9. 1 point
    Это уже зависит от Ваших возможностей по обслуживанию и развитию системы. Операционная система только фундамент, все остальное ставится поверх, будь то готовый софт или Ваши собственные скрипты и программы. В данном случае мне удобнее было бы работать с Ubuntu, но Вам, возможно, проще будет с Windows или с чем-то еще.
  10. 1 point
    Обновление от 27.02.2018 (v2.0 Beta) Друзья, всем доброе время суток. Немного не хватает времени и технических возможностей подготовить все как положено до конца месяца, в связи с этим прошу отнестись с пониманием. Основная статья будет переписана в течении нескольких дней после публикации этого сообщения. Все исходники, по доброй традиции, опубликованы в первом сообщении темы. Краткий список изменений Требования Arduino IDE c поддержкой esp8266 v2.4.0+ Любой модуль на базе ESP8266 c Flash 4MB (3MB выделяем под SPIFFS) Код для микроконтроллера структурирован и разбит на модули, что делает его более простым для понимания и внесения изменений config.h - работа с файлом конфигурации хранящимся во flash памяти микроконтроллера в формате json. Реализована возможность быстрого добавления пользовательских параметров. Поиск, чтение, запись этих параметров, а также специализированные функции для работы с WEB интерфейсом – обновление и запись группы параметров, переданных в формате json и формирование списка параметров и их значений с фильтрацией паролей для их скрытия при передаче в WEB интерфейс (в WEB интерфейсе реализована ответная часть). cron.h - планировщик заданий основной целью которого является выполнение пользовательских заданий с установленным интервалом времени. Задания представляют из себя функции описанные пользователем. На данный момент они не должны принимать или возвращать никаких значений, обязаны выполнять всю работу самостоятельно или с помощью глобальных объектов. Интервал выполнения задания выставляется в миллисекундах или с помощью макросов, представляющих из себя человекочитаемые имена, за которыми скрываются часто используемые отрезки времени в миллисекундах. Доступен дополнительный функционал в виде поиска задания в журнале, сброс его интервала вызова, выставление нового интервала, остановка выполнения и проверка активности задания. gpio.h - не является модулем. Содержит примеры реализации работы с GPIO для самых часто упоминаемых пользователями задач – управление нагрузкой по превышению установленных через WEB интерфейс приделов температуры и влажности, а также управление нагрузкой при расхождении расчетных значений абсолютной влажности между показаниями двух датчиков. sensors.h - тестовый вариант модуля для реализации автоматического сбора данных с пользовательских датчиков. Очень тесно завязан с планировщиком заданий и http сервером. Преследует только одну цель – избавить пользователя от внесения изменений в большую часть кода при составления собственного набора датчиков, в том числе не описанных в проекте, работающих на других шинах данных или с другими библиотеками. Также позволяет создавать программные сенсоры для вывода расчетных данных, например, абсолютная влажность или любой иной информации представленной в числовом виде. Это могут быть данные об уровне сигнала, напряжения питания или значение с аналогово порта. Помимо добавления сенсоров доступен поиск по списку всех сенсоров, проверка и изменения статуса (актуально только для i2c шины), получение последнего собранного значение с одного или группы сенсоров, аналогичная процедура для логов (активируются для каждого сенсора отдельно) и формирование списка в формате json из всех сенсоров с описанием всех необходимых характеристик. services.h - не является модулем. Содержит примеры реализации передачи показаний на внешние ресурсы на примере связи с MQTT брокером, а также передача данных через Rest API на такие ресурсы как "ThingSpeak" или "Народный мониторинг". tools.h - содержит набор вспомогательных утилит. webserver.h - Основная рабочая лошадка. Представляет из себя http сервер с реализацией API для обмена данными с WEB интерфейсом проекта, а также работающий с файлами во flash памяти микроконтроллера. Тесно связан со всеми модулями. Описание всего функционала заслуживает отдельного раздела. wifi.h - модуль описывает режимы работы Wi-Fi а также переключение между ними. Добавлена поддержка работы со скрытыми беспроводными сетями. В связи с тем, что целью было охватить все желаемые пользователями датчики, код был унифицирован и теперь поддерживает работу с любыми источниками данных. Примеры пользовательской конфигурации расположены в следующих файлах. users_auto.h - не является модулем. Содержит пример с реализацией выбора используемых датчиков с помощью подобия виртуальных переключателей ON/OFF. Также является примером как добавлять датчики в систему с использованием лямбда функций. Не совместим с users_bme280_x2.h users_bme280_x2.h - не является модулем. Содержи пример реализации работы с двумя датчиками BME280 на I2C шине. В отличие от users_auto.h, при добавлении нового датчика используются обычные функции. Не совместим с users_auto.h Изменения в WEB интерфейсе WEB интерфейс больше не запрашивает дублирующие файлы с внешних ресурсов, все необходимое для работы хранится на микроконтроллере. Список индикаторов на главной странице строится автоматически в зависимости от данных предоставленных объектом sensors через API. Добавлена поддержка двух групп датчиков – внешних и внутренних. Группа внешних сенсоров считается основной и отображается по умолчанию. Если зафиксировано наличие внутренней группы, то в меню будет добавлен переключает с индикацией выбранной группы. Исправлен баг с блокировкой доступа к панели управления из-за паразитных cookies различных систем аналитики. Изменен алгоритм работы системы защиты доступа к панели управления – реакция на брутфорс пароля или cookies, метод генерации соли и т.п. Также клиент получает соответствующее уведомление при блокировке доступа. В разделе основных настроек добавлена возможность изменять имя контроллера для MDNS протокола. Изменения вступят в силу в течении 10 минут или после перезапуска микроконтроллера. Найти устройство можно по этому имени в зоне ".local", по умолчанию "espws.local". Также в основных настройках добавлен пункт подтверждения пароля для домашней беспроводной сети. Его отсутствие было историческим упущением, но справедливость наконец восторжествовала. Раздел "Система" был расширен и теперь включает в себя всю информацию о текущем подключении. Также добавлена возможность динамического обновления некоторых данных, в список входят: уровень сигнала, напряжение питания и объем свободной памяти. В разделе обновления прошивки микроконтроллера ужесточена проверка контрольной суммы загружаемого файла, теперь нельзя загрузить программу без этих расчетов. Ранее просто выводилось предупреждение. Также увеличен список расшифровок ответа микроконтроллера в ходе обновления микропрограммы. В разделе "Файловая система" отображается корректный объем доступной flash памяти для внутренней файловой системы. Добавлен раздел для внешнего коллектора данных “ThingSpeak”. Пока доступен только ввод ключа для работы с API. По Вашим просьбам был добавлен раздел "Контроль состояния GPIO". Это пробный вариант конфигурации взаимодействия ESP8266 с внешней нагрузкой через WEB интерфейс. На данный момент в разделе присутствуют два параметра выставляющие границу включения внешней нагрузки при превышении установленных значений температуры или влажности. Доработана система оповещений. Мелкие правки и исправления ошибок в коде web интерфейса. В связи с тем, что старая реализация графика была нацелена на конкретные данные, унификация его кода на данный момент невозможна. График работает, но принимает строго указанные значения. Данная проблема будет решена позже. PS: Еще раз прошу отнестись с понимание и обратить внимание, что это тестовая версия. Спасибо.
  11. 1 point
    Представьте ситуацию, что Вам необходимо получить доступ к закрытому ресурсу. Это может быть, как компьютер находящийся в частной локальной сети (например, на работе), так и сервер находящийся в интернете и доступ к нему закрыт в связи с разного рода санкциями и прочей чепухой не имеющей ничего общего со здравым смыслом. Некоторые пользователи скатываются настолько низко, что могут закрыть видео на YouTube для граждан той или иной страны. Ну да Бог с ними, сама реализация описанная ниже намного более интереснее чем закрытый видеоролик и, тем более имеет намного более широкие перспективы! Все эти проблемы решает VPN, заодно он является самым распространенным способом для организации удаленных рабочих мест разными работодателями. В подавляющем большинстве случаев при использовании VPN Ваш компьютер становится частью чужой локальной сети, следовательно, маршрутизация всего трафика уже идет по чужим правилам. В рабочей обстановке это может выражаться в виде отсутствия доступа в интернет через сеть работодателя или между Вами и остальным интернетом вдруг появляется чужой Firewall и блокирует доступ к: ICQ, IRC, Skype или другим законным ресурсам. А вот если Вы используете в интернете бесплатные VPN сервера (да и платные тоже) для Ваших личных нужд, то стоит помнить о том, что весь трафик проходит где-то там и все, что Вы делаете становится известно всем заграничным друзьям. В список раскрытой информации также входят cookie используемые Вашим браузером, платежные реквизиты от электронной коммерции до банковских карт, различные ключи и много всего интересного. Кстати, отечественные сервера тоже не брезгуют воспользоваться этими данными. Самое логичное решение на мой взгляд - составить список ресурсов, с которыми необходимо работать через VPN и заворачивать их трафик в тоннель, а все остальное пускать классическим способом через местного провайдера. Сам VPN тоннель поднимать только в том случае, если появляется трафик для него. Это позволит не держать постоянно поднятый канал и сэкономит ресурсы. Приступим к реализации Первым делом нам необходимо создать список сетей, в которые мы хотим ходить через VPN. Условно назовем этот список "blackHole". Список подсетей работодателя можно узнать у самого работодателя или его IT специалистов. Но вот, что делать если необходимо получить доступ к закрытому иностранному ресурсу? Для наглядности эксперимента пусть его роль сыграет https://2ip.ru/ т.к это покажет наглядную работу системы. Давно не новость, что за DNS именем ресурса может находится несколько IP адресов, иногда даже десятки или сотни. Все их необходимо добавить. В этом случае очень хорошо, если у Вас под рукой имеется машина с UNIX подобной операционной системой с установленными утилитами Host и Whois. Если таковой нету, то утилиты нам заменят: Host: http://www.digwebinterface.com/ Whois: https://www.reg.ru/whois/ https://www.nic.ru/whois/ Узнаем список используемых IP адресов с помощью утилиты Host root@linuxPC:/# host 2ip.ru 2ip.ru has address 178.63.151.224 2ip.ru mail is handled by 10 aspmx3.googlemail.com. 2ip.ru mail is handled by 5 alt1.aspmx.l.google.com. 2ip.ru mail is handled by 5 alt2.aspmx.l.google.com. 2ip.ru mail is handled by 1 aspmx.l.google.com. 2ip.ru mail is handled by 10 aspmx2.googlemail.com. Узнаем список всех подсетей с помощью утилиты Whois. Если предыдущая операция показала наличие более одного IP адреса, то данную процедуру нужно провести для всего списка. root@linuxPC:/# whois 178.63.151.224 % This is the RIPE Database query service. % The objects are in RPSL format. % % The RIPE Database is subject to Terms and Conditions. ... route: 178.63.0.0/16 Будет очень много информации, но нас интересует только строка с параметром route. Именно эту подсеть с указанием маски мы и добавляем в список "blackHole" маршрутизатора. /ip firewall address-list add address=178.63.0.0/16 comment=2ip.ru disabled=no list=blackHole Или через WinBox в разделе IP -> Firewall -> Address List Теперь необходимо промаркировать пакеты, это позволит повлиять в дальнейшем на их маршрутизацию. Каждому пакету, который предназначается для подсети из списка "blackHole" мы дадим маркер с именем "bh". /ip firewall mangle add action=mark-routing chain=prerouting dst-address-list=blackHole log=no \ new-routing-mark=bh Или через WinBox в разделе IP -> Firewall -> Mangle Теперь нам необходимо создать подключение к VPN серверу. В сети большой выбор как бесплатных серверов с периодически меняющимися учетными данными для подключения, так и платных к которым тоже нет особого доверия. В идеале конечно лучше держать свой собственный сервер, но это требует некоторых затрат средств и выгодно только в том случае, если такой доступ необходим целой компании или организации. Настройка будет зависеть от Вашего выбора. Я нашел первый попавшийся PPTP сервер и подключился к нему. /interface pptp-client add comment="VPN blackHole" connect-to=serverName\ disabled=yes name=pptp-out1 password=password\ user=login dial-on-demand=yes keepalive-timeout=60 comment - комментарий к подключению connect-to - адрес VPN сервера disabled - устанавливаем yes пока не закончим настройку (сюрпризы не нужны) name - имя интерфейса password - пароль user - логин dial-on-demand - связь с сервером устанавливается только при необходимости keepalive-timeout - время удержания соединения в секунда до разрыва связи в случае не использования соединения Или через WinBox в разделе Interface Учитывайте, что для разных серверов одного типа настройки могут сильно отличаться. Добавляем запись Masquerade в NAT для нашего нового интерфейса. /ip firewall nat add action=masquerade chain=srcnat dst-address-list=blackHole out-interface=\ pptp-out1 Или через WinBox в разделе IP -> Firewall -> NAT Осталось дело за малым, добавить новую запись в лист маршрутизации и заворачивать пакеты с маркером "bh" на интерфейс pptp-out1 /ip route add distance=1 gateway=pptp-out1 routing-mark=bh Или через WinBox в разделе IP -> Routes Поднимаем интерфейс (естественно, что у Вас его порядковый номер может отличаться) /interface pptp-client set numbers=0 disabled=no После всех манипуляций идем на любой адрес из списка "blackHole", в нашем случае это http://2ip.ru и сравниваем адрес с данными например на http://myip.ru Теперь трафик перераспределяется нужным нам образом и можно приступить к поднятию необходимых тоннелей с серверами и маршрутизаторами на работе, в удаленных офисах и вообще с чем душе угодно.
  12. 1 point
    Точное время - всегда актуальный вопрос. В большинстве случаев высокая точность не нужна и настроить время на вашем оборудовании можно по наручным, кухонным или напольным с кукушкой часами, да хоть по положению солнца, и этого будет более чем достаточно для большинства людей. Но вот, что делать, если хочется высокой точности? Верно, начинаем синхронизироваться с любым попавшимся NTP сервером в интернете, он в свою очередь синхронизируется с другим (возможно даже более точным, а может быть и нет) сервером. Цепочка может быть достаточно длинной, но в один прекрасный день может появится желание убрать посредников и найти самые точные часы на планете и спрашивать время у них. А какие часы самые точные? Атомные! Кстати на wikipedia имеется отличная статья про время! И вот тут пораскинув мозгами, начинаем судорожно вспоминать, в каком это супермаркете мы последний раз видели их в продаже и желательно с USB интерфейсом, можно даже розового цвета... Вы тоже не видели? Печаль. А ведь у нас над головой, на высоте порядка 19400 км висят куча спутников систем позиционирования (GPS / ГЛОННАС), а чтобы они работали им нужно знать точное время. Именно для этой цели у каждого из этих трудяг на борту имеются атомные часы! Отлично, давайте узнавать время у этих ребят. И так, немного задержавшись на сайте MikroTik можно найти пакет gps-xx.xx.npk который позволяет расширить возможности маршрутизатора и позволит ему определять свои точные координаты на поверхности нашей планеты. Чтобы установить пакет, достаточно просто скопировать его на маршрутизатор (сделать это можно перетащив .npk файл в файловый менеджер WinBox) и перезагрузиться. Теперь нам нужен GPS приемник. Общение будет идти по протоколу NMEA 0183, PDF. Мой маршрутизатор собран на базе стационарного компьютера, а следовательно можно смело брать приемник с USB интерфейсом. В наличии имеется отличный экземпляр от GlobalSat - BU-353U4. После подключения приемника переходим к настройки маршрутизатора. [admin@Kitsum] > port print Flags: I - inactive # DEVICE NAME CHANNELS USED-BY BAUD-RATE 0 serial0 1 Serial Console 9600 1 3:2 usb2 1 4800 Отлично, маршрутизатор видит что-то на порту usb2, запоминаем его Flag (1) и выставляем настройки согласно техническим характеристикам от производителя. Естественно, что для Вашего "свистка" настройки могут отличаться. [admin@Kitsum] > /port [admin@Kitsum] /port> set numbers=1 baud-rate=4800 data-bits=8 parity=none flow-control=none stop-bitsrs=1 Все настройки с портами Вы можете провести через Web интерфейс или WinBox в разделе System -> Ports Теперь осталось дело за малым. Сообщим маршрутизатору, что на порту usb2 висит GPS приемник, и он может им овладеть, то есть воспользоваться, ... блин использовать! И естественно, мы желаем, чтобы время, полученное в телеграмме от спутников считалось эталонным и использовалось как системное. [admin@Kitsum] > /system gps [admin@Kitsum] /system gps> set enabled=yes port=usb2 set-system-time=yes Теперь мы может посмотреть, какими именно данными мы начали располагать в следствии, этих сверх сложных манипуляций! Внимание: естественно, что при холодном старте, данные начнут поступать не сразу. [admin@Kitsum] > /system gps [admin@Kitsum] /system gps> monitor date-and-time: feb/08/2016 14:44:42 latitude: N 00 18' 13.236'' longitude: E 00 54' 5.236'' altitude: 325.299988m speed: 0.000000 km/h destination-bearing: none true-bearing: 133.419998 deg. True magnetic-bearing: none valid: yes satellites: 9 -- [Q quit|D dump|C-z pause] В данном случае получилось поймать сигнал с 9 спутников. Каждый из них передает нам свои координаты, а самое главное - время со встроенных атомных часов. Большая часть информации вычисляется уже по месту (скорость, высота ...). Мы практически добились нужного результата. Естественно мы получаем время по Гринвичу (UTC+0), меня это не устраивает, видимо и Вас тоже. Необходимо подправить часовой пояс. Это можно сделать в System -> Clock [admin@Kitsum] > /system clock [admin@Kitsum] /system clock> set time-zone-autodetect=no time-zone-name=Europe/Moscow И так, теперь Ваш маршрутизатор знает самое точное время на планете и им стоит поделиться хотя бы со всеми желающими в локальной сети. А таких поверьте, будет не мало. В современном мире все устройства жаждут обладать этой информации. Как же без этого Вам кофеварка сварит благородный напиток, или телевизор выключится и оградит молодое поколение от всего того, что оно и так потом узнает, а пока должно делать уроки, ммм? Необходимо поднять собственный NTP сервер и делается это сверх сложной и длинной командой. [admin@Kitsum] > /system ntp server [admin@Kitsum] /system ntp server> set enabled=yes manycast=yes Ну, или просто выставлением соответствующей галочки в System -> NTP Server И все было бы просто великолепно, если бы устройства в сети знали, что мы владеем более точным временем, чем time.windows.com, time.nist.gov да и сотни других серверов. Первая мысль, которая посетила меня - просто подменю ip адреса в записях DNS и "вуаля", но я даже понятия не имею с чем синхронизируется мой телефон, телевизор и у кого, после очередного обновления, захочет узнать время мой компьютер. Мы знаем, что NTP протокол использует 123 UDP порт для общения. Предлагаю перехватывать все запросы, из нашей локальной сети, адресованные на этот порт во внешний мир и заворачивать их на внутренний IP маршрутизатора! У меня все сетевые интерфейсы локальной сети объедены в Bridge и весь трафик ходит во внешний мир через через NAT и masquerade, внутренний адрес маршрутизатора 10.10.10.1 Добавим новое правило в NAT [admin@Kitsum] > /ip firewall nat [admin@Kitsum] /ip firewall nat> add action=dst-nat chain=dstnat dst-port=123 in-interface=bridge1 protocol=udp to-addresses=10.10.10.1 to-ports=123 На этом все. PS: зачем? потому что хочется и есть возможность!
×
×
  • Create New...