Arduino IDE
Напишем программу в среде Arduino IDE.
Для работы будем использовать библиотеку PubSubClient. Её можно скачать по ссылке из репозитория на github, или установить с помощью менеджера библиотек в Arduino IDE.
Пусть, тестовая программа будет каждые пять секунд отправлять MQTT брокеру значение обычного счётчика.
#include <WiFi.h>
#include <PubSubClient.h>
// реквизиты WiFi
const char* ssid = "X-COM-CITADEL"; // имя точки доступа WiFi
const char* password = "id7dq8d-"; // пароль к точке доступа WiFi
const char* mqtt_username = "user_3ad51bab"; // имя пользователя MQTT
const char* mqtt_password = "************"; // пароль пользователя MQTT
const char* mqtt_client_id = "user_3ad51bab_test"; // идентификатор клиента MQTT
// брокер MQTT
const char* mqtt_server = "mqtt.robotclass.ru";
// тема сообщений
const char* mqtt_topic = "user_3ad51bab/data";
// инициализация WiFi и MQTT
WiFiClient espClient;
PubSubClient client(espClient);
int cnt = 0;
void setup() {
// запуск WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
// настройка клиента MQTT
client.setServer(mqtt_server, 1883);
}
void loop() {
if (!client.connected()) {
if (!client.connect(mqtt_client_id, mqtt_username, mqtt_password)) {
return;
}
}
client.publish(mqtt_topic, String(cnt).c_str());
cnt++;
delay(5000);
}
Метод publish принимает два аргумента: тему сообщения и текст сообщение. Второй аргумент должен иметь тип const char*. Для преобразования счётчика типа int в тип const char* используем встроенный в Arduino тип String.
Загружаем программу на Графит-S3 и смотрим панель управления. Число в блоке data должно увеличиваться на единицу каждые 5 секунд.
Приём сообщений
Теперь изменим программу так, чтобы наше устройство смогло ещё и получать сообщения от MQTT брокера.
Добавим функцию-обработчик событий MQTT, которая будет вызывать каждый раз, когда приходит сообщение. Пусть при получении сообщения с темой user_3ad51bab/switch на плате Графит-S3 будет включаться или выключаться штатный светодиод.
void callback(char* topic, byte* payload, unsigned int length) {
digitalWrite(LED_BUILTIN, payload[0]);
}
Эта функция имеет три аргумента:
- topic — тема сообщения, строка типа char*;
- payload — сообщение, массив байт;
- length — количество байт в сообщении.
В setup укажем эту функцию, сразу после настройки реквизитов брокера:
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
А в суперцикл программы добавим вызов обработчика событий:
void loop() {
client.loop();
Чтобы не пропустить события избавимся от явной паузы в суперцикле: time.sleep(5). Организуем отправку сообщений с помощью таймаута.
Полный код программы
#include <WiFi.h>
#include <PubSubClient.h>
// реквизиты WiFi
const char* ssid = "X-COM-CITADEL"; // имя точки доступа WiFi
const char* password = "id7dq8d-"; // пароль к точке доступа WiFi
const char* mqtt_username = "user_3ad51bab"; // имя пользователя MQTT
const char* mqtt_password = "MljV7p1Yb9ln"; // пароль пользователя MQTT
const char* mqtt_client_id = "user_3ad51bab_test"; // идентификатор клиента MQTT
// брокер MQTT
const char* mqtt_server = "mqtt.robotclass.ru";
// тема сообщений
const char* mqtt_pub_topic = "user_3ad51bab/data";
const char* mqtt_sub_topic = "user_3ad51bab/switch";
// инициализация WiFi и MQTT
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long publish_next = 0;
unsigned int publish_to = 5000;
int cnt = 0;
void callback(char* topic, byte* payload, unsigned int length) {
if( payload[0] == '1' )
digitalWrite(LED_BUILTIN, HIGH);
else
digitalWrite(LED_BUILTIN, LOW);
}
void setup() {
// настраиваем контакт светодиода
pinMode(LED_BUILTIN, OUTPUT);
// запуск WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
// настройка клиента MQTT
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
if (client.connect(mqtt_client_id, mqtt_username, mqtt_password)) {
client.subscribe(mqtt_sub_topic);
} else {
return;
}
}
unsigned long t = millis();
if( t > publish_next ){
publish_next = t + publish_to;
client.publish(mqtt_pub_topic, String(cnt).c_str());
cnt++;
}
client.loop();
}
Загружаем программу на Графит-S3 и открываем панель управления. Нажимаем кнопку свет и на отладочной плате зажигается светодиод.
