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ปิดใช้งาน) ต้องน้อยกว่า65536callback -- 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 -- ถ้าเป็น
Truebroker จะเก็บข้อความ will เป็น retained messageqos -- ระดับ 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 ที่ไม่ใช่ศูนย์
- 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