Kaptain.
Telegram /
LinkedIn /
Email /
GIT /
RSS /
GPG /
Заказ печатных плат

№ 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: "Religion stills a thinking mind." [Greg Erwin]
Leave a Reply