2017-02-22 16 views
1

Я отправляю эту температуру и влажность, используя UDP-пакеты по сети, но. Поскольку UDP принимает только один аргумент, я поместил их в объект JSON, а затем строку. Когда я получаю пакет я не могу показаться, чтобы получить из значения я хочу от принятого пакетаPython: Как получить объект JSON из полученного пакета UDP

#!/usr/bin/python 
import sys 
import time 
import socket 
import Adafruit_DHT 
import json 

UDP_IP = "192.168.42.18" 
PORT = 5001 

my_ip = socket.gethostbyname(socket.getfqdn()) 

print "server has started", 


while True: 
    humidity, temperature = Adafruit_DHT.read_retry(11, 4)#initialising DHT11 temp sensor 

    print 'Temp: {0:0.1f} C Humidity: {1:0.1f} %'.format(temperature, humidity) 
    print time.asctime()#printing to the terminal values 

    json_string = {} 
    json_string ['details'] = {'ip': my_ip, 'temp':temperature, 'humidity':humidity} 

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)#initalising socket and UDP connection 
    Message = str(json_string) 
    print 'Message sent:= ', Message 

    sock.sendto(Message,(UDP_IP, PORT)) 
    print "SENT to:-", UDP_IP, PORT, "From", my_ip 

    time.sleep(3)#delay 

получения кода

import socket 
import time 
import json 

port = 5001 

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 

sock.bind(("", port)) 

print "server started" 

while True: 
    recieved = sock.recvfrom(1024) 
    print type(recieved) 
    print recieved[0] 
    print time.asctime()#bytes object 


    json_obj = json.dumps(recieved) 

    print type(json_obj) 

    print json_obj ['details']['temp'] 

#json_converted = json.loads(json_obj) 
#print type(json_converted) 

#json_string = map(str,(json_converted)) 

    print "converted Json:- " 
#print json_string['details']['temp'] 
    print "Temperature in Celsuius" 

Я постоянно получаю ошибки неправильного формата. Каков правильный метод.

server started 
<type 'tuple'> 
{'details': {'ip': '127.0.1.1', 'temp': 20.0, 'humidity': 49.0}} 
Wed Feb 22 16:27:06 2017 
<type 'str'> 
Traceback (most recent call last): 
File "/Users/Faiz/Desktop/Rpi_Sensors_UDP/sensor_listenerUDP.py", line 24, in  <module> 
print json_obj ['details']['temp'] 
TypeError: string indices must be integers, not str 

Process finished with exit code 1 

ответ

0

использование json.loads в

json_obj = json.loads(recieved[0]) 

вместо

json_obj = json.dumps(recieved) 

json.loads преобразует вашу полученную строку в Словаре, а затем вы можете получить ваши данные

как это

import socket 
import time 
import json 

port = 5001 

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 

sock.bind(("", port)) 

print "server started" 

while True: 
    recieved = sock.recvfrom(1024) 
    print type(recieved) 
    print recieved[0] 
    print time.asctime()#bytes object 


    json_obj = json.loads(recieved[0]) 

    print type(json_obj) 

    print json_obj.get('details').get('temp') 

#json_converted = json.loads(json_obj) 
#print type(json_converted) 

#json_string = map(str,(json_converted)) 

    print "converted Json:- " 
#print json_string['details']['temp'] 
    print "Temperature in Celsuius" 
+0

ValueError: Ожидать имя свойства: строка 1 колонка 2 (обугленного 1) - ошибка, которую я получил. Он говорит, что находится в строке 19 –

0

как ниже в json.loads использования Recieve (получил [0]) вместо а также создать строку из JSON с помощью json.dump

#!/usr/bin/python 
import sys 
import time 
import socket 
import Adafruit_DHT 
import json 

UDP_IP = "192.168.43.113" 
PORT = 5001 

my_ip = socket.gethostbyname(socket.getfqdn()) 

print "server has started", 

while True: 
    humidity, temperature = Adafruit_DHT.read_retry(11, 4)#initialising DHT11 temp sensor 

    print 'Temp: {0:0.1f} C Humidity: {1:0.1f} %'.format(temperature, humidity) 
    print time.asctime()#printing to the terminal values 


    json_string = json.dumps({"ip": my_ip, "temp": temperature, "humidity": humidity}) 
    #here put the created JSON into a string using json.dumps also checked the JSON string for validity using jsonlint. 


    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)#initalising socket and UDP connection 

    Message = json_string 
    print 'Message sent:= ', Message 

    sock.sendto(Message,(UDP_IP, PORT)) 
    print "SENT to:-", UDP_IP, PORT, "From", my_ip 

    time.sleep(3)#delay 5 mins 
Смежные вопросы