INT 21h

Hi, I am Vladimir Smagin, SysAdmin and Kaptain. Telegram Email / GIT / RSS / GPG

ESP8266: Использование MQTT для управления микроконтроллером

№ 8388 В разделах: Electronics ESP8266 Programming от August 12th, 2017,
В подшивках: , ,

MQTT это протокол обмена сообщениями для встраиваемой электроники, роботов, мониторинга ПО и т.д. Я буду рассматривать этот протокол как разработчик электроники. Поскольку я сейчас плотно подсел на ESP8266, то и примеры все будут под эту микросхему + Arduino IDE. Только не надо тут кидания бутыльками с флюсом. Среда разработки ардуино была выбрана потому, что там огромная куча готовых библиотек, а я очень ленивая жопа. Благодаря этому количество кода и работы снижается с нескольких дней до нескольких часов. Библиотеку mqtt и пример кода можно найти здесь. Библиотеки по ссылке почему-то нет в менеджере библиотек arduino, но одноименная библиотека все-таки есть, но функционал другой.

Регистрируетесь на облачном сервисе, где предлагают mosquitto и прописываете сервер, порт, логин и пароль. Использовав код из примера мы можем добиться поступления данных с нашего микроконтроллера в шину. Если предполагается большое количество датчиков (скажем, 8), то облачный сервис не подойдет, если вам нужно куда-то бесплатно или недорого скидывать данные. Можно купить копеешный компьютер за те же 19 баксов месячной абоненки (Raspberry Pi, например), поставить туда свой собственный сервер и пользоваться им в дальнейшем абсолютно бесплатно.

В клиенте на телефоне можно даже небольшой интерфейс соорудить с помощью MQTT Dashboard.

Круто, да? Теперь когда получилось засылать все ваши данные с датчиками на удаленный сервер надо сделать так, чтобы с вашими датчиками было удобно работать. Топики это не просто заголовки сообщений. Ими можно пользоваться подобно файловой системе, разбивая данные от ваших устройств на категории. Зачем это надо? Для масштабируемости системы и это просто удобно иметь древовидную структуру для ваших данных. Я сделал так, чтобы устройство посылало /hello сообщение со своим именем и фичами при старте и примерно 1 раз в минуту. А вот всё остальное доступно через /device сообщения. Мой демонстрационный стенд засылает примерно 1 раз в 3 секунды состояние термодатчика и реле, а RSSI раз в 10 секунд. Обратите внимание на то, что RSSI универсальный параметр для конечных устройств и поэтому не запихивается в отдельный каталог и выступает как свойство устройства.

На этом видео можно наглядно увидеть работу устройства

Что касается кода, так он от примера далеко не ушел. Я лишь добавил дополнительные публикации топиков для служебной информации и идентификации устройства, т.к. 2 устройства с одинаковым именем не подключат.

String getDevName() {
 return WiFi.macAddress();
}
String DeviceName = getDevName();
String hostname_origin = "mod" + DeviceName;
IPAddress InternalMyIP;

void setup() {
  hostname_origin.replace(":", "");
  WiFi.hostname(hostname_origin);
  ... ваш код предварительных настроек ...
}

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

    if (!client.connected()) {
      Serial.println("Connecting to MQTT server");
      if (client.connect(MQTT::Connect(hostname_origin)
                         .set_auth(mqtt_user, mqtt_pass))) {
        Serial.println("Connected to MQTT server");

Также для удобства можно заслать дополнительные данные о себе в свойства девайса

void InternalHelloSend() {
  if (internalHello == 0)
  {
    client.publish("/hello/" + DeviceName, "termo[1],relay[1]");
    client.publish("/device/" + DeviceName + "/hostname", hostname_origin);
    client.publish("/device/" + DeviceName + "/devicename", DeviceName);
    client.publish("/device/" + DeviceName + "/IP", InternalMyIP.toString());
    internalHello = internalHelloInterval;
  }
  internalHello--;
}

void InternalRSSISend() {

  if (internalRSSI == 0)
  {
    Serial.println("RSSI " + String(WiFi.RSSI()));
    client.publish("/device/" + DeviceName + "/RSSI", String(WiFi.RSSI()));
    internalRSSI = internalRSSIInterval;
  }
  internalRSSI--;
}

Ничего сложного.

Программой mosquitto_sub из пакета mosquitto-clients можно наблюдать работу всей шины, пользуясь масками “#” и “+”. На правой панели прослушиваются все сообщения маской “#”, а на левой только одно устройство с указанным именем “/+/5C:CF:7F:3D:C3:9F/#”.

Теперь вы знакомы с MQTT и сможете начать делать ваши собственные проекты. Помните, что одним “интернетом вещей” вы не ограничены и можете использовать такой сервер для обмена сообщениями между различным ПО. Например, для мониторинга вашей инфраструктуры предприятия.

Ссылки по теме:

Нет комментариев »

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Облачная платформа
Яндекс.Метрика

Fortune cookie: Today's spam: First blowjob and First anal sex HERE