Загрузка данных


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Остановлено вручную")