Как обрабатывать декодирование unix.timestamp в цикле mqtt.client для продолжения сообщений - PullRequest
0 голосов
/ 08 июля 2019

Я подключаюсь к брокеру mqtt в своем коде Python, который отправляет мне объекты json с

{значение: 7504, отметка времени: 1562595566}

Я хочу декодировать отметку времени изатем отправьте значение через http post или другой клиент mqtt на другой сервер.Так что это в основном потоковая пересылка.

Поэтому, прежде чем начать отправлять его на сервер, я просто хотел сначала распечатать декодированное значение.Это должно быть возможно, поскольку я получаю сообщения только каждые 10 с.Однако, как только я добавлю декодирование (print (datetime.fromtimestamp (unix_time_from_json_object))), я больше не смогу печатать полезные данные.Никаких исключений не называется.Поэтому я поместил декодирование в функцию и подумал, что многопоточность здесь может помочь.Но это тоже не работает.У меня заканчиваются идеи.

# -*- coding: utf-8 -*-
# Author: 
# Company: 
#
# Program: 
#
#
# ----------------------------------------------------------------------------------------------------------------------
# Module
import paho.mqtt.client as mqtt
import json
from threading import Thread
from datetime import datetime
from threading import Thread


# ----------------------------------------------------------------------------------------------------------------------
# Variablen
mqtt_broker = "broker_address"
client_id = "some_client_id"
client_user_id = "client_user_id"
client_pw = "some_password"
server = "http://{ip_adress}/"
topic = "topic/1/topic/#"

# ----------------------------------------------------------------------------------------------------------------------
# Functions

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))

    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
    # Manual subscription to the topics of the charging stations on the sensor things server
    #for x in range(54, 758):
    #    client.subscribe("v1.0/Datastreams(" + str(x) + ")/Observations")
    client.subscribe(topic)


def time_decode(unix_time):
    utc = datetime.fromtimestamp(unix_time)
    return utc


# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    # print(msg.topic +" "+str(msg.payload))
    payload = json.loads(msg.payload)
    utc = payload['timestamp']
    print(time_decode(utc))
    print(payload)
    #threading.Thread(target=time_decode, args=(utc)).start()
    #t = Thread(target=time_decode, args=(payload['timestamp'])
    #t.start()

    #print(datetime.utcfromtimestamp(payload['timestamp']).strftime('%Y-%m-%d %H:%M:%S'))



# ----------------------------------------------------------------------------------------------------------------------
# Main program

client = mqtt.Client()
client.username_pw_set(client_user_id, client_pw)
client.on_connect = on_connect
client.on_message = on_message

# client.connect("ip_adress", 1883, 60)
client.connect(mqtt_broker, 1883, 60)
client.loop_forever()
#thread2 = Thread(target=client.loop_forever)


#thread2.start()

Итак, в первую очередь мне хотелось бы печатать декодированное время каждый раз, когда я получаю сообщение.Во-вторых, я хочу создать новый объект json со значением и датой-временем и отправить его через http post или mqtt на другой сервер

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Нашел решение проблемы. Сам код правильный.

Я отредактировал код как

try:
    print(time_decode(utc))
except Exception as e:
    print(e)
    print(e.args)
print(payload)

это привело к сообщению об ошибке (недействительный аргумент). Таким образом, оказалось, что метка времени Unix была представлена ​​как целое число, включая мс. Следовательно, мне просто нужно было разделить значение на 1000.

0 голосов
/ 08 июля 2019

Добавьте блок try / исключением вокруг вызова time_decode, чтобы перехватить и распечатать ошибку.Функция on_message вызывается внутри своей собственной попытки /, за исключением того, что она выбрасывает любые ошибки, поэтому вы не увидите в ней никаких исключений, которые обычно выдают.

Что-то вроде:

def on_message(client, userdata, msg):
  # print(msg.topic +" "+str(msg.payload))
  payload = json.loads(msg.payload)
  utc = payload['timestamp']
  try:
    print(time_decode(utc))
  except:
    print "Unexpected error:", sys.exc_info()[0]
  print(payload)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...