關鍵字:

iFlow、dumpcap、tshark、tcpflow、ngrep、BPF過濾器、JSON

⚠️ 注意事項

  • 對於不能丟失端口數據包信息的ATIS監控需求,dumpcap是最佳選擇,其次是優化配置的tcpdump。這兩個工具都能在內核層面進行高效抓包,並提供完善的緩衝和輪轉機制來防止數據丟失。
  • .\TotalMonitor\logs\totalMonitor.log日誌中記錄:"atisVersion":"H","updateTime":"2025-12-25 00:00:41"
2025-12-25 00:00:51.836 [Thread-16] INFO  com.adcc.thread.DatisThread:  Datis json: {"status":"UP","data":{"ip":"127.0.0.1","category":"SINGLE_CLI","atisVersion":"H","updateTime":"2025-12-25 00:00:41","expiredTime":"2025-12-25 01:05:41","broadcast":0,"voice":0,"aftngs":0,"db":0,"edit":0,"ws":0,"version":"3.9.1"}}
2025-12-25 00:00:51.839 [Thread-16] INFO  com.adcc.thread.DatisThread:  DatisThread to changeUI


🎯 TLDR

  1. dumpcap - 最推薦 ⭐⭐⭐⭐⭐

理由:

  • 零數據丟失:作為Wireshark核心引擎,使用內核級抓包,性能最優
  • 環形緩衝機制:-b filesize:100000 -b files:10 避免磁盤滿導致的數據丟失
  • 精確端口過濾:-f "tcp port 80" 在內核層面就過濾,減少不必要的數據處理
  • 支持多接口:-i any 確保抓取所有網絡接口的數據包
  1. tcpdump - 次推薦 ⭐⭐⭐⭐

理由:

  • 成熟穩定:經過長期驗證,在各種環境下表現穩定
  • 靈活的過濾語法:可以精確指定端口範圍
  • 緩衝區控制:-B 參數可以調整緩衝區大小
  • 輕量高效:資源佔用相對較少
  1. tshark - 中等推薦 ⭐⭐⭐

理由:

  • 強大的解析能力:但解析過程可能增加處理延遲
  • 實時輸出:-l 參數啓用行緩衝,但仍有丟失風險
  • 資源佔用較高:協議解析消耗更多CPU和內存
  1. tcpflow - 不太推薦 ⭐⭐

理由:

  • 流重組延遲:需要等待完整TCP流才能輸出,實時性差
  • 內存佔用大:重組過程需要大量內存
  • 可能丟失瞬時數據:流未完成時數據暫存內存
  1. ngrep - 最不推薦 ⭐

理由:

  • 高層應用:工作在應用層,可能丟失底層包信息
  • 模式匹配限制:只輸出匹配的行,可能遺漏重要上下文
  • 緩衝機制簡單:沒有高級的緩衝和文件輪轉機制

1、原來的東東,tcpdump抓包獲取atisVersion

sudo   python sendVer2Com1.py ttyS1
sendVer2Com1.py                  //輸出模版: ./data/atis.xml
# -*- coding:utf-8 -*-
import os
import struct
import subprocess
import sys
import binascii
import time
import serial

def unpack2ascii(_hex):
    byte = binascii.a2b_hex(_hex)
    version = struct.unpack("%ss" % str(len(byte)), byte)[0]
    version = version.strip()[:]
    return version
def searchVersion():
    process = subprocess.Popen(["tcpdump", "-x"], stdout=subprocess.PIPE)
    ver_before = ' '
    while True:
        next_line = process.stdout.readline().split(":")[-1].strip().replace(" ", "")
        #print(next_line)
        if next_line != '' and "6174697356657273696f6e22" in next_line:  # 'Upd'ateTime=
            #print("aaa")
            version = unpack2ascii(next_line[:])
            ver_alpha = version[14:15]
            #print(ver_alpha)
            if  ver_before !=  ver_alpha :
                ver_before = ver_alpha
                print    (atisxml + read_data.format(ver_alpha))  #output to serial
                ser.write(atisxml + read_data.format(ver_alpha))
        else:
            time.sleep(0.01)
if __name__ == '__main__':
    try:
        comNo = sys.argv[1]      #使用ttyS1
        comNo = '/dev/' + str(comNo)
    except:
        print("Please input serial numner,such as ttyS1 !!!")
        os._exit(1)
    ser = serial.Serial(comNo, timeout=1)
    with open('./data/atis.xml', 'r') as f:
        read_data = f.read()
        atisxml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n'
    searchVersion()

2、新程序monitor_atis_version.py,從logs/totalMonitor.log日誌中獲取atisVersion字段的值

提示詞:   使用iFlow, glm-4.7模型
編寫python程序,實時動態讀取日誌@logs/totalMonitor.log ,從日誌中這個位置2025-12-25 00:00:51.836 [Thread-16] INFO
   com.adcc.thread.DatisThread:  Datis json:
   {"status":"UP","data":{"ip":"127.0.0.1","category":"SINGLE_CLI","atisVersion":"H","updateTime":"2025-12-25
   00:00:41","expiredTime":"2025-12-25
   01:05:41","broadcast":0,"voice":0,"aftngs":0,"db":0,"edit":0,"ws":0,"version":"3.9.1"}}獲取"atisVersion":"H"信息,並將
   atisVersion的值,例如這裏是H,賦值給變量ver_alpha返回,要求持續監控並動態輸出最新的atisVersion值
---
執行結果:
成功創建了Python程序來實時監控日誌文件並提取atisVersion信息。程序的主要功能如下:
  程序功能
   1. 實時監控日誌文件:監控.\TotalMonitor\logs\totalMonitor.log 文件
   2. 解析日誌行:使用正則表達式匹配包含 "Datis json" 的日誌行
   3. 提取JSON數據:從日誌行中提取JSON字符串並解析
   4. 獲取atisVersion:從解析的JSON數據中提取 atisVersion 字段的值
   5. 歷史日誌查詢:首先檢查歷史日誌中是否已有atisVersion信息
   6. 實時監控:如果歷史日誌中沒有,則開始實時監控新日誌
使用方法
    python monitor_atis_version.py
  程序會返回 ver_alpha 變量,其中包含從日誌中提取的atisVersion值。程序會先檢查歷史日誌,如果沒有找到則會持續監控新的日誌條目,直到找到ati
  sVersion信息或用户按Ctrl+C停止監控。