# IoT MVP — E2E Demo ## Что делает этот пример Показывает полную цепочку: ``` IoT Device (mosquitto_pub) → MQTT PUBLISH → EMQX (HTTP auth → sless-operator) → [iot-mqtt-bridge подписан на "+/telemetry/+"] → RabbitMQ queue "iot.{namespace}.telemetry" → event-dispatcher → POST → serverless function (handler.py) ``` ## Предусловия 1. EMQX запущен: `kubectl apply -f deployments/k8s/emqx.yaml` 2. iot-mqtt-bridge запущен: `kubectl apply -f deployments/k8s/iot-mqtt-bridge.yaml` 3. event-dispatcher запущен (уже должен работать) ## Запуск ```bash # Установить переменные export API_TOKEN="your-jwt-token" export NAMESPACE="sless-abc123def456" # твой namespace # Инициализировать terraform init terraform apply \ -var="namespace=${NAMESPACE}" \ -var="api_token=${API_TOKEN}" # Получить credentials MQTT_USER=$(terraform output -raw mqtt_username) MQTT_PASS=$(terraform output -raw mqtt_password) MQTT_TOPIC=$(terraform output -raw mqtt_topic) echo "MQTT user: ${MQTT_USER}" echo "MQTT topic: ${MQTT_TOPIC}" ``` ## Отправить тестовое сообщение ```bash # Через mosquitto_pub (из пода внутри кластера) kubectl run mqtt-test --rm -i --image=eclipse-mosquitto --restart=Never -- \ mosquitto_pub \ -h emqx.sless.svc \ -p 1883 \ -u "${MQTT_USER}" \ -P "${MQTT_PASS}" \ -t "${MQTT_TOPIC}" \ -m '{"temperature": 22.5, "humidity": 65, "unit": "celsius"}' ``` ## Проверить что функция вызвалась ```bash # Логи event-dispatcher kubectl logs -n sless deployment/event-dispatcher -f # Логи функции (через invocations API) curl -H "Authorization: Bearer ${API_TOKEN}" \ https://sless.kube5s.ru/v1/namespaces/${NAMESPACE}/functions/iot-telemetry-handler/invocations ``` ## Структура файлов ``` examples/IOT/ main.tf # Terraform: function + trigger + iot_device handler.py # Python обработчик телеметрии README.md # Этот файл ``` ## Известные ограничения MVP - `sless_iot_device` Terraform ресурс требует реализации в terraform-provider-sless (Этап 6) - EMQX TLS отключён — включить для prod (настроить cert-manager secret) - iot-mqtt-bridge credentials создаются вручную (автоматизировать в будущем) - Нет обратного канала: Cloud → Device команды (Device Shadow — вне MVP)