前一篇文章:micro:bit和電腦的串列通訊程式
電腦執行的Python程式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | import serial import random import paho.mqtt.client as mqtt import time # MQTT 設定 BROKER = "broker.mqttgo.io" PORT = 1883 TOPIC_PUBLISH = "temperature" TOPIC_SUBSCRIBE = "messages" MQTT_CLIENT_ID = "microbit_client" USERNAME = "" # 如果需要帳號,填入使用者名稱 PASSWORD = "" # 如果需要密碼,填入密碼 message = "" def on_connect(client, userdata, flags, rc): print(f"MQTT 連線狀態: {rc}") if rc == 0: print("成功連線到 MQTT Broker") client.subscribe(TOPIC_SUBSCRIBE) else: print("無法連線到 MQTT Broker") def on_message(client, userdata, msg): global message print(f"接收到來自 {msg.topic} 的訊息: {msg.payload.decode('utf-8')}") # 處理收到的訊息 payload = msg.payload.decode('utf-8') if payload in ["heart", "OK", "Error"]: message = payload print(f"處理訂閱訊息: {payload}") else: print("收到未知訊息") def main(): # 配置串列埠參數 global message port = 'COM4' # 替換為您的串列埠名稱 baudrate = 115200 # 串列埠速率 # 初始化 MQTT 客戶端 client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1, MQTT_CLIENT_ID) client.username_pw_set(USERNAME, PASSWORD) client.on_connect = on_connect client.on_message = on_message # 嘗試連線到 MQTT Broker try: client.connect(BROKER, PORT, 60) client.loop_start() # 開啟串列埠 ser = serial.Serial(port, baudrate, timeout=1) print(f"已開啟串列埠: {ser.port}, 波特率: {ser.baudrate}") buffer = "" # 初始化資料緩衝區 while True: # 處理串列埠的輸入 if ser.in_waiting > 0: data = ser.read(ser.in_waiting).decode('latin-1', errors='ignore').strip() buffer += data print(f"目前緩衝區資料: {buffer}") while '|' in buffer: line, buffer = buffer.split('|', 1) # 提取一行資料 line = line.strip() print(f"處理資料: {line}") if line.startswith("T="): try: # 發佈溫度值到 MQTT Broker temperature = int(line.split("=")[1]) print(f"當前溫度: {temperature} 度") client.publish(TOPIC_PUBLISH, temperature) except ValueError: print("無法解析溫度值") # 模擬隨機傳送訊息給 micro:bit #message = random.choice(["heart", "OK", "Error"]) ser.write((message + "\n").encode('utf-8')) print(f"已傳送: {message}") time.sleep(1) except serial.SerialException as e: print(f"串列埠錯誤: {e}") except KeyboardInterrupt: print("程序中止") finally: # 清理資源 if 'ser' in locals() and ser.is_open: ser.close() print("串列埠已關閉") client.loop_stop() client.disconnect() print("已斷開 MQTT 連線") if __name__ == "__main__": main() |
執行結果:
目前緩衝區資料: T=2|
處理資料: T=2
當前溫度: 2 度
已傳送: OK
已傳送: OK
目前緩衝區資料: T=21|
處理資料: T=21
當前溫度: 21 度
已傳送: OK
目前緩衝區資料: T=21
已傳送: OK
目前緩衝區資料: T=21T=21|
處理資料: T=21T=21
無法解析溫度值
已傳送: OK
目前緩衝區資料: T=21|
處理資料: T=21
當前溫度: 21 度
已傳送: OK
連上MQTTGO的執行結果如最上圖
沒有留言:
張貼留言