[Документация Yandex Cloud](../../index.md) > [Yandex IoT Core](../index.md) > [Пошаговые инструкции](index.md) > Отправка сообщения

# Отправка сообщения

{% note warning %}

Сервис Yandex IoT Core больше не доступен для новых пользователей. 

Текущие пользователи могут создавать ресурсы до 1 ноября 2026 года. После сервис перейдет в режим read-only, а 1 декабря 2026 года — прекратит работу. Подробнее о сроках и порядке закрытия читайте на странице [Закрытие сервиса](../sunset.md).

{% endnote %}

Сервис предоставляет две модели управления ресурсами:
* при использовании брокера отправка и прием сообщений может осуществляться в произвольных топиках, не начинающихся с `$`;
* при использовании реестров и устройств выбор топиков ограничен.

Подробнее о различиях брокеров и реестров устройств читайте в разделе [Взаимосвязь ресурсов в Yandex IoT Core](../concepts/index.md).

При использовании реестров и устройств, вы можете отправлять сообщения следующих типов:
- Отправлять данные с устройства в реестр, используя топики `$devices/<идентификатор_устройства>/events` или `$registries/<идентификатор_реестра>/events`.
- Отправлять данные с устройства в реестр, используя перманентные топики `$devices/<идентификатор_устройства>/state` или `$registries/<идентификатор_реестра>/state`.
- Отправлять команды из реестра на устройство, используя топики `$devices/<идентификатор_устройства>/commands` или `$registries/<идентификатор_реестра>/commands`.
- Отправлять команды из реестра на устройство, используя перманентные топики `$devices/<идентификатор_устройства>/config` или `$registries/<идентификатор_реестра>/config`.

Для получения сообщения необходимо быть подписанным на отправителя. Как это сделать, читайте в разделе [Подписка на получение сообщений](subscribe.md).

О том, как убедиться, что сообщение было успешно отправлено и доставлено, читайте в разделе [Тестирование доставки сообщения](../tutorials/message-delivery-check.md).

{% note warning %}

Топик реестра и топик устройства не связаны между собой. Если устройство отправляет данные в топик устройства для телеметрических данных, получить их можно только подписавшись на этот топик. Аналогично для топика реестра.

{% endnote %}

## Перед началом работы {#before-you-begin}

Подготовьте ресурсы:
1. (Опционально) [Создайте сертификаты для реестра и устройства](certificates/create-certificates.md).
1. [Создайте реестр](registry/registry-create.md).
1. [Добавьте сертификат реестру](certificates/registry-certificates.md#add-cert).
1. [Создайте устройство](device/device-create.md).
1. [Добавьте сертификат устройству](certificates/device-certificates.md#add-cert).

### Аутентификация {#auth}

Чтобы отправлять сообщения, необходимо пройти [аутентификацию](../concepts/authorization.md). Для этого используйте X.509-сертификат или логин и пароль. В данном разделе приведены примеры для обоих способов аутентификации.

## Отправить сообщение с данными {#pub-events}

{% note info %}

Если в процессе выполнения команды у вас возникла ошибка, добавьте к команде флаг `--debug` и попробуйте еще раз. Данный флаг выводит журнал отладки при выполнении команды, что помогает при диагностике проблемы.

{% endnote %}

### Отправьте данные с устройства в топик устройства {#to-device-topic}

Реестр, подписанный на данный топик, будет знать, какое именно устройство отправило данные, так как в топике присутствует уникальный идентификатор устройства.

{% list tabs group=instructions %}

- CLI {#cli}
    
    Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).
    
    По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.
    
    - Отправьте данные в топик устройства, используя авторизацию по сертификату: 
          
        ```
        yc iot mqtt publish \
          --cert device-cert.pem \
          --key device-key.pem \
          --topic '$devices/<идентификатор_устройства>/events' \
          --message 'Test data' \
          --qos 1
        ```
    - Отправьте данные в перманентный топик устройства, используя авторизацию по сертификату: 
          
        ```
        yc iot mqtt publish \
          --cert device-cert.pem \
          --key device-key.pem \
          --topic '$devices/<идентификатор_устройства>/state' \
          --message 'Test data' \
          --qos 1
        ```
		
        Где:

        - `--cert` и `--key` — параметры для аутентификации с помощью сертификата.
        - `--topic` — топик устройства для отправки данных.
        - `--message` — текст сообщения.
        - `--qos` — [уровень качества обслуживания (QoS)](../concepts/index.md#qos).

	- Отправьте данные в топик устройства, используя авторизацию по логину и паролю: 
    
        ```
        yc iot mqtt publish \
          --username <идентификатор_устройства> \
          --password <пароль_для_устройства> \
          --topic '$devices/<идентификатор_устройства>/events' \
          --message 'Test data' \
          --qos 1
        ```

	- Отправьте данные в перманентный топик устройства, используя авторизацию по логину и паролю: 
    
        ```
        yc iot mqtt publish \
          --username <идентификатор_устройства> \
          --password <пароль_для_устройства> \
          --topic '$devices/<идентификатор_устройства>/state' \
          --message 'Test data' \
          --qos 1
        ```
		
        Где:

        - `--username` и `--password` — параметры для аутентификации с помощью логина и пароля.
        - `--topic` — топик устройства для отправки данных.
        - `--message` — текст сообщения.
        - `--qos` — [уровень качества обслуживания (QoS)](../concepts/index.md#qos).

- API {#api}

  Чтобы отправить данные с устройства в топик устройства, воспользуйтесь методом REST API [publish](../api-ref/DeviceData/publish.md) для ресурса [DeviceData](../api-ref/DeviceData/index.md) или вызовом gRPC API [DeviceDataService/Publish](../api-ref/grpc/DeviceData/publish.md).

{% endlist %}          

### Отправьте данные с устройства в топик реестра {#to-registry-topic}

Реестр, подписанный на данный топик, не будет знать, какое именно устройство отправило данные, так как в топике отсутствует уникальный идентификатор устройства.

{% list tabs group=instructions %}

- CLI {#cli}
    
    - Отправьте данные в топик реестра, используя авторизацию по сертификату: 
        
        ```
        yc iot mqtt publish \
          --cert device-cert.pem \
          --key device-key.pem \
          --topic '$registries/<идентификатор_реестра>/events' \
          --message 'Test data' \
          --qos 1
        ```

	- Отправьте данные в перманентный топик реестра, используя авторизацию по сертификату: 
        
        ```
        yc iot mqtt publish \
          --cert device-cert.pem \
          --key device-key.pem \
          --topic '$registries/<идентификатор_реестра>/state' \
          --message 'Test data' \
          --qos 1
        ```
		
        Где:

        - `--cert` и `--key` — параметры для аутентификации с помощью сертификата.
        - `--topic` — топик реестра для получения данных.
        - `--message` — текст сообщения.
        - `--qos` — [уровень качества обслуживания (QoS)](../concepts/index.md#qos).

	- Отправьте данные в топик реестра, используя авторизацию по логину и паролю:
    
        ```
        yc iot mqtt publish \
          --username <идентификатор_устройства> \
          --password <пароль_для_устройства> \
          --topic '$registries/<идентификатор_реестра>/events' \
          --message 'Test data' \
          --qos 1
        ```

	- Отправьте данные в перманентный топик реестра, используя авторизацию по логину и паролю:
	
        ```
        yc iot mqtt publish \
          --username <идентификатор_устройства> \
          --password <пароль_для_устройства> \
          --topic '$registries/<идентификатор_реестра>/state' \
          --message 'Test data' \
          --qos 1
        ```
		
        Где:

        - `--username` и `--password` — параметры для аутентификации с помощью логина и пароля.
        - `--topic` — топик реестра для получения данных.
        - `--message` — текст сообщения.
        - `--qos` — [уровень качества обслуживания (QoS)](../concepts/index.md#qos).

- API {#api}

  Чтобы отправить данные с устройства в топик реестра, воспользуйтесь методом REST API [publish](../api-ref/DeviceData/publish.md) для ресурса [DeviceData](../api-ref/DeviceData/index.md) или вызовом gRPC API [DeviceDataService/Publish](../api-ref/grpc/DeviceData/publish.md).

{% endlist %}

## Отправить сообщение с командой {#pub-commands}

Реестр может отправить сообщение с командой одному, нескольким или всем устройствам, добавленным в него. Рассмотрим все варианты.

{% note info %}

Если в процессе выполнения команды у вас возникла ошибка, добавьте к команде флаг `--debug` и попробуйте еще раз. Данный флаг выводит журнал отладки при выполнении команды, что помогает при диагностике проблемы.

{% endnote %}

### Отправьте команду одному устройству {#one-device}

{% list tabs group=instructions %}

- CLI {#cli}

    - Отправьте команду, используя авторизацию по сертификату:

        ```
        yc iot mqtt publish \
          --cert registry-cert.pem \
          --key registry-key.pem \
          --topic '$devices/<идентификатор_устройства>/commands' \
          --message 'Test command for first device' \
          --qos 1
        ```
		
    - Отправьте команду, используя перманентный топик и авторизацию по сертификату:

        ```
        yc iot mqtt publish \
          --cert registry-cert.pem \
          --key registry-key.pem \
          --topic '$devices/<идентификатор_устройства>/config' \
          --message 'Test command for first device' \
          --qos 1
        ```
      
        Где:

        - `--cert` и `--key` — параметры для аутентификации с помощью сертификата.
        - `--topic` — топик устройства для получения команд.
        - `--message` — текст сообщения.
        - `--qos` — [уровень качества обслуживания (QoS)](../concepts/index.md#qos).      

	- Отправьте команду, используя авторизацию по логину и паролю: 

        ```
        yc iot mqtt publish \
          --username <идентификатор_реестра> \
          --password <пароль_для_реестра> \
          --topic '$devices/<идентификатор_устройства>/commands' \
          --message 'Test command for first device' \
          --qos 1
        ```                      
	- Отправьте команду, используя перманентный топик и авторизацию по логину и паролю: 

        ```
        yc iot mqtt publish \
          --username <идентификатор_реестра> \
          --password <пароль_для_реестра> \
          --topic '$devices/<идентификатор_устройства>/config' \
          --message 'Test command for first device' \
          --qos 1
        ```                      

        Где:

        - `--username` и `--password` — параметры для аутентификации с помощью логина и пароля.
        - `--topic` — топик устройства для получения команд.
        - `--message` — текст сообщения.
        - `--qos` — [уровень качества обслуживания (QoS)](../concepts/index.md#qos).

- API {#api}

  Чтобы отправить команду одному устройству, воспользуйтесь методом REST API [publish](../api-ref/RegistryData/publish.md) для ресурса [RegistryData](../api-ref/RegistryData/index.md) или вызовом gRPC API [RegistryDataService/Publish](../api-ref/grpc/RegistryData/publish.md).

{% endlist %}

### Отправьте команду всем устройствам, добавленным в реестр {#all-device}
{% list tabs group=instructions %}

- CLI {#cli}
          
    - Отправьте команду всем устройствам, используя авторизацию по сертификату: 
    
        ```
        yc iot mqtt publish \
          --cert registry-cert.pem \
          --key registry-key.pem \
          --topic '$registries/<идентификатор_реестра>/commands' \
          --message 'Test command for all devices' \
          --qos 1
        ```

    - Отправьте команду всем устройствам, используя перманентный топик и авторизацию по сертификату: 
    
        ```
        yc iot mqtt publish \
          --cert registry-cert.pem \
          --key registry-key.pem \
          --topic '$registries/<идентификатор_реестра>/config' \
          --message 'Test command for all devices' \
          --qos 1
        ```
		
        Где:

        - `--cert` и `--key` — параметры для аутентификации с помощью сертификата.
        - `--topic` — топик реестра для отправки команд.
        - `--message` — текст сообщения.
        - `--qos` — [уровень качества обслуживания (QoS)](../concepts/index.md#qos).      

	- Отправьте команду всем устройствам, используя авторизацию по логину и паролю:
    
        ```
        yc iot mqtt publish \
          --username <идентификатор_реестра> \
          --password <пароль_для_реестра> \
          --topic '$registries/<идентификатор_реестра>/commands' \
          --message 'Test command for all devices' \
          --qos 1
        ```

	- Отправьте команду всем устройствам, используя перманентный топик и авторизацию по логину и паролю:
    
        ```
        yc iot mqtt publish \
          --username <идентификатор_реестра> \
          --password <пароль_для_реестра> \
          --topic '$registries/<идентификатор_реестра>/config' \
          --message 'Test command for all devices' \
          --qos 1
        ```
		
        Где:

        - `--username` и `--password` — параметры для аутентификации с помощью логина и пароля.
        - `--topic` — топик реестра для отправки команд.
        - `--message` — текст сообщения.
        - `--qos` — [уровень качества обслуживания (QoS)](../concepts/index.md#qos).

- API {#api}

  Чтобы отправить команду всем устройствам, добавленным в реестр, воспользуйтесь методом REST API [publish](../api-ref/RegistryData/publish.md) для ресурса [RegistryData](../api-ref/RegistryData/index.md) или вызовом gRPC API [RegistryDataService/Publish](../api-ref/grpc/RegistryData/publish.md).

{% endlist %}

## Отправить сообщение в брокере {#broker}

При использовании брокера сообщение можно отправить в произвольный топик, используя для аутентификации логин и пароль или любой сертификат, назначенный брокеру.

{% list tabs group=instructions %}

- CLI {#cli}

    - Отправьте сообщение, используя авторизацию по логину и паролю:

        ```
        yc iot mqtt publish \
          --username <идентификатор_брокера> \
          --password <пароль_для_брокера> \
          --topic /my/custom/topic \
          --message 'Test broker message'
          --qos 1
        ```

        Где:

        - `--username` и `--password` — параметры для аутентификации с помощью логина и пароля.
        - `--topic` — произвольное имя топика, соответствующее спецификации [MQTT](../../glossary/mqtt-server.md) и не начинающееся с символа `$`
        - `--message` — текст сообщения.
        - `--qos` — [уровень качества обслуживания (QoS)](../concepts/index.md#qos).

    - Отправьте сообщение, используя авторизацию по сертификату:

        ```
        yc iot mqtt publish \
          --cert broker-cert.pem \
          --key broker-key.pem \
          --topic /my/custom/topic \
          --message 'Test broker message'
          --qos 1
        ```

        Где:

        - `--cert` и `--key` — параметры для аутентификации с помощью сертификата.
        - `--topic` — произвольное имя топика, соответствующее спецификации MQTT и не начинающееся с символа `$`
        - `--message` — текст сообщения.
        - `--qos` — [уровень качества обслуживания (QoS)](../concepts/index.md#qos).

- API {#api}

  Чтобы отправить сообщение в брокере, воспользуйтесь методом REST API [publish](../broker/api-ref/BrokerData/publish.md) для ресурса [BrokerData](../broker/api-ref/BrokerData/index.md) или вызовом gRPC API [BrokerDataService/Publish](../broker/api-ref/grpc/BrokerData/publish.md).

{% endlist %}