在多個 LTE 數據機上同時進行速度測試

在隔離期間,我受邀參與為多家蜂窩運營商開發一款用於測量 LTE 數據機速度的設備。

在多個 LTE 數據機上同時進行速度測試

該客戶希望評估不同地理位置的各個電信業者的速度,以便能夠了解在安裝使用 LTE 連接的設備(例如用於視訊廣播)時哪個蜂窩運營商最適合他。 同時,必須盡可能簡單且便宜地解決該問題,而無需使用昂貴的設備。

我馬上說,這個任務不是最簡單、最有知識的;我會告訴你我遇到了什麼問題以及我是如何解決的。 那麼,我們走吧。

注意

測量 LTE 連接的速度是一件非常複雜的事情:您需要選擇正確的設備和測量技術,並且還需要充分了解蜂窩網路的拓撲和操作。 另外,速度可能會受到多種因素的影響:小區上的使用者數量、天氣條件,甚至小區之間的速度也會因網路拓撲而發生巨大變化。 總的來說,這是一個存在大量未知數的問題,只有電信業者才能正確解決。

最初,客戶只是想用運營商的手機驅動快遞員,直接在手機上進行測量,然後將速度測量結果記在筆記本上。 我的測量 lte 網路速度的解決方案雖然不理想,但解決了問題。

由於時間不夠,我所做的決定不是為了方便或實用,而是為了開發速度。 例如,使用反向 ssh 進行遠端訪問,而不是更實用的 VPN,以節省設定伺服器和每個客戶端的時間。

技術任務

正如文章中所說 沒有技術規格:為什麼客戶不要它: 沒有技術規格就不要工作! 從來沒有,任何地方!

技術任務非常簡單,為了最終用戶的理解,我將對其進行一些擴展。 技術解決方案和設備的選擇由客戶決定。 因此,在獲得所有批准後,技術規範本身:

基於單板計算機 維姆2 透過 H 數據機製作 lte 連接速度測試儀華為 E3372H - 153 多家電信業者(從 XNUMX 到 n)。 還需要從透過 UART 連接的 GPS 接收器接收座標。 使用該服務進行速度測量 www.speedtest.net 並將它們放入這樣的表中:

在多個 LTE 數據機上同時進行速度測試

csv 格式的表。 然後每 6 小時透過電子郵件發送此標誌。 如果發生錯誤,請讓連接到 GPIO 的 LED 閃爍。

經過多次批准後,我以自由形式描述了技術規格。 但任務的意義已經可見。 所有事情都給了一周的時間。 但實際上它持續了三個星期。 這是考慮到我只在主要工作結束後和週末才這樣做的事實。

這裡我想再次提請注意的是,客戶事先同意了測速服務和硬體的使用,這極大地限制了我的能力。 預算也有限,所以沒有買什麼特別的東西。 所以我們必須遵守這些規則。

架構與開發

方案簡單明了。 因此,我將不做任何特別評論。

在多個 LTE 數據機上同時進行速度測試

我決定用 python 實現整個項目,儘管我根本沒有用這種語言進行開發的經驗。 我選擇它是因為有很多現成的範例和解決方案可以加快開發速度。 因此,我請求所有專業程式設計師不要責罵我第一次使用Python開發的經歷,我總是很高興聽到建設性的批評來提高我的技能。

同樣在這個過程中我發現python有兩個運行版本2和3,因此我選擇了第三個。

硬體節點

單板vim2

我得到了一台單板計算機作為我的主機 維姆2

在多個 LTE 數據機上同時進行速度測試

一款適用於智慧家庭和智慧電視的優秀且強大的媒體處理器,但非常不適合這項任務,或者可以說,很不適合。 例如,其主要作業系統是Android,Linux是次要作業系統,因此無法保證Linux下所有節點和驅動程式的高品質運作。 我認為一些問題與該平台的 USB 驅動程式有關,因此調製解調器在該板上無法按預期工作。 它還擁有非常糟糕且分散的文檔,因此每次操作都需要花費大量時間在碼頭上進行挖掘。 即使是普通的 GPIO 工作也要耗費大量的血。 例如,我花了幾個小時來設定 LED。 但客觀來說,是什麼單板根本不重要,重要的是能用,有USB介面。

首先,我需要在這塊板上安裝Linux。 為了不為每個人以及那些將要處理這個單板系統的人搜尋大量的文檔,我正在編寫本章。

安裝 Linux 有兩種選擇:安裝在外部 SD 卡上或安裝在內部 MMC 上。 我花了一個晚上試圖弄清楚如何讓它與卡一起工作,所以我決定將它安裝在 MMC 上,儘管毫無疑問與外部卡一起工作會容易得多。

關於韌體 這裡歪曲地告訴。 我把奇怪的翻譯成俄文。 為了刷新開發板,我需要連接硬體 UART。 連接了 如下。

  • 工具接腳 GND:<—> VIM GPIO 的 Pin17
  • 工具腳位 TXD:<—> VIM GPIO 的 Pin18 (Linux_Rx)
  • 工具接腳 RXD:<—> VIM GPIO 的 Pin19 (Linux_Tx)
  • 工具接腳 VCC:<—> VIM GPIO 的 Pin20

在多個 LTE 數據機上同時進行速度測試

之後我下載了韌體 。 具體韌體版本 VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

為了上傳此固件,我需要實用程式。 有關此的更多詳細信息 這裡。 我沒有嘗試過在 Windows 下刷寫它,但我需要告訴你一些關於 Linux 下固件的信息。 首先,我將根據說明安裝實用程式。

git clone https://github.com/khadas/utils
cd /path/to/utils
sudo ./INSTALL

Aaand...沒有任何效果。 我花了幾個小時編輯安裝腳本,以便一切都能正確安裝。 我不記得我在那裡做了什麼,但那裡還有馬戲團。 所以要小心。 但如果沒有這些實用程序,就沒有必要進一步折磨 vim2。 最好別去招惹他!

經過七圈地獄、腳本配置和安裝,我收到了一個工作實用程式包。 我透過 USB 將開發板連接到我的 Linux 計算機,並根據上圖連接了 UART。
我正在將我最喜歡的 minicom 終端設定為 115200 的速度,沒有硬體和軟體錯誤控制。 讓我們開始吧。

在多個 LTE 數據機上同時進行速度測試

當在UART終端加載VIM2時,我按下一個鍵,例如空白鍵,停止加載。 出現該行後

kvim2# 

我輸入命令:

kvim2# run update

在我們加載的主機上,我執行:

burn-tool -v aml -b VIM2 -i  VIM2_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.img

就是這樣,唷。 我查了一下,板上有Linux。 登入名稱/密碼khadas:khadas。

之後,進行一些小的初始設定。 為了進一步工作,我禁用 sudo 的密碼(是的,不安全,但方便)。

sudo visudo

我將行編輯到表單並儲存

# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) NOPASSWD: ALL

然後我更改當前區域設置,使時間位於莫斯科,否則時間將為格林威治。

sudo timedatectl set-timezone Europe/Moscow

ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

如果你覺得很難,那就不要使用這個板子;Raspberry Pi 更好。 誠實地。

數據機華為 e3372h – 153

這個調變解調器對我來說是一個重要的血液來源,事實上,它成為了整個專案的瓶頸。 一般來說,這些設備的「調製解調器」名稱根本不能反映工作的本質:這是一個功能強大的組合,這個硬體有一個複合設備,它偽裝成 CD-ROM 以安裝驅動程序,然後切換到網卡模式。

從架構上來說,從 Linux 用戶的角度來看,完成所有設定後,它看起來像這樣:連接調變解調器後,我有一個 eth* 網路接口,它透過 dhcp 接收 IP 位址 192.168.8.100 和預設閘道是192.168.8.1 .XNUMX。

還有最重要的時刻! 此調變解調器型號無法運作在調變解調器模式下,該模式由 AT 指令控制。 一切都會變得更加簡單,為每個數據機創建 PPP 連接,然後使用它們進行操作。 但就我而言,「他自己」(更準確地說,是根據 udev 規則的 Linux 驅動程式)創建一個 eth 介面並透過 dhcp 為其分配一個 IP 位址。

為了避免進一步混淆,我建議忘記「調製解調器」這個詞,而說網卡和網關,因為本質上,這就像將新網卡與網關連接一樣。
當有一個調變解調器時,這不會造成任何特殊問題,但當有多個調變解調器(即n個)時,就會出現以下網路圖片。

在多個 LTE 數據機上同時進行速度測試

即,n 個網路卡,具有相同的 IP 位址,每個網路卡具有相同的預設閘道。 但事實上,它們每個都連接到自己的運營商。

最初,我有一個簡單的解決方案:使用 ifconfig 或 ip 命令,關閉所有接口,然後依次打開一個並進行測試。 這個解決方案對每個人都有好處,只是在切換期間我無法連接到設備。 而且由於切換頻繁且速度快,我實際上根本沒有機會聯繫。

因此,我選擇了手動更改數據機的 IP 位址,然後使用路由設定驅動流量的路徑。

在多個 LTE 數據機上同時進行速度測試

這並不是我的數據機問題的結束:如果出現電源問題,它們就會脫落,並且需要為 USB 集線器提供良好且穩定的電源。 我透過將電源直接硬焊接到集線器上解決了這個問題。 我遇到的另一個問題破壞了整個專案:設備重新啟動或冷啟動後,並非所有調變解調器都被偵測到,而且並非總是如此,我無法確定為什麼會發生這種情況以及透過什麼演算法進行。 但首先要說的是。

為了使數據機正常工作,我安裝了 usb-modeswitch 軟體包。

sudo apt update
sudo apt install -y usb-modeswitch

之後,連接後,udev 子系統將正確偵測並配置數據機。 我只需連接調製解調器並確保網路出現即可進行檢查。
我無法解決的另一個問題:如何從該調變解調器取得我們正在使用的操作員的名稱? 操作員名稱包含在數據機 Web 介面 192.168.8.1 中。 這是一個動態網頁,透過Ajax請求接收數據,所以簡單地獲取頁面並解析名稱是行不通的。 於是我開始研究如何開發網頁等,並意識到我在做一些無意義的事情。 結果,他吐了口水,營運商開始使用 Speedtest API 本身進行接收。

如果調變解調器可以透過 AT 命令進行訪問,那就容易多了。 可以重新配置它、創建 ppp 連接、分配 IP、聯繫電信運營商等。 但可惜的是,我正在照我所得到的去做。

GPS

我得到的 GPS 接收器有一個 UART 介面和電源。 這不是最好的解決方案,但它仍然可行且簡單。 接收器看起來像這樣。

在多個 LTE 數據機上同時進行速度測試

說實話,這是我第一次使用 GPS 接收器,但正如我所料,一切都是我們早就想好的。 所以我們只使用現成的解決方案。

首先,我啟用uart_AO_B(UART_RX_AO_B、UART_TX_AO_B)來連接GPS。

khadas@Khadas:~$ sudo fdtput -t s /dtb.img /serial@c81004e0 status okay

然後我檢查操作是否成功。

khadas@Khadas:~$ fdtget /dtb.img /serial@c81004e0 status
okay

這個指令顯然是動態編輯devtree,這非常方便。

此操作成功後,重新啟動並安裝 GPS 守護程序。

khadas@Khadas:~$ sudo reboot

安裝 GPS 守護程序。 我安裝了所有東西並立即將其切斷以進行進一步配置。

sudo apt install gpsd gpsd-clients -y
sudo killall gpsd
 
/* GPS daemon stop/disable */
sudo systemctl stop gpsd.socket
sudo systemctl disable gpsd.socket

編輯設定檔。

sudo vim /etc/default/gpsd

我正在安裝一個 UART,GPS 將掛在其上。

DEVICES="/dev/ttyS4"

然後我們打開一切並開始。

/* GPS daemon enable/start */
sudo systemctl enable gpsd.socket
sudo systemctl start gpsd.socket

之後,我連接 GPS。

在多個 LTE 數據機上同時進行速度測試

GPS 線在我手中,UART 調試器線在我的手指下可見。

我重新啟動並使用 gpsmon 程式檢查 GPS 操作。

在多個 LTE 數據機上同時進行速度測試

在此螢幕截圖中您看不到衛星,但您可以看到與 GPS 接收器的通信,這意味著一切都很好。

在 python 中,我嘗試了多種使用此守護程序的選項,但我選擇了與 python 3 一起正常工作的選項。

我安裝了必要的庫。

sudo -H pip3 install gps3 

我制定了工作代碼。

from gps3.agps3threaded import AGPS3mechanism
...

def getPositionData(agps_thread):
	counter = 0;
	while True:
		longitude = agps_thread.data_stream.lon
		latitude = agps_thread.data_stream.lat
		if latitude != 'n/a' and longitude != 'n/a':
			return '{}' .format(longitude), '{}' .format(latitude)
		counter = counter + 1
		print ("Wait gps counter = %d" % counter)
		if counter == 10:
			ErrorMessage("Ошибка GPS приемника!!!")
			return "NA", "NA"
		time.sleep(1.0)
...
f __name__ == '__main__':
...
	#gps
	agps_thread = AGPS3mechanism()  # Instantiate AGPS3 Mechanisms
	agps_thread.stream_data()  # From localhost (), or other hosts, by example, (host='gps.ddns.net')
	agps_thread.run_thread()  # Throttle time to sleep after an empty lookup, default '()' 0.2 two tenths of a second

如果我需要取得座標,可以透過以下調用完成:

longitude, latitude = getPositionData(agps_thread)

在 1-10 秒內我要么得到坐標,要么得不到坐標。 是的,我嘗試了十次來獲取座標。 不是最佳的,歪斜的,但它有效。 我決定這樣做是因為 GPS 的接收效果可能很差,而且並不總是能接收到資料。 如果你等待接收數據,那麼如果你在遠端房間工作,程式就會凍結在這個地方。 因此,我實現了這個不優雅的選項。

原則上,如果有更多時間,可以透過 UART 直接從 GPS 接收數據,在單獨的線程中解析它並使用它。 但根本沒有時間,因此程式碼極為醜陋。 是的,我並不感到羞恥。

發光二極管

連接 LED 既簡單又困難。 主要困難是系統中的引腳號與板上的引腳號不對應,並且因為文件是用左手書寫的。 要比較硬體引腳號和作業系統中的引腳號,需要執行以下命令:

gpio readall

將顯示系統中和電路板上的引腳對應表。 之後我就可以在作業系統本身中操作該引腳了。 在我的例子中,LED 連接到 GPIOH_5.

在多個 LTE 數據機上同時進行速度測試

我將 GPIO 引腳切換到輸出模式。

gpio -g mode 421 out

我寫下零。

gpio -g write 421 0

我寫下一篇。

gpio -g write 421 1

在多個 LTE 數據機上同時進行速度測試
寫「1」後一切都亮了

#gpio subsistem
def gpio_init():
	os.system("gpio -g mode 421 out")
	os.system("gpio -g write 421 1")

def gpio_set(val):
	os.system("gpio -g write 421 %d" % val)
	
def error_blink():
	gpio_set(0)
	time.sleep(0.1)
	gpio_set(1)
	time.sleep(0.1)
	gpio_set(0)
	time.sleep(0.1)
	gpio_set(1)
	time.sleep(0.1)
	gpio_set(0)
	time.sleep(1.0)
	gpio_set(1)

def good_blink():
	gpio_set(1)

現在,如果發生錯誤,我會呼叫 error_blink(),LED 會漂亮地閃爍。

軟體節點

測速API

很高興 speedtest.net 服務有自己的 python-API,你可以看看 Github上.

好處是還有原始碼可以查看。 如何使用此 API(簡單範例)可以在以下位置找到 相關部分.

我使用以下命令安裝 python 庫。

sudo -H pip3 install speedtest-cli

例如,您甚至可以直接從軟體在 Ubuntu 中安裝速度測試器。 這是同一個 python 應用程序,可以直接從控制台啟動。

sudo apt install speedtest-cli -y

並測量您的網路速度。

speedtest-cli
Retrieving speedtest.net configuration...
Testing from B***** (*.*.*.*)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by MTS (Moscow) [0.12 km]: 11.8 ms
Testing download speed................................................................................
Download: 7.10 Mbit/s
Testing upload speed......................................................................................................
Upload: 3.86 Mbit/s

結果,就像我一樣。 我必須了解此速度測試的原始程式碼,以便更全面地將它們實施到我的專案中。 最重要的任務之一是獲取電信業者的名稱,以便將其替換到車牌中。

import speedtest
from datetime import datetime
...
#Указываем конкретный сервер для теста
#6053) MaximaTelecom (Moscow, Russian Federation)
servers = ["6053"]
# If you want to use a single threaded test
threads = None
s = speedtest.Speedtest()
#получаем имя оператора сотовой связи
opos = '%(isp)s' % s.config['client']
s.get_servers(servers)
#получаем текстовую строку с параметрами сервера
testserver = '%(sponsor)s (%(name)s) [%(d)0.2f km]: %(latency)s ms' % s.results.server
#тест загрузки
s.download(threads=threads)
#тест выгрузки
s.upload(threads=threads)
#получаем результаты
s.results.share()

#После чего формируется строка для записи в csv-файл.
#получаем позицию GPS
longitude, latitude = getPositionData(agps_thread)
#время и дата
curdata = datetime.now().strftime('%d.%m.%Y')
curtime = datetime.now().strftime('%H:%M:%S')
delimiter = ';'
result_string = opos + delimiter + str(curpos) + delimiter + 
	curdata + delimiter + curtime + delimiter + longitude + ', ' + latitude + delimiter + 
	str(s.results.download/1000.0/1000.0) + delimiter + str(s.results.upload / 1000.0 / 1000.0) + 
	delimiter + str(s.results.ping) + delimiter + testserver + "n"
#тут идет запись в файл логов

在這裡,一切也變得不那麼簡單,儘管看起來簡單得多。 最初,伺服器參數等於 []他們說,選擇最好的伺服器。 結果,我有隨機的伺服器,而且,正如你可能猜到的,速度是可變的。 這是一個相當複雜的話題,使用固定伺服器,無論是靜態還是動態,都需要研究。 但這裡是 Beeline 操作員在動態選擇測試伺服器和靜態固定伺服器時的速度測量圖範例。

在多個 LTE 數據機上同時進行速度測試
選擇動態伺服器時測量速度的結果。

在多個 LTE 數據機上同時進行速度測試
速度測試的結果,嚴格挑選一台伺服器。

測試時,兩個地方都有“毛皮”,需要用數學方法去除。 但對於固定伺服器來說,幅度會稍微小一些,而且幅度更穩定。
總的來說,這是一個進行大量研究的地方。 我會使用 iperf 實用程式來測量伺服器的速度。 但我們堅持技術規範。

發送郵件和錯誤

為了發送郵件,我嘗試了數十種不同的選項,但最終我選擇了以下選項。 我在Yandex上註冊了一個郵箱,然後拿了 這是發送郵件的範例。 我檢查了一下並將其實現到程序中。 此範例檢查各種選項,包括從 gmail 發送等。 我不想費心去設定我的郵件伺服器,也沒有時間,但後來發現,這也是徒勞無功的。

日誌根據調度程序發送, 如果有連接,每 6 小時一次:00 點、早上 06 點、中午 12 點和晚上 18 點。 發送如下。

from send_email import *
...
message_log = "Логи тестирования платы №1"
EmailForSend = ["[email protected]", "[email protected]"]
files = ["/home/khadas/modems_speedtest/csv"]
...
def sendLogs():
	global EmailForSend
	curdata = datetime.now().strftime('%d.%m.%Y')
	сurtime = datetime.now().strftime('%H:%M:%S')
	try:
		for addr_to in EmailForSend:
			send_email(addr_to, message_log, "Логи за " + curdata + " " + сurtime, files)
	except:
		print("Network problem for send mail")
		return False
	return True

最初也發送了錯誤。 首先,它們被累積在列表中,然後如果存在連接,也使用調度程序發送。 然而,隨後出現了問題,因為 Yandex 對每天發送的訊息數量有限制(這是痛苦、悲傷和羞辱)。 由於即使每分鐘也可能出現大量錯誤,因此我們不得不放棄透過郵件發送錯誤。 因此,在透過 Yandex 服務自動發送有關此類問題的資訊時請記住。

回饋伺服器

為了存取遠端硬體並能夠對其進行自訂和重新配置,我需要一台外部伺服器。 一般來說,公平地說,將所有資料發送到伺服器並在 Web 介面中建立所有漂亮的圖表是正確的。 但不是一下子全部完成。

對於VPS我選擇 ruvds.com。 您可以採用最簡單的伺服器。 一般來說,對於我的目的來說,這已經足夠了。 但由於我沒有自掏腰包購買伺服器費用,所以我決定保留少量資金,這樣我們就可以部署 Web 介面、我們自己的 SMTP 伺服器、VPN 等。 另外,能夠設定 Telegram 機器人並且不會遇到被封鎖的問題。 因此,我選擇了阿姆斯特丹和以下參數。

在多個 LTE 數據機上同時進行速度測試

作為與硬體通訊的方法,vim2 選擇了反向 ssh 連接,實踐表明,這並不是最好的。 如果連線遺失,伺服器會保留該端口,並且在一段時間內無法透過該連接埠進行連線。 因此,最好還是使用其他通訊方式,例如VPN。 以後我想改用VPN,但沒有時間。

我不會詳細介紹設定防火牆、限制權限、停用 root ssh 連線以及其他設定 VPS 的道理。 我願意相信你已經知道了一切。 對於遠端連接,我在伺服器上建立一個新用戶。

adduser vimssh

我在我們的硬體上產生 ssh 連線金鑰。

ssh-keygen

我將它們複製到我們的伺服器。

ssh-copy-id [email protected]

在我們的硬體上,我在每次啟動時建立自動反向 ssh 連線。

[Unit] Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service] User=khadas
ExecStart=/usr/bin/ssh -NT -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 -CD 8080 -R 8083:localhost:22 [email protected]
RestartSec=5
Restart=always
[Install] WantedBy=multi-user.target

請注意連接埠 8083:它決定我將使用哪個連接埠透過反向 ssh 進行連接。 將其添加到啟動並啟動。

sudo systemctl enable autossh.service
sudo systemctl start autossh.service

您甚至可以查看狀態:

sudo systemctl status autossh.service

現在,在我們的 VPS 伺服器上,如果我們運行:

ssh -p 8083 khadas@localhost

然後我開始測試硬體。 從硬體上我還可以透過 ssh 將日誌和任何資料發送到我的伺服器,這非常方便。

把它放在一起

在多個 LTE 數據機上同時進行速度測試
開機,我們開始開發調試

唷,好吧,就是這樣,我描述了所有的節點。 現在是時候把它們放在一起了。 你可以看到程式碼 就在這裡.

程式碼的一個要點是:這個專案可能不會像這樣開始,因為它是為特定架構的特定任務量身定制的。 即使我給出了原始程式碼,我仍然會在這裡解釋最有價值的東西,就在文本中,否則它是完全無法理解的。

一開始,我初始化 gps、gpio 並啟動一個單獨的調度程式線程。

#запуск потока планировщика
pShedulerThread = threading.Thread(target=ShedulerThread, args=(1,))
pShedulerThread.start()

調度程序非常簡單:它查看是否到了發送訊息的時間以及當前的錯誤狀態是什麼。 如果有錯誤標誌,我們就會讓 LED 閃爍。

#sheduler
def ShedulerThread(name):
	global ready_to_send
	while True:
		d = datetime.today()
		time_x = d.strftime('%H:%M')
		if time_x in time_send_csv:
			ready_to_send = True
		if error_status:
			error_blink()
		else:
			good_blink()
		time.sleep(1)

這個專案最困難的部分是為每個測試維護反向 ssh 連線。 每次測試都涉及重新配置預設網關和 DNS 伺服器。 由於無論如何都沒有人讀書,所以要知道火車不是在木軌上行駛的。 找到復活節彩蛋的人會得到一些糖果。

為此,我建立了一個單獨的路由表 -set-mark 0x2 和一條重定向流量的規則。

def InitRouteForSSH():
	cmd_run("sudo iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j MARK --set-mark 0x2")
	cmd_run("sudo ip rule add fwmark 0x2/0x2 lookup 102")

您可以詳細了解它的工作原理 閱讀本文.

之後我進入無限循環,每次我們都會獲得已連接調製解調器的清單(以找出網路配置是否突然發生變化)。

network_list = getNetworklist()

取得網路介面清單非常簡單。

def getNetworklist():
	full_networklist = os.listdir('/sys/class/net/')
	network_list = [x for x in full_networklist if "eth" in x and x != "eth0"]
	return network_list

收到清單後,我為所有介面設定 IP 位址,如有關數據機的章節中的圖片所示。

SetIpAllNetwork(network_list)

def SetIpAllNetwork(network_list):
	for iface in network_list:
		lastip = "%d" % (3 + network_list.index(iface))
		cmd_run ("sudo ifconfig " + iface + " 192.168.8." + lastip +" up")

然後我簡單地循環瀏覽每個介面。 我配置每個介面。

	for iface in network_list:
		ConfigNetwork(iface)

def ConfigNetwork(iface):
#сбрасываем все настройки
		cmd_run("sudo ip route flush all")
#Назначаем шлюз по умолчанию
		cmd_run("sudo route add default gw 192.168.8.1 " + iface)
#задаем dns-сервер (это нужно для работы speedtest)
		cmd_run ("sudo bash -c 'echo nameserver 8.8.8.8 > /etc/resolv.conf'")

我檢查介面的功能,如果沒有網絡,則會產生錯誤。 如果有網絡,那就該行動了!

在這裡,我配置了到此介面的 ssh 路由(如果尚未完成),如果時間到了,則將錯誤發送到伺服器,發送日誌,最後運行速度測試並將日誌保存到 csv 檔案。

if not NetworkAvalible():
....
#Здесь мы формируем ошибки
....
else: #Есть сеть, ура, работаем!
#Если у нас проблемный интерфейс, на котором ssh, то меняем его
  if (sshint == lastbanint or sshint =="free"):
    print("********** Setup SSH ********************")
    if sshint !="free":
      сmd_run("sudo ip route del default via 192.168.8.1 dev " + sshint +" table 102")
    SetupReverseSSH(iface)
    sshint = iface
#раз сетка работает, то давай срочно все отправим!!!
    if ready_to_send:
      print ("**** Ready to send!!!")
        if sendLogs():
          ready_to_send = False
        if error_status:
          SendErrors()
#и далее тестируем скорость и сохраняем логи. 

值得一提的是設定反向ssh的功能。

def SetupReverseSSH(iface):
	cmd_run("sudo systemctl stop autossh.service")
	cmd_run("sudo ip route add default via 192.168.8.1 dev " + iface +" table 102")
	cmd_run("sudo systemctl start autossh.service")

當然,您需要將所有這些美麗添加到啟動中。 為此,我創建一個文件:

sudo vim /etc/systemd/system/modems_speedtest.service

我在裡面寫道:

[Unit] Description=Modem Speed Test
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service] User=khadas
ExecStart=/usr/bin/python3.6 /home/khadas/modems_speedtest/networks.py
RestartSec=5
Restart=always
[Install] WantedBy=multi-user.target

我打開自動加載並開始!

sudo systemctl enable modems_speedtest.service
sudo systemctl start modems_speedtest.service

現在我可以使用以下命令查看正在發生的情況的日誌:

journalctl -u modems_speedtest.service --no-pager -f

Результаты

那麼,現在最重要的是,結果呢? 以下是我在開發和調試過程中捕獲的一些圖表。 這些圖表是使用 gnuplot 和以下腳本建立的。

#! /usr/bin/gnuplot -persist
set terminal postscript eps enhanced color solid
set output "Rostelecom.ps"
 
#set terminal png size 1024, 768
#set output "Rostelecom.png"
 
set datafile separator ';'
set grid xtics ytics
set xdata time
set ylabel "Speed Mb/s"
set xlabel 'Time'
set timefmt '%d.%m.%Y;%H:%M:%S'
set title "Rostelecom Speed"

plot "Rostelecom.csv" using 3:6 with lines title "Download", '' using 3:7 with lines title "Upload"
 
set title "Rostelecom 2 Ping"
set ylabel "Ping ms"
plot "Rostelecom.csv" using 3:8 with lines title "Ping"

第一次體驗是與 Tele2 營運商合作,我進行了幾天。

在多個 LTE 數據機上同時進行速度測試

這裡我使用了動態測量伺服器。 速度測量有效,但波動很大,但仍然可見一些平均值,這可以透過過濾數據來獲得,例如使用移動平均值。

後來我為其他電信業者建立了一些圖表。 在這種情況下,已經有一台測試伺服器,結果也很有趣。

在多個 LTE 數據機上同時進行速度測試

在多個 LTE 數據機上同時進行速度測試

在多個 LTE 數據機上同時進行速度測試

在多個 LTE 數據機上同時進行速度測試

正如您所看到的,該主題對於這些數據的研究和處理非常廣泛,顯然不會持續幾週的工作。 但…

工作成果

由於我無法控制的情況,這項工作突然完成了。 在我看來,這個專案的弱點之一是調製解調器,它並不真正希望與其他調製解調器同時工作,並且每次加載時都會做出這樣的伎倆。 出於這些目的,還有大量其他數據機型號;通常它們已經採用 Mini PCI-e 格式並安裝在設備內部,並且更容易配置。 但這是一個完全不同的故事。 這個項目很有趣,我很高興能夠參與其中。

在多個 LTE 數據機上同時進行速度測試

來源: www.habr.com

添加評論