MQTT и кнопки

Направление такое.
Нужно иметь статический IP-адрес (у меня он за 100 рублей в месяц) или доменное имя.
ESP01 должен работать в режиме станции. Для него должен быть выделен IP-адрес в локальной сети и порт. Это прописывается на роутере. В моем случае команды, поступившие из интернета (с телефона) на ESP01, передаются на ARDUINO-UNO, которая делает свои дела и передает результаты в ESP01, а тот, в свою очередь, обратно - в интернет.

Телефон должен выдать GET-запрос такого вида:
http://xx.xxx.x.xx:10200/s?s=V1V2SlRTtTempGis.
xx.xxx.x.xx - статический IP-адрес (или доменное имя).
V1V2SlRTtTempGis - примерный набор команд, который передается в ARDUINO-UNO и там обрабатывается.

Скетч для ESP01 (ESP01S)

//Вставляем ссылку в поле «Дополнительные ссылки для Менеджера плат:» и жмём «OK».
//
//http://arduino.esp8266.com/stable/package_esp8266com_index.json
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char* ssid = "ABRAKADABRA";
const char* password = "19661117";

// const int period = 500;
const int period = 125;
unsigned long moment;
unsigned long avral;

bool flag;

ESP8266WebServer server(10200);

IPAddress ip(192, 168, 0, 62);
IPAddress dns(8, 8, 8, 8);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);

void setup()
{
  WiFi.config(ip, dns, gateway, subnet);
  Serial.begin(9600);
  delay(100);

  WiFi.begin(ssid, password);
  WiFi.mode(WIFI_STA);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
  }
  server.on("/s", razborki);
  server.begin();
}

void loop()
{
  server.handleClient();

  if (millis() - moment >= period)
  {
    if (flag == true) // зафиксирован прием GET-запроса ####
    {
      avral = millis();
      String stroka = "w"; // просто так
      Serial.println(server.arg(0)); // аргумент отправляется в Arduino
      // delay(250); // ожидание ответа от Arduino
      delay(125); // ожидание ответа от Arduino
      while (true)
      {
        if (millis() - avral >= 5000)
        {
          server.send(200, "text/plain", "Oblom"); // а если ответа от Arduino не получено, то это - облом.
          break;
        }
        if (Serial.available() > 0)
        {
          char sim = Serial.read();
          byte simb = (byte) sim;
          if (sim == '\n') // конец пакета
          {
            server.send(200, "text/plain", stroka); // stroka отправляется в интернет
            break;
          }
          else
          {
            if (simb != 13) stroka += sim; // накапливается символ в stroka
          }
        }
      }
      Serial.flush();
      flag = false;
    }
    moment = moment + period;
  }
}
void razborki()
{
  flag = true;
}

Так, возвращаем MQTT!

У меня всегда по одному шаблону сделано. Заряжаю таймер на 10 мс и в прерывании таймера для каждой кнопки вставляю код

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

1 лайк

Я завишу ТОЛЬКО от своего провайдера.

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

А я ни от кого не завишу. Мой провайдер только обеспечивает интернет. Если я завтра перееду к другому провайдеру для меня ничего не изменится.

1 лайк

Но это мой личный брокер.

Ну так и у меня мой личный MQTT брокер висящий на крохотной малинке zero w.
И работающий в связке с mojordomo выдаёт красивые графики параметров через http.

Если я куплю доменное имя, то для меня - тоже.

А как с масштабированием? Я вот по осени новую железку поставил на мониторинг параметров 3х-фазной сети на PZEMах. Мониторит аж 18 параметров, которые MQTT брокер скушал и не пришлось ничего перепрограммировать.

Мониторинг и MQTT - это не совсем совместимые вещи.

Зависите от ПО на вышей малинке, которое подчинено и легко закрывается производителем серверного ПО MQTT. Если запад с амерами залупятся, то не видать вам на территории России управления через MQTT, который будет хоть ваш личный брокер, хоть общественный. Живой пример с Ccleaner . Хоть ты 10 VPNов включи, не работает он у нас (.

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

Вот не надо путать тёплое с мягким. Пока у меня брокер стоит на моей малинке нет способа заблокировать мне обмен с ним. А Ccleaner при запуске проверяет страну компа. Это есть в коде. Отключи интернет, поставь Казахстан и чисти. Потом вернёшь Россию.
Стоящий у меня mosquitto это “An open source MQTT broker” т.е. всё в наших руках.

Ну, как бэ да - можно и так выразится.

Но, если подумать, то ценность мониторинга состоит в том, что пользователь должен понимать к какому моменту времени привязано изменение метрики. Однако проблема в том, что MQTT не сопровождает мессейдж таймштампом. Т.е. подключившись к брокеру можно получить не срез из Voltage / Current / Power Factor, а напряжение сегодняшнее, ток - вчерашний, а PF - от рандомного дня.

Пока цепочка паблишер-брокер-клиент не испытывают проблем связности, всё выглядит прилично… Но, когда начинаются проблемы передачи/приема - хрен поймешь, что все пошло вразнос.

Ну ты вообще! Это же MQTT! Это же ты формируешь пакет информации. Кто мешает тебе прицепить таймштамп к пакету? Если конечно оно тебе нужно.

Ваша малинка локальная что ли? Она же в инете. Вы полагаете, что производитель не оставил себе дыру, для блокировки? Ну это наивно.

Клиент на смартфоне его поймет и синхронизирует метрики ?

Производитель москита? Да наврядли. Сырцы открытые - можно и провести анализ при желании.

Проводи не проводи, только производитель знает эту дыру как остановить сервер. Если что, то не будет работать, то сразу у всех в данном регионе. Хуже, если это сделают какие нибудь хакеры. Я уже давно использую нечто подобное описанное @Optron -ом. JS и PHP нам в помощь. Понимаю, что с таким подходом можно и на серверное ПО замахнуться Билли мать его Гейца. Который постоянно закрывает свои дыры кбэшками. Но тот хоть честно об этом говорит. Обновитесь, нето вас порюхают жестко. А с телефонами нашими что творится? Производители даже в последнее время вообще не спрашивают пользователей хочет он обновить систему или нет. Тупо летит ПО когда мы спим. Это я говорю на полном серьёзе, потому как вижу это на практике у не менее 500 пользователей андроида и айос. Буквально яблоко пару недель назад обновило систему, что некоторые пользователи не узнали свои айфоны. Вот такие дела творятся. А вы говорите это моё и ни кто не сможет. Всё они смогут если захотят.

1 лайк