2017-01-12 2 views
1

저는 Python과 MQTT에서 새롭습니다. 브로커에 연결된 센서 데이터를 게시하기 위해 파이썬 작업 코드를 작성할 수 있었지만 지금은 하나 이상의 주제를 구독하고 모든 페이로드를 라즈베리에 연결된 LCD 20x4에 쓰고 싶습니다.MQTT/Python 라즈베리 LCD에 여러 주제를 등록하고 페이로드를 작성하십시오.

사실 저는 한 주제를 구독하고 LCD에 페이로드를 작성하는 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() 
+0

이 언어/기술에 익숙하지 않지만 독자가 코드에 새로운 기능을 추가하도록 요청하는 것처럼 들립니다 (여러 항목 지원). 그렇다면 너무 광범위 할 수 있습니다. 당신의 목표를 달성하기 위해 어떤 전략이 필요합니까? 너 뭐하니? – halfer

+0

필요한 다른 주제에'client.subscribe ("...", 2)'줄을 추가하기 만하면됩니다. 그러면 메세지는 같은'on_message1' 함수에 의해 처리 될 것입니다. – hardillb

+0

나는 내 포스트에서 파이썬과 mqtt의 뉴비라고 말했다. 페이로드가 어떻게 인터넷을 통해 전송되는지 이해하기 위해 mqtt.fx를 사용하기 시작했습니다. 어쨌든 나의 가난한 파이썬 지식은 나를 위해 도움이되지 않을 것이다. 나는 좋은 파이썬 책을 읽을 시간이있다. – Marco

답변

0

파호 파이썬 mqtt 라이브러리를 사용하여 여러 주제를 구독 할 수 있습니다. 나는 주제 목록을 만들고 그것을 "subscribe.simple"에 전달했다. 아래 샘플 프로그램을 사용하여 "topic1"및 "topic2"를 구독 할 수 있습니다.

topic = ["topic1", "topic2"] 
hostname_1 = "<mqtt broker host name>" 
port_1 = <mqtt broker connection port> 
username_1 = "broker username" 
password_1 = "broker password" 
message = subscribe.simple(topic, hostname=hostname_1, port=port_1, keepalive=60, will=None, auth={'username':username_1,'password':password_1}) 
print meaasge.payload 
+0

아니요 - 파호에게 주제 목록을 제공하려는 경우 각 주제는 (주제, 질문) 튜플이어야합니다 (예 : 주제 = [('주제 1', 0), ('주제 2', 0)] –

1

는 MQTT에 대한 자세한 문서를 읽고 난

"message_callback_add"지금은 파이썬 프로그램이 잘 작동 기능을 발견했다. 이것이 내가 염두에 두었던 것입니다. 이제 모든 주제를 구독하지만 어떤 특정 주제를 선택하고 페이로드가 분리되어 LCD에서 쉽게 시각화 할 수 있습니다. 죄송합니다. 파이썬 코드입니다. 저는 프로그래머가 아니지만 다음과 같이 잘 작동합니다. 내 같은 문제를 가진 다른 사람들을 도울 수 있기를 바랍니다.

#!/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() 
관련 문제