# echolot mqtt (/ko/docs/cli/mqtt)

`echolot mqtt`는 터미널에서 MQTT 브로커와 통신합니다. `subscribe`는 도착하는 메시지를 출력하고 `publish`는 메시지를 보냅니다. 둘 다
기본적으로 MQTT 5.0을 사용하며, 요청하면 3.1.1을 사용합니다. 프로토콜은 TCP(`mqtt://`), TLS(`mqtts://`), WebSocket(`ws://`, `wss://`)을
지원합니다. 앱에서의 같은 기능은 [MQTT 요청](/docs/requests/mqtt)을 참조하십시오.

예제는 Alpenglow 요청 **Warehouse sensors**처럼 Mac의 `localhost`에 있는 브로커를 사용합니다. 데모 API는 MQTT를 실행할 수 없습니다.

## echolot mqtt subscribe [#echolot-mqtt-subscribe]

```sh
echolot mqtt subscribe [<options>] <broker> <filters> ...
```

`<broker>`는 `mqtt://host[:1883]`, `mqtts://host[:8883]`, `ws://host/mqtt`, `wss://host/mqtt`입니다. `<filters>`는 하나 이상의 토픽
필터입니다. `+`는 한 레벨, `#`은 나머지 전부와 일치합니다.

```sh
echolot mqtt subscribe mqtt://localhost 'warehouses/+/temperature' --qos 1
```

```text
warehouses/bern/temperature 4.5
warehouses/zurich/temperature 5.1
```

각 메시지는 표준 출력의 한 줄이며, 토픽, 공백, 페이로드 순서입니다. UTF-8 텍스트가 아닌 페이로드는 Base64로 출력됩니다. `--json`을
쓰면 각 메시지가 `topic`, `payload`(또는 `payload_base64`), `qos`, `retain`이 있는 JSON 줄이 되어 `jq`에 바로 넘길 수 있습니다.

```sh
echolot mqtt subscribe mqtt://localhost 'warehouses/#' --count 10 --json | jq -r .payload
```

구독은 사용자가 중지할 때(<kbd>⌃</kbd><kbd>C</kbd>), 브로커의 연결이 끊어질 때, `--listen` 초가 지났을 때, `--count`개의 메시지가
도착했을 때까지 계속됩니다. 브로커가 거부한 필터는 표준 오류에 표시됩니다.

| 옵션 | 의미 |
| --- | --- |
| `--qos <level>` | `0`(최대 한 번), `1`(최소 한 번), `2`(정확히 한 번). 기본값은 0입니다. |
| `--listen <seconds>` | 수신할 시간(초). `0`이면 중지하거나 브로커의 연결이 끊어질 때까지 수신합니다. 기본값은 0입니다. |
| `--count <n>` | 이 수만큼 메시지를 받으면 멈춥니다. |
| `--json` | 각 메시지를 JSON 줄로 출력합니다. 토픽, 페이로드, qos, retain. 바이너리 페이로드는 Base64입니다. |

## echolot mqtt publish [#echolot-mqtt-publish]

```sh
echolot mqtt publish [<options>] <broker> <topic>
```

`-m`은 페이로드를 지정합니다. 없으면 표준 입력의 각 줄이 메시지가 됩니다.

```sh
echolot mqtt publish mqtt://localhost warehouses/bern/temperature -m '4.5' --qos 1
tail -f readings.log | echolot mqtt publish mqtt://localhost warehouses/bern/log
```

QoS 1이나 2에서는 Echolot이 브로커가 모든 메시지를 확인할 때까지 기다리고, 거부된 메시지가 있으면 알려 줍니다. QoS 0에서는 게시한
메시지 수를 알려 줍니다.

| 옵션 | 의미 |
| --- | --- |
| `-m`, `--message <payload>` | 페이로드. |
| `--qos <level>` | `0`(최대 한 번), `1`(최소 한 번), `2`(정확히 한 번). 기본값은 0입니다. |
| `--retain` | 이후의 구독자를 위해 브로커가 메시지를 보관하도록 요청합니다. |

## 둘 다의 옵션 [#options-of-both]

| 옵션 | 의미 |
| --- | --- |
| `--mqtt-version <version>` | 프로토콜 버전: `5` 또는 `3.1.1`. 기본값은 5입니다. |
| `--client-id <id>` | 클라이언트 ID. 기본값은 `echolot-`와 임의의 접미사입니다. |
| `-u`, `--user <name>` | 사용자 이름. |
| `--password <password>` | 암호. `ECHOLOT_MQTT_PASSWORD` 환경 변수를 쓰는 편이 좋습니다. |
| `--keep-alive <seconds>` | 핑 사이의 간격(초). `0`이면 보내지 않습니다. 기본값은 60입니다. |
| `--timeout <seconds>` | 연결과 브로커의 응답을 기다리는 시간(초). 기본값은 30입니다. |
| `-i`, `--insecure` | 브로커의 TLS 인증서를 검증하지 않습니다. |
| `-v`, `--verbose` | 연결과 브로커의 응답을 표준 오류에 출력합니다. |
| `--proxy <url>` | 이 프록시를 통해 연결합니다: `http://host:port`, `https://…`, `socks5://user:password@host:port`. |
| `--no-proxy` | `HTTP_PROXY` 등을 무시하고 직접 연결합니다. |
| `--cacert <file>` | 이 PEM 파일의 CA 인증서도 신뢰합니다. 반복할 수 있습니다. |
| `--cert <file>` | 이 클라이언트 인증서를 보냅니다. PEM 파일(`--key`와 함께) 또는 `.p12`/`.pfx` 파일. |
| `--key <file>` | 인증서 파일에 개인 키가 없을 때, 클라이언트 인증서의 PEM 개인 키. |
| `--pass <passphrase>` | 키나 PKCS#12 파일의 암호. `ECHOLOT_CERT_PASSPHRASE`를 쓰는 편이 좋습니다. |

여기서 `-i`는 `echolot send`의 “include”가 아니라 `--insecure`를 뜻합니다.

```sh
export ECHOLOT_MQTT_PASSWORD='…'
echolot mqtt publish mqtts://broker.example.com:8883 status/door -m open --retain -u heidi
```

## 종료 코드 [#exit-codes]

| 코드 | 조건 |
| --- | --- |
| `0` | 연결했고 구독하거나 게시했습니다. |
| `1` | `subscribe`: 브로커가 연결이나 모든 구독을 거부했습니다. `publish`: 브로커가 연결이나 QoS 1, 2 메시지를 거부했습니다. |
| `64` | 잘못된 옵션이나 브로커 주소. |
