Интеграция AWS IoT Core в мобильное IoT-приложение
AWS IoT Core — это managed MQTT-брокер с аутентификацией по X.509 сертификатам, политиками доступа через AWS IAM/IoT Policies и возможностью масштабироваться до миллионов устройств. Интегрировать его в мобильное приложение не сложно, но есть несколько мест, где ошибаются почти все.
Аутентификация: что выбрать для мобильного клиента
AWS IoT Core поддерживает три метода auth для мобильных клиентов: X.509 сертификаты, AWS Cognito Identity Pools и SigV4. Сертификаты — для устройств, не для мобильных приложений: хранить private key в приложении небезопасно, ротация сложна.
Правильный путь для мобильных клиентов — Cognito Identity Pool + IoT Core. Пользователь логинится через Cognito User Pool (или федеративную идентификацию через Google/Apple), получает временные AWS credentials через AssumeRoleWithWebIdentity, и уже с этими credentials подключается к IoT Core через aws-iot-device-sdk или нативный MQTT over WebSocket.
На Flutter используем amplify_auth_cognito для авторизации и mqtt_client с кастомным WebSocket endpoint в формате:
wss://[endpoint].iot.[region].amazonaws.com/mqtt
Подписываем WebSocket Upgrade request через SigV4 — заголовки X-Amz-Security-Token, X-Amz-Date, Authorization. Библиотека aws_common из Amplify SDK умеет это делать.
На React Native — AWS Amplify с @aws-amplify/pubsub, который под капотом использует MQTT over WebSocket с автоматической SigV4-подписью.
IoT Policies: где режутся права
IoT Policy — это отдельный от IAM механизм. Даже если у Cognito-роли есть iotdata:Publish, без IoT Policy на iot:Publish для конкретных топиков запросы вернут 403. Типичная политика для мобильного клиента:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["iot:Connect"],
"Resource": "arn:aws:iot:region:account:client/${cognito-identity.amazonaws.com:sub}"
},
{
"Effect": "Allow",
"Action": ["iot:Subscribe", "iot:Receive"],
"Resource": "arn:aws:iot:region:account:topicfilter/home/${cognito-identity.amazonaws.com:sub}/*"
},
{
"Effect": "Allow",
"Action": ["iot:Publish"],
"Resource": "arn:aws:iot:region:account:topic/home/${cognito-identity.amazonaws.com:sub}/*"
}
]
}
${cognito-identity.amazonaws.com:sub} — это policy variable, которая подставляет Cognito Identity ID. Каждый пользователь видит только свои устройства. Это стандартный паттерн multi-tenant IoT.
Device Shadow: состояние без постоянного соединения
AWS IoT Device Shadow — ключевая фича для мобильных приложений. Устройство может быть офлайн, но Shadow хранит его последнее известное состояние. Мобильный клиент пишет в desired, устройство читает при подключении и обновляет reported.
На практике: пользователь выключил свет через приложение. Команда ушла в Shadow desired. Устройство было офлайн 10 минут — при восстановлении соединения прочитало delta и выполнило команду. Без Shadow пришлось бы держать очередь команд самостоятельно.
Для чтения Shadow из мобильного приложения — REST API или MQTT топики $aws/things/{thingName}/shadow/get. Обновление — publish в $aws/things/{thingName}/shadow/update с {"state": {"desired": {"power": "OFF"}}}.
Rules Engine для уведомлений
AWS IoT Rules позволяют триггерить Lambda, SNS, SQS по условиям из MQTT-сообщений. Для push-уведомлений: IoT Rule → Lambda → SNS → Firebase Cloud Messaging / APNs. Это чище, чем держать постоянное соединение с MQTT только ради уведомлений.
Типичные проблемы
Reconnect storm: 1000 устройств одновременно переподключаются после сетевого сбоя → IoT Core throttling → лавина ошибок. Решение: exponential backoff с jitter в клиентском коде, mqtt_client это не делает автоматически — нужно реализовать самостоятельно.
Endpoint throttling: iotdata endpoint лимитирует до 20 транзакций в секунду на аккаунт по умолчанию. Для реальных продакшн-нагрузок нужно запрашивать лимиты через AWS Support заранее.
Процесс и сроки
Настройка Cognito + IoT Core + IoT Policies + базовая интеграция — 1–2 недели. Device Shadow, Rules Engine, уведомления — ещё 1–2 недели. Полная интеграция с реальными устройствами и нагрузочное тестирование — 4–6 недель. Стоимость рассчитывается после оценки количества устройств и частоты сообщений.







