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