2016-07-28 32 views
0

Ich verwende MQTT, um ein Thema zu abonnieren und Nachrichten zu empfangen. Ich habe diesen Code so weit geschrieben und es funktioniert gut Abonnieren und alle, aber ich habe Probleme mit der Bestimmung einer Möglichkeit, durch die Nutzlast, die ich von der MQTT-Broker erhalten Parsen. Ich habe versucht, die numerischen Werte zu erhalten, die ich in der Nutzlast sehe, aber ich kann den richtigen Ansatz nicht finden, um diese Daten zu analysieren. Irgendwelche Ideen/Vorschläge? Vielen Dank!Irgendwelche Ideen, wie man diese Nutzlast in Python analysieren kann?

Mein Code:

gibt es mehr Code, irrelevant ist. Dies ist nur ein Ausschnitt.

import paho.mqtt.client as mqtt 
import json 

#Call back functions 

# gives connection message 
def on_connect(client,userdata,rc): 
print("Connected with result code:"+str(rc)) 
# subscribe for all devices of user 
client.subscribe('+/devices/+/up') 

def on_connect(client,userdata,rc): 
print("Connected with result code:"+str(rc)) 
# subscribe for all devices of user 
client.subscribe('+/devices/+/up') 

def on_message(client,userdata,msg): 
print"Topic",msg.topic + "\nMessage:" + str(msg.payload) 

node_data = str(msg.payload) 
print '\r\n test' 
print node_data 

j = json.loads(node_data) 
print "\r\n after loads: " 
print j 

Meine Ausgänge:?

Message:{"payload":"Dgv+CggGBCYFAPMLAgc=","fields":{"Light":58.32,"Pressure":98569.5,"Temp":32.4375,"X_accel":0.6875,"Y_accel":-0.125,"Z_accel":0.625},"port":1,"counter":8,"dev_eui":"000000007D9050C1","metadata":[{"frequency":904.3,"datarate":"SF7BW125","codingrate":"4/5","gateway_timestamp":2090979635,"gateway_time":"2016-07-28T02:26:15.386371Z","channel":2,"server_time":"2016-07-28T02:06:13.075194806Z","rssi":-13,"lsnr":9.5,"rfchain":0,"crc":1,"modulation":"LORA","gateway_eui":"0080000000009BE6","altitude":911,"longitude":-93.19677,"latitude":45.10303}]} 


test 
{"payload":"Dgv+CggGBCYFAPMLAgc=","fields":{"Light":58.32,"Pressure":98569.5,"Temp":32.4375,"X_accel":0.6875,"Y_accel":-0.125,"Z_accel":0.625},"port":1,"counter":8,"dev_eui":"000000007D9050C1","metadata":[{"frequency":904.3,"datarate":"SF7BW125","codingrate":"4/5","gateway_timestamp":2090979635,"gateway_time":"2016-07-28T02:26:15.386371Z","channel":2,"server_time":"2016-07-28T02:06:13.075194806Z","rssi":-13,"lsnr":9.5,"rfchain":0,"crc":1,"modulation":"LORA","gateway_eui":"0080000000009BE6","altitude":911,"longitude":-93.19677,"latitude":45.10303}]} 


after loads: 
{u'fields': {u'Y_accel': -0.125, u'Temp': 32.4375, u'X_accel': 0.6875, u'Light': 58.32, u'Pressure': 98569.5, u'Z_accel': 0.625}, u'counter': 8, u'port': 1, u'dev_eui': u'000000007D9050C1', u'payload': u'Dgv+CggGBCYFAPMLAgc=', u'metadata': [{u'gateway_time': u'2016-07-28T02:26:15.386371Z', u'server_time': u'2016-07-28T02:06:13.075194806Z', u'datarate': u'SF7BW125', u'gateway_eui': u'0080000000009BE6', u'modulation': u'LORA', u'gateway_timestamp': 2090979635, u'longitude': -93.19677, u'crc': 1, u'frequency': 904.3, u'rfchain': 0, u'codingrate': u'4/5', u'lsnr': 9.5, u'latitude': 45.10303, u'rssi': -13, u'altitude': 911, u'channel': 2}]} 

Ich möchte die numerischen Werte aus dieser ... Zeichenfolge extrahieren können Dict Json (Nutzlast) für die 'Temp', " Light ',' Pressure 'usw. Parameter. Jeder Rat wird sehr geschätzt. Ich habe Folgendes versucht, aber ich erhalte diesen Fehler. Hat mir nicht viel ...

data = json.loads(node_data) 
Press = data['Pressure'] 
print Press 

Datei "C: \ Python27 \ My_Py_27_Codes \ scratch_py_mqtt.py", Zeile 25, in ON_MESSAGE Press = data [ 'Druck']

KeyError: 'Pressure' 

Anscheinend ist "Druck" kein Schlüssel in diesem Wörterbuch?

+0

Drücken Sie = Daten ["Felder"] ['Druck'] – Backtrack

+0

versuchen Sie 'Daten ['Felder'] ['Druck']'. – bananafish

+1

müssen Sie die genaue Position des Feldes angeben. In Ihrem Fall "Druck" ist innerhalb "Felder" – Backtrack

Antwort

1
node_data = {"payload":"dsgsg","fields":{"pressure":34,"temp":35}} 
data = json.loads(node_data) 
Press = data['fields']['Pressure'] 
print Press 

müssen Sie die genaue Position des Feldes angeben. In Ihrem Fall pressure ist innerhalb der fields Wörterbuch

+0

Ja, ich war mit diesem Thema nicht vertraut, denke ich. Es war eine einfache Lösung, als ich merkte, dass ich tatsächlich mit einem 'Wörterbuch' arbeitete. Ich habe mein eigenes Problem gelöst, bevor ich Ihren Kommentar gelesen habe, aber ich kann sehen, dass Sie Recht haben. Danke für Ihre Hilfe und großzügige Beratung. Prost! – LapdanceTransform

0

So nach ein paar Stunden kratzte sich den Kopf und 'Code-in' entfernt, gelang es mir, mein Ziel zu erreichen. Ich bin mir nicht sicher, ob es der "schönste" Weg ist oder ob es sogar der beste Weg ist, aber hier ist, was ich herausgefunden habe: Ich hatte es mit einem "Wörterbuch" zu tun und musste die passenden Schlüssel-Namen-Felder auswählen ". Dies würde mir dann ermöglichen, die numerischen Werte zu bekommen, die mit den Parametern (Temp, Pressure, Light, etc ...) verbunden sind, die sich innerhalb des "fields" -Abschnitts des Dictionary befinden.

-Code mein Problem zu lösen:

def on_message(client,userdata,msg): 
print"Topic",msg.topic + "\n\nMessage:" + str(msg.payload) 

node_data = str(msg.payload) 

print ' \n Sensor Values \r' 

my_dict = json.loads(node_data) 
params = my_dict.get("fields",None) 

light = params.get('Light') 
pressure = params.get('Pressure') 
temp = params.get('Temp') 
x = params.get('X_accel') 
y = params.get('Y_accel') 
z = params.get('Z_accel') 

print '' 
print 'Light:' + str(light) 
print 'Pressure:' + str(pressure) 
print 'Temperature:' + str(temp) 
print 'X-accel:' + str(x) 
print 'Y-accel:' + str(y) 
print 'Z-accel:' + str(z) 
print '\n\n' 

Prost jeder!

+0

Da der gesamte Code nach dieser Zeile 'params = my_dict.get (" fields ", None)' mit params als dict arbeitet, wäre ein besserer Standardwert "params = my_dict.get (" fields ", {})' . – PaulMcG