mqtt — 간단한 MQTT 클라이언트

mqtt 모듈은 메모리가 제한된 장치에서 사용하기 적합한 최소한의 MQTT v3.1.1 클라이언트 구현을 제공합니다. 브로커 연결(선택적 TLS 포함), 메시지 발행, 토픽 구독, last-will 구성 및 keep-alive 핑을 지원합니다.

예시:

from mqtt import MQTTClient

def callback(topic, msg):
    print(topic, msg)

client = MQTTClient("openmv", "broker.example.com", 1883)
client.set_callback(callback)
client.connect()
client.subscribe(b"openmv/in")
client.publish(b"openmv/out", b"hello")
while True:
    client.check_msg()

예외

exception mqtt.MQTTException

브로커가 CONNECT 요청을 거부하거나 SUBSCRIBE 요청이 거절될 때 발생합니다. 단일 인수는 브로커가 제공한 숫자 반환 코드입니다.

클래스

class mqtt.MQTTClient(client_id: bytes | str, server: str, port: int, ssl_params: dict | None = None, user: bytes | str | None = None, password: bytes | str | None = None, keepalive: int = 0, callback: callable | None = None)

MQTT 클라이언트를 생성합니다.

인수:

  • client_id – 브로커로 전송되는 고유 클라이언트 식별자입니다.

  • server – 브로커 호스트명 또는 IP 주소입니다(socket.getaddrinfo()로 확인됨).

  • port – 브로커 TCP 포트입니다(일반적으로 일반 연결은 1883, TLS는 8883).

  • ssl_paramsNone이 아닌 경우, 소켓이 ssl.wrap_socket()으로 래핑되고 ssl_params가 키워드 인수로 전달됩니다. 기본값으로 TLS를 활성화하려면 {}를 전달하십시오.

  • user – 브로커 인증을 위한 선택적 사용자명입니다. 지정하는 경우 password도 함께 제공해야 합니다.

  • passworduser와 함께 사용되는 선택적 비밀번호입니다.

  • keepalive – keep-alive 간격(초 단위, 0은 비활성화). 65536보다 작아야 합니다.

  • callback – 브로커에서 전달되는 각 PUBLISH에 대해 callback(topic, msg)로 호출되는 콜러블입니다. 나중에 set_callback()으로 설정할 수도 있습니다.

메서드

set_callback(f: callable) None

PUBLISH 메시지가 수신될 때 wait_msg()check_msg()가 호출하는 콜백을 설정합니다. 콜백은 두 인수 모두 bytes로 하여 f(topic, msg)로 호출됩니다.

set_last_will(topic: bytes | str, msg: bytes | str, retain: bool = False, qos: int = 0) None

MQTT Last Will and Testament를 구성합니다. 클라이언트가 비정상적으로 연결을 끊으면 브로커가 topicmsg를 발행합니다. connect() 전에 호출해야 합니다.

인수:

  • topic – last-will 토픽입니다(비어 있지 않아야 함).

  • msg – last-will 페이로드입니다.

  • retainTrue이면 브로커가 will 메시지를 보존된(retained) 메시지로 저장합니다.

  • qos – last-will QoS 레벨입니다. 0, 1 또는 2여야 합니다.

connect(clean_session: bool = True, timeout: float = 5.0) int

브로커에 대한 TCP(및 선택적으로 TLS) 연결을 열고 CONNECT 패킷을 전송합니다.

인수:

  • clean_sessionTrue이면 클린 세션을 요청하고, 그렇지 않으면 브로커가 이전 세션 상태를 재개합니다.

  • timeout – 기반 소켓에 적용되는 소켓 타임아웃(초 단위)입니다.

브로커의 session present 플래그(0 또는 1)를 반환합니다. 브로커가 0이 아닌 CONNACK 반환 코드를 반환하면 MQTTException을 발생시킵니다.

disconnect() None

DISCONNECT 패킷을 전송하고 기반 소켓을 닫습니다.

ping() None

브로커에 PINGREQ 패킷을 전송합니다. keepalive가 0이 아닌 경우 브로커가 연결을 끊지 않도록 주기적으로 호출해야 합니다.

publish(topic: bytes | str, msg: bytes | str, retain: bool = False, qos: int = 0) None

msgtopic에 발행합니다.

인수:

  • topic – 발행할 토픽 이름입니다.

  • msg – 페이로드 바이트입니다.

  • retainTrue이면 브로커가 새 구독자를 위해 메시지를 보존하도록 지시합니다.

  • qos – quality-of-service 레벨입니다. 0(전송 후 확인 안 함)과 1(확인됨)이 지원됩니다. 2는 구현되지 않았으며 AssertionError를 발생시킵니다.

qos 1의 경우, 일치하는 PUBACK이 수신될 때까지 호출이 블록됩니다. 전체 패킷 크기는 2097152 바이트보다 작아야 합니다.

subscribe(topic: bytes | str, qos: int = 0) None

주어진 qos 레벨로 topic을 구독합니다. set_callback()을 통해 또는 생성자에 콜백이 등록되어 있어야 하며, 그렇지 않으면 AssertionError가 발생합니다.

일치하는 SUBACK이 수신될 때까지 블록됩니다. 브로커가 구독을 거부하면(반환 코드 0x80) MQTTException을 발생시킵니다.

wait_msg() int | None

단일 수신 MQTT 패킷을 기다리며 블록하고 이를 처리합니다. PUBLISH 패킷은 등록된 콜백으로 전달됩니다. PINGRESP 패킷은 조용히 소비됩니다. 다른 제어 패킷의 경우 원시 첫 바이트가 반환됩니다. 사용 가능한 데이터가 없거나 PINGRESP가 처리된 경우 None을 반환합니다.

check_msg() int | None

wait_msg()의 논블로킹 변형입니다. select.select()를 사용하여 최대 ~50 ms 동안 소켓을 폴링합니다. 데이터가 대기 중이면 wait_msg()와 동일한 처리를 수행하고, 그렇지 않으면 None을 반환합니다.