Commit 2e65db9b by gujiulin

init

parents
Device, Razor
Type, tilt beat
MAC, 170058
Cal Date, 2025-04-09T00:00:00.000+01:00
Man Date, 2022-05-15T00:00:00.000+01:00
H/W, 5.0
Main F/W, 5.3.14
Orient. (g), 0.000,0.000,0.000
Bat,0.00
Time,BaseP,BaseR,Pitch,Roll,dPitch,dRoll,degC
2025-05-26T08:00:01.152+08:00,-0.3264,1.2244,-0.2998,1.2273,0.0267,0.0029,24.01
2025-05-26T08:05:00.000+08:00,-0.3264,1.2244,-0.2987,1.2294,0.0278,0.0049,23.90
2025-05-26T08:10:00.000+08:00,-0.3264,1.2244,-0.2998,1.2292,0.0266,0.0047,24.01
2025-05-26T08:15:00.000+08:00,-0.3264,1.2244,-0.2989,1.2283,0.0275,0.0039,24.01
2025-05-26T08:20:00.000+08:00,-0.3264,1.2244,-0.3000,1.2255,0.0264,0.0011,23.90
2025-05-26T08:25:00.000+08:00,-0.3264,1.2244,-0.2998,1.2276,0.0266,0.0032,24.01
2025-05-26T08:30:00.000+08:00,-0.3264,1.2244,-0.2987,1.2292,0.0278,0.0047,23.90
2025-05-26T08:35:00.000+08:00,-0.3264,1.2244,-0.3005,1.2271,0.0260,0.0027,23.90
2025-05-26T08:40:00.000+08:00,-0.3264,1.2244,-0.2987,1.2285,0.0278,0.0041,23.67
2025-05-26T08:45:00.000+08:00,-0.3264,1.2244,-0.2987,1.2276,0.0278,0.0032,23.67
2025-05-26T08:50:00.000+08:00,-0.3264,1.2244,-0.2993,1.2285,0.0271,0.0041,24.23
2025-05-26T08:55:00.000+08:00,-0.3264,1.2244,-0.2996,1.2271,0.0269,0.0027,23.90
2025-05-26T09:00:01.012+08:00,-0.3264,1.2244,-0.2993,1.2235,0.0271,-0.0009,24.12
2025-05-26T09:05:00.000+08:00,-0.3264,1.2244,-0.2996,1.2285,0.0269,0.0041,24.01
2025-05-26T09:10:00.000+08:00,-0.3264,1.2244,-0.2994,1.2296,0.0271,0.0052,24.01
2025-05-26T09:15:00.000+08:00,-0.3264,1.2244,-0.3005,1.2273,0.0260,0.0029,24.34
2025-05-26T09:20:00.000+08:00,-0.3264,1.2244,-0.2991,1.2285,0.0273,0.0040,24.45
2025-05-26T09:25:00.000+08:00,-0.3264,1.2244,-0.2991,1.2289,0.0273,0.0044,24.12
2025-05-26T09:30:00.000+08:00,-0.3264,1.2244,-0.2991,1.2305,0.0273,0.0060,24.12
2025-05-26T09:35:00.000+08:00,-0.3264,1.2244,-0.2987,1.2298,0.0278,0.0053,25.00
2025-05-26T09:40:00.000+08:00,-0.3264,1.2244,-0.2996,1.2302,0.0269,0.0058,24.23
2025-05-26T09:45:00.000+08:00,-0.3264,1.2244,-0.2991,1.2309,0.0273,0.0064,24.89
2025-05-26T09:50:00.000+08:00,-0.3264,1.2244,-0.2993,1.2304,0.0271,0.0060,24.89
2025-05-26T09:55:00.000+08:00,-0.3264,1.2244,-0.2993,1.2285,0.0271,0.0041,24.89
2025-05-26T10:00:00.000+08:00,-0.3264,1.2244,-0.3022,1.2252,0.0242,0.0008,24.89
2025-05-26T10:05:00.000+08:00,-0.3264,1.2244,-0.2995,1.2310,0.0269,0.0066,24.89
2025-05-26T10:10:00.000+08:00,-0.3264,1.2244,-0.2984,1.2312,0.0280,0.0068,24.89
2025-05-26T10:15:00.000+08:00,-0.3264,1.2244,-0.3000,1.2315,0.0265,0.0070,25.22
2025-05-26T10:20:00.000+08:00,-0.3264,1.2244,-0.2993,1.2324,0.0271,0.0079,24.89
2025-05-26T10:25:00.000+08:00,-0.3264,1.2244,-0.3000,1.2301,0.0265,0.0057,25.55
2025-05-26T10:30:00.000+08:00,-0.3264,1.2244,-0.2997,1.2316,0.0267,0.0072,25.33
2025-05-26T10:35:00.000+08:00,-0.3264,1.2244,-0.2993,1.2316,0.0272,0.0072,25.66
2025-05-26T10:40:00.000+08:00,-0.3264,1.2244,-0.3004,1.2321,0.0260,0.0077,25.66
2025-05-26T10:45:00.000+08:00,-0.3264,1.2244,-0.3004,1.2285,0.0260,0.0041,25.77
2025-05-26T10:50:00.000+08:00,-0.3264,1.2244,-0.2988,1.2336,0.0276,0.0092,25.66
2025-05-26T10:55:00.000+08:00,-0.3264,1.2244,-0.3006,1.2330,0.0258,0.0085,25.77
2025-05-26T11:00:00.000+08:00,-0.3264,1.2244,-0.3004,1.2322,0.0260,0.0078,25.77
2025-05-26T11:05:00.000+08:00,-0.3264,1.2244,-0.3009,1.2312,0.0256,0.0067,25.77
2025-05-26T11:10:00.000+08:00,-0.3264,1.2244,-0.2982,1.2345,0.0283,0.0100,25.88
2025-05-26T11:15:00.000+08:00,-0.3264,1.2244,-0.2986,1.2347,0.0278,0.0103,25.77
2025-05-26T11:20:00.000+08:00,-0.3264,1.2244,-0.2995,1.2338,0.0269,0.0094,26.10
2025-05-26T11:25:00.000+08:00,-0.3264,1.2244,-0.2993,1.2328,0.0272,0.0084,26.10
2025-05-26T11:30:00.000+08:00,-0.3264,1.2244,-0.2997,1.2326,0.0267,0.0082,26.22
2025-05-26T11:35:01.224+08:00,-0.3264,1.2244,-0.2986,1.2355,0.0279,0.0111,26.55
2025-05-26T11:40:00.000+08:00,-0.3264,1.2244,-0.2990,1.2337,0.0274,0.0093,26.44
2025-05-26T11:45:00.000+08:00,-0.3264,1.2244,-0.2997,1.2322,0.0267,0.0077,26.66
2025-05-26T11:50:00.000+08:00,-0.3264,1.2244,-0.2984,1.2349,0.0281,0.0105,26.55
2025-05-26T11:55:00.356+08:00,-0.3264,1.2244,-0.2988,1.2355,0.0276,0.0111,26.66
[EMAIL]
SMTP_SERVER = smtp.163.com
SMTP_PORT = 25
SENDER_EMAIL = jiulingu1986@163.com
SENDER_PASSWORD = VVQ7TFS3ZsGQgC3X
RECIPIENTS = 605292529@qq.com,jiulingu1986@163.com
[REPORTTIME]
EMAIL_TIME = 08:40
TILT_REPORT_TIME = 08:30
VIBRATION_REPORT_TIME = 08:35
\ No newline at end of file
import csv
import os
import time
from datetime import datetime
from datetime import datetime
from ftplib import FTP
import socket
import io
import pandas as pd
from io import BytesIO
import paho.mqtt.client as mqtt
import json
# MQTT服务器地址和端口
broker = "iot.raytue.com"
port = 1883
# 客户端ID
client_id = "S&D2367JBEYPY32&157&23"
userName="raytue"
passWord="P14AX03XD7W9G42Z"
# 发布主题
topic = "/157/D2367JBEYPY32/property/post"
# FTP服务器配置
FTP_SERVER = 'iot.raytue.com'
FTP_USER = 'tsensing'
FTP_PASS = 'tsensing!@#123'
FTP_DIR = '/tilt/170091(TM10)' # FTP服务器上的目标目录,根据实际情况修改
def connect_ftp():
try:
ftp = FTP()
ftp.connect(FTP_SERVER) # 设置连接超时
ftp.login(FTP_USER, FTP_PASS)
#ftp.set_pasv(True)
ftp.cwd(FTP_DIR)
print(f"TM10成功连接 {FTP_SERVER}:{21}")
return ftp
except socket.timeout:
print("TM10连接超时,请检查网络或服务器状态")
except Exception as e:
print(f"TM10连接失败: {str(e)}")
def del_file(list_row):
# print(list_row[10])
number_row= len(list_row)
mqttstr=""
print("TM10列表中有",number_row,"行")
j=10
# if list_row[10][0] == "Time":#有的表格第10行不是数据是表头
# j=11
for i in range(number_row):
if list_row[i][0] == "Time":
j=i+1
break
i=0
for i in range(j,number_row):
#格式化mqtt字符串
mqttstr="[{\"id\":\"tiltData_time\",\"remark\":\"\",\"value\":\"%s\"},{\"id\":\"tiltData_dPitch\",\"remark\":\"\",\"value\":\"%s\"},{\"id\":\"tiltData_dRoll\",\"remark\":\"\",\"value\":\"%s\"}]" % (list_row[i][0] ,list_row[i][5] ,list_row[i][6] )
# print(mqttstr)
# payload = json.dumps(mqttstr)
payload = mqttstr
# 发布消息
result = client.publish(topic, payload)
# 检查消息是否成功发布
status = result[0]
if status == 0:
print(f"TM10Send `{payload}` to topic `{topic}`")
else:
print(f"TM10Failed to send message to topic {topic}")
time.sleep(1)
def monitor_directory(known_files,interval=60):
"""
监控指定目录的新增文件
"""
# known_files=[]#首次全部传输完成后注释掉
while True:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
# 获取当前文件列表
try:
#ftp.set_pasv(True)
current_files = ftp.nlst()#读文件列表
print('TM10当前目录------------>:')
# print(current_files)
# 找出新增文件
#new_files = current_files - known_files
new_files = [item for item in current_files if item not in known_files]
print('TM10新增文件--------->:')
print(new_files)
#new_files = ['44444444.csv']
if new_files:
print(f"[{datetime.now()}] 发现 {len(new_files)} 个新文件:")
for filename in new_files:
#filepath = os.path.join(directory, filename)
print(f"TM10分析文件: {filename}")
#analyze_file(filepath)
for i in range(10): # 从0到4 防止掉线读不出来
# 使用BytesIO作为文件缓冲区
try:
print(f"TM10第{i}次读取")
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
file_data = io.BytesIO()
ftp.retrbinary(f"RETR {filename}", file_data.write)
file_data.seek(0)
csv_data = file_data.read().decode('utf-8')
csv_reader = csv.reader(io.StringIO(csv_data))
#csv_reader = csv.reader(csv_data)
list_row = list(csv_reader)
del_file(list_row)#处理数据
# for row in csv_reader:
# del_file(row)#处理数据
break
except Exception as e:
print(f"TM10读取文件{filename}出错: {e}")
if i == 9:
i = 0
continue
print("--------------------------------全部文件发送完毕------------------------------------------")#首次全部传输完成后,注释掉
#return#首次全部传输完成后,注释掉
# 打印文件内容
#content = file_data.read().decode('utf-8')
#print(content)
# 更新已知文件列表
known_files = current_files
ftp.quit()
except Exception as e:
print(f"TM10读取当前目录出错: {e}")
# 等待下次检查
time.sleep(interval)
def analyze_file(filepath):
"""
分析文件内容
:param filepath: 文件路径
"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# 这里可以添加你的分析逻辑
print(f"TM10文件大小: {len(content)} 字节")
#print(f"首100字符: {content[:100]}...")
except Exception as e:
print(f"TM10读取文件 {filepath} 出错: {str(e)}")
# 连接回调函数
def on_connect1(client, userdata, flags, reason_code, properties):
if reason_code == 0:
print("TM10Connected to MQTT Broker!")
else:
print(f"TM10Failed to connect, return code {reason_code}")
if __name__ == "__main__":
# 创建MQTT客户端实例
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id)
#client = mqtt.Client(client_id)
client.on_connect = on_connect1
client.username_pw_set(userName, passWord)
# 连接到MQTT服务器
client.connect(broker, port, 60)
# 开始循环
client.loop_start()
# 初始文件列表
while True:
try:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
#ftp.set_pasv(True)
known_files = ftp.nlst()
print('TM10初始目录:')
#print(known_files)
ftp.quit()
monitor_directory(known_files,10)
except Exception as e:
print(f"TM10读取初始目录出错: {e}")
time.sleep(5)
import csv
import os
import time
from datetime import datetime
from ftplib import FTP
import socket
import io
import pandas as pd
from io import BytesIO
import paho.mqtt.client as mqtt
import json
# MQTT服务器地址和端口
broker = "iot.raytue.com"
port = 1883
# 客户端ID
client_id = "S&D2367JBEYPY32&157&23"
userName="raytue"
passWord="P14AX03XD7W9G42Z"
# 发布主题
topic = "/157/D2367JBEYPY32/property/post"
# FTP服务器配置
FTP_SERVER = 'iot.raytue.com'
FTP_USER = 'tsensing'
FTP_PASS = 'tsensing!@#123'
FTP_DIR = '/tilt/170091(TM10)' # FTP服务器上的目标目录,根据实际情况修改
def connect_ftp():
try:
ftp = FTP()
ftp.connect(FTP_SERVER) # 设置连接超时
ftp.login(FTP_USER, FTP_PASS)
#ftp.set_pasv(True)
ftp.cwd(FTP_DIR)
print(f"TM10成功连接 {FTP_SERVER}:{21}")
return ftp
except socket.timeout:
print("TM10连接超时,请检查网络或服务器状态")
except Exception as e:
print(f"TM10连接失败: {str(e)}")
def del_file(list_row):
# print(list_row[10])
number_row= len(list_row)
mqttstr=""
print("TM10列表中有",number_row,"行数据需处理")
j=10
# if list_row[10][0] == "Time":#有的表格第10行不是数据是表头
# j=11
for i in range(number_row):
if list_row[i][0] == "Time":
j=i+1
break
i=0
for i in range(j,number_row):
#格式化mqtt字符串
if(len(list_row[i])== 8):#防止最后一行有数据缺失!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iso_str = list_row[i][0]
# 解析字符串,注意要指定时区信息
dt = datetime.fromisoformat(iso_str)
# 格式化为所需的格式
formatted_str = dt.strftime("%Y-%m-%d %H:%M:%S")
mqttstr="[{\"id\":\"tiltData_time\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"tiltData_dPitch\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"tiltData_dRoll\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"}]" \
% (list_row[i][0], formatted_str ,list_row[i][5], formatted_str ,list_row[i][6], formatted_str)
# print(mqttstr)
# payload = json.dumps(mqttstr)
payload = mqttstr
# 发布消息
result = client.publish(topic, payload)
# 检查消息是否成功发布
status = result[0]
if status == 0:
print(f"TM10Send `{payload}` to topic `{topic}`")
else:
print(f"TM10Failed to send message to topic {topic}")
time.sleep(0.05)#100ms传一次
def monitor_directory(known_files,interval=60):
"""
监控指定目录的新增文件
"""
# known_files=[]#首次全部传输完成后注释掉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
while True:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
# 获取当前文件列表
try:
#ftp.set_pasv(True)
current_files = ftp.nlst()#读文件列表
print('获取TM10当前目录------------>:')
# print(current_files)
# 找出新增文件
#new_files = current_files - known_files
new_files = [item for item in current_files if item not in known_files]
print('获取TM10新增文件--------->:')
print(new_files)
#new_files = ['44444444.csv']
if new_files:
print(f"[{datetime.now()}] 发现 {len(new_files)} 个新文件:")
for filename in new_files:
#filepath = os.path.join(directory, filename)
print(f"TM10分析文件: {filename}")
#analyze_file(filepath)
for i in range(10): # 从0到4 防止掉线读不出来
# 使用BytesIO作为文件缓冲区
try:
print(f"TM10第{i}次读取")
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
file_data = io.BytesIO()
ftp.retrbinary(f"RETR {filename}", file_data.write)
file_data.seek(0)
csv_data = file_data.read().decode('utf-8')
csv_reader = csv.reader((io.StringIO(csv_data).getvalue()).splitlines(),delimiter=',')
#csv_reader = csv.reader(csv_data)
list_row = list(csv_reader)
del_file(list_row)#处理数据
# for row in csv_reader:
# del_file(row)#处理数据
break
except Exception as e:
print(f"TM10读取文件{filename}出错: {e}")
# if i == 9:
# i = 0
continue
print("--------------------------------全部文件发送完毕------------------------------------------")#首次全部传输完成后,注释掉
#return#首次全部传输完成后,注释掉
# 打印文件内容
#content = file_data.read().decode('utf-8')
#print(content)
# 更新已知文件列表
known_files = current_files
ftp.quit()
except Exception as e:
print(f"TM10读取当前目录出错: {e}")
# 等待下次检查
time.sleep(interval)
def analyze_file(filepath):
"""
分析文件内容
:param filepath: 文件路径
"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# 这里可以添加你的分析逻辑
print(f"TM10文件大小: {len(content)} 字节")
#print(f"首100字符: {content[:100]}...")
except Exception as e:
print(f"TM10读取文件 {filepath} 出错: {str(e)}")
# 连接回调函数
def on_connect1(client, userdata, flags, reason_code, properties):
if reason_code == 0:
print("TM10Connected to MQTT Broker!")
else:
print(f"TM10Failed to connect, return code {reason_code}")
if __name__ == "__main__":
# 创建MQTT客户端实例
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id)
#client = mqtt.Client(client_id)
client.on_connect = on_connect1
client.username_pw_set(userName, passWord)
# 连接到MQTT服务器
client.connect(broker, port, 60)
# 开始循环
client.loop_start()
# 初始文件列表
while True:
try:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
#ftp.set_pasv(True)
known_files = ftp.nlst()
print('获取TM10初始目录:')
#print(known_files)
ftp.quit()
monitor_directory(known_files,10)
except Exception as e:
print(f"TM10获取初始目录出错: {e}")
time.sleep(5)
import csv
import os
import time
from datetime import datetime
from datetime import datetime
from ftplib import FTP
import socket
import io
import pandas as pd
from io import BytesIO
import paho.mqtt.client as mqtt
import json
# MQTT服务器地址和端口
broker = "iot.raytue.com"
port = 1883
# 客户端ID
client_id = "S&D23AFZM72Q620&157&23"
userName="raytue"
passWord="P14AX03XD7W9G42Z"
# 发布主题
topic = "/157/D23AFZM72Q620/property/post"
# FTP服务器配置
FTP_SERVER = 'iot.raytue.com'
FTP_USER = 'tsensing'
FTP_PASS = 'tsensing!@#123'
FTP_DIR = '/tilt/170097(TM10A)/' # FTP服务器上的目标目录,根据实际情况修改
def connect_ftp():
try:
ftp = FTP()
ftp.connect(FTP_SERVER) # 设置连接超时
ftp.login(FTP_USER, FTP_PASS)
#ftp.set_pasv(True)
ftp.cwd(FTP_DIR)
print(f"TM10A成功连接 {FTP_SERVER}:{21}")
return ftp
except socket.timeout:
print("TM10A连接超时,请检查网络或服务器状态")
except Exception as e:
print(f"TM10A连接失败: {str(e)}")
def del_file(list_row):
# print(list_row[10])
number_row= len(list_row)
mqttstr=""
print("TM10A列表中有",number_row,"行")
j=10
# if list_row[10][0] == "Time":#有的表格第10行不是数据是表头
# j=11
for i in range(number_row):
if list_row[i][0] == "Time":
j=i+1
break
i=0
for i in range(j,number_row):
#格式化mqtt字符串
mqttstr="[{\"id\":\"tiltData_time\",\"remark\":\"\",\"value\":\"%s\"},{\"id\":\"tiltData_dPitch\",\"remark\":\"\",\"value\":\"%s\"},{\"id\":\"tiltData_dRoll\",\"remark\":\"\",\"value\":\"%s\"}]" % (list_row[i][0] ,list_row[i][5] ,list_row[i][6] )
# print(mqttstr)
# payload = json.dumps(mqttstr)
payload = mqttstr
# 发布消息
result = client.publish(topic, payload)
# 检查消息是否成功发布
status = result[0]
if status == 0:
print(f"TM10ASend `{payload}` to topic `{topic}`")
else:
print(f"TM10AFailed to send message to topic {topic}")
time.sleep(1)
def monitor_directory(known_files,interval=60):
"""
监控指定目录的新增文件
"""
# known_files=[]#首次全部传输完成后注释掉
while True:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
# 获取当前文件列表
try:
#ftp.set_pasv(True)
current_files = ftp.nlst()#读文件列表
print('TM10A当前目录------------>:')
# print(current_files)
# 找出新增文件
#new_files = current_files - known_files
new_files = [item for item in current_files if item not in known_files]
print('TM10A新增文件--------->:')
print(new_files)
#new_files = ['44444444.csv']
if new_files:
print(f"[{datetime.now()}] 发现 {len(new_files)} 个新文件:")
for filename in new_files:
#filepath = os.path.join(directory, filename)
print(f"TM10A分析文件: {filename}")
#analyze_file(filepath)
for i in range(10): # 从0到4 防止掉线读不出来
# 使用BytesIO作为文件缓冲区
try:
print(f"TM10B第{i}次读取")
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
file_data = io.BytesIO()
ftp.retrbinary(f"RETR {filename}", file_data.write)
file_data.seek(0)
csv_data = file_data.read().decode('utf-8')
csv_reader = csv.reader((io.StringIO(csv_data).getvalue()).splitlines(),delimiter=',')
#csv_reader = csv.reader(csv_data)
list_row = list(csv_reader)
del_file(list_row)#处理数据
# for row in csv_reader:
# del_file(row)#处理数据
break
except Exception as e:
print(f"TM10A读取文件{filename}出错: {e}")
if i == 9:
i = 0
continue
print("--------------------------------全部文件发送完毕------------------------------------------")#首次全部传输完成后,注释掉
#return#首次全部传输完成后,注释掉
# 打印文件内容
#content = file_data.read().decode('utf-8')
#print(content)
# 更新已知文件列表
known_files = current_files
ftp.quit()
except Exception as e:
print(f"TM10A读取当前目录出错: {e}")
# 等待下次检查
time.sleep(interval)
def analyze_file(filepath):
"""
分析文件内容
:param filepath: 文件路径
"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# 这里可以添加你的分析逻辑
print(f"TM10A文件大小: {len(content)} 字节")
#print(f"首100字符: {content[:100]}...")
except Exception as e:
print(f"TM10A读取文件 {filepath} 出错: {str(e)}")
# 连接回调函数
def on_connect1(client, userdata, flags, reason_code, properties):
if reason_code == 0:
print("TM10AConnected to MQTT Broker!")
else:
print(f"TM10AFailed to connect, return code {reason_code}")
if __name__ == "__main__":
# 创建MQTT客户端实例
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id)
#client = mqtt.Client(client_id)
client.on_connect = on_connect1
client.username_pw_set(userName, passWord)
# 连接到MQTT服务器
client.connect(broker, port, 60)
# 开始循环
client.loop_start()
# 初始文件列表
while True:
try:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
#ftp.set_pasv(True)
known_files = ftp.nlst()
print('TM10A初始目录:')
#print(known_files)
ftp.quit()
monitor_directory(known_files,10)
except Exception as e:
print(f"TM10A读取初始目录出错: {e}")
time.sleep(5)
import csv
import os
import time
from datetime import datetime
from ftplib import FTP
import socket
import io
import pandas as pd
from io import BytesIO
import paho.mqtt.client as mqtt
import json
# MQTT服务器地址和端口
broker = "iot.raytue.com"
port = 1883
# 客户端ID
client_id = "S&D23AFZM72Q620&157&23"
userName="raytue"
passWord="P14AX03XD7W9G42Z"
# 发布主题
topic = "/157/D23AFZM72Q620/property/post"
# FTP服务器配置
FTP_SERVER = 'iot.raytue.com'
FTP_USER = 'tsensing'
FTP_PASS = 'tsensing!@#123'
FTP_DIR = '/tilt/170097(TM10A)/' # FTP服务器上的目标目录,根据实际情况修改
def connect_ftp():
try:
ftp = FTP()
ftp.connect(FTP_SERVER) # 设置连接超时
ftp.login(FTP_USER, FTP_PASS)
#ftp.set_pasv(True)
ftp.cwd(FTP_DIR)
print(f"TM10A成功连接 {FTP_SERVER}:{21}")
return ftp
except socket.timeout:
print("TM10A连接超时,请检查网络或服务器状态")
except Exception as e:
print(f"TM10A连接失败: {str(e)}")
def del_file(list_row):
# print(list_row[10])
number_row= len(list_row)
mqttstr=""
print("TM10A列表中有",number_row,"行数据需处理")
j=10
# if list_row[10][0] == "Time":#有的表格第10行不是数据是表头
# j=11
for i in range(number_row):
if list_row[i][0] == "Time":
j=i+1
break
i=0
for i in range(j,number_row):
#格式化mqtt字符串
if(len(list_row[i])== 8):#防止最后一行有数据缺失!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iso_str = list_row[i][0]
# 解析字符串,注意要指定时区信息
dt = datetime.fromisoformat(iso_str)
# 格式化为所需的格式
formatted_str = dt.strftime("%Y-%m-%d %H:%M:%S")
mqttstr="[{\"id\":\"tiltData_time\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"tiltData_dPitch\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"tiltData_dRoll\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"}]" \
% (list_row[i][0], formatted_str ,list_row[i][5], formatted_str ,list_row[i][6], formatted_str)
# print(mqttstr)
# payload = json.dumps(mqttstr)
payload = mqttstr
# 发布消息
result = client.publish(topic, payload)
# 检查消息是否成功发布
status = result[0]
if status == 0:
print(f"TM10ASend `{payload}` to topic `{topic}`")
else:
print(f"TM10AFailed to send message to topic {topic}")
time.sleep(0.05)#100ms传一次
def monitor_directory(known_files,interval=60):
"""
监控指定目录的新增文件
"""
# known_files=[]#首次全部传输完成后注释掉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
while True:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
# 获取当前文件列表
try:
#ftp.set_pasv(True)
current_files = ftp.nlst()#读文件列表
print('获取TM10A当前目录------------>:')
# print(current_files)
# 找出新增文件
#new_files = current_files - known_files
new_files = [item for item in current_files if item not in known_files]
print('获取TM10A新增文件--------->:')
print(new_files)
#new_files = ['44444444.csv']
if new_files:
print(f"[{datetime.now()}] 发现 {len(new_files)} 个新文件:")
for filename in new_files:
#filepath = os.path.join(directory, filename)
print(f"TM10A分析文件: {filename}")
#analyze_file(filepath)
for i in range(10): # 从0到4 防止掉线读不出来
# 使用BytesIO作为文件缓冲区
try:
print(f"TM10A第{i}次读取")
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
file_data = io.BytesIO()
ftp.retrbinary(f"RETR {filename}", file_data.write)
file_data.seek(0)
csv_data = file_data.read().decode('utf-8')
csv_reader = csv.reader((io.StringIO(csv_data).getvalue()).splitlines(),delimiter=',')
#csv_reader = csv.reader(csv_data)
list_row = list(csv_reader)
del_file(list_row)#处理数据
# for row in csv_reader:
# del_file(row)#处理数据
break
except Exception as e:
print(f"TM10A读取文件{filename}出错: {e}")
# if i == 9:
# i = 0
continue
print("--------------------------------全部文件发送完毕------------------------------------------")#首次全部传输完成后,注释掉
#return#首次全部传输完成后,注释掉
# 打印文件内容
#content = file_data.read().decode('utf-8')
#print(content)
# 更新已知文件列表
known_files = current_files
ftp.quit()
except Exception as e:
print(f"TM10A读取当前目录出错: {e}")
# 等待下次检查
time.sleep(interval)
def analyze_file(filepath):
"""
分析文件内容
:param filepath: 文件路径
"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# 这里可以添加你的分析逻辑
print(f"TM10A文件大小: {len(content)} 字节")
#print(f"首100字符: {content[:100]}...")
except Exception as e:
print(f"TM10A读取文件 {filepath} 出错: {str(e)}")
# 连接回调函数
def on_connect1(client, userdata, flags, reason_code, properties):
if reason_code == 0:
print("TM10AConnected to MQTT Broker!")
else:
print(f"TM10AFailed to connect, return code {reason_code}")
if __name__ == "__main__":
# 创建MQTT客户端实例
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id)
#client = mqtt.Client(client_id)
client.on_connect = on_connect1
client.username_pw_set(userName, passWord)
# 连接到MQTT服务器
client.connect(broker, port, 60)
# 开始循环
client.loop_start()
# 初始文件列表
while True:
try:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
#ftp.set_pasv(True)
known_files = ftp.nlst()
print('获取TM10A初始目录:')
#print(known_files)
ftp.quit()
monitor_directory(known_files,10)
except Exception as e:
print(f"TM10A获取初始目录出错: {e}")
time.sleep(5)
import csv
import os
import time
from datetime import datetime
from ftplib import FTP
import socket
import io
import pandas as pd
from io import BytesIO
import paho.mqtt.client as mqtt
import json
# MQTT服务器地址和端口
broker = "iot.raytue.com"
port = 1883
# 客户端ID
client_id = "S&D2368757I1Y4G&157&23"
userName="raytue"
passWord="P14AX03XD7W9G42Z"
# 发布主题
topic = "/157/D2368757I1Y4G/property/post"
# FTP服务器配置
FTP_SERVER = 'iot.raytue.com'
FTP_USER = 'tsensing'
FTP_PASS = 'tsensing!@#123'
FTP_DIR = '/tilt/170098(TM10B)/' # FTP服务器上的目标目录,根据实际情况修改
def connect_ftp():
try:
ftp = FTP()
ftp.connect(FTP_SERVER) # 设置连接超时
ftp.login(FTP_USER, FTP_PASS)
#ftp.set_pasv(True)
ftp.cwd(FTP_DIR)
print(f"TM10B成功连接 {FTP_SERVER}:{21}")
return ftp
except socket.timeout:
print("TM10B连接超时,请检查网络或服务器状态")
except Exception as e:
print(f"TM10B连接失败: {str(e)}")
def del_file(list_row):
# print(list_row[10])
number_row= len(list_row)
mqttstr=""
print("TM10B列表中有",number_row,"行数据需处理")
j=10
# if list_row[10][0] == "Time":#有的表格第10行不是数据是表头
# j=11
for i in range(number_row):
if list_row[i][0] == "Time":
j=i+1
break
i=0
for i in range(j,number_row):
#格式化mqtt字符串
if(len(list_row[i])== 8):#防止最后一行有数据缺失!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iso_str = list_row[i][0]
# 解析字符串,注意要指定时区信息
dt = datetime.fromisoformat(iso_str)
# 格式化为所需的格式
formatted_str = dt.strftime("%Y-%m-%d %H:%M:%S")
mqttstr="[{\"id\":\"tiltData_time\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"tiltData_dPitch\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"tiltData_dRoll\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"}]" \
% (list_row[i][0], formatted_str ,list_row[i][5], formatted_str ,list_row[i][6], formatted_str)
# print(mqttstr)
# payload = json.dumps(mqttstr)
payload = mqttstr
# 发布消息
result = client.publish(topic, payload)
# 检查消息是否成功发布
status = result[0]
if status == 0:
print(f"TM10BSend `{payload}` to topic `{topic}`")
else:
print(f"TM10BFailed to send message to topic {topic}")
time.sleep(0.05)#100ms传一次
def monitor_directory(known_files,interval=60):
"""
监控指定目录的新增文件
"""
# known_files=[]#首次全部传输完成后注释掉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
while True:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
# 获取当前文件列表
try:
#ftp.set_pasv(True)
current_files = ftp.nlst()#读文件列表
print('获取TM10B当前目录------------>:')
# print(current_files)
# 找出新增文件
#new_files = current_files - known_files
new_files = [item for item in current_files if item not in known_files]
print('获取TM10B新增文件--------->:')
print(new_files)
#new_files = ['44444444.csv']
if new_files:
print(f"[{datetime.now()}] 发现 {len(new_files)} 个新文件:")
for filename in new_files:
#filepath = os.path.join(directory, filename)
print(f"TM10B分析文件: {filename}")
#analyze_file(filepath)
for i in range(10): # 从0到4 防止掉线读不出来
# 使用BytesIO作为文件缓冲区
try:
print(f"TM10B第{i}次读取")
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
file_data = io.BytesIO()
ftp.retrbinary(f"RETR {filename}", file_data.write)
file_data.seek(0)
csv_data = file_data.read().decode('utf-8')
csv_reader = csv.reader((io.StringIO(csv_data).getvalue()).splitlines(),delimiter=',')
#csv_reader = csv.reader(csv_data)
list_row = list(csv_reader)
del_file(list_row)#处理数据
# for row in csv_reader:
# del_file(row)#处理数据
break
except Exception as e:
print(f"TM10B读取文件{filename}出错: {e}")
# if i == 9:
# i = 0
continue
print("--------------------------------全部文件发送完毕------------------------------------------")#首次全部传输完成后,注释掉
#return#首次全部传输完成后,注释掉
# 打印文件内容
#content = file_data.read().decode('utf-8')
#print(content)
# 更新已知文件列表
known_files = current_files
ftp.quit()
except Exception as e:
print(f"TM10B读取当前目录出错: {e}")
# 等待下次检查
time.sleep(interval)
def analyze_file(filepath):
"""
分析文件内容
:param filepath: 文件路径
"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# 这里可以添加你的分析逻辑
print(f"TM10B文件大小: {len(content)} 字节")
#print(f"首100字符: {content[:100]}...")
except Exception as e:
print(f"TM10B读取文件 {filepath} 出错: {str(e)}")
# 连接回调函数
def on_connect1(client, userdata, flags, reason_code, properties):
if reason_code == 0:
print("TM10BConnected to MQTT Broker!")
else:
print(f"TM10BFailed to connect, return code {reason_code}")
if __name__ == "__main__":
# 创建MQTT客户端实例
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id)
#client = mqtt.Client(client_id)
client.on_connect = on_connect1
client.username_pw_set(userName, passWord)
# 连接到MQTT服务器
client.connect(broker, port, 60)
# 开始循环
client.loop_start()
# 初始文件列表
while True:
try:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
#ftp.set_pasv(True)
known_files = ftp.nlst()
print('获取TM10B初始目录:')
#print(known_files)
ftp.quit()
monitor_directory(known_files,10)
except Exception as e:
print(f"TM10B获取初始目录出错: {e}")
time.sleep(5)
import csv
import os
import time
from datetime import datetime
from datetime import datetime
from ftplib import FTP
import socket
import io
import pandas as pd
from io import BytesIO
import paho.mqtt.client as mqtt
import json
# MQTT服务器地址和端口
broker = "iot.raytue.com"
port = 1883
# 客户端ID
client_id = "S&D23ANR8041JQI&157&23"
userName="raytue"
passWord="P14AX03XD7W9G42Z"
# 发布主题
topic = "/157/D23ANR8041JQI/property/post"
# FTP服务器配置
FTP_SERVER = 'iot.raytue.com'
FTP_USER = 'tsensing'
FTP_PASS = 'tsensing!@#123'
FTP_DIR = '/tilt/170058(TM9)/' # FTP服务器上的目标目录,根据实际情况修改
def connect_ftp():
try:
ftp = FTP()
ftp.connect(FTP_SERVER) # 设置连接超时
ftp.login(FTP_USER, FTP_PASS)
#ftp.set_pasv(True)
ftp.cwd(FTP_DIR)
print(f"TM9成功连接 {FTP_SERVER}:{21}")
return ftp
except socket.timeout:
print("TM9连接超时,请检查网络或服务器状态")
except Exception as e:
print(f"TM9连接失败: {str(e)}")
def del_file(list_row):
# print(list_row[10])
number_row= len(list_row)
mqttstr=""
print("TM9列表中有",number_row,"行")
j=10
# if list_row[10][0] == "Time":#有的表格第10行不是数据是表头
# j=11
for i in range(number_row):
if list_row[i][0] == "Time":
j=i+1
break
i=0
for i in range(j,number_row):
#格式化mqtt字符串
mqttstr="[{\"id\":\"tiltData_time\",\"remark\":\"\",\"value\":\"%s\"},{\"id\":\"tiltData_dPitch\",\"remark\":\"\",\"value\":\"%s\"},{\"id\":\"tiltData_dRoll\",\"remark\":\"\",\"value\":\"%s\"}]" % (list_row[i][0] ,list_row[i][5] ,list_row[i][6] )
# print(mqttstr)
# payload = json.dumps(mqttstr)
payload = mqttstr
# 发布消息
result = client.publish(topic, payload)
# 检查消息是否成功发布
status = result[0]
if status == 0:
print(f"TM9Send `{payload}` to topic `{topic}`")
else:
print(f"TM9Failed to send message to topic {topic}")
time.sleep(1)
def monitor_directory(known_files,interval=60):
"""
监控指定目录的新增文件
"""
#known_files=[]#首次全部传输完成后注释掉
while True:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
# 获取当前文件列表
try:
#ftp.set_pasv(True)
current_files = ftp.nlst()#读文件列表
print('TM9当前目录------------>:')
# print(current_files)
# 找出新增文件
#new_files = current_files - known_files
new_files = [item for item in current_files if item not in known_files]
print('TM9新增文件--------->:')
print(new_files)
#new_files = ['44444444.csv']
if new_files:
print(f"[{datetime.now()}] 发现 {len(new_files)} 个新文件:")
for filename in new_files:
#filepath = os.path.join(directory, filename)
print(f"TM9分析文件: {filename}")
#analyze_file(filepath)
for i in range(10): # 从0到4 防止掉线读不出来
# 使用BytesIO作为文件缓冲区
try:
print(f"TM9第{i}次读取")
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
file_data = io.BytesIO()
ftp.retrbinary(f"RETR {filename}", file_data.write)
file_data.seek(0)
csv_data = file_data.read().decode('utf-8')
csv_reader = csv.reader(io.StringIO(csv_data))
#csv_reader = csv.reader(csv_data)
list_row = list(csv_reader)
del_file(list_row)#处理数据
# for row in csv_reader:
# del_file(row)#处理数据
break
except Exception as e:
print(f"TM9读取文件{filename}出错: {e}")
if i == 9:
i = 0
continue
print("--------------------------------全部文件发送完毕------------------------------------------")#首次全部传输完成后,注释掉
#return#首次全部传输完成后,注释掉
# 打印文件内容
#content = file_data.read().decode('utf-8')
#print(content)
# 更新已知文件列表
known_files = current_files
ftp.quit()
except Exception as e:
print(f"TM9读取当前目录出错: {e}")
# 等待下次检查
time.sleep(interval)
def analyze_file(filepath):
"""
分析文件内容
:param filepath: 文件路径
"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# 这里可以添加你的分析逻辑
print(f"TM9文件大小: {len(content)} 字节")
#print(f"首100字符: {content[:100]}...")
except Exception as e:
print(f"TM9读取文件 {filepath} 出错: {str(e)}")
# 连接回调函数
def on_connect1(client, userdata, flags, reason_code, properties):
if reason_code == 0:
print("TM9Connected to MQTT Broker!")
else:
print(f"TM9Failed to connect, return code {reason_code}")
if __name__ == "__main__":
# 创建MQTT客户端实例
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id)
#client = mqtt.Client(client_id)
client.on_connect = on_connect1
client.username_pw_set(userName, passWord)
# 连接到MQTT服务器
client.connect(broker, port, 60)
# 开始循环
client.loop_start()
# 初始文件列表
while True:
try:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
#ftp.set_pasv(True)
known_files = ftp.nlst()
print('TM9初始目录:')
#print(known_files)
ftp.quit()
monitor_directory(known_files,10)
except Exception as e:
print(f"TM9读取初始目录出错: {e}")
time.sleep(5)
import csv
import os
import time
from datetime import datetime
from ftplib import FTP
import socket
import io
import pandas as pd
from io import BytesIO
import paho.mqtt.client as mqtt
import json
# MQTT服务器地址和端口
broker = "iot.raytue.com"
port = 1883
# 客户端ID
client_id = "S&D23ANR8041JQI&157&23"
userName="raytue"
passWord="P14AX03XD7W9G42Z"
# 发布主题
topic = "/157/D23ANR8041JQI/property/post"
# FTP服务器配置
FTP_SERVER = 'iot.raytue.com'
FTP_USER = 'tsensing'
FTP_PASS = 'tsensing!@#123'
FTP_DIR = '/tilt/170058(TM9)/' # FTP服务器上的目标目录,根据实际情况修改
def connect_ftp():
try:
ftp = FTP()
ftp.connect(FTP_SERVER) # 设置连接超时
ftp.login(FTP_USER, FTP_PASS)
#ftp.set_pasv(True)
ftp.cwd(FTP_DIR)
print(f"TM9成功连接 {FTP_SERVER}:{21}")
return ftp
except socket.timeout:
print("TM9连接超时,请检查网络或服务器状态")
except Exception as e:
print(f"TM9连接失败: {str(e)}")
def del_file(list_row):
# print(list_row[10])
number_row= len(list_row)
mqttstr=""
print("TM9列表中有",number_row,"行数据需处理")
j=10
# if list_row[10][0] == "Time":#有的表格第10行不是数据是表头
# j=11
for i in range(number_row):
if list_row[i][0] == "Time":
j=i+1
break
i=0
for i in range(j,number_row):
#格式化mqtt字符串
if(len(list_row[i])== 8):#防止最后一行有数据缺失!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iso_str = list_row[i][0]
# 解析字符串,注意要指定时区信息
dt = datetime.fromisoformat(iso_str)
# 格式化为所需的格式
formatted_str = dt.strftime("%Y-%m-%d %H:%M:%S")
mqttstr="[{\"id\":\"tiltData_time\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"tiltData_dPitch\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"tiltData_dRoll\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"}]" \
% (list_row[i][0], formatted_str ,list_row[i][5], formatted_str ,list_row[i][6], formatted_str)
# print(mqttstr)
# payload = json.dumps(mqttstr)
payload = mqttstr
# 发布消息
result = client.publish(topic, payload)
# 检查消息是否成功发布
status = result[0]
if status == 0:
print(f"TM9Send `{payload}` to topic `{topic}`")
else:
print(f"TM9Failed to send message to topic {topic}")
time.sleep(0.05)#100ms传一次
def monitor_directory(known_files,interval=60):
"""
监控指定目录的新增文件
"""
# known_files=[]#首次全部传输完成后注释掉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
while True:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
# 获取当前文件列表
try:
#ftp.set_pasv(True)
current_files = ftp.nlst()#读文件列表
print('获取TM9当前目录------------>:')
# print(current_files)
# 找出新增文件
#new_files = current_files - known_files
new_files = [item for item in current_files if item not in known_files]
print('获取TM9新增文件--------->:')
print(new_files)
#new_files = ['44444444.csv']
if new_files:
print(f"[{datetime.now()}] 发现 {len(new_files)} 个新文件:")
for filename in new_files:
#filepath = os.path.join(directory, filename)
print(f"TM9分析文件: {filename}")
#analyze_file(filepath)
for i in range(10): # 从0到4 防止掉线读不出来
# 使用BytesIO作为文件缓冲区
try:
print(f"TM9第{i}次读取")
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
file_data = io.BytesIO()
ftp.retrbinary(f"RETR {filename}", file_data.write)
file_data.seek(0)
csv_data = file_data.read().decode('utf-8')
csv_reader = csv.reader((io.StringIO(csv_data).getvalue()).splitlines(),delimiter=',')
#csv_reader = csv.reader(csv_data)
list_row = list(csv_reader)
del_file(list_row)#处理数据
# for row in csv_reader:
# del_file(row)#处理数据
break
except Exception as e:
print(f"TM9读取文件{filename}出错: {e}")
# if i == 9:
# i = 0
continue
print("--------------------------------全部文件发送完毕------------------------------------------")#首次全部传输完成后,注释掉
#return#首次全部传输完成后,注释掉
# 打印文件内容
#content = file_data.read().decode('utf-8')
#print(content)
# 更新已知文件列表
known_files = current_files
ftp.quit()
except Exception as e:
print(f"TM9读取当前目录出错: {e}")
# 等待下次检查
time.sleep(interval)
def analyze_file(filepath):
"""
分析文件内容
:param filepath: 文件路径
"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# 这里可以添加你的分析逻辑
print(f"TM9文件大小: {len(content)} 字节")
#print(f"首100字符: {content[:100]}...")
except Exception as e:
print(f"TM9读取文件 {filepath} 出错: {str(e)}")
# 连接回调函数
def on_connect1(client, userdata, flags, reason_code, properties):
if reason_code == 0:
print("TM9Connected to MQTT Broker!")
else:
print(f"TM9Failed to connect, return code {reason_code}")
if __name__ == "__main__":
# 创建MQTT客户端实例
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id)
#client = mqtt.Client(client_id)
client.on_connect = on_connect1
client.username_pw_set(userName, passWord)
# 连接到MQTT服务器
client.connect(broker, port, 60)
# 开始循环
client.loop_start()
# 初始文件列表
while True:
try:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
#ftp.set_pasv(True)
known_files = ftp.nlst()
print('获取TM9初始目录:')
#print(known_files)
ftp.quit()
monitor_directory(known_files,10)
except Exception as e:
print(f"TM9获取初始目录出错: {e}")
time.sleep(5)
import csv
import os
import time
from datetime import datetime
from ftplib import FTP
import socket
import io
import pandas as pd
from io import BytesIO
import paho.mqtt.client as mqtt
import json
# MQTT服务器地址和端口
broker = "iot.raytue.com"
port = 1883
# 客户端ID
client_id = "S&D23538EQB38P9&158&23"
userName="raytue"
passWord="P3S856X7622UJX15"
# 发布主题
topic = "/158/D23538EQB38P9/property/post"
# FTP服务器配置
FTP_SERVER = 'iot.raytue.com'
FTP_USER = 'tsensing'
FTP_PASS = 'tsensing!@#123'
FTP_DIR = '/vibration/2b0653(VC104)/' # FTP服务器上的目标目录,根据实际情况修改
def connect_ftp():
try:
ftp = FTP()
ftp.connect(FTP_SERVER) # 设置连接超时
ftp.login(FTP_USER, FTP_PASS)
#ftp.set_pasv(True)
ftp.cwd(FTP_DIR)
print(f"VC104成功连接 {FTP_SERVER}:{21}")
return ftp
except socket.timeout:
print("VC104连接超时,请检查网络或服务器状态")
except Exception as e:
print(f"VC104连接失败: {str(e)}")
def del_file(list_row):
# print(list_row[10])
number_row= len(list_row)
mqttstr=""
print("VC104列表中有",number_row,"行数据需处理")
j=10
# if list_row[10][0] == "Time":#有的表格第10行不是数据是表头
# j=11
for i in range(number_row):
if list_row[i][0] == "Time":
j=i+1
break
i=0
for i in range(j,number_row):
#格式化mqtt字符串
if(len(list_row[i])== 18):#防止最后一行有数据缺失!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iso_str = list_row[i][0]
# 解析字符串,注意要指定时区信息
dt = datetime.fromisoformat(iso_str)
# 格式化为所需的格式
formatted_str = dt.strftime("%Y-%m-%d %H:%M:%S")
mqttstr="[{\"id\":\"vibrationData_time\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"vibrationData_PPVX\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"vibrationData_PPVY\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"vibrationData_PPVZ\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"vibrationData_PVS\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"}]" \
% (list_row[i][0], formatted_str ,list_row[i][1], formatted_str ,list_row[i][4], formatted_str,list_row[i][7] , formatted_str,list_row[i][10], formatted_str )
# print(mqttstr)
# payload = json.dumps(mqttstr)
payload = mqttstr
# 发布消息
result = client.publish(topic, payload)
# 检查消息是否成功发布
status = result[0]
if status == 0:
print(f"VC104Send `{payload}` to topic `{topic}`")
else:
print(f"VC104Failed to send message to topic {topic}")
time.sleep(0.05)#100ms传一次
def monitor_directory(known_files,interval=60):
"""
监控指定目录的新增文件
"""
# known_files=[]#首次全部传输完成后注释掉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
while True:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
# 获取当前文件列表
try:
#ftp.set_pasv(True)
current_files = ftp.nlst()#读文件列表
print('获取VC104当前目录------------>:')
# print(current_files)
# 找出新增文件
#new_files = current_files - known_files
new_files = [item for item in current_files if item not in known_files]
print('获取VC104新增文件--------->:')
print(new_files)
#new_files = ['44444444.csv']
if new_files:
print(f"[{datetime.now()}] 发现 {len(new_files)} 个新文件:")
for filename in new_files:
#filepath = os.path.join(directory, filename)
print(f"VC104分析文件: {filename}")
#analyze_file(filepath)
for i in range(10): # 从0到4 防止掉线读不出来
# 使用BytesIO作为文件缓冲区
try:
print(f"VC104第{i}次读取")
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
file_data = io.BytesIO()
ftp.retrbinary(f"RETR {filename}", file_data.write)
file_data.seek(0)
csv_data = file_data.read().decode('utf-8')
csv_reader = csv.reader((io.StringIO(csv_data).getvalue()).splitlines(),delimiter=',')
#csv_reader = csv.reader(csv_data)
list_row = list(csv_reader)
del_file(list_row)#处理数据
# for row in csv_reader:
# del_file(row)#处理数据
break
except Exception as e:
print(f"VC104读取文件{filename}出错: {e}")
# if i == 9:
# i = 0
continue
print("--------------------------------全部文件发送完毕------------------------------------------")#首次全部传输完成后,注释掉
#return#首次全部传输完成后,注释掉
# 打印文件内容
#content = file_data.read().decode('utf-8')
#print(content)
# 更新已知文件列表
known_files = current_files
ftp.quit()
except Exception as e:
print(f"VC104读取当前目录出错: {e}")
# 等待下次检查
time.sleep(interval)
def analyze_file(filepath):
"""
分析文件内容
:param filepath: 文件路径
"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# 这里可以添加你的分析逻辑
print(f"VC104文件大小: {len(content)} 字节")
#print(f"首100字符: {content[:100]}...")
except Exception as e:
print(f"VC104读取文件 {filepath} 出错: {str(e)}")
# 连接回调函数
def on_connect1(client, userdata, flags, reason_code, properties):
if reason_code == 0:
print("VC104Connected to MQTT Broker!")
else:
print(f"VC104Failed to connect, return code {reason_code}")
if __name__ == "__main__":
# 创建MQTT客户端实例
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id)
#client = mqtt.Client(client_id)
client.on_connect = on_connect1
client.username_pw_set(userName, passWord)
# 连接到MQTT服务器
client.connect(broker, port, 60)
# 开始循环
client.loop_start()
# 初始文件列表
while True:
try:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
#ftp.set_pasv(True)
known_files = ftp.nlst()
print('获取VC104初始目录:')
#print(known_files)
ftp.quit()
monitor_directory(known_files,10)
except Exception as e:
print(f"VC104获取初始目录出错: {e}")
time.sleep(5)
\ No newline at end of file
import csv
import os
import time
from datetime import datetime
from ftplib import FTP
import socket
import io
import pandas as pd
from io import BytesIO
import paho.mqtt.client as mqtt
import json
# MQTT服务器地址和端口
broker = "iot.raytue.com"
port = 1883
# 客户端ID
client_id = "S&D239F9D04LVM9&158&23"
userName="raytue"
passWord="P3S856X7622UJX15"
# 发布主题
topic = "/158/D239F9D04LVM9/property/post"
# FTP服务器配置
FTP_SERVER = 'iot.raytue.com'
FTP_USER = 'tsensing'
FTP_PASS = 'tsensing!@#123'
FTP_DIR = '/vibration/2b0652(VC22)/' # FTP服务器上的目标目录,根据实际情况修改
def connect_ftp():
try:
ftp = FTP()
ftp.connect(FTP_SERVER) # 设置连接超时
ftp.login(FTP_USER, FTP_PASS)
#ftp.set_pasv(True)
ftp.cwd(FTP_DIR)
print(f"VC22成功连接 {FTP_SERVER}:{21}")
return ftp
except socket.timeout:
print("VC22连接超时,请检查网络或服务器状态")
except Exception as e:
print(f"VC22连接失败: {str(e)}")
def del_file(list_row):
# print(list_row[10])
number_row= len(list_row)
mqttstr=""
print("VC22列表中有",number_row,"行数据需处理")
j=10
# if list_row[10][0] == "Time":#有的表格第10行不是数据是表头
# j=11
for i in range(number_row):
if list_row[i][0] == "Time":
j=i+1
break
i=0
for i in range(j,number_row):
#格式化mqtt字符串
if(len(list_row[i])== 18):#防止最后一行有数据缺失!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
iso_str = list_row[i][0]
# 解析字符串,注意要指定时区信息
dt = datetime.fromisoformat(iso_str)
# 格式化为所需的格式
formatted_str = dt.strftime("%Y-%m-%d %H:%M:%S")
mqttstr="[{\"id\":\"vibrationData_time\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"vibrationData_PPVX\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"vibrationData_PPVY\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"vibrationData_PPVZ\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"},\
{\"id\":\"vibrationData_PVS\",\"remark\":\"\",\"value\":\"%s\",\"ts\":\"%s\"}]" \
% (list_row[i][0], formatted_str ,list_row[i][1], formatted_str ,list_row[i][4], formatted_str,list_row[i][7] , formatted_str,list_row[i][10], formatted_str )
# print(mqttstr)
# payload = json.dumps(mqttstr)
payload = mqttstr
# 发布消息
result = client.publish(topic, payload)
# 检查消息是否成功发布
status = result[0]
if status == 0:
print(f"VC22Send `{payload}` to topic `{topic}`")
else:
print(f"VC22Failed to send message to topic {topic}")
time.sleep(0.05)#100ms传一次
def monitor_directory(known_files,interval=60):
"""
监控指定目录的新增文件
"""
# known_files=[]#首次全部传输完成后注释掉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
while True:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
# 获取当前文件列表
try:
#ftp.set_pasv(True)
current_files = ftp.nlst()#读文件列表
print('获取VC22当前目录------------>:')
# print(current_files)
# 找出新增文件
#new_files = current_files - known_files
new_files = [item for item in current_files if item not in known_files]
print('获取VC22新增文件--------->:')
print(new_files)
#new_files = ['44444444.csv']
if new_files:
print(f"[{datetime.now()}] 发现 {len(new_files)} 个新文件:")
for filename in new_files:
#filepath = os.path.join(directory, filename)
print(f"VC22分析文件: {filename}")
#analyze_file(filepath)
for i in range(10): # 从0到4 防止掉线读不出来
# 使用BytesIO作为文件缓冲区
try:
print(f"VC22第{i}次读取")
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
file_data = io.BytesIO()
ftp.retrbinary(f"RETR {filename}", file_data.write)
file_data.seek(0)
csv_data = file_data.read().decode('utf-8')
csv_reader = csv.reader((io.StringIO(csv_data).getvalue()).splitlines(),delimiter=',')
#csv_reader = csv.reader(csv_data)
list_row = list(csv_reader)
del_file(list_row)#处理数据
# for row in csv_reader:
# del_file(row)#处理数据
break
except Exception as e:
print(f"VC22读取文件{filename}出错: {e}")
# if i == 9:
# i = 0
continue
print("--------------------------------全部文件发送完毕------------------------------------------")#首次全部传输完成后,注释掉
#return#首次全部传输完成后,注释掉
# 打印文件内容
#content = file_data.read().decode('utf-8')
#print(content)
# 更新已知文件列表
known_files = current_files
ftp.quit()
except Exception as e:
print(f"VC22读取当前目录出错: {e}")
# 等待下次检查
time.sleep(interval)
def analyze_file(filepath):
"""
分析文件内容
:param filepath: 文件路径
"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# 这里可以添加你的分析逻辑
print(f"VC22文件大小: {len(content)} 字节")
#print(f"首100字符: {content[:100]}...")
except Exception as e:
print(f"VC22读取文件 {filepath} 出错: {str(e)}")
# 连接回调函数
def on_connect1(client, userdata, flags, reason_code, properties):
if reason_code == 0:
print("VC22Connected to MQTT Broker!")
else:
print(f"VC22Failed to connect, return code {reason_code}")
if __name__ == "__main__":
# 创建MQTT客户端实例
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id)
#client = mqtt.Client(client_id)
client.on_connect = on_connect1
client.username_pw_set(userName, passWord)
# 连接到MQTT服务器
client.connect(broker, port, 60)
# 开始循环
client.loop_start()
# 初始文件列表
while True:
try:
ftp = connect_ftp()
ftp.cwd(FTP_DIR)
#ftp.set_pasv(True)
known_files = ftp.nlst()
print('获取VC22初始目录:')
#print(known_files)
ftp.quit()
monitor_directory(known_files,10)
except Exception as e:
print(f"VC22获取初始目录出错: {e}")
time.sleep(5)
\ No newline at end of file
import subprocess
import signal
import time
import os
from typing import Dict
class ScriptManager:
def __init__(self):
self.processes: Dict[str, subprocess.Popen] = {}
signal.signal(signal.SIGTERM, self._handle_signal)
signal.signal(signal.SIGINT, self._handle_signal)
def start_script(self, name: str, script_path: str) -> None:
"""启动指定脚本并记录进程"""
if name in self.processes:
print(f"脚本 {name} 已在运行")
return
proc = subprocess.Popen(
["python", script_path],
start_new_session=True # 防止僵尸进程
)
self.processes[name] = proc
print(f"已启动脚本 {name} (PID: {proc.pid})")
def stop_script(self, name: str, timeout=5) -> None:
"""优雅停止指定脚本"""
if name not in self.processes:
print(f"脚本 {name} 未运行")
return
proc = self.processes[name]
try:
proc.terminate() # 先发送SIGTERM
proc.wait(timeout=timeout)
except subprocess.TimeoutExpired:
proc.kill() # 超时后强制终止
print(f"强制终止脚本 {name}")
finally:
self.processes.pop(name)
print(f"已停止脚本 {name}")
def stop_all(self) -> None:
"""停止所有管理的脚本"""
for name in list(self.processes.keys()):
self.stop_script(name)
def _handle_signal(self, signum, frame) -> None:
"""处理终止信号"""
print(f"\n接收到终止信号 {signum}, 正在停止所有脚本...")
self.stop_all()
exit(0)
def list_scripts(self) -> None:
"""列出所有运行中的脚本"""
print("运行中的脚本:")
for name, proc in self.processes.items():
status = "运行中" if proc.poll() is None else "已停止"
print(f"- {name} (PID: {proc.pid}, 状态: {status})")
if __name__ == "__main__":
manager = ScriptManager()
# 示例用法
manager.start_script("worker1", "./filemonitorservice/filemonitorTM9.py")
manager.start_script("worker2", "./filemonitorservice/filemonitorTM10.py")
manager.start_script("worker3", "./filemonitorservice/filemonitorTM10A.py")
manager.start_script("worker4", "./filemonitorservice/filemonitorTM10B.py")
manager.start_script("worker5", "./filemonitorservice/filemonitorVC22.py")
manager.start_script("worker6", "./filemonitorservice/filemonitorVC104.py")
manager.start_script("worker7", "./reportservice/report_tilt.py")
manager.start_script("worker8", "./reportservice/report_vibration.py")
manager.start_script("worker9", "./reportservice/email_task.py")
manager.list_scripts()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
manager.stop_all()
This source diff could not be displayed because it is too large. You can view the blob instead.
2 個 Vibration sensor and 4 個 tilt sensor 會先把 data 以 csv file 推送到指定的 ftp (根很久之前給你試的差不多方式), 之後需要每天只取csv內的某個時間的一個數值, 自動出 daily report 及 send email 給客戶(可能有多個 email 需要接收).
1、物联网平台SaaS版
2、传感器数据对接(2个振动传感器、4个倾角传感器)
3、每日生成报告并发送到多个客户邮箱
configparser
\ No newline at end of file
import requests # type: ignore
import json
from datetime import datetime, timedelta
import pandas as pd
import xlsxwriter # type: ignore
def create_excel_with_chart(result_df, output_file):
result_df['dPitch']=pd.to_numeric(result_df['dPitch'], errors='coerce')
result_df['dRoll']=pd.to_numeric(result_df['dRoll'], errors='coerce')
# 创建Excel写入器
writer = pd.ExcelWriter(output_file, engine='xlsxwriter')
# 将DataFrame写入Excel
result_df.to_excel(writer, sheet_name='Data', startrow=25,index=False)
# 获取工作簿和工作表对象
workbook = writer.book
worksheet = writer.sheets['Data']
# 创建折线图
chart = workbook.add_chart({'type': 'line'})
# 配置图表数据
max_row = len(result_df) +1 # +1因为第一行是标题
chart.add_series({
'name': 'dPitch',
'categories': ['Data', 1+25, 0, max_row-1+25, 0], # Date列作为X轴
'values': ['Data', 1+25, 3, max_row-1+25, 3], # dPitch列作为Y轴
})
# 设置图表标题和轴标签
chart.set_title({'name': 'dPitch over Time'})
chart.set_x_axis({'name': 'Date'})
chart.set_y_axis({'name': 'dPitch'})
chart.set_size({'width': 480, 'height': 320})
# 设置日期格式的X轴
chart.set_x_axis({'date_axis': True})
# 将图表插入工作表
worksheet.insert_chart('B2', chart)
# 保存Excel文件
writer.close()
url = "https://iot.raytue.com/prod-api/login"
payload = {
"username": "admin",
"password": "@raytue123",
"sourceType": 1
}
headers = {
'Content-Type': 'application/json'
}
# 发送POST请求
response = requests.post(url, headers=headers, data=json.dumps(payload))
# 检查请求是否成功
if response.status_code == 200:
# 解析并打印返回的数据
data = response.json()
print(json.dumps(data, indent=4))
else:
# 打印错误信息
print(f"请求失败,状态码:{response.status_code},响应内容:{response.text}")
token= data["token"]
# 定义token和请求接口#
#token = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjcwNTdmNzIzLTY5NDUtNDgyZS04ZDViLTgyNjZjNjZhOTg2NCJ9.7Akf3R2AXpYNkGn3LhRkINZjRa7ZWUx1O3zCR6R6rcw5IF0083v5Jypv2OmKfItJxqLTNHLsNJGEVl74qC7FAA"
url = "https://iot.raytue.com/prod-api/data/center/deviceHistory"
# 定义请求的载荷
payload ={
"deviceId": 278,
"serialNumber": "D2367JBEYPY32",
"identifierList": [
{
"identifier": "tiltData_time",
"type": 1
},
{
"identifier": "tiltData_dRoll",
"type": 1
},
{
"identifier": "tiltData_dPitch",
"type": 1
}
],
"beginTime": "2025-05-30 11:45:12",
"endTime": "2025-06-06 11:45:12"
}
# 设置请求头,包括Authorization
headers = {
'Authorization': token,
'Content-Type': 'application/json'
}
# 发送POST请求
response = requests.post(url, headers=headers, data=json.dumps(payload))
# 检查请求是否成功
if response.status_code == 200:
# 解析并打印返回的数据
data1 = response.json()
# print(json.dumps(data1, indent=4))
else:
# 打印错误信息
print(f"请求失败,状态码:{response.status_code},响应内容:{response.text}")
original_json = json.dumps(data1, indent=4)
# 将JSON字符串转换为Python字典
data_dict = json.loads(original_json)
# 初始化tiltData数组
tilt_data_array = []
# 遍历data数组
for item in data_dict['data']:
# 获取时间戳作为键(这里我们不需要它作为最终输出的一部分,但用它来访问内部列表)
timestamp_key = list(item.keys())[0]
# 获取与该时间戳关联的数据列表
data_list = item[timestamp_key]
# 初始化一个空字典来存储组合后的数据
combined_data = {}
# 遍历数据列表,将相关数据合并到字典中
for data in data_list:
for key, value in data.items():
combined_data[key] = value
# 将组合后的数据字典添加到tiltData数组中
tilt_data_array.append(combined_data)
# # 将结果插入回原始字典中的新键'tiltData'
# data_dict['tiltData'] = tilt_data_array
# # 将修改后的字典转换为JSON字符串并打印
# modified_json = json.dumps(data_dict, indent=4)
#print(tilt_data_array)
# print(len(tilt_data_array))
# 打开(或创建)TXT文件并写入字符串
# with open('output.txt', 'w', encoding='utf-8') as file:
# file.write(str(tilt_data_array))
tilt_data = json.dumps(tilt_data_array)
# 转换为DataFrame
df = pd.DataFrame(json.loads(tilt_data))
#print(df['tiltData_time'])
# 将字符串时间转换为datetime对象
df['tiltData_time'] =pd.to_datetime( df['tiltData_time'].str.slice(stop=-6))
# 获取当前日期和时间
current_time = datetime.now()
# print(current_time)
# 计算前30天的日期列表
dates = [current_time - timedelta(days=i) for i in range(1, 31)]
# 初始化一个空的DataFrame来存储结果
result_df = pd.DataFrame(columns=['Date', 'Time', 'dRoll', 'dPitch'])
# 遍历前30天的日期
for date in dates:
# 获取当天上午的数据
# print("--------------------------------------------------------------------")
# print(date.date())
day_data = df[(df['tiltData_time'].dt.date == date.date()) & (df['tiltData_time'].dt.hour < 12)]
# print(day_data)
# print("--------------------------------------------------------------------")
# print(day_data)
# 如果当天有数据,则找到最接近10点30分的数据
if not day_data.empty:
# 计算每个数据与10点30分的时间差
time_diffs = abs(day_data['tiltData_time']- pd.to_datetime(f'{date.date()} 10:30:00'))
print("--------------------------------------------------------------------")
print(time_diffs.idxmin())
# # 找到时间差最小的数据
closest_data = df.iloc[time_diffs.idxmin()]
print(closest_data)
# 将数据添加到结果DataFrame中
result_df = result_df._append({
'Date': closest_data['tiltData_time'].date(),
'Time': closest_data['tiltData_time'].time(),
'dRoll': closest_data['tiltData_dRoll'],
'dPitch': closest_data['tiltData_dPitch']
}, ignore_index=True)
# 按照时间从小到大排序
result_df = result_df.sort_values(by=['Date', 'Time'])
reportname ='report'+ str(datetime.now().date()).replace("-", "") + '.xlsx'
# 将结果保存到Excel表格中
result_df.to_excel(reportname, index=False)
print(f"数据已保存到{reportname}文件中。")
create_excel_with_chart(result_df,'output_with_chart.xlsx')
import os
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
import schedule # type: ignore
import time
from datetime import datetime
import configparser
# 配置信息
SMTP_SERVER = '' # SMTP服务器地址
SMTP_PORT = '' # SMTP端口
SENDER_EMAIL = '' # 发件邮箱
SENDER_PASSWORD = '' # 邮箱密码
RECIPIENTS = '' # 收件人列表
FILE_PREFIX = 'tilt_report_' # 文件前缀
FILE_PREFIX2 = 'vibration_report_' # 文件前缀
FILE_DIR = './report' # 文件目录
def get_today_filename():
"""获取当天日期的文件名"""
# today = datetime.now().strftime('%Y%m%d')
today = str(datetime.now().date()).replace("-", "")
return [f"{FILE_PREFIX}{today}.xlsx",f"{FILE_PREFIX2}{today}.xlsx"]
def send_email(SMTP_SERVER,SMTP_PORT,SENDER_EMAIL,SENDER_PASSWORD,RECIPIENTS):
"""发送邮件函数"""
filename = get_today_filename()
filepath = os.path.join(FILE_DIR, filename[0])
filepath2 = os.path.join(FILE_DIR, filename[1])
if not os.path.exists(filepath):
print(f"文件 {filename[0]} 不存在")
return
if not os.path.exists(filepath2):
print(f"文件 {filename[1]} 不存在")
return
msg = MIMEMultipart()
msg['From'] = SENDER_EMAIL
msg['To'] = ', '.join(RECIPIENTS)
msg['Subject'] = f"每日报告 - {datetime.now().strftime('%Y-%m-%d')}"
# 添加附件
with open(filepath, 'rb') as f:
part = MIMEApplication(f.read(), Name=filename[0])
part['Content-Disposition'] = f'attachment; filename="{filename[0]}"'
msg.attach(part)
with open(filepath2, 'rb') as f:
part = MIMEApplication(f.read(), Name=filename[1])
part['Content-Disposition'] = f'attachment; filename="{filename[1]}"'
msg.attach(part)
try:
server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
server.starttls()
server.login(SENDER_EMAIL, SENDER_PASSWORD)
server.sendmail(SENDER_EMAIL, RECIPIENTS, msg.as_string())
server.quit()
print(f"{datetime.now()}: 邮件发送成功")
except Exception as e:
print(f"邮件发送失败: {str(e)}")
def job():
"""定时任务"""
print(f"{datetime.now()}: 开始执行发送任务")
# 创建ConfigParser对象并读取INI文件
config = configparser.ConfigParser()
config.read('./config.ini') # 确保路径正确,替换为你的文件名
SMTP_SERVER = config['EMAIL']['SMTP_SERVER']# SMTP服务器地址
SMTP_PORT = config.get('EMAIL','SMTP_PORT' ) # SMTP端口
SENDER_EMAIL = config['EMAIL']['SENDER_EMAIL'] # 发件邮箱
SENDER_PASSWORD = config['EMAIL']['SENDER_PASSWORD'] # 邮箱密码
RECIPIENTS = config.get('EMAIL', 'RECIPIENTS').split(',') # 收件人列表
send_email(SMTP_SERVER,SMTP_PORT,SENDER_EMAIL,SENDER_PASSWORD,RECIPIENTS)
if __name__ == '__main__':
# 每天8:30执行
print("邮件自动发送程序已启动...")
# 创建ConfigParser对象并读取INI文件
config = configparser.ConfigParser()
config.read('./config.ini') # 确保路径正确,替换为你的文件名
EMAIL_TIME= config['REPORTTIME']['EMAIL_TIME']
schedule.every().day.at(EMAIL_TIME).do(job)
while True:
schedule.run_pending()
time.sleep(60)
TM10B 113.981321 22.389807
TM10A 113.9812 22.389619
TM10 113.981541 22.389464
TM9 113.981685 22.389636
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment