mqtt --- Simple MQTT client

โมดูล mqtt มีการใช้งาน MQTT v3.1.1 client ขั้นต่ำที่เหมาะสำหรับใช้บนอุปกรณ์ที่มีหน่วยความจำจำกัด รองรับการเชื่อมต่อกับ broker (พร้อม TLS เสริม), การ publish ข้อความ, การ subscribe หัวข้อ, การกำหนดค่า last-will และ keep-alive ping

ตัวอย่าง:

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

เกิดขึ้นเมื่อ broker ปฏิเสธคำขอ CONNECT หรือเมื่อคำขอ SUBSCRIBE ถูกปฏิเสธ อาร์กิวเมนต์เดียวคือรหัสส่งคืนตัวเลขที่ broker ส่งมา

คลาส

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

อาร์กิวเมนต์:

  • client_id -- ตัวระบุ client ที่ไม่ซ้ำกันส่งไปยัง broker

  • server -- ชื่อโฮสต์หรือที่อยู่ IP ของ broker (แก้ไขด้วย socket.getaddrinfo())

  • port -- TCP port ของ broker (โดยทั่วไป 1883 แบบธรรมดาหรือ 8883 สำหรับ TLS)

  • ssl_params -- ถ้าไม่ใช่ None ซ็อกเก็ตจะถูกห่อด้วย ssl.wrap_socket() และ ssl_params จะถูกส่งต่อเป็น keyword arguments ส่ง {} เพื่อเปิดใช้ TLS ด้วยค่าเริ่มต้น

  • user -- ชื่อผู้ใช้เสริมสำหรับการรับรองตัวตน broker ถ้าระบุ ต้องระบุ password ด้วย

  • password -- รหัสผ่านเสริมที่ใช้ร่วมกับ user

  • keepalive -- ช่วง keep-alive เป็นวินาที (0 ปิดใช้งาน) ต้องน้อยกว่า 65536

  • callback -- callable ที่เรียกเป็น callback(topic, msg) สำหรับแต่ละ PUBLISH ที่ส่งจาก broker อาจตั้งค่าภายหลังด้วย set_callback()

เมธอด

set_callback(f: callable) None

ตั้งค่าคอลแบ็กที่เรียกโดย wait_msg() และ check_msg() เมื่อได้รับข้อความ PUBLISH คอลแบ็กจะถูกเรียกเป็น f(topic, msg) โดยทั้งสองอาร์กิวเมนต์เป็น bytes

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

กำหนดค่า MQTT Last Will and Testament broker จะ publish msg บน topic ถ้า client ตัดการเชื่อมต่อโดยไม่ถูกต้อง ต้องเรียกก่อน connect()

อาร์กิวเมนต์:

  • topic -- หัวข้อ last-will (ต้องไม่ว่าง)

  • msg -- payload ของ last-will

  • retain -- ถ้าเป็น True broker จะเก็บข้อความ will เป็น retained message

  • qos -- ระดับ QoS ของ last-will ต้องเป็น 0, 1 หรือ 2

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

เปิดการเชื่อมต่อ TCP (และ TLS เสริม) ไปยัง broker และส่ง CONNECT packet

อาร์กิวเมนต์:

  • clean_session -- ถ้าเป็น True จะขอ clean session; มิฉะนั้น broker จะกลับมาใช้ session state ก่อนหน้า

  • timeout -- socket timeout เป็นวินาทีที่ใช้กับ socket พื้นฐาน

คืนค่า flag session present ของ broker (0 หรือ 1) เกิด MQTTException ถ้า broker คืนรหัส CONNACK ที่ไม่ใช่ศูนย์

disconnect() None

ส่ง DISCONNECT packet และปิด socket พื้นฐาน

ping() None

ส่ง PINGREQ packet ไปยัง broker ควรเรียกเป็นระยะถ้า keepalive ไม่ใช่ศูนย์เพื่อไม่ให้ broker ตัดการเชื่อมต่อ

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

Publish msg ไปยัง topic

อาร์กิวเมนต์:

  • topic -- ชื่อหัวข้อที่จะ publish ไปยัง

  • msg -- ไบต์ payload

  • retain -- ถ้าเป็น True จะสั่งให้ broker เก็บข้อความสำหรับผู้ subscribe ใหม่

  • qos -- ระดับ quality-of-service 0 (fire and forget) และ 1 (acknowledged) รองรับ 2 ไม่ได้ใช้งานและจะเกิด AssertionError

สำหรับ qos 1 การเรียกจะบล็อกจนกว่าจะได้รับ PUBACK ที่ตรงกัน ขนาด packet รวมต้องน้อยกว่า 2097152 ไบต์

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

Subscribe topic ที่ระดับ qos ที่กำหนด ต้องลงทะเบียนคอลแบ็กผ่าน set_callback() หรือระบุใน constructor ก่อน มิฉะนั้นจะเกิด AssertionError

บล็อกจนกว่าจะได้รับ SUBACK ที่ตรงกัน เกิด MQTTException ถ้า broker ปฏิเสธการ subscription (รหัสส่งคืน 0x80)

wait_msg() int | None

บล็อกรอ MQTT packet ขาเข้าเดียวและประมวลผล PUBLISH packet จะถูกส่งไปยังคอลแบ็กที่ลงทะเบียน PINGRESP packet จะถูกใช้โดยไม่มีการแจ้งเตือน สำหรับ control packet อื่น ๆ จะคืนไบต์แรก raw คืน None ถ้าไม่มีข้อมูลหรือถ้า PINGRESP ถูกประมวลผล

check_msg() int | None

ตัวแปรแบบไม่บล็อกของ wait_msg() ตรวจสอบ socket ไม่เกิน ~50 ms โดยใช้ select.select(); ถ้ามีข้อมูลรอการประมวลผลจะดำเนินการเหมือนกับ wait_msg() มิฉะนั้นคืน None