№ 8388 В разделах: Electronics
ESP8266
Programming
от August 12th, 2017,
В подшивках: ESP8266, MQTT, Smart Home
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 и сможете начать делать ваши собственные проекты. Помните, что одним “интернетом вещей” вы не ограничены и можете использовать такой сервер для обмена сообщениями между различным ПО. Например, для мониторинга вашей инфраструктуры предприятия.
Ссылки по теме:
Fortune cookie: Today's spam: First blowjob and First anal sex HERE
Leave a Reply