|
|
<!--
|
|
|
CO_OP_TRANSLATOR_METADATA:
|
|
|
{
|
|
|
"original_hash": "6754c915dae64ba70fcd5e52c37f3adf",
|
|
|
"translation_date": "2025-08-26T23:20:48+00:00",
|
|
|
"source_file": "1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md",
|
|
|
"language_code": "ru"
|
|
|
}
|
|
|
-->
|
|
|
# Управляйте ночником через Интернет - Wio Terminal
|
|
|
|
|
|
В этой части урока вы будете подписываться на команды, отправленные с MQTT-брокера, на ваш Wio Terminal.
|
|
|
|
|
|
## Подписка на команды
|
|
|
|
|
|
Следующий шаг — подписаться на команды, отправляемые с MQTT-брокера, и реагировать на них.
|
|
|
|
|
|
### Задание
|
|
|
|
|
|
Подпишитесь на команды.
|
|
|
|
|
|
1. Откройте проект ночника в VS Code.
|
|
|
|
|
|
1. Добавьте следующий код в конец файла `config.h`, чтобы определить имя темы для команд:
|
|
|
|
|
|
```cpp
|
|
|
const string SERVER_COMMAND_TOPIC = ID + "/commands";
|
|
|
```
|
|
|
|
|
|
`SERVER_COMMAND_TOPIC` — это тема, на которую устройство будет подписываться, чтобы получать команды для управления светодиодом.
|
|
|
|
|
|
1. Добавьте следующую строку в конец функции `reconnectMQTTClient`, чтобы подписаться на тему команд при повторном подключении MQTT-клиента:
|
|
|
|
|
|
```cpp
|
|
|
client.subscribe(SERVER_COMMAND_TOPIC.c_str());
|
|
|
```
|
|
|
|
|
|
1. Добавьте следующий код ниже функции `reconnectMQTTClient`.
|
|
|
|
|
|
```cpp
|
|
|
void clientCallback(char *topic, uint8_t *payload, unsigned int length)
|
|
|
{
|
|
|
char buff[length + 1];
|
|
|
for (int i = 0; i < length; i++)
|
|
|
{
|
|
|
buff[i] = (char)payload[i];
|
|
|
}
|
|
|
buff[length] = '\0';
|
|
|
|
|
|
Serial.print("Message received:");
|
|
|
Serial.println(buff);
|
|
|
|
|
|
DynamicJsonDocument doc(1024);
|
|
|
deserializeJson(doc, buff);
|
|
|
JsonObject obj = doc.as<JsonObject>();
|
|
|
|
|
|
bool led_on = obj["led_on"];
|
|
|
|
|
|
if (led_on)
|
|
|
digitalWrite(D0, HIGH);
|
|
|
else
|
|
|
digitalWrite(D0, LOW);
|
|
|
}
|
|
|
```
|
|
|
|
|
|
Эта функция будет обратным вызовом, который MQTT-клиент вызовет при получении сообщения от сервера.
|
|
|
|
|
|
Сообщение принимается в виде массива 8-битных целых чисел без знака, поэтому его нужно преобразовать в массив символов, чтобы работать с ним как с текстом.
|
|
|
|
|
|
Сообщение содержит JSON-документ, который декодируется с помощью библиотеки ArduinoJson. Свойство `led_on` из JSON-документа считывается, и в зависимости от его значения светодиод включается или выключается.
|
|
|
|
|
|
1. Добавьте следующий код в функцию `createMQTTClient`:
|
|
|
|
|
|
```cpp
|
|
|
client.setCallback(clientCallback);
|
|
|
```
|
|
|
|
|
|
Этот код устанавливает `clientCallback` как обратный вызов, который будет вызываться при получении сообщения от MQTT-брокера.
|
|
|
|
|
|
> 💁 Обработчик `clientCallback` вызывается для всех тем, на которые подписан клиент. Если позже вы напишете код, который слушает несколько тем, вы сможете получить тему, в которую было отправлено сообщение, из параметра `topic`, переданного в функцию обратного вызова.
|
|
|
|
|
|
1. Загрузите код на ваш Wio Terminal и используйте Serial Monitor, чтобы увидеть уровни освещенности, отправляемые на MQTT-брокер.
|
|
|
|
|
|
1. Настройте уровни освещенности, обнаруживаемые вашим физическим или виртуальным устройством. Вы увидите, как сообщения принимаются и команды отправляются в терминале. Также вы увидите, как светодиод включается и выключается в зависимости от уровня освещенности.
|
|
|
|
|
|
> 💁 Вы можете найти этот код в папке [code-commands/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal).
|
|
|
|
|
|
😀 Вы успешно запрограммировали ваше устройство на реагирование на команды от MQTT-брокера.
|
|
|
|
|
|
---
|
|
|
|
|
|
**Отказ от ответственности**:
|
|
|
Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода. |