Jump to content
iT4iT.CLUB

Kitsum

Members
  • Content Count

    418
  • Joined

  • Last visited

  • Days Won

    220

Kitsum last won the day on January 19

Kitsum had the most liked content!

Community Reputation

221 Excellent

About Kitsum

  • Birthday April 2

Recent Profile Visitors

5,934 profile views
  1. Доброе время суток. Вы все делаете правильно. В ходе одного из обновлений была допущена оплошность. Самый простой вариант решения проблемы, это не комментировать данную строчку. Или можно исправить оплошность и в файле wifi.h найти строку if (!MDNS.begin(hostname.c_str())) { console.println("Error setting up MDNS responder!"); } и заменить её на if (!MDNS.begin(hostname.c_str())) { #ifdef console console.println("Error setting up MDNS responder!"); #endif } Я загружу исправления в ближайшее время.
  2. Я бы не тратил на это время. Намного надежнее и практичнее взять LTE+WIFI маршрутизатор, например, БУ по объявлениям. Это избавить от кучи подводных камней. А если Вы сами довольно много времени будите проводить в зоне действия будущей точке доступа, то лучше взять хороший маршрутизатор и возможность подключения LTE модема или со встроенным модемом. Это окупит себя многократно и сэкономит кучу бессонных ночей.
  3. @post125 да, подключение через контроллер посредник будет самым выгодным. На сколько мне помнится, Вы уже скидывали в эту тему свои наработки. Вот бегло нашел первый пост https://it4it.club/topic/55-meteostanciya-na-esp8266-ot-it4itclub/?do=findComment&comment=1203, начиная с него можно почитать о Вашем опыте. Но хоть это больше про I2C, думаю заинтересованным будет интересно.
  4. Просто закомментируйте не нужный вам вызов управления A0 Прикрепите пожалуйста весь текст ошибки т.к по скриншоту невозможно определить где проблема.
  5. Доброе время суток. Вот небольшой спойлер, но работы ведутся совсем не такими темпами как мне бы хотелось, банально из-за нехватки времени в связи с переездом в другой город и со всеми вытекающими из этого событиями. Я постарался сделать снимок экрана так, чтобы, присмотревшись к косвенным признакам, была возможность понять, что уже реализовано и, что используется в коде. Последние изменения были сделаны еще в конце лета 2019. @kamikozz Рад, что Вы с таким азартом отнеслись к этому проекту. Но, к сожалению, Вы упустили главную мысль - проект модульный и wifi.h один из модулей с малым количеством зависимостей, а если быть точным, то от него не зависят другие модули вообще. Вы вправе вообще удалить его или полностью переписать согласно необходимой логике работы. Главная идея wifi.h, это балансировка между режимами AP и STA. Нормальным считается, что контроллер подключен к домашней беспроводной сети, если этот пункт не выполнен, то контроллер переходит в режим AP и периодически пытается найти домашнюю сеть. В этом режиме мы получаем возможность его перенастроить т.к контроллер мог потерять домашнюю сеть из-за того, что у неё изменился SSID или контроллер переехал на другое место жительства. В Вашем случае работа данного модуля немного противоречит тому, что Вы хотите получить т.к в случае отсутствия связи с домашней точкой доступа контроллер будет пытаться её найти, а это возможно только при переводе контроллера в режим STA для сканирования эфира. В Вашем случае в этом нет необходимости, и можно пользоваться штатными средствами восстановления связи, предоставляемыми на аппаратном уровне т.к для установки новой точки доступа в качестве домашней, достаточно подключиться к точке поднимаемой контроллером в режиме AP+STA, ведь она доступна всегда. Но у меня вопрос, зачем Вам режим AP+STA? Возможно лучше и надежнее подключить второй контроллер к общей с первым точке доступа и просто перекидываться через HTTP API запросами? Почему я это спрашиваю - дело в том, что я упоминал, в том числе и в первом посте, что мы ограничены количеством обрабатываемых контроллером запросов и при некоторой нагрузке все может поломаться. Кстати, именно по этой причине много кода WEB интерфейса размазано по малому количеству файлов, в Index.htm валяется и css и java, а в css сохранены некоторые картинки. Динамическая подгрузка компонентов. Все это позволяет уложиться в минимальное, как я это видел, количество tcp соединений с контроллером т.к браузер загружает все компоненты страницы параллельно, а текущий web сервер не способен обрабатывать более одного соединения за раз, да и у контроллера попросту нет на это ресурсов. Обязательно помните об этом. Но вернемся к wifi.h. Если Вам ближе режим AP+STA место центрального маршрутизатора для обоих контроллеров, то просто удалите wifi.h и в основном файле добавьте необходимый режим. Убедитесь, что имеете доступ со стороны AP и STA. После этого можете начинать прикручивать сохраненные в config значения параметров для поднятия точки с нужным именем и для подключения к домашней точке доступа. @Neon @den48rus давайте разбираться с NRF. Под рукой, в текущий момент, её нет, но мы попробуем и пробежимся по основным моментам. На сколько я понимаю, подключается она по SPI, а это значит, что потребуется много портов. Следовательно, Вам придется освободить все порты, используемые под управление нагрузкой, но скорее всего еще что-то. На фото ниже видны 5 основных портов для передачи данных и один для прерывания. В данном проекте придется использовать прерывания т.к NRF может получить данные в момент когда будет происходить другая длительная операция, например загрузка web интерфейса. В таком случае данные будут потеряны. Прерывание поможет получать данные в тот момент когда, они пришли и это будет незаметно для остальных процессов. Бегло, я нашел информацию, что прерывание генерирует низкий уровень сигнала на порту IRQ. Отследить его можно с помощью attachInterrupt. В функции, которая будет вызвана при прерывании реализуйте логику чтения данных, как это делается в обычном случае. А теперь самое интересное. Например, в библиотеки RF24.h, которую, как мне кажется, используют многие, возможно использовать свой тип данных для передачи. Таким образом Вы можете объявить свою структуру, в которой можно определить что угодно. Допустим не просто пустые и безликие данные, а тип сенсора, показания с нескольких датчиков и, например, напряжение питания удаленного устройства. struct { byte type; float temperature; float humidity; float voltage; } nrf_data; nrf_data remote_sensor; Теперь важный момент. Переменная, которую мы будем использовать для хранения данных (в примере remote_sensor), должна быть объявлена в глобальном пространстве имен чтобы избежать проблем в дальнейшем, конечно, если у Вас нет иного механизма передачи данных между модулями проекта. После того как данные будут переданы, они будут сохранены в оперативной памяти микроконтроллера. Теперь их необходимо связать с сенсором, а это уже совсем не сложно. sensors.add(new knob_t(0, 100, ".01", "Влажность", "%"), "Humidity", [&](){ return remote_sensor.humidity; } ); Конечно, могут быть ситуации, когда в момент чтения переменной будет произведена попытка её перезаписи, но и это можно решить. В общем, у Вас все должно получиться. Но если будут вопросы, то обязательно пишите, и я постараюсь найти NFR24 и подготовить полноценный код для решения этой задачи.
  6. Файлы проекта обновлены. Добавлена поддержка последних, на момент публикации, версий Arduino IDE и модуля ESP8266. Добавлены небольшие исправления и доработки. При использовании, указанных в основном посте, версий программных компонентов Вы не получите вылет программы с критической ошибкой. Исправлена серьезная ошибка в медианном фильтре, кто использует проект обязательно обновите у себя объект medianFilter_t, он находится в tools.h В разделе загрузок, добавлена утилита для загрузки файлов web сервера во flash память. Также в описании к файлам, добавлена ссылка на скачивание готовой Arduino IDE со всеми библиотеками, утилитами, и последней версией проекта. Для работы модуля загрузки файлов во Flash может понадобится последняя версия Python https://www.python.org/downloads/
  7. @godzillajenkins доброе время суток. Вы можете составить списки преобразований основываясь на MIB файле который опубликован с шаблоном.
  8. Доброе время суток. Значит ошибка в подключении имеет место быть. Для Вашей платы шина I2C была проинициализирована на портах D1 (SCL) и D2 (SDA). Возможно Вы их перепутали, или нет контакта или проблема на стороне датчиков. В любом случае, работа I2C сканера обкатана всеми участниками в этой теме и в его работоспособности нет сомнений. Кстати, он как раз и внедрялся для выявления подобных проблем. Еще раз все внимательно проверьте. Вот как выглядит его работа сейчас у меня В данной теме Вы можете найти описание, как вырезать всю анимацию фона. Если есть возможность, то сообщите характеристики устройства, с которого Вы заходите в web интерфейс.
  9. @Андрей Иванов Попробуйте вот эту сборку https://yadi.sk/d/jseefFB50NMhAg
  10. @Андрей Иванов нет, нет. Вы указали вариант платы, на которой распаян модуль ESP8266. Вам следует проверить версию пакета ESP8266 установленного в Arduino IDE. Скорее всего Вы используете одну из последних, а необходимо установить ту, что указана в инструкции в первом посте. В ближайшее время я опубликую обновление с некоторыми исправлениями, и поддержкой последней среды разработки и пакета ESP8266. Также внимательно смотрите на версию используемой библиотеки ArduinoJson. Все это описано в инструкции.
  11. @Андрей Иванов какую версию пакета ESP8266 Вы используете?
  12. @emaus нет, так не получится т.к ключи Вашего массива никак не связаны с его значениями. Сейчас, условно, в $data[5] лежат одни данные, а через секунду совершенно другие и это можно устроить даже не добавляя новые записи в таблицу. Все, что Вам требуется это использовать понятные пары ключей и значений, например, так while($row = $result->fetch_assoc()) { $data[$row['topic']] = $row['value']; } Далее Вы можете легко обращаться к значениям по имени топика и делать это хоть с массивом, хоть с объектом json. А если потребуется перебрать все, что там есть, то можно использовать foreach, благо он есть во всех современных языках.
  13. @emaus не совсем понимаю, что Вы делаете т.к объяснение идет в контексте другой программы. Вам стоит предоставить Ваш код и более подробно описать что вы хотите сделать. И если этот вопрос никак не связан с текущим проектом, то лучше создать отдельную тему или напишите мне в приват.
  14. Доброе время суток. Нет не сложно, это все правится через HTML и CSS. В код контроллера ничего вносить не потребуется. Но Вы точно столкнетесь с проблемой быстрой выгрузки фоновой картинки если она будет храниться на SPI Flash. Если она будет не большого размера, то все будет хорошо и не придется придумывать костыли, как я это делал с облаками. Скорее всего Вы не залили файлы web сервера в вашу новую flash память. Этот этап описан в инструкции.
  15. @emaus Доброе время суток. Давайте разбираться. В первую очередь нам нужно создать сертификаты. Я приведу пример с самоподписанным сертификатом, но в сети множество мануалов на эту тему, вплоть до получения сертификата у Let's Encrypt. СЕРВЕР Создание закрытого ключа для центра сертификации. Ключ будет защищен паролем. openssl genrsa -des3 -out ca.key 2048 Создание сертификата для центра сертификации openssl req -new -x509 -days 99999 -key ca.key -out ca.crt Создание закрытого ключа для брокера mosquitto openssl genrsa -out srv.key 2048 Создание запроса к центру сертификации по которому будет создан ключ сервера. Мы не задаем пароль для него т.к иначе придется его вводить каждый раз когда стартует mosquitto. И еще один важный момент, это заполнение поля "Common Name" в котором должно быть указано доменное имя сервера. Это необходимо для прохождения проверки подлинности на стороне клиента. Но если это невозможно, и Вы используете сервер в локальной сети, то эту проверку можно будет отключить на стороне клиента. Этот важный момент будет описан ниже. openssl req -new -out srv.csr -key srv.key Теперь осталось подписать сертификат сервера в нашем сервере сертификации. Потребуется ввести пароль которым защищен ключ сервера сертификации. openssl x509 -req -in srv.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out srv.crt -days 99999 Теперь необходимо установить MQTT брокер. Я использую операционную систему Linux Ubuntu 18.04 и буду описывать установку для неё. Все команды выполняются от пользователя root. apt-add-repository ppa:mosquitto-dev/mosquitto-ppa apt update apt install mosquitto Теперь созданы все необходимые файлы и каталоги и нам необходимо скопировать: сертификат центра сертификации (ca.crt), сертификат сервера (srv.crt) и ключ сервера (srv.key) в каталог который доступен mosquitto, например, /etc/mosquitto/certs По умолчанию конфигурационный файл сервера практически не содержит никаких настроек. Вот как он выглядит у меня. root@server:/# cat /etc/mosquitto/mosquitto.conf # Place your local configuration in /etc/mosquitto/conf.d/ # # A full description of the configuration file is at # /usr/share/doc/mosquitto/examples/mosquitto.conf.example pid_file /var/run/mosquitto.pid persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log include_dir /etc/mosquitto/conf.d Как мы видим, сервер читает все пользовательские конфигурационные файлы из каталога /etc/mosquitto/conf.d тут мы и разместим свой файл. Создайте любой файл в этом каталоге, например, tls.conf touch /etc/mosquitto/conf.d/tls.conf Записываем в него следующие параметры. По необходимости добавьте свои параметры конфигурации. port 8883 cafile /etc/mosquitto/certs/ca.crt certfile /etc/mosquitto/certs/srv.crt keyfile /etc/mosquitto/certs/srv.key tls_version tlsv1.2 Я использовал версию TLS 1.2 т.к на момент тестирования модуль SSL для Python не знал о версии 1.3. Вероятнее всего эту ситуацию можно поправить, но я не стал тратить на это время т.к цель ставилась просто запустить скрипт с использованием шифрования соединения с сервером. Перезапустим сервер так systemctl restart mosquitto или по старинке /etc/init.d/mosquitto restart Проверяем, что сервер запустился и прослушивает порт 8883 netstat -plnt | grep mosquitto tcp 0 0 0.0.0.0:8883 0.0.0.0:* LISTEN 24233/mosquitto tcp6 0 0 :::8883 :::* LISTEN 24233/mosquitto Если что-то не так, то смотрим логи и анализируем ситуацию. СКРИПТ В первую очередь необходимо в самом начале файла добавить, по понятным причинам, модуль SSL. import ssl Вносим изменения в переменные описывающие где искать MQTT сервер и меняем порт. mqtt_port = 8883 Чтобы Вам не насиловать себя правками моего кода в Python, я сразу предоставлю Вам всю функцию start() в которой я добавил поддержку шифрования и вывода отладочной информации в случае возникновения проблем. Просто замените имеющийся код этой функции на предоставленный мною в этом посте. def start(): global mqttReconnect global mysql try: mysql = mysqlDB(mysql_host, mysql_user, mysql_passwd, mysql_schema, mysql_port) mqttc = mqtt.Client(mqtt_client_id, True) # mqttc.on_log = on_log mqttc.on_connect = on_connect mqttc.on_disconnect = on_disconnect mqttc.on_message = on_message # !!!DANGEROUS!!! Be sure to remove "cert_reqs=ssl.CERT_NONE" if you use valid domain names in the COMMON NAME field of your certificate! mqttc.tls_set("/etc/mosquitto/certs/ca.crt", cert_reqs=ssl.CERT_NONE, tls_version=ssl.PROTOCOL_TLSv1_2); if len(mqtt_login) > 0: mqttc.username_pw_set(mqtt_login, mqtt_password) mqttReconnect = True while mqttReconnect: try: alert('connecting to MQTT broker...') mqttc.connect(mqtt_server, mqtt_port, 60) mqttReconnect = False except Exception as e: alert('could not connect to MQTT broker, reconnect after 10 seconds: ' + str(e), True) time.sleep(10) while not mqttReconnect: mysql.loop() mqttc.loop(timeout=1.0) except Exception as e: alert('\nunexpected termination of the program: ' + str(e), True) Обратите внимание на следующую строку mqttc.tls_set("/etc/mosquitto/certs/ca.crt", cert_reqs=ssl.CERT_NONE, tls_version=ssl.PROTOCOL_TLSv1_2); Тут мы указываем где найти сертификат центра сертификации, по нему будет проверяться подлинность сертификата сервера. Также мы указываем версию TLS и, что !!!ОЧЕНЬ ВАЖНО!!! - мы говорим клиенту не проверять подлинность сертификата (cert_reqs=ssl.CERT_NONE). Это нужно только на время отладки или в том случае если поле "COMMON NAME", сертификата сервера, не соответствует фактическому адресу сервера или там указан только ip адрес. Я оставил об этом соответствующий комментарий строкой выше. # !!!DANGEROUS!!! Be sure to remove "cert_reqs=ssl.CERT_NONE" if you use valid domain names in the COMMON NAME field of your certificate! Осталось самое главное - проверить работоспособность. Запустите демона с параметром window чтобы увидеть дополнительную информацию и ошибки в ходе отладки <script dir>/mqttMySqlClient.py window Все должно заработать, проверил на своем домашнем сервере.
×
×
  • Create New...