python - MQTT/Python订阅多个主题并在Raspberry LCD上写入payload

标签 python mqtt lcd

我是 Python 和 MQTT 的新手。我能够编写一些 Python 工作代码来将连接的传感器数据发布到代理,现在我想订阅多个主题并将所有有效负载写入连接到覆盆子的 LCD 20x4 上。

其实我写了一个Python来订阅一个topic,然后在LCD上写payload;没问题,它正在工作。无法在同一个 Python 中包含其他主题并在 LCD 上写入有效载荷。

您可以在下面找到“仅”一个主题的我的工作 Python 代码。

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# RPi-S-LCD.py
# Created on 8/1/2017
#
# Python program that write payloads on LCD 20x4
#

import time
import sys
import os
import paho.mqtt.client as paho
sys.path.append("/home/pi/Adafruit_Python_CharLCD")
import Adafruit_CharLCD as LCD
import Adafruit_GPIO.MCP230xx as MCP

### Define MCP pins connected to LCD
lcd_rs = 6
lcd_en = 4
lcd_d4 = 3
lcd_d5 = 2
lcd_d6 = 1
lcd_d7 = 0
lcd_backlight = None

### Define LCD type
lcd_columns = 20
lcd_rows = 4

### Initialize MCP23017 for LCD
gpiomcp = MCP.MCP23017(0x20, busnum=1)

### Initialize LCD panel parameters
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight, gpio=gpiomcp)
lcd.show_cursor(False)
lcd.blink(False)
lcd.clear()

### Read data from MQTT broker
def on_subscribe(client, userdata, mid, granted_qos):
    print("Subscribed to the broker "+str(mid)+" "+str(granted_qos))


### Print topic data to LCD
def on_message1(client, userdata, msg):
    lcd.set_cursor(0,0)
    lcd.message(msg.payload)

client = paho.Client()
client.on_subscribe = on_subscribe
client.on_message = on_message1
client.connect("10.0.2.10", 1883, 30)
client.subscribe("iDomus/Time",2)

client.loop_forever()

最佳答案

阅读更多关于 MQTT 的文档我找到了这个函数

"message_callback_add"

现在 python 程序运行良好。这就是我的想法。 现在我订阅了所有主题,但我选择了我想要处理的特定主题,有效负载被分开以便在 LCD 上轻松可视化。 对不起我的 python 代码..我不是程序员,但下面它对我来说工作正常。希望它能帮助其他人解决我同样的问题。

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# RPi-S-LCD.py
# Created on 21/1/2017
#
# Python program that use LCD 20x4 to display topics info
#

import time
import sys
import os
import paho.mqtt.client as paho
sys.path.append("/home/pi/Adafruit_Python_CharLCD")
import Adafruit_CharLCD as LCD
import Adafruit_GPIO.MCP230xx as MCP

### Define MCP pins connected to LCD
lcd_rs = 6
lcd_en = 4
lcd_d4 = 3
lcd_d5 = 2
lcd_d6 = 1
lcd_d7 = 0
lcd_backlight = None

### Define LCD type
lcd_columns = 20
lcd_rows = 4

### Initialize MCP23017 for LCD
gpiomcp = MCP.MCP23017(0x20, busnum=1)

### Initialize LCD panel parameters
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight, gpio=gpiomcp)
lcd.show_cursor(False)
lcd.blink(False)
lcd.clear()

### DATE
def on_message_date(mosq, obj, msg):
    lcd.set_cursor(0,0)
    lcd.message(str(msg.payload))

### TIME
def on_message_time(mosq, obj, msg):
    lcd.set_cursor(0,2)
    lcd.message(str(msg.payload))

### RELAY
def on_message_relay(mosq, obj, msg):
    if (str(msg.payload)[3]) == '0':
        lcd.set_cursor(7,2)
        lcd.message("RL1= 0 RL2= 0")
    elif (str(msg.payload)[3]) == '1':
        lcd.set_cursor(7,2)
        lcd.message("RL1= 1 RL2= 0")
    elif (str(msg.payload)[3]) == '2':
        lcd.set_cursor(7,2)
        lcd.message("RL1= 0 RL2= 1")
    elif (str(msg.payload)[3]) == '3':
        lcd.set_cursor(7,2)
        lcd.message("RL1= 1 RL2= 1")
    else:
        lcd.set_cursor(7,2)
        lcd.message("RELAYs ERROR!")

### PUBLIC IP
def on_message_pubip(mosq, obj, msg):
    lcd.set_cursor(0,1)
    lcd.message("                    ")
    lcd.set_cursor(0,1)
    lcd.message("IP = "+str(msg.payload)[0:14])

### TEMPERATURE
def on_message_temp(mosq, obj, msg):
    lcd.set_cursor(0,3)
    lcd.message(str(msg.payload)[0:4]+chr(223)+"C")

### HUMIDITY
def on_message_humi(mosq, obj, msg):
    lcd.set_cursor(7,3)
    lcd.message(str(msg.payload)[0:4]+chr(37))

### PRESSURE
def on_message_pres(mosq, obj, msg):
    lcd.set_cursor(13,3)
    lcd.message(str(msg.payload)+"hPa")

### topic message
def on_message(mosq, obj, msg):
    print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))

mqttc = paho.Client()

#Add message callbacks that will only trigger on a specific   subscription    match
mqttc.message_callback_add('iDomus/Time', on_message_time)
mqttc.message_callback_add('iDomus/Date', on_message_date)
mqttc.message_callback_add('iDomus/PubIPRead', on_message_pubip)
mqttc.message_callback_add('iDomus/RPiS/Sens1/Temp', on_message_temp)
mqttc.message_callback_add('iDomus/RPiS/Sens1/Humi', on_message_humi)
mqttc.message_callback_add('iDomus/RPiN/Sens2/Pres', on_message_pres)
mqttc.message_callback_add('iDomus/RPiS/Rel1/Read', on_message_relay)
mqttc.on_message = on_message
mqttc.connect("10.0.2.10", 1883, 30)
mqttc.subscribe("iDomus/#")

mqttc.loop_forever()

关于python - MQTT/Python订阅多个主题并在Raspberry LCD上写入payload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41624697/

相关文章:

python - 在 Ruby 中逐步将数组拆分为子数组

python - 我用的是哪个 python ?

python - Opencv和python获取正确的文档构建并绘制图像

java - 如何修复 HiveMQ 中未解析的 DaggerSingletonComponent(MQTT 协议(protocol))

mqtt - 检测 MQTT 中重复的客户端 ID?

Python Paho MQTT : Unable to publish immediately in a function

c - STM32F4 HAL I2C只发送地址

wpf - 如何获得(lcd)显示器对角线的实际尺寸,即如果是 17 英寸或 19 英寸或其他?

embedded - 开发 LCD 显示模拟器的技巧

Python find number 步骤将值分配给列表中的元素