from scapy.all import sniff, IP, TCP, UDP, Raw
import datetime
import os
TARGET_IP = "192.168.100.1"
LOG_FILE = "C:/laser_time/report.csv"
os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True)
start_time = None
last_activity = None
idle_limit = 3.0 # секунды тишины = конец резки
print(f"Запущен перехват трафика до {TARGET_IP}")
print("Нажми Ctrl+C для остановки\n")
def packet_handler(pkt):
global start_time, last_activity
if IP not in pkt:
return
# Проверяем: относится ли пакет к станку
if pkt[IP].src != TARGET_IP and pkt[IP].dst != TARGET_IP:
return
now = datetime.datetime.now()
# Если в пакете есть данные (payload)
payload = b""
if Raw in pkt:
payload = pkt[Raw].load
elif TCP in pkt and pkt[TCP].payload:
payload = bytes(pkt[TCP].payload)
elif UDP in pkt and pkt[UDP].payload:
payload = bytes(pkt[UDP].payload)
if not payload:
return
# Фиксируем начало
if start_time is None:
start_time = now
print("▶ Резка началась:", start_time.strftime("%H:%M:%S"))
last_activity = now
# Показываем первые 80 байт (для отладки)
print(f"[{now.strftime('%H:%M:%S')}] {len(payload)} байт | {payload[:80]}")
def check_idle():
"""Проверяем, не закончилась ли резка"""
global start_time, last_activity
if start_time and last_activity:
idle = (datetime.datetime.now() - last_activity).total_seconds()
if idle > idle_limit:
end_time = datetime.datetime.now()
duration = end_time - start_time
with open(LOG_FILE, "a", encoding="utf-8") as f:
f.write(f"{start_time.date()};{start_time.time()};{end_time.time()};{duration.total_seconds():.1f}\n")
print("■ Резка завершена. Длительность:", duration)
start_time = None
last_activity = None
# Запускаем сниффер
try:
while True:
sniff(prn=packet_handler, timeout=1, filter=f"host {TARGET_IP}", store=False)
check_idle()
except KeyboardInterrupt:
print("\nОстановлено вручную")