
ESP32: IoT устройство, работающее в локальной сети
В статье показан пример разработки подключенной к локальной сети простой умной розетки. Приведенные примеры функций помогут быстрее начать разработку более сложного устройства
Допустим, вы создаете умную розетку и хотите включать и выключать ее. Для этого мы запустим на контроллере HTTP сервер и будем управлять контроллером, используя запросы по адресу/ power на устройстве:
- Запрос HTTP GET на этот URI вернет текущее состояние выхода.
- Запрос HTTP POST на этот URI обновит состояние выхода.
Следующий код определяет обработчики запросов для нужного URI:
httpd_uri_t power_get = {
.uri = "/power",
.method = HTTP_GET,
.handler = power_get_handler
};httpd_uri_t power_post = {
.uri = "/power",
.method = HTTP_POST,
.handler = power_post_handler
};
Функции Power_get_handler() и power_post_handler() будут вызываться при поступлении HTTP GET или HTTP POST запросов на контроллер.
Теперь нужно запустить веб-сервер и зарегистрировать эти URI на нем:
httpd_handle_t server = NULL;
// Запуск httpd server
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
ESP_LOGI(TAG, "Starting server on port: '%d'", config.server_port);
if (httpd_start(&server, &config) == ESP_OK) {
// Регистрация обработчикоов
httpd_register_uri_handler(server, &power_get);
httpd_register_uri_handler(server, &power_post);
}
Собственно функции power_get_handler() и power_post_handler() могут быть реализованы следующим образом (приведен не весь код, а только та его часть, которая касается обработки веб запросов):
esp_err_t power_get_handler(httpd_req_t *req)
{
char resp_str[100];
snprintf(resp_str, sizeof(resp_str), "{\"state\": %s}",
driver_get_output_state() ? "true" : "false");
httpd_resp_send(req, resp_str, strlen(resp_str));
return ESP_OK;
}
#define RESP_SUCCESS "{\"status\": \"success\"}"
#define RESP_FAIL "{\"status\": \"fail\"}"
esp_err_t power_post_handler(httpd_req_t *req)
{
char buffer[100];
char *resp_str = RESP_SUCCESS;
int remaining = req->content_len;
while (remaining > 0) {
/* Чтение данных из запроса */
if ((ret = httpd_req_recv(req, buffer,
MIN(remaining, sizeof(buffer)))) < 0) {
return ESP_FAIL;
}
remaining -= ret;
} /* Разбор запроса */
target_state = my_parse_user_request(buffer);
if (target_state < 0) {
resp_str = RESP_FAIL;
} else {
/* Изменение выхода */
driver_set_output_state(target_state);
} /* Возврат статуса */
httpd_resp_send(req, resp_str, strlen(resp_str));
return ESP_OK;
}
В приведенном выше примере функция power_get_handler() просто получает текущее состояние вывода из драйвера и возвращает его в ответе на запрос HTTP GET.
Функция power_post_handler() получает запрос пользователя и изменяет состояние выхода устройства в соответствии с этим запросом.
Использование API
Теперь можно использовать команды Curl для проверки работы контроллера:
$ curl http://192.168.1.113/power
{"state": true}
$ curl -d '{"state": false}' http://192.168.1.113/power
{"status": "success"}
Можно написать простое приложение для телефона, которое будет выполнять приведенные выше команды и управлять, таким образом, готовым устройством.
Безопасность
Использование созданного выше API абсолютно не защищено от любых внешних атак. Конечно, если вы находитесь внутри безопасной сети Wi-Fi, не имеющей подключения к интернету, этим можно пренебречь, но в большинстве реальных задач нужно будет использовать совсем другой уровень безопасности, и даже использование HTTP сервера, скорее всего, будет недопустимо. Но это тема для другой статьи.
Статья основана на проекте ESP-Jumpstart https://docs.espressif.com/projects/esp-jumpstart
Источник: https://medium.com
Производители: ESPRES
Опубликовано: 30.10.2019