首页 > 解决方案 > 如何使用 Flask/python 在特定时间间隔内记录物联网数据

问题描述

这是我的第一个问题,请原谅任何错误。我正在尝试使用 python/flask 开发软件,它不断地从多个设备接收物联网数据,并以特定的时间间隔记录数据。例如,我有 3 个设备并以 30 秒的间隔记录数据:device1、device2、device3 分别在 5:04:20、5:04:29,5;04:31 发送第一个数据。然后这些设备每1或2秒连续发送数据,我想跟踪最后一个数据并确保下一个数据分别在5:04:50,5:04:59,5:05:01之后更新在 5:05:20 等。

我已经编写了一个脚本来确保使用线程的单个设备:这是代码:

import paho.mqtt.client as mqtt
import csv
import os
import datetime
import threading
import queue
import time
q = queue.Queue()
header = ["Date", "Time", "Real_Speed"]
Rspd_key_1 = "key1="
Rspd_key_2 = "key2="
state = 0
message = ""
values = {"Date": 0, "Time": 0, "Real_Speed": 0}
writeFlag = True
logTime = 0
locallog = 0
nowTime = 0
dataUpdated = False
F_checkTime = True
prev_spd = 9999



def checkTime():
    global logTime
    global locallog
    global values
    global dataUpdated
    timesDataMissed = 0
    while (F_checkTime):
        nowTime = time.time()
        if(logTime != 0 and nowTime-logTime >= 30):
            values['Date'] = datetime.date.today().strftime("%d/%m/%Y")
            now = datetime.datetime.now()
            values['Time'] = now.strftime("%H:%M:%S")
            if(dataUpdated):
                q.put(values)
                logTime +=30
                dataUpdated = False
                print(values)
                timesDataMissed=0
            else:
                values['Real_Speed'] = 'NULL'
                q.put(values)
                logTime = nowTime
                dataUpdated = False
                timesDataMissed += 1
                print(values)
                if(timesDataMissed > 10):
                    timesDataMissed = 0
                    logTime = 0


def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("something")


def write_csv():
    csvfile = open('InverterDataLogger01.csv', mode='w',
                   newline='',  encoding='utf-8')
    spamwriter = csv.DictWriter(csvfile, fieldnames=header)
    spamwriter.writeheader()
    csvfile.close()
    while writeFlag:
        # print("worker running ",csv_flag)
        time.sleep(0.01)
        # time.sleep(2)
        while not q.empty():
            results = q.get()
            if results is None:
                continue
            csvfile = open('InverterDataLogger01.csv', mode='a',
                           newline='',  encoding='utf-8')
            spamwriter = csv.DictWriter(csvfile, fieldnames=header)
            spamwriter.writerow(results)
            csvfile.close()
            print("Written in csv File")



def find_spd_val(message):
    Do Something
    return realspd


def on_message(client, userdata, msg):
    message = str(msg.payload.decode("utf-8", "ignore"))
    topic = str(msg.topic)
    global values
    global dataUpdated
    global r_index
    global prev_spd
    global rspd
    global locallog
    if(logTime==0):
        global logTime
        logTime = time.time()
        locallog=logTime

    else:
        try:
            rspd = int(find_spd_val(message))
        except:
            pass
        if(prev_spd == 9999):
            prev_spd = rspd
        else:
            values['Real_Speed'] = rspd



def on_publish(client, userdata, mid):
    print("Message Published")


client = mqtt.Client("hidden")
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish
client.connect("hidden")
client.loop_start()
t1 = threading.Thread(target=write_csv)  # start logger
t2 = threading.Thread(target=checkTime)  # start logger

t1.start()  # start logging thread
t2.start()  # start logging thread

print('written')
try:
    while True:
        time.sleep(1)
        pass
except:
    print("interrrupted by keyboard")
    client.loop_stop()  # start loop
    writeFlag = False  # stop logging thread
    F_checkTime = False
    time.sleep(5)

我想使用 python/flask 来处理多个设备来做同样的事情。我是烧瓶的新手,你能给我一些指导吗,我怎样才能确保烧瓶中的这个功能,我应该使用什么技术?

标签: pythonmultithreadingflaskmqttiot

解决方案


我认为要正确回答您的问题,需要更多背景信息。但简单地说,您的设备可以发出 http 请求吗?如果可能的话,您可以创建一个烧瓶网络应用程序来接收 http 调用并存储信息。我也看到你提到了 csv,这不是存储数据的好方法,因为依赖文件的读/写不是一个好习惯。我建议使用适当的数据库(例如 mysql 等)以事务方式存储信息。


推荐阅读