首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

智慧型 WiFi 動態限速工具設計與實現:從路由器逆向到公平頻寬分配演算法

     編輯:Java 綜合教學

智慧型 WiFi 動態限速工具設計與實現:從路由器逆向到公平頻寬分配演算法

宿舍頻寬有限,迅雷下載佔滿頻寬導致其他人看影片卡頓、網頁打不開。本文記錄一個基於 TP-Link 路由器後台 API 的智慧限速工具:自動發現頻寬上限、監測設備流量、動態判定「飢餓/飽食」狀態、公平重分配頻寬。專案開源:themis-von-wifi。

問題場景與目標

  • 總頻寬 ~2.8 MB/s
  • 用戶 B 迅雷全速下載,用戶 C 看影片僅 12 KB/s
  • 用戶 A/D 輕度瀏覽也極慢
  • 目標: 高需求競爭時公平分配,低需求設備保底速度

宿舍網絡擁塞場景示意圖

路由器後台逆向關鍵步驟

  1. 登入頁面分析: 密碼經前端 JS 加密(classs.js 中 securityEncode、orgAuthPwd)。
  2. Java 呼叫 JS 加密: 使用 ScriptEngine 執行提取的 JS 函數獲取密文。
  3. Token 機制: 登入成功返回 stok,後續請求 URL 附帶 ?stok=xxx 作為憑證。
  4. 獲取設備列表與限速: 解析後台返回 JSON,提取 MAC、IP、下載速度、當前限速值;下發限速指令需構造特定 JSON 結構。
// Java 呼叫 JS 加密核心片段
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("javascript");
se.eval(extractFunction("this.securityEncode"));
se.eval(extractFunction("this.orgAuthPwd"));
se.eval("result=this.orgAuthPwd(\"" + plainPwd + "\")");
String encryptedPwd = se.get("result").toString();

路由器登入頁面

開發者工具網絡面板

登入返回 stok

動態限速演算法核心邏輯

參數: maxSpeed(觀測到的峰值頻寬)、hostCount(在線設備數)、watch_interval=3s、judge_interval=12s、minSpeedLimit(保底速度)。

  1. 啟動階段: 均分 maxSpeed * 0.9 / hostCount 給每台設備。
  2. 觀測階段: 每 3 秒採樣一次實際下載速度,累加計算 12 秒內平均速度。
  3. 判定階段(每 12 秒):
    • 計算 利用率 = 平均速度 / 當前限速
    • 飢餓: 利用率 > 80%(需求大於供給)
    • 飽食: 利用率 < 20%(有剩餘頻寬)
  4. 重分配:
    • 單一飢餓設備:獲得 90% 空閒頻寬
    • 多飢餓設備:壓縮飽食設備至保底,將 90% 空閒頻寬均分給飢餓設備
    • 無飢餓:維持均分

工具運行介面預覽

動態限速演示動畫

核心代碼片段

分析器:計算建議限速

static JSONObject retrieveSuggestion(Map<String, Long> speedSum, int maxSpeed, Map<String, Integer> currLimit) {
    // 計算各設備平均速度、空閒頻寬
    // 識別飢餓/飽食設備
    // 依規則分配空閒頻寬,不低於 minSpeedLimit
    // 返回 {mac: 建議限速} JSON
}

看門狗執行緒:週期採樣與下發

class WatchDogThread extends Thread {
    public void run() {
        while (true) {
            storeHostInfo(listOnlineHosts()); // 採樣
            if (++tick == judge_interval/watch_interval) {
                judge(); // 分析+下發
                tick = 0;
            }
            sleep(watch_interval);
        }
    }
    private void judge() {
        JSONObject suggestion = HostAnalyzer.retrieveSuggestion(...);
        for (mac : suggestion.keySet()) act(mac, suggestion.getInt(mac));
        // 清空本輪統計
    }
    private void act(String mac, int limit) {
        // 構造 JSON 下發限速指令至路由器
    }
}

效果與反思

  • B 迅雷下載速度自動降低,C 影片流暢緩衝,A/D 網頁秒開。
  • 演算法參數(閾值、間隔、保底速度)可透過配置檔調整適應不同環境。
  • 局限:依賴特定路由器 API,通用性受限;未來可研究 OpenWrt/路由器固件層級 QoS 實現。

歡迎關注專案 GitHub,歡迎 PR 改進演算法與支援更多路由器型號!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved