Simultan Geschwindegkeetstest op verschidde LTE Modems

Wärend der Quarantän gouf ech ugebueden un der Entwécklung vun engem Apparat deelzehuelen fir d'Geschwindegkeet vun LTE Modems fir verschidde Cellulär Betreiber ze moossen.

Simultan Geschwindegkeetstest op verschidde LTE Modems

De Client wollt d'Geschwindegkeet vu verschiddenen Telekomoperateuren op verschiddene geographesche Plazen evaluéieren, fir ze verstoen, wéi en Handybetreiber am beschten fir hien ass, wann Dir Ausrüstung mat enger LTE Verbindung installéiert, zum Beispill fir Videosendungen. Gläichzäiteg huet de Problem esou einfach a bëlleg wéi méiglech geléist ginn, ouni deier Ausrüstung.

Ech wäert direkt soen datt d'Aufgab net déi einfachst a meeschte Wëssenintensiv ass; Ech soen Iech wéi eng Problemer ech begéint hunn a wéi ech se geléist hunn. Also, loosst eis goen.

Remarque

D'Messung vun der Geschwindegkeet vun enger LTE Verbindung ass eng ganz komplex Saach: Dir musst déi richteg Ausrüstung a Miesstechnik wielen, an och e gutt Verständnis vun der Topologie an der Operatioun vum Zellularnetz hunn. Plus, d'Geschwindegkeet kann vu verschiddene Faktoren beaflosst ginn: d'Zuel vun den Abonnenten op enger Zell, Wiederkonditiounen, och vun Zell zu Zell, kann d'Geschwindegkeet dramatesch variéieren wéinst der Netztopologie. Am Allgemengen ass dëst e Problem mat enger grousser Zuel vun Onbekannten, an nëmmen en Telekomoperateur kann et richteg léisen.

Am Ufank wollt de Client just de Courrier mat den Telefonen vun den Opérateuren fueren, Miessunge direkt um Telefon huelen an dann d'Vitessemessresultater an engem Notizbuch opschreiwen. Meng Léisung fir d'Geschwindegkeet vun lte Netzwierker ze moossen, obwuel net ideal ass, léist de Problem.

Wéinst Mangel un Zäit hunn ech Entscheedungen net zugonschte vun der Komfort oder der Praktikitéit, mee zugonschte vun der Geschwindegkeet vun der Entwécklung. Zum Beispill, ëmgedréint ssh gouf fir Remote-Zougang benotzt, amplaz vum méi praktesche VPN, fir Zäit ze spueren beim Konfiguratioun vum Server an all eenzel Client.

Technesch Aufgab

Wéi et am Artikel steet Ouni technesch Spezifikatioune: firwat de Client et net wëllt: Schafft net ouni technesch Spezifikatioune! Ni, iwwerall!

Déi technesch Aufgab war ganz einfach, ech wäert et e bëssen ausbaue fir d'Verständnis vum Endbenotzer. D'Wiel vun technesche Léisungen an Ausrüstung gouf vum Client diktéiert. Also, d'technesch Spezifizéierung selwer, no all Genehmegungen:

Baséiert op engem eenzege Verwaltungsrot Computer vim 2 maachen e Vitesse Tester fir lte Verbindungen iwwer H Modemsuawei e3372h - 153 verschidde Telekomoperateuren (vun engem bis n). Et ass och noutwendeg fir Koordinaten vun engem GPS Empfänger ze kréien, deen iwwer UART verbonnen ass. Maacht Geschwindegkeetsmessungen mam Service www.spedtest.net a setzt se an en Dësch wéi dëst:

Simultan Geschwindegkeetstest op verschidde LTE Modems

Tabell am csv-Format. Da schéckt dëst Schëld all 6 Stonnen per E-Mail. Am Fall vu Feeler, blénkt d'LED déi mat der GPIO verbonnen ass.

Ech hunn déi technesch Spezifikatioune a fräier Form beschriwwen, no villen Genehmegungen. Awer d'Bedeitung vun der Aufgab ass scho sichtbar. Eng Woch gouf fir alles ginn. Awer a Wierklechkeet huet et dräi Wochen gedauert. Dëst berécksiichtegt datt ech dat eréischt no menger Haaptaarbecht an um Weekend gemaach hunn.

Hei wëll ech nach eng Kéier op d'Tatsaach opmierksam maachen datt de Client am Viraus op d'Benotzung vum Geschwindegkeetsmessungsservice an Hardware ausgemaach huet, wat meng Fäegkeeten staark limitéiert huet. De Budget war och limitéiert, sou datt näischt speziell kaaft gouf. Also hu mir no dëse Regelen ze spillen.

Architektur an Entwécklung

De Schema ass einfach an offensichtlech. Dofir loossen ech et ouni speziell Kommentaren.

Simultan Geschwindegkeetstest op verschidde LTE Modems

Ech hu beschloss de ganze Projet am Python ëmzesetzen, trotz der Tatsaach, datt ech guer keng Erfahrung an dëser Sprooch entwéckelen. Ech hunn et gewielt, well et eng Rëtsch fäerdeg Beispiller a Léisunge waren, déi d'Entwécklung beschleunegen. Dofir froen ech all berufflech Programméierer net meng éischt Erfahrung am Python z'entwéckelen, an ech sinn ëmmer frou, konstruktiv Kritik ze héieren fir meng Fäegkeeten ze verbesseren.

Och am Prozess hunn ech entdeckt datt de Python zwou lafende Versiounen 2 an 3 huet, als Resultat hunn ech mech op déi drëtt néiergelooss.

Hardware Noden

Eenzelplack vim2

Ech krut eng Single-Verwaltungsrot Computer als meng Haaptrei Maschinn vim 2

Simultan Geschwindegkeetstest op verschidde LTE Modems

En exzellenten, mächtege Medienprozessor fir e Smart Doheem a SMART-TV, awer extrem onpassend fir dës Aufgab, oder, loosst eis soen, schlecht gëeegent. Zum Beispill ass säin Haapt OS Android, a Linux ass e Secondaire OS, an deementspriechend garantéiert keen déi héichqualitativ Operatioun vun all Noden a Chauffeuren ënner Linux. An ech huelen un datt e puer vun de Probleemer mat den USB Treiber vun dëser Plattform verbonne sinn, sou datt d'Modems net wéi erwaart op dësem Board funktionnéieren. Et huet och ganz aarm a verspreet Dokumentatioun, sou datt all Operatioun vill Zäit gedauert huet duerch d'Docks ze gräifen. Och déi normal Aarbecht mat GPIO huet vill Blutt geholl. Zum Beispill huet et mech e puer Stonnen gedauert fir d'LED opzestellen. Awer, fir objektiv ze sinn, war et grondsätzlech net wichteg wéi eng Single-Board et war, den Haapt Saach war datt et funktionnéiert an et goufen USB Ports.

Als éischt muss ech Linux op dësem Board installéieren. Fir net d'Wilds vun der Dokumentatioun fir jiddereen ze fueren, an och fir déi, déi mat dësem Single-Verwaltungsrot System beschäftegen, schreiwen ech dëst Kapitel.

Et ginn zwou Méiglechkeeten fir Linux z'installéieren: op enger externer SD Kaart oder op enger interner MMC. Ech hunn en Owend probéiert erauszefannen wéi et mat der Kaart funktionnéiert, also hunn ech decidéiert et op der MMC ze installéieren, obwuel et ouni Zweifel vill méi einfach wier mat enger externer Kaart ze schaffen.

Iwwer Firmware kromm hei gesot. Ech iwwersetzen aus komesch an Russesch. Fir de Board ze flashen, muss ech d'Hardware UART verbannen. Verbonnen et wéi folgend.

  • Tool Pin GND: <—> Pin17 vum VIMs GPIO
  • Tool Pin TXD: <—> Pin18 vum VIMs GPIO (Linux_Rx)
  • Tool Pin RXD: <—> Pin19 vum VIMs GPIO (Linux_Tx)
  • Tool Pin VCC: <—> Pin20 vum VIMs GPIO

Simultan Geschwindegkeetstest op verschidde LTE Modems

Duerno hunn ech d'Firmware erofgelueden vun hei. Spezifesch Firmware Versioun VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Fir dës Firmware eropzelueden, brauch ech Utilities. Méi Detailer iwwer dëst hei. Ech hunn net probéiert et ënner Windows ze blénken, awer ech muss Iech e puer Wierder soen iwwer Firmware ënner Linux. Als éischt installéieren ech d'Utilities no den Instruktiounen.

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

Aaand ... Näischt funktionnéiert. Ech hunn e puer Stonne verbruecht fir d'Installatiounsskripter z'änneren sou datt alles fir mech richteg installéiert ass. Ech erënnere mech net wat ech do gemaach hunn, mä et war och deen Zirkus mat Päerd. Also oppassen. Awer ouni dës Utilities ass et kee Sënn fir vim2 weider ze folteren. Et ass besser net mat him ze messen!

No siwe Kreeser vun Häll, Skript Konfiguratioun an Installatioun, Ech krut e Pak vun schaffen Utilities. Ech verbonne de Verwaltungsrot via USB zu mengem Linux Computer, an och der UART no der Diagramm uewen ugeschloss.
Ech setzen mäi Liiblings Minicom-Terminal fir eng Geschwindegkeet vun 115200 op, ouni Hardware- a Softwarefehlerkontrolle. A loosst eis ufänken.

Simultan Geschwindegkeetstest op verschidde LTE Modems

Wann Dir VIM2 am UART-Terminal lued, dréckt ech e Schlëssel, wéi zum Beispill d'Spacebar, fir d'Luede ze stoppen. No der Linn schéngt

kvim2# 

Ech gitt de Kommando:

kvim2# run update

Op dem Host, aus deem mir lueden, féieren ech aus:

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

Dat ass et, pff. Ech hu gepréift, et gëtt Linux um Bord. Login / Passwuert khadas: khadas.

Duerno, e puer kleng initial Astellungen. Fir weider Aarbecht deaktivéieren ech d'Passwuert fir sudo (jo, net sécher, awer bequem).

sudo visudo

Ech änneren d'Linn op d'Form a späicheren

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

Dann änneren ech déi aktuell Lokalitéit sou datt d'Zäit zu Moskau ass, soss wäert et zu Greenwich sinn.

sudo timedatectl set-timezone Europe/Moscow

oder

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

Wann Dir et schwéier fannt, da benotzt dëse Board net; Raspberry Pi ass besser. Éierlech gesot.

Modem Huawei e3372h – 153

Dëse Modem war eng bedeitend Quell vu Blutt fir mech, an tatsächlech gouf et de Flaschenhals vum ganze Projet. Am Allgemengen reflektéiert den Numm "Modem" fir dës Apparater guer net d'Essenz vun der Aarbecht: dëst ass eng mächteg Kombinatioun, dëst Stéck Hardware huet e Composite-Apparat, deen sech als CD-Rom mécht fir Chauffeuren z'installéieren, an dann wiesselt op Reseau Kaart Modus.

Architektonesch, aus der Siicht vun engem Linux Benotzer, no all Astellungen, gesäit et esou aus: nodeems ech de Modem ugeschloss hunn, hunn ech en eth* Netzwierk Interface, deen iwwer dhcp d'IP Adress 192.168.8.100 an den Default Gateway kritt ass 192.168.8.1.

An dee wichtegste Moment! Dëse Modemmodell kann net am Modemmodus funktionnéieren, deen duerch AT Kommandoen kontrolléiert gëtt. Alles wier vill méi einfach, PPP Verbindunge fir all Modem erstellen an dann mat hinnen operéieren. Awer a mengem Fall, "selwer" (méi präzis, e Linux Taucher no den udev Reegelen), erstellt eng eth-Interface an ass eng IP Adress iwwer dhcp.

Fir weider Duercherneen ze vermeiden, proposéieren ech d'Wuert "Modem" ze vergiessen a soen Netzwierkkaart a Paart, well am Wesentlechen ass et wéi eng nei Netzwierkkaart mat engem Paart ze verbannen.
Wann et e Modem gëtt, verursaacht dëst keng speziell Problemer, awer wann et méi wéi een ass, nämlech n-Stécker, entsteet déi folgend Netzwierkbild.

Simultan Geschwindegkeetstest op verschidde LTE Modems

Dat ass, n Reseau Kaarte, mat der selwechter IP Adress, all mat der selwechter Default Paart. Awer tatsächlech ass jidderee vun hinnen mat sengem eegene Bedreiwer verbonnen.

Am Ufank hat ech eng einfach Léisung: mam ifconfig oder ip Kommando auszeschalten, all Interfaces auszeschalten an einfach een am Tour un an testen. D'Léisung war gutt fir jiddereen, ausser datt ech während de Schaltmomenter net konnt mam Apparat konnektéieren. A well de Wiessel dacks a séier ass, hat ech eigentlech guer keng Geleeënheet fir ze verbannen.

Dofir hunn ech de Wee gewielt fir d'IP Adresse vun de Modems manuell z'änneren an dann de Verkéier mat Routing-Astellungen ze féieren.

Simultan Geschwindegkeetstest op verschidde LTE Modems

Dëst war net d'Enn vu menge Probleemer mat Modem: am Fall vu Stroumproblemer si se ofgefall, an eng gutt stabil Energieversuergung zum USB Hub war erfuerderlech. Ech hunn dëse Problem geléist andeems ech d'Kraaft direkt un den Hub haart solderen. En anere Problem deen ech begéint hunn an deen de ganze Projet ruinéiert huet: no engem Neistart oder engem kale Start vum Apparat sinn net all Modem festgestallt ginn an net ëmmer, an ech konnt net bestëmmen firwat dat geschitt ass a wéi engem Algorithmus. Awer éischt Saachen éischt.

Fir datt de Modem richteg funktionnéiert, hunn ech den usb-modeswitch Package installéiert.

sudo apt update
sudo apt install -y usb-modeswitch

Duerno, no der Verbindung, gëtt de Modem korrekt festgestallt a konfiguréiert vum Udev Subsystem. Ech kontrolléieren duerch einfach de Modem ze verbannen a sécherzestellen datt d'Netzwierk erschéngt.
En anere Problem deen ech net konnt léisen: wéi kann ech den Numm vum Bedreiwer mat deem mir schaffen aus dësem Modem kréien? Den Numm vum Bedreiwer ass am Modem Webinterface um 192.168.8.1 enthale. Dëst ass eng dynamesch Websäit déi Daten duerch Ajax Ufroe kritt, sou datt einfach d'Säit wgetéieren an den Numm parséieren funktionnéiert net. Also hunn ech ugefaang ze kucken wéi ech eng Websäit entwéckelen, asw., a gemierkt datt ech eng Zort Blödsinn maachen. Als Resultat huet hien gespaut, an de Bedreiwer huet ugefaang mat der Speedtest API selwer ze kréien.

Vill wier méi einfach wann de Modem Zougang iwwer AT Kommandoen hätt. Et wier méiglech et nei ze konfiguréieren, eng ppp Verbindung ze kreéieren, eng IP ze ginn, en Telekomoperateur ze kréien, asw. Awer leider, ech schaffen mat deem wat ech kritt hunn.

GPS

De GPS Empfänger, deen ech krut, hat eng UART Interface a Kraaft. Et war net déi bescht Léisung, awer et war nach ëmmer funktionnéiert an einfach. Den Empfänger huet sou eppes ausgesinn.

Simultan Geschwindegkeetstest op verschidde LTE Modems

Fir éierlech ze sinn, war dëst meng éischt Kéier mat engem GPS Empfänger ze schaffen, awer wéi ech erwaart hunn, war alles viru laanger Zäit fir eis geduecht. Also benotze mir just fäerdeg Léisungen.

Als éischt aktivéieren ech uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) fir GPS ze verbannen.

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

Duerno kontrolléieren ech den Erfolleg vun der Operatioun.

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

Dëse Kommando ännert anscheinend den Devtree op der Flucht, wat ganz bequem ass.

Nom Erfolleg vun dëser Operatioun, Restart an installéiert de GPS Daemon.

khadas@Khadas:~$ sudo reboot

Installatioun vum GPS Daemon. Ech installéieren alles a schneide se direkt of fir weider Konfiguratioun.

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

Änneren vun der Astellungsdatei.

sudo vim /etc/default/gpsd

Ech installéieren en UART op deem de GPS hänkt.

DEVICES="/dev/ttyS4"

An da schalten mir alles un a fänken un.

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

Duerno verbannen ech de GPS.

Simultan Geschwindegkeetstest op verschidde LTE Modems

De GPS Drot ass a mengen Hänn, d'UART Debugger Drot sinn ënner meng Fanger ze gesinn.

Ech restarten a kontrolléieren d'GPS Operatioun mam GPSmon Programm.

Simultan Geschwindegkeetstest op verschidde LTE Modems

Dir kënnt d'Satellitten net an dësem Screenshot gesinn, awer Dir kënnt d'Kommunikatioun mam GPS Empfänger gesinn, an dat heescht datt alles gutt ass.

Am Python hunn ech vill Méiglechkeeten probéiert fir mat dësem Daemon ze schaffen, awer ech hu mech op deen niddergelooss dee richteg mam Python 3 geschafft huet.

Ech installéieren déi néideg Bibliothéik.

sudo -H pip3 install gps3 

An ech sculpt den Aarbechtscode.

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

Wann ech Koordinaten musse kréien, gëtt dat mam folgenden Uruff gemaach:

longitude, latitude = getPositionData(agps_thread)

A bannent 1-10 Sekonnen kréien ech entweder d'Koordinate oder net. Jo, ech hat zéng Versich fir Koordinaten ze kréien. Net optimal, kromm a schief, awer et funktionnéiert. Ech hu beschloss dëst ze maachen, well GPS kann schlecht Empfang hunn an net ëmmer Daten kréien. Wann Dir waart fir Daten ze kréien, dann wann Dir an engem Fernzëmmer schafft, wäert de Programm op dëser Plaz afréieren. Dofir hunn ech dës inelegant Optioun ëmgesat.

Am Prinzip, wann et méi Zäit ass, wier et méiglech Daten vum GPS direkt iwwer UART ze kréien, se an engem getrennten Fuedem ze analyséieren a mat ze schaffen. Awer et war guer keng Zäit, dofir de brutal ellen Code. An jo, ech schummen mech net.

Liichtdiode

D'Verbindung vun der LED war einfach a schwéier zur selwechter Zäit. D'Haaptschwieregkeet ass datt d'PIN-Nummer am System net mat der PIN-Nummer op der Board entsprécht a well d'Dokumentatioun mat der lénker Hand geschriwwe gëtt. Fir d'Hardware Pin Nummer an d'Pin Nummer am OS ze vergläichen, musst Dir de Kommando ausféieren:

gpio readall

En Dësch vun PIN-Korrespondenz am System an op de Comité gëtt ugewisen. Duerno kann ech schonn de Pin am OS selwer operéieren. A mengem Fall ass d'LED verbonne mat GPIOH_5.

Simultan Geschwindegkeetstest op verschidde LTE Modems

Ech schalten de GPIO Pin op Ausgangsmodus.

gpio -g mode 421 out

Ech schreiwen null.

gpio -g write 421 0

Ech schreiwen een op.

gpio -g write 421 1

Simultan Geschwindegkeetstest op verschidde LTE Modems
Alles ass beliicht, nodeems Dir "1" schreift

#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)

Elo, am Fall vu Feeler, ruffen ech error_blink () an d'LED blénkt schéin.

Software Noden

Speedtest API

Et ass eng grouss Freed datt de speedtest.net Service säin eegene Python-API huet, Dir kënnt kucken Github.

Déi gutt Saach ass datt et Quellcoden sinn déi och gekuckt kënne ginn. Wéi mat dëser API ze schaffen (einfach Beispiller) kann fonnt ginn an relevant Rubrik.

Ech installéieren d'Python-Bibliothéik mat dem folgenden Kommando.

sudo -H pip3 install speedtest-cli

Zum Beispill kënnt Dir souguer e Geschwindegkeetstester an Ubuntu direkt vun der Software installéieren. Dëst ass déiselwecht Python Applikatioun, déi dann direkt vun der Konsole gestart ka ginn.

sudo apt install speedtest-cli -y

A moosst Är Internetgeschwindegkeet.

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

Als Resultat, grad wéi ech gemaach. Ech hu missen an d'Quellcoden vun dësem Geschwindegkeetstest kommen fir se méi voll a mengem Projet ëmzesetzen. Eng vun de wichtegsten Aufgaben ass den Numm vum Telekomoperateur ze kréien fir en an d'Plack ze ersetzen.

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"
#тут идет запись в файл логов

Och hei huet sech alles net sou einfach gewisen, obwuel et vill méi einfach wier. Am Ufank war de Serverparameter gläich wéi [], se soen, wielt déi bescht Server. Als Resultat hunn ech zoufälleg Serveren, an, wéi Dir vläicht roden, variabel Vitesse. Dëst ass zimmlech e komplext Thema, mat engem fixen Server, wa jo, statesch oder dynamesch, erfuerdert Fuerschung. Awer hei ass e Beispill vu Geschwindegkeetsmessgrafiken fir e Beeline Bedreiwer wann Dir dynamesch en Testserver auswielt an e statesch fixen.

Simultan Geschwindegkeetstest op verschidde LTE Modems
D'Resultat vun der Messgeschwindegkeet beim Choix vun engem dynamesche Server.

Simultan Geschwindegkeetstest op verschidde LTE Modems
D'Resultat vum Geschwindegkeetstest, mat engem streng ausgewielten Server.

Wärend dem Test gëtt et op béide Plazen "Pelz", an et muss mat mathematesche Methoden ewechgeholl ginn. Awer mat engem fixen Server ass et liicht manner an d'Amplitude ass méi stabil.
Am Allgemengen ass dëst eng Plaz vu grousser Fuerschung. An ech géif d'Geschwindegkeet vu mengem Server moossen mam iperf Utility. Awer mir halen eis un déi technesch Spezifikatioune.

Schécken Mail a Feeler

Fir E-Mail ze schécken, hunn ech e puer Dosen verschidden Optiounen probéiert, awer um Enn hunn ech mech op déi folgend néiergelooss. Ech hunn eng Mailbox op Yandex ugemellt an dann geholl Dëst ass e Beispill fir Mail ze schécken. Ech hunn et iwwerpréift an an de Programm ëmgesat. Dëst Beispill ënnersicht verschidde Méiglechkeeten, inklusiv Schécken vu Gmail, etc. Ech wollt mech net mam Opriichten vun mengem Mail-Server beméien an hat keng Zäit dofir, mee wéi et sech herno erausstellt, war et och ëmsoss.

D'Logbicher goufen no dem Scheduler geschéckt, wann et eng Verbindung ass, all 6 Stonnen: um 00 Auer, 06 Auer, 12 Auer an 18 Auer. Geschéckt et wéi follegt.

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

Feeler goufen och am Ufank geschéckt. Fir unzefänken, goufen se an der Lëscht cumuléiert, an dann och mat der Scheduler geschéckt, wann et eng Verbindung war. Allerdéngs entstanen dann Problemer mat der Tatsaach, datt Yandex eng Limite op d'Zuel vun de Messagen pro Dag geschéckt huet (dëst ass Péng, Trauregkeet an Ernidderung). Well et souguer pro Minutt eng riesech Unzuel vu Feeler kéinte ginn, hu mir misse Feeler per Mail schécken. Also am Kapp behalen wann Dir automatesch Informatioun iwwer sou e Problem duerch Yandex Servicer schéckt.

Feedback Server

Fir Zougang zu engem Remote Stéck Hardware ze hunn an et ze personaliséieren an nei ze konfiguréieren, brauch ech en externen Server. Am Allgemengen, fir fair ze sinn, wier et richteg fir all d'Donnéeën op de Server ze schécken an all déi schéi Grafiken an der Webinterface ze bauen. Awer net alles op eemol.

Fir VPS hunn ech gewielt ruvds.com. Dir kënnt den einfachsten Server huelen. An allgemeng, fir meng Zwecker wier dat genuch. Awer well ech de Server net aus menger eegener Täsch bezuelt hunn, hunn ech decidéiert et mat enger klenger Reserve ze huelen, fir datt et genuch wier wa mir e Webinterface, eisen eegene SMTP-Server, VPN, etc. Plus, fäeg sinn en Telegram Bot opzestellen an net Problemer mat deem ze blockéieren. Dofir hunn ech Amsterdam an déi folgend Parameteren gewielt.

Simultan Geschwindegkeetstest op verschidde LTE Modems

Als Kommunikatiounsmethod mat der Hardware huet vim2 eng ëmgedréint ssh Verbindung gewielt an, wéi d'Praxis gewisen huet, ass et net déi bescht. Wann d'Verbindung verluer ass, hält de Server den Hafen an et ass onméiglech fir eng Zäit ze verbannen. Dofir ass et nach ëmmer besser aner Kommunikatiounsmethoden ze benotzen, zum Beispill VPN. An Zukunft wollt ech op VPN wiesselen, awer hat keng Zäit.

Ech ginn net an Detailer fir eng Firewall opzestellen, d'Rechter ze beschränken, d'Root ssh Verbindungen auszeschalten an aner Truismus fir e VPS opzestellen. Ech géif gären gleewen, datt Dir schon alles wësst. Fir eng Fernverbindung erstellen ech en neie Benotzer um Server.

adduser vimssh

Ech generéieren ssh Verbindungsschlësselen op eiser Hardware.

ssh-keygen

An ech kopéieren se op eise Server.

ssh-copy-id [email protected]

Op eiser Hardware erstellen ech eng automatesch ëmgedréint ssh Verbindung bei all Boot.

[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

Opgepasst op den Hafen 8083: et bestëmmt wéi en Hafen ech benotze fir iwwer ëmgedréint ssh ze verbannen. Füügt et zum Startup a fänkt un.

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

Dir kënnt souguer de Status gesinn:

sudo systemctl status autossh.service

Elo, op eisem VPS Server, wa mir lafen:

ssh -p 8083 khadas@localhost

Da kommen ech op meng Teststéck Hardware. A vun der Hardware kann ech och Logbicher an all Daten iwwer ssh op mäi Server schécken, wat ganz bequem ass.

All zesummen maachen

Simultan Geschwindegkeetstest op verschidde LTE Modems
Schalten un, loosst eis d'Entwécklung an d'Debuggen ufänken

Phew, gutt, dat ass et, ech hunn all Noden beschriwwen. Elo ass et Zäit alles zesummen ze setzen. Dir kënnt de Code gesinn hei riets.

E wichtege Punkt mam Code: Dëse Projet kann net esou ufänken, well e fir eng spezifesch Aufgab, vun enger spezifescher Architektur ugepasst gouf. Och wann ech de Quellcode ginn, erklären ech nach ëmmer déi wäertvollst Saachen hei, direkt am Text, soss ass et komplett onverständlech.

Am Ufank initialiséieren ech gps, gpio a starten e separaten Scheduler thread.

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

De Scheduler ass ganz einfach: et gesäit aus ob d'Zäit komm ass fir Messagen ze schécken a wat den aktuelle Feelerstatus ass. Wann et e Feeler Fändel ass, da blénke mir d'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)

Dee schwieregsten Deel vun dësem Projet ass déi ëmgedréint ssh Verbindung fir all Test z'erhalen. All Test beinhalt d'Neikonfiguratioun vum Standardgateway an den DNS Server. Well souwisou kee liest, weess, datt den Zuch net op hëlze Schinne fiert. Wien d'Ouschtereeër fënnt, kritt e Séisswueren.

Fir dëst ze maachen, erstellen ech eng separat Routing-Tabelle -set-mark 0x2 an eng Regel fir de Verkéier ze redirectéieren.

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")

Dir kënnt méi iwwer léieren wéi et funktionnéiert liest an dësem Artikel.

Duerno ginn ech an eng endlos Loop, wou mir all Kéier eng Lëscht mat verbonne Modem kréien (fir erauszefannen ob d'Netzkonfiguratioun op eemol geännert huet).

network_list = getNetworklist()

Eng Lëscht vun Netzwierkschnëttplazen ze kréien ass ganz einfach.

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

Nodeems ech d'Lëscht kritt hunn, hunn ech IP Adressen op all Interface gesat, wéi ech am Bild am Kapitel iwwer de Modem gewisen hunn.

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")

Da ginn ech einfach duerch all Interface an enger Loop. An ech konfiguréieren all Interface.

	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'")

Ech kontrolléieren d'Interface fir d'Funktionalitéit, wann et keen Netz ass, da generéiere ech Feeler. Wann et en Netzwierk ass, dann ass et Zäit ze handelen!

Hei konfiguréieren ech ssh Routing op dës Interface (wann et net gemaach gouf), schéckt Feeler op de Server wann d'Zäit komm ass, schéckt Logbicher a laaft endlech e Speedtest a späichert d'Logbicher op eng Csv-Datei.

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()
#и далее тестируем скорость и сохраняем логи. 

Et ass derwäert d'Funktioun ze ernimmen fir ëmgedréint ssh opzestellen.

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")

An natierlech musst Dir all dës Schéinheet zum Startup addéieren. Fir dëst ze maachen, erstellen ech eng Datei:

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

An ech schreiwen dran:

[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

Ech schalten d'Autoloading un a fänken un!

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

Elo kann ech Logbicher gesinn wat geschitt mam Kommando:

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

Resultater

Gutt, elo ass dat Wichtegst, wat ass als Resultat geschitt? Hei sinn e puer Grafiken déi ech et fäerdeg bruecht hunn während der Entwécklung an Debugging Prozess ze erfassen. D'Grafike goufen mat Gnuplot mat dem folgenden Skript gebaut.

#! /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"

Déi éischt Erfahrung war mam Tele2 Bedreiwer, deen ech e puer Deeg gemaach hunn.

Simultan Geschwindegkeetstest op verschidde LTE Modems

Hei hunn ech en dynamesche Messserver benotzt. Geschwindegkeetsmessungen funktionnéieren, awer schwanke ganz vill, awer e puer Duerchschnëttswäert ass nach ëmmer ze gesinn, an dëst kann kritt ginn andeems Dir d'Daten filtert, zum Beispill mat engem bewegende Duerchschnëtt.

Méi spéit hunn ech eng Rei Grafike fir aner Telekomoperateuren gebaut. An dësem Fall gouf et schonn een Testserver, an d'Resultater waren och ganz interessant.

Simultan Geschwindegkeetstest op verschidde LTE Modems

Simultan Geschwindegkeetstest op verschidde LTE Modems

Simultan Geschwindegkeetstest op verschidde LTE Modems

Simultan Geschwindegkeetstest op verschidde LTE Modems

Wéi Dir kënnt gesinn, ass d'Thema ganz extensiv fir d'Fuerschung an d'Veraarbechtung vun dësen Donnéeën, a dauert kloer net fir e puer Wochen Aarbecht. Awer…

Resultat vun der Aarbecht

D'Aarbecht gouf abrupt ofgeschloss wéinst Ëmstänn iwwer meng Kontroll. Ee vun de Schwächten vun dësem Projet, menger subjektiver Meenung, war de Modem, deen net wierklech gläichzäiteg mat anere Modem wollt schaffen, an all Kéiers wann et geluede gouf, esou Tricken gemaach huet. Fir dës Zwecker ginn et eng grouss Zuel vun anere Modem Modeller; normalerweis si se schonn am Mini PCI-e Format a sinn am Apparat installéiert a si vill méi einfach ze konfiguréieren. Mä dat ass eng ganz aner Geschicht. De Projet war interessant an ech war ganz frou, datt ech do konnt matmaachen.

Simultan Geschwindegkeetstest op verschidde LTE Modems

Source: will.com

Setzt e Commentaire