python - 如何使用 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 来处理多个设备来做同样的事情。我是烧瓶的新手,你能给我一些指导吗,我怎样才能确保烧瓶中的这个功能,我应该使用什么技术?
解决方案
我认为要正确回答您的问题,需要更多背景信息。但简单地说,您的设备可以发出 http 请求吗?如果可能的话,您可以创建一个烧瓶网络应用程序来接收 http 调用并存储信息。我也看到你提到了 csv,这不是存储数据的好方法,因为依赖文件的读/写不是一个好习惯。我建议使用适当的数据库(例如 mysql 等)以事务方式存储信息。
推荐阅读
- javascript - “异步”Azure Function App 未按预期等待
- magento2 - 使用composer成功安装magento后,当我在magento中点击admin的url时什么也没有
- reactjs - 如何使用带有反应钩子的静态变量
- wix - WiX 工具集扩展:如何使自定义操作的顺序可配置?
- c# - 将一个数字拆分为多个数字
- excel - 在不同的单元格上粘贴不同的值
- security - 在 AppScan 期间,是否可以判断特定 URL 是否已被扫描?
- javascript - 在 Angular 的 ngIf 条件中使用 split 函数
- android - 是否有任何轻量级库可以从 Android 的本地存储中读取 pdf 文件?
- sql - 带有 order by 的 sqlite select 语句