Thiết Kế Nhanh Công Cụ Kiểm Tra Mạng QuickPing Bằng Python

Hướng Dẫn Xây Dựng Ứng Dụng QuickPing Nhẹ Nhàng

Trong quy trình bảo trì hạ tầng mạng, việc kiểm tra độ trễ và khả năng kết nối giữa các node là hoạt động thường xuyên. Mặc dù lệnh ping tích hợp sẵn trên hệ điều hành đáp ứng nhu cầu cơ bản, nó thiếu khả năng lưu trữ lịch sử và trực quan hóa dữ liệu. Bài viết này trình bày quy trình xây dựng một công cụ QuickPing tùy chỉnh với thời gian phát triển ngắn gọn.

Phân Tích Yêu Cầu Chức Năng

Kiến trúc của sản phẩm tối giản (MVP) cần tập trung vào các mục tiêu chính sau:

  • Tính năng ICMP: Gửi yêu cầu ping đến tên miền hoặc địa chỉ IP xác định.
  • Giao diện phản hồi: Hiển thị trạng thái kết nối theo thời gian thực.
  • Thống kê hiệu năng: Tự động tính toán độ trễ trung bình và tỷ lệ mất gói tin.
  • Tải xuống dữ liệu: Cho phép xuất kết quả kiểm tra sang định dạng .csv.
  • Đa nền tảng: Tương thích cả môi trường web và ứng dụng máy tính để bàn.

Lựa Chọn Công Nghệ và Kiến Trúc

Để đảm bảo tốc độ phát triển và khả năng vận chuyển chéo, bộ kỹ thuật được chọn bao gồm:

  • Ngôn ngữ cốt lõi: Python, nhờ thư viện mạng phong phú và tính linh hoạt cao.
  • Backend & Giao diện: Framework Flask giúp tạo server đơn giản với giao diện HTML/CSS nhúng.
  • Packaging: Sử dụng Electron để đóng gói mã nguồn web thành ứng dụng desktop độc lập.
  • Cấu trúc tệp: Đơn giản hóa bằng cách gom nhóm logic nghiệp vụ vào một script chính.

Triển Khai Các Chức Năng Chính

Phần dưới đây mô tả chi tiết logic xử lý ping và hiển thị dữ liệu.

1. Xử Lý Lệnh Ping Đa Nền Tảng

Sử dụng module subprocess để gọi lệnh hệ thống. Cần xử lý khác biệt về cú pháp giữa Windows (-n) và Unix/macOS (-c).

import os
import subprocess
import re

class NetworkProbe:
    def __init__(self, target_address):
        self.destination = target_address
    
    def run_check(self, packet_count=4):
        params = []
        # Xác định tham số dựa trên hệ điều hành
        if os.name == 'nt':
            params = ['ping', '-n', str(packet_count), self.destination]
        else:
            params = ['ping', '-c', str(packet_count), self.destination]
            
        try:
            output = subprocess.check_output(params, stderr=subprocess.STDOUT)
            return self._decode_response(output.decode('utf-8'))
        except Exception as e:
            return {'error': str(e)}

    def _decode_response(self, response_text):
        # Trích xuất thời gian phản hồi từ chuỗi văn bản
        latency_list = []
        # Regex chung để bắt match thời gian ở cả hai nền tảng
        pattern = r"time[=<](\d+(\.\d+)?)ms" 
        matches = re.findall(pattern, response_text)
        
        if matches:
            latency_list = [float(m[0]) for m in matches]
            
        avg_latency = round(sum(latency_list) / len(latency_list), 2) if latency_list else None
        return {
            'success': True,
            'latencies': latency_list,
            'average_ms': avg_latency,
            'packets_sent': packet_count,
            'lost': packet_count - len(latencies)
        }

2. Giao Diện Web Với Flask

Tạo đường dẫn API để nhận yêu cầu từ frontend và trả về JSON.

from flask import Flask, jsonify, render_template_string
import uuid

app = Flask(__name__)

@app.route('/')
def dashboard():
    html_template = '''
    <html><body>
        <input id="ipInput" placeholder="Nhập IP...">
        <button onclick="startTest()">Bắt đầu kiểm tra</button>
        <div id="result"></div>
        <script>
            async function startTest() {
                const ip = document.getElementById('ipInput').value;
                const res = await fetch(`/api/ping?url=${ip}`);
                const data = await res.json();
                document.getElementById('result').innerText = JSON.stringify(data);
            }
        </script>
    </body></html>
    '''
    return render_template_string(html_template)

@app.route('/api/ping')
def api_ping():
    url = request.args.get('url')
    probe = NetworkProbe(url)
    # Thực thi kiểm tra và trả kết quả
    result_data = probe.run_check()
    return jsonify(result_data)

if __name__ == '__main__':
    app.run(debug=True)

3. Xuất Dữ Liệu Sang CSV

Sử dụng module csv nội tại để ghi log kiểm tra hàng loạt.

import csv
from datetime import datetime

def save_results_to_file(results_log, filename='network_report.csv'):
    headers = ['Thời Gian', 'Địa Chỉ', 'Trạng Thái', 'Độ Trễ Trung Bình', 'Mất Gói']
    
    with open(filename, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(headers)
        
        for entry in results_log:
            timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            writer.writerow([
                timestamp,
                entry['address'],
                entry['status'],
                entry['avg_latency'],
                f"{entry['loss_percent']}%"
            ])
    return filename

Gói Đóng Cho Môi Trường Desktop

Để biến ứng dụng web này thành phần mềm chạy độc lập trên máy tính người dùng, có thể kết hợp Electron. Cấu hình chính nằm trong tệp main.js, nơi khởi tạo cửa sổ trình duyệt tải trang Flask đang chạy ở localhost.

Quy trình đóng gói yêu cầu cài đặt Node.js, thiết lập thông tin gói npm phù hợp và chạy lệnh build tương ứng cho từng hệ điều hành (Windows, macOS, Linux) nhằm tạo ra file thực thi (.exe, .dmg). Việc quản lý tài nguyên tĩnh và proxy local sẽ giúp ứng dụng ổn định mà không cần kết nối internet liên tục đến server bên ngoài.

Thẻ: python Flask electron network-diagnostics icmp

Đăng vào ngày 19 tháng 6 lúc 20:40