2016-07-28 3 views
0

MQTT를 사용하여 주제를 등록하고 메세지를 수신합니다. 나는 지금까지 작성된이 코드를 가지고 있으며 잘 작동하지만 모두 MQTT 중개자로부터받는 페이로드를 파싱하는 방법을 결정하는 데 문제가 있습니다. 페이로드에서 보는 숫자 값을 얻으려고했지만이 데이터를 구문 분석하는 올바른 방법을 알 수 없습니다. 어떤 아이디어/제안? 감사!모든 아이디어는 어떻게 파이썬 에서이 페이로드를 구문 분석 할 수 있습니까?

내 코드 :

는 무관 더 많은 코드가있다. 이것은 단지 발췌 일뿐입니다.

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 

내 출력 :???

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}]} 

내가이 ... 문자열에서 숫자 값을 추출 할 수 있도록하려는 DICT JSON '온도'에 대한 (페이로드), ' 빛 ','압력 '등 ... parameters.Any 조언을 크게 주시면 감사하겠습니다. 다음을 시도했지만이 오류가 나타납니다. ... 많이 말하지 않는다

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

파일 "C : \ Python27 \ My_Py_27_Codes \ scratch_py_mqtt.py", 25 행, ON_MESSAGE 보도 = 데이터 [ '압력']

KeyError: 'Pressure' 
에서

분명히 '압력'이이 사전의 핵심이 아닌가?

+0

Press = data [ "fields"] [ 'Pressure'] – Backtrack

+0

'data [ 'fields'] [ 'Pressure']'시도하십시오. – bananafish

+1

필드의 정확한 위치를 지정해야합니다. 귀하의 경우 '압력'은 '필드'안에 있습니다 – Backtrack

답변

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

제출 한 정확한 위치를 알려줘야합니다. 귀하의 경우 pressurefields 사전에 있습니다

+0

예,이 주제에 익숙하지 않았습니다. 일단 내가 '사전'으로 실제로 일하고 있다는 것을 깨달은 것은 쉬운 수정이었습니다. 나는 당신의 코멘트를 읽기 전에 나의 자신의 문제점을 해결했다, 그러나 나는 당신이 정확하다는 것을 볼 수있다. 도움과 관대 한 조언에 감사드립니다. 건배! – LapdanceTransform

0

그래서 몇 시간 동안 내 머리를 긁고 '코드'를 치고 나면 목표를 달성 할 수있었습니다. 나는 그것이 "가장 예쁜"방법인지 아니면 그것을 할 수있는 최선의 방법인지 확실하지 않지만, 여기에 내가 알아 낸 것이있다. 나는 '사전'을 다루고 있었고 적절한 키 이름 '필드를 선택해야했다. '. 그러면 사전의 '필드'부분 안에있는 매개 변수 (온도, 압력, 빛 등 ...)와 관련된 숫자 값을 가져올 수 있습니다.

코드 내 문제를 해결하기 위해 :

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' 

건배 모든 사람을!

+0

'params = my_dict.get ("fields", None)'이 줄 뒤에있는 모든 코드는 params를 dict로 사용하기 때문에 더 나은 기본값은'params = my_dict.get ("fields", {})' . – PaulMcG