Test i njëkohshëm i shpejtësisë në disa modemë LTE

Gjatë karantinës, m'u ofrua të merrja pjesë në zhvillimin e një pajisjeje për matjen e shpejtësisë së modemeve LTE për disa operatorë celularë.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Klienti dëshironte të vlerësonte shpejtësinë e operatorëve të ndryshëm të telekomit në vende të ndryshme gjeografike, në mënyrë që të ishte në gjendje të kuptonte se cili operator celular ishte më optimali për të kur instalonte pajisje duke përdorur një lidhje LTE, për shembull, për transmetime video. Në të njëjtën kohë, problemi duhej të zgjidhej sa më thjeshtë dhe më lirë, pa pajisje të shtrenjta.

Unë do të them menjëherë se detyra nuk është më e thjeshta dhe me njohuri intensive; unë do t'ju tregoj se cilat probleme kam hasur dhe si i kam zgjidhur ato. Pra, le të shkojmë.

Shënim

Matja e shpejtësisë së një lidhjeje LTE është një çështje shumë komplekse: ju duhet të zgjidhni pajisjet dhe teknikën e duhur të matjes, si dhe të keni një kuptim të mirë të topologjisë dhe funksionimit të rrjetit celular. Plus, shpejtësia mund të ndikohet nga disa faktorë: numri i abonentëve në një celular, kushtet e motit, madje edhe nga qeliza në qelizë shpejtësia mund të ndryshojë në mënyrë dramatike për shkak të topologjisë së rrjetit. Në përgjithësi, ky është një problem me një numër të madh të panjohurash, dhe vetëm një operator telekomi mund ta zgjidhë atë saktë.

Fillimisht, klienti thjesht donte të drejtonte korrierin me telefonat e operatorëve, të bënte matje direkt në telefon dhe më pas të shënonte rezultatet e matjes së shpejtësisë në një fletore. Zgjidhja ime për matjen e shpejtësisë së rrjeteve lte, edhe pse jo ideale, e zgjidh problemin.

Për shkak të mungesës së kohës, mora vendime jo në favor të komoditetit apo prakticitetit, por në favor të shpejtësisë së zhvillimit. Për shembull, reverse ssh u përdor për akses në distancë, në vend të VPN më praktike, në mënyrë që të kursehet kohë në konfigurimin e serverit dhe çdo klient individual.

Detyrë teknike

Siç thuhet në artikull Pa specifikime teknike: pse klienti nuk e dëshiron atë: Mos punoni pa specifikime teknike! Asnjëherë, askund!

Detyra teknike ishte mjaft e thjeshtë, do ta zgjeroj pak për ta kuptuar përdoruesin përfundimtar. Zgjedhja e zgjidhjeve teknike dhe pajisjeve u diktua nga klienti. Pra, vetë specifikimi teknik, pas të gjitha miratimeve:

Bazuar në një kompjuter të vetëm vim2 bëni një testues shpejtësie për lidhjet lte nëpërmjet modemit Huawei e3372h - 153 disa operatorë telekomunikacioni (nga një në n). Është gjithashtu e nevojshme të merren koordinatat nga një marrës GPS i lidhur nëpërmjet UART. Bëni matje të shpejtësisë duke përdorur shërbimin www.speedtest.net dhe vendosini ato në një tabelë si:

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Tabela në format csv. Më pas dërgojeni këtë shenjë me e-mail çdo 6 orë. Në rast gabimesh, pulsoni LED-in që është i lidhur me GPIO.

Specifikimet teknike i kam përshkruar në formë të lirë, pas shumë miratimeve. Por kuptimi i detyrës tashmë është i dukshëm. Një javë u dha për gjithçka. Por në realitet ajo zgjati për tre javë. Kjo po merr parasysh faktin që këtë e kam bërë vetëm pas punës sime kryesore dhe gjatë fundjavave.

Këtu dua të tërheq edhe një herë vëmendjen për faktin se klienti ra dakord paraprakisht për përdorimin e shërbimit të matjes së shpejtësisë dhe pajisjes, gjë që kufizoi shumë aftësitë e mia. Buxheti ishte gjithashtu i kufizuar, kështu që nuk u ble asgjë e veçantë. Kështu që ne duhej të luanim sipas këtyre rregullave.

Arkitektura dhe zhvillimi

Skema është e thjeshtë dhe e qartë. Prandaj, do ta lë pa komente të veçanta.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Vendosa të zbatoj të gjithë projektin në python, pavarësisht se nuk kisha fare përvojë në zhvillimin e kësaj gjuhe. E zgjodha sepse kishte një mori shembujsh dhe zgjidhjesh të gatshme që mund të shpejtonin zhvillimin. Prandaj, u kërkoj të gjithë programuesve profesionistë të mos qortojnë përvojën time të parë të zhvillimit në python dhe jam gjithmonë i lumtur të dëgjoj kritika konstruktive për të përmirësuar aftësitë e mia.

Gjithashtu gjatë procesit zbulova se python ka dy versione të ekzekutimit 2 dhe 3, si rezultat u vendosa në të tretin.

Nyjet e harduerit

Vim2 me një pjatë

Më dhanë një kompjuter me një bord si makinën time kryesore vim2

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Një procesor i shkëlqyer, i fuqishëm i mediave për një shtëpi inteligjente dhe SMART-TV, por jashtëzakonisht i papërshtatshëm për këtë detyrë, ose, le të themi, pak i përshtatshëm. Për shembull, OS i tij kryesor është Android, dhe Linux është një OS dytësor, dhe në përputhje me rrethanat askush nuk garanton funksionimin me cilësi të lartë të të gjitha nyjeve dhe drejtuesve nën Linux. Dhe supozoj se disa nga problemet kishin të bënin me drejtuesit USB të kësaj platforme, kështu që modemet nuk funksionuan siç pritej në këtë bord. Ai gjithashtu ka dokumentacion shumë të dobët dhe të shpërndarë, kështu që çdo operacion kërkonte shumë kohë duke gërmuar nëpër doke. Edhe puna e zakonshme me GPIO mori shumë gjak. Për shembull, m'u deshën disa orë për të vendosur LED. Por, për të qenë objektiv, në thelb nuk ishte e rëndësishme se çfarë lloj dërrase të vetme ishte, gjëja kryesore ishte se funksiononte dhe kishte porte USB.

Së pari, më duhet të instaloj Linux në këtë bord. Për të mos fshirë egërsinë e dokumentacionit për të gjithë, por edhe për ata që do të merren me këtë sistem me një tabelë, po shkruaj këtë kapitull.

Ekzistojnë dy mundësi për të instaluar Linux: në një kartë SD të jashtme ose në një MMC të brendshëm. E kalova mbrëmjen duke u përpjekur të kuptoj se si ta bëja të funksiononte me kartën, kështu që vendosa ta instaloja në MMC, megjithëse pa dyshim do të ishte shumë më e lehtë të punoja me një kartë të jashtme.

Rreth firmuerit i thënë shtrembër këtu. Unë përkthej nga e çuditshme në Rusisht. Për të ndezur bordin, më duhet të lidh harduerin UART. E lidhi atë në mënyrën e mëposhtme.

  • Pini i veglave GND: <—> Pin17 i GPIO-s së VIM-ve
  • Pini i veglave TXD: <—> Pin18 i GPIO-s së VIM-ve (Linux_Rx)
  • Pini i veglave RXD: <—> Pin19 i GPIO-s së VIM-ve (Linux_Tx)
  • Pini i veglave VCC: <—> Pin20 i GPIO-s së VIM-ve

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Pas së cilës, shkarkova firmware-in prandaj. Version specifik i firmuerit VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Për të ngarkuar këtë firmware, më duhen shërbimet komunale. Më shumë detaje rreth kësaj këtu. Nuk kam provuar ta ndez nën Windows, por duhet t'ju them disa fjalë për firmware nën Linux. Së pari, unë do të instaloj shërbimet sipas udhëzimeve.

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

Aadhe... Asgjë nuk funksionon. Kalova disa orë duke redaktuar skriptet e instalimit në mënyrë që gjithçka të instalohej siç duhet për mua. Nuk më kujtohet se çfarë bëra atje, por ishte edhe ai cirku me kuaj. Prandaj kini kujdes. Por pa këto shërbime nuk ka kuptim të torturosh më tej vim2. Është më mirë të mos ngatërrohesh fare me të!

Pas shtatë rrathëve të ferrit, konfigurimit dhe instalimit të skenarit, mora një paketë të shërbimeve komunale. E lidha bordin nëpërmjet USB-së me kompjuterin tim Linux dhe lidha gjithashtu UART-in sipas diagramit të mësipërm.
Po konfiguroj terminalin tim të preferuar minicom për një shpejtësi prej 115200, pa kontroll të gabimeve harduerike dhe softuerike. Dhe le të fillojmë.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Kur ngarkoj VIM2 në terminalin UART, unë shtyp një tast, siç është shiriti i hapësirës, ​​për të ndaluar ngarkimin. Pasi të shfaqet rreshti

kvim2# 

Unë fut komandën:

kvim2# run update

Në hostin nga i cili po ngarkojmë, unë ekzekutoj:

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

Kjo është ajo, puf. Kontrollova, ka Linux në tabelë. Hyrja/fjalëkalimi khadas:khadas.

Pas kësaj, disa cilësime të vogla fillestare. Për punë të mëtejshme, unë çaktivizoj fjalëkalimin për sudo (po, jo i sigurt, por i përshtatshëm).

sudo visudo

Redaktoj rreshtin në formular dhe ruaj

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

Pastaj ndryshoj vendndodhjen aktuale në mënyrë që ora të jetë në Moskë, përndryshe do të jetë në Greenwich.

sudo timedatectl set-timezone Europe/Moscow

ose

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

Nëse e keni të vështirë, atëherë mos e përdorni këtë tabelë; Raspberry Pi është më i mirë. Sinqerisht.

Modem Huawei e3372h – 153

Ky modem ishte një burim i rëndësishëm gjaku për mua dhe, në fakt, u bë pengesa e të gjithë projektit. Në përgjithësi, emri "modem" për këto pajisje nuk pasqyron aspak thelbin e punës: ky është një kombinim i fuqishëm, kjo pjesë e harduerit ka një pajisje të përbërë që pretendon të jetë një CD-ROM për të instaluar drejtuesit, dhe më pas kalon në modalitetin e kartës së rrjetit.

Arkitekturisht, nga këndvështrimi i një përdoruesi Linux, pas të gjitha cilësimeve, duket kështu: pas lidhjes së modemit, kam një ndërfaqe rrjeti eth*, i cili përmes dhcp merr adresën IP 192.168.8.100 dhe portën e paracaktuar. është 192.168.8.1.

Dhe momenti më i rëndësishëm! Ky model modemi nuk mund të funksionojë në modalitetin e modemit, i cili kontrollohet nga komandat AT. Gjithçka do të ishte shumë më e thjeshtë, krijoni lidhje PPP për çdo modem dhe më pas veproni me to. Por në rastin tim, "vetë" (më saktë, një zhytës Linux sipas rregullave të udev), krijon një ndërfaqe eth dhe i cakton asaj një adresë IP përmes dhcp.

Për të shmangur konfuzionin e mëtejshëm, ju sugjeroj të harroni fjalën "modem" dhe të thoni kartë rrjeti dhe portë, sepse në thelb, është si të lidhni një kartë të re rrjeti me një portë.
Kur ka një modem, kjo nuk shkakton ndonjë problem të veçantë, por kur ka më shumë se një, përkatësisht n-copa, lind fotografia e mëposhtme e rrjetit.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Kjo do të thotë, n karta rrjeti, me të njëjtën adresë IP, secila me të njëjtën portë të paracaktuar. Por në fakt, secila prej tyre është e lidhur me operatorin e vet.

Fillimisht, pata një zgjidhje të thjeshtë: duke përdorur komandën ifconfig ose ip, çaktivizoni të gjitha ndërfaqet dhe thjesht aktivizoni njërën me radhë dhe provoni. Zgjidhja ishte e mirë për të gjithë, përveç se gjatë momenteve të ndërrimit nuk arrita të lidhem me pajisjen. Dhe duke qenë se ndërrimi është i shpeshtë dhe i shpejtë, në fakt nuk kisha mundësi të lidhem fare.

Prandaj, zgjodha rrugën e ndryshimit manual të adresave IP të modemit dhe më pas drejtimit të trafikut duke përdorur cilësimet e rrugëzimit.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Ky nuk ishte fundi i problemeve të mia me modemet: në rast të problemeve me energjinë, ato ranë dhe kërkohej një furnizim i mirë i qëndrueshëm me energji elektrike në shpërndarësin USB. E zgjidha këtë problem duke e bashkuar fort fuqinë direkt në qendër. Një problem tjetër që hasa dhe që shkatërroi të gjithë projektin: pas një rindezjeje ose fillimi të ftohtë të pajisjes, jo të gjithë modemët u zbuluan dhe jo gjithmonë, dhe nuk mund të përcaktoja pse ndodhi kjo dhe me cilin algoritëm. Por gjërat e para së pari.

Që modemi të funksionojë siç duhet, kam instaluar paketën usb-modeswitch.

sudo apt update
sudo apt install -y usb-modeswitch

Pas së cilës, pas lidhjes, modemi do të zbulohet dhe konfigurohet saktë nga nënsistemi udev. Kontrolloj thjesht duke lidhur modemin dhe duke u siguruar që rrjeti të shfaqet.
Një problem tjetër që nuk arrita ta zgjidh: si mund ta marr emrin e operatorit me të cilin po punojmë nga ky modem? Emri i operatorit gjendet në ndërfaqen e ueb-it të modemit në 192.168.8.1. Kjo është një faqe interneti dinamike që merr të dhëna përmes kërkesave të Ajax, kështu që thjesht fshirja e faqes dhe analizimi i emrit nuk do të funksionojë. Kështu që fillova të shikoja se si të zhvilloja një faqe interneti, etj., dhe kuptova se po bëja një lloj marrëzie. Si rezultat, ai pështyu dhe operatori filloi të marrë duke përdorur vetë API-në Speedtest.

Shumë do të ishte më e lehtë nëse modemi do të kishte akses nëpërmjet komandave AT. Do të ishte e mundur rikonfigurimi i tij, krijimi i një lidhjeje ppp, caktimi i një IP, marrja e një operatori telekomi, etj. Por mjerisht, po punoj me atë që më është dhënë.

GPS

Marrësi GPS që më dhanë kishte një ndërfaqe dhe fuqi UART. Nuk ishte zgjidhja më e mirë, por ishte ende e zbatueshme dhe e thjeshtë. Marrësi dukej diçka si kjo.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Për të qenë i sinqertë, kjo ishte hera ime e parë që punoja me një marrës GPS, por siç prisja, gjithçka ishte menduar për ne shumë kohë më parë. Pra, ne përdorim vetëm zgjidhje të gatshme.

Së pari, unë aktivizoj uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) për të lidhur GPS.

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

Më pas kontrolloj suksesin e operacionit.

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

Kjo komandë me sa duket redakton devtree në fluturim, gjë që është shumë e përshtatshme.

Pas suksesit të këtij operacioni, rindizni dhe instaloni demonin GPS.

khadas@Khadas:~$ sudo reboot

Instalimi i demonit GPS. Unë instaloj gjithçka dhe e ndërpres menjëherë për konfigurim të mëtejshëm.

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

Redaktimi i skedarit të cilësimeve.

sudo vim /etc/default/gpsd

Unë jam duke instaluar një UART në të cilën do të varet GPS.

DEVICES="/dev/ttyS4"

Dhe pastaj ne ndezim gjithçka dhe fillojmë.

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

Pas kësaj, unë lidh GPS.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Teli GPS është në duart e mia, telat e korrigjimit të UART janë të dukshme nën gishtat e mi.

Rinisem dhe kontrolloj funksionimin GPS duke përdorur programin gpsmon.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Ju nuk mund t'i shihni satelitët në këtë pamje të ekranit, por mund të shihni komunikimin me marrësin GPS, dhe kjo do të thotë se gjithçka është në rregull.

Në python, provova shumë opsione për të punuar me këtë daemon, por u vendosa në atë që funksionoi saktë me python 3.

Unë instaloj bibliotekën e nevojshme.

sudo -H pip3 install gps3 

Dhe unë skali kodin e punës.

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

Nëse më duhet të marr koordinatat, kjo bëhet me thirrjen e mëposhtme:

longitude, latitude = getPositionData(agps_thread)

Dhe brenda 1-10 sekondash ose do të marr koordinatat ose jo. Po, kam pasur dhjetë përpjekje për të marrë koordinatat. Jo optimale, e shtrembër dhe e shtrembër, por funksionon. Vendosa ta bëj këtë sepse GPS mund të ketë pritje të dobët dhe jo gjithmonë të marrë të dhëna. Nëse prisni të merrni të dhëna, atëherë nëse punoni në një dhomë të largët, programi do të ngrijë në këtë vend. Prandaj, unë zbatova këtë opsion joelegant.

Në parim, nëse do të kishte më shumë kohë, do të ishte e mundur të merrni të dhëna nga GPS direkt përmes UART, t'i analizoni ato në një fije të veçantë dhe të punoni me të. Por nuk kishte fare kohë, prandaj kodi brutalisht i shëmtuar. Dhe po, nuk më vjen turp.

dritë-emeton diode

Lidhja e LED-it ishte e thjeshtë dhe e vështirë në të njëjtën kohë. Vështirësia kryesore është se numri i pinit në sistem nuk korrespondon me numrin e pinit në tabelë dhe sepse dokumentacioni është shkruar me dorën e majtë. Për të krahasuar numrin e pinit të harduerit dhe numrin e pinit në OS, duhet të ekzekutoni komandën:

gpio readall

Do të shfaqet një tabelë e korrespondencës së pineve në sistem dhe në tabelë. Pas së cilës unë tashmë mund të përdor pinin në vetë OS. Në rastin tim LED është i lidhur me GPIOH_5.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

E kaloj pinin GPIO në modalitetin e daljes.

gpio -g mode 421 out

Unë shkruaj zero.

gpio -g write 421 0

Unë shkruaj një.

gpio -g write 421 1

Test i njëkohshëm i shpejtësisë në disa modemë LTE
Gjithçka është ndezur, pasi shkruani "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)

Tani, në rast gabimesh, unë thërras error_blink() dhe LED do të pulsojë bukur.

Nyjet e softuerit

Speedtest API

Është një gëzim i madh që shërbimi speedtest.net ka python-API-në e tij, mund ta shikoni Github.

E mira është se ka kode burimore që gjithashtu mund të shikohen. Mënyra e punës me këtë API (shembuj të thjeshtë) mund të gjendet në seksioni përkatës.

Unë instaloj bibliotekën python me komandën e mëposhtme.

sudo -H pip3 install speedtest-cli

Për shembull, madje mund të instaloni një testues shpejtësie në Ubuntu direkt nga softueri. Ky është i njëjti aplikacion python, i cili më pas mund të lëshohet direkt nga tastiera.

sudo apt install speedtest-cli -y

Dhe matni shpejtësinë tuaj të internetit.

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

Si rezultat, ashtu siç bëra unë. Më duhej të futesha në kodet burimore të këtij testi të shpejtësisë në mënyrë që t'i zbatoja më plotësisht në projektin tim. Një nga detyrat më të rëndësishme është marrja e emrit të operatorit të telekomit për ta zëvendësuar atë në tabelë.

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

Edhe këtu, gjithçka doli të ishte jo aq e thjeshtë, megjithëse do të dukej shumë më e thjeshtë. Fillimisht, parametri i serverëve ishte i barabartë me [], thonë ata, zgjidhni serverin më të mirë. Si rezultat, unë kisha serverë të rastësishëm dhe, siç mund ta merrni me mend, shpejtësi të ndryshueshme. Kjo është një temë mjaft komplekse, përdorimi i një serveri fiks, nëse po, statik apo dinamik, kërkon kërkime. Por këtu është një shembull i grafikëve të matjes së shpejtësisë për një operator Beeline kur zgjedh në mënyrë dinamike një server testimi dhe një të fiksuar statikisht.

Test i njëkohshëm i shpejtësisë në disa modemë LTE
Rezultati i matjes së shpejtësisë kur zgjidhni një server dinamik.

Test i njëkohshëm i shpejtësisë në disa modemë LTE
Rezultati i testimit të shpejtësisë, me një server të zgjedhur rreptësisht.

Gjatë testimit, ka "lesh" në të dy vendet dhe duhet të hiqet duke përdorur metoda matematikore. Por me një server fiks është pak më pak dhe amplituda është më e qëndrueshme.
Në përgjithësi, ky është një vend i kërkimit të madh. Dhe unë do të mata shpejtësinë e serverit tim duke përdorur mjetin iperf. Por ne i përmbahemi specifikimeve teknike.

Dërgimi i postës dhe gabimet

Për të dërguar postë, provova disa dhjetëra opsione të ndryshme, por në fund u vendosa në sa vijon. Regjistrova një kuti postare në Yandex dhe më pas e mora Ky është një shembull i dërgimit të postës. E kontrollova dhe e zbatova në program. Ky shembull shqyrton opsione të ndryshme, duke përfshirë dërgimin nga gmail, etj. Nuk doja të shqetësohesha me vendosjen e serverit tim të postës dhe nuk kisha kohë për të, por siç doli më vonë, ishte gjithashtu e kotë.

Regjistrat u dërguan sipas planifikuesit, nëse ka një lidhje, çdo 6 orë: në 00:06, 12:18, XNUMX:XNUMX dhe XNUMX:XNUMX. E dërgoi si më poshtë.

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

Fillimisht u dërguan edhe gabime. Për të filluar, ato u grumbulluan në listë, dhe më pas u dërguan gjithashtu duke përdorur planifikuesin, nëse kishte një lidhje. Sidoqoftë, atëherë lindën probleme me faktin se Yandex ka një kufi në numrin e mesazheve të dërguara në ditë (kjo është dhimbje, trishtim dhe poshtërim). Meqenëse mund të kishte një numër të madh gabimesh edhe në minutë, na u desh të braktisnim dërgimin e gabimeve me postë. Pra, mbani në mend kur dërgoni automatikisht informacion në lidhje me një problem të tillë përmes shërbimeve Yandex.

Serveri i komenteve

Për të pasur akses në një pjesë harduerike të largët dhe për të qenë në gjendje ta personalizoj dhe rikonfiguroj atë, më duhej një server i jashtëm. Në përgjithësi, për të qenë i drejtë, do të ishte e saktë që të dërgohen të gjitha të dhënat në server dhe të ndërtohen të gjitha grafikët e bukur në ndërfaqen e internetit. Por jo të gjitha përnjëherë.

Për VPS zgjodha ruvds.com. Ju mund të merrni serverin më të thjeshtë. Dhe në përgjithësi, për qëllimet e mia kjo do të mjaftonte. Por meqenëse nuk e pagova serverin nga xhepi im, vendosa ta merrja me një rezervë të vogël, në mënyrë që të mjaftonte nëse do të vendosnim një ndërfaqe në internet, serverin tonë SMTP, VPN, etj. Plus, mund të konfiguroni një bot Telegram dhe të mos keni probleme me bllokimin e tij. Prandaj, zgjodha Amsterdamin dhe parametrat e mëposhtëm.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Si një metodë komunikimi me harduerin, vim2 zgjodhi një lidhje të kundërt ssh dhe, siç ka treguar praktika, nuk është më e mira. Nëse lidhja humbet, serveri mban portin dhe është e pamundur të lidhet përmes tij për ca kohë. Prandaj, është akoma më mirë të përdorni metoda të tjera komunikimi, për shembull VPN. Në të ardhmen doja të kaloja në VPN, por nuk pata kohë.

Unë nuk do të hyj në detaje të konfigurimit të një muri zjarri, kufizimit të të drejtave, çaktivizimit të lidhjeve root ssh dhe truizmave të tjera të konfigurimit të një VPS. Do të doja të besoja se ju tashmë dini gjithçka. Për një lidhje në distancë, unë krijoj një përdorues të ri në server.

adduser vimssh

Unë gjeneroj çelësat e lidhjes ssh në harduerin tonë.

ssh-keygen

Dhe unë i kopjoj ato në serverin tonë.

ssh-copy-id [email protected]

Në harduerin tonë, unë krijoj një lidhje automatike të kundërt ssh në çdo nisje.

[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

Kushtojini vëmendje portit 8083: ai përcakton se cilën port do të përdor për t'u lidhur me anë të ssh të kundërt. Shtojeni atë në fillim dhe filloni.

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

Ju madje mund të shihni statusin:

sudo systemctl status autossh.service

Tani, në serverin tonë VPS, nëse ekzekutojmë:

ssh -p 8083 khadas@localhost

Pastaj shkoj te pjesa ime e testimit të harduerit. Dhe nga hardueri mund të dërgoj gjithashtu regjistra dhe çdo të dhënë përmes ssh në serverin tim, gjë që është shumë e përshtatshme.

Duke i bashkuar të gjitha

Test i njëkohshëm i shpejtësisë në disa modemë LTE
Duke u ndezur, le të fillojmë zhvillimin dhe korrigjimin e gabimeve

Epo, kjo është ajo, i përshkrova të gjitha nyjet. Tani është koha për t'i bashkuar të gjitha. Ju mund të shihni kodin këtu.

Një pikë e rëndësishme me kodin: Ky projekt mund të mos fillojë kështu, sepse është përshtatur për një detyrë specifike, të një arkitekture specifike. Edhe pse po jap kodin burimor, do të shpjegoj gjërat më të vlefshme këtu, pikërisht në tekst, përndryshe është krejtësisht e pakuptueshme.

Në fillim, unë inicializoj gps, gpio dhe hap një thread të veçantë planifikues.

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

Planifikuesi është mjaft i thjeshtë: duket për të parë nëse ka ardhur koha për të dërguar mesazhe dhe cili është statusi aktual i gabimit. Nëse ka një flamur gabimi, atëherë ne ndezim 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)

Pjesa më e vështirë e këtij projekti është ruajtja e lidhjes së kundërt ssh për çdo test. Çdo test përfshin rikonfigurimin e portës së paracaktuar dhe serverit DNS. Meqë gjithsesi askush nuk lexon, dijeni se treni nuk ecën në shina druri. Kushdo që gjen vezën e Pashkëve merr pak karamele.

Për ta bërë këtë, unë krijoj një tabelë të veçantë rrugëtimi -set-mark 0x2 dhe një rregull për të ridrejtuar trafikun.

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

Mund të mësoni më shumë se si funksionon lexoni në këtë artikull.

Pas së cilës kaloj në një lak të pafund, ku çdo herë marrim një listë të modemëve të lidhur (për të zbuluar nëse konfigurimi i rrjetit ka ndryshuar papritmas).

network_list = getNetworklist()

Marrja e një liste të ndërfaqeve të rrjetit është mjaft e thjeshtë.

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

Pas marrjes së listës, vendosa adresat IP në të gjitha ndërfaqet, siç tregova në foto në kapitullin për modemin.

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

Pastaj thjesht kaloj nëpër secilën ndërfaqe në një lak. Dhe unë konfiguroj çdo ndërfaqe.

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

Unë kontrolloj ndërfaqen për funksionalitet, nëse nuk ka rrjet, atëherë gjeneroj gabime. Nëse ka një rrjet, atëherë është koha për të vepruar!

Këtu unë konfiguroj kursin ssh në këtë ndërfaqe (nëse nuk është bërë), dërgoj gabime në server nëse ka ardhur koha, dërgoj regjistrat dhe në fund ekzekutoj një test shpejtësie dhe i ruaj regjistrat në një skedar 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()
#и далее тестируем скорость и сохраняем логи. 

Vlen të përmendet funksioni i konfigurimit të ssh të kundërt.

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

Dhe sigurisht, ju duhet t'i shtoni gjithë këtë bukuri startup-it. Për ta bërë këtë, unë krijoj një skedar:

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

Dhe unë shkruaj në të:

[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

Aktivizoj ngarkimin automatik dhe filloj!

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

Tani mund të shoh regjistrat e asaj që po ndodh duke përdorur komandën:

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

Gjetjet

Epo, tani gjëja më e rëndësishme është, çfarë ndodhi si rezultat? Këtu janë disa grafikë që kam arritur të kap gjatë procesit të zhvillimit dhe korrigjimit. Grafikët u ndërtuan duke përdorur gnuplot me skriptin e mëposhtëm.

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

Eksperienca e parë ishte me operatorin Tele2, të cilin e drejtova për disa ditë.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Këtu kam përdorur një server matës dinamik. Matjet e shpejtësisë funksionojnë, por luhaten shumë, por një vlerë mesatare është ende e dukshme, dhe kjo mund të merret duke filtruar të dhënat, për shembull, me një mesatare lëvizëse.

Më vonë ndërtova një numër grafikësh për operatorët e tjerë të telekomit. Në këtë rast, ekzistonte tashmë një server testimi, dhe rezultatet ishin gjithashtu shumë interesante.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Siç mund ta shihni, tema është shumë e gjerë për kërkimin dhe përpunimin e këtyre të dhënave, dhe qartësisht nuk zgjat për disa javë punë. Por…

Rezultati i punës

Puna përfundoi papritur për shkak të rrethanave jashtë kontrollit tim. Një nga dobësitë e këtij projekti, për mendimin tim subjektiv, ishte modemi, i cili nuk donte të punonte njëkohësisht me modemë të tjerë dhe bënte truke të tilla sa herë ngarkohej. Për këto qëllime, ekziston një numër i madh i modeleve të tjera të modemit; zakonisht ato janë tashmë në formatin Mini PCI-e dhe janë instaluar brenda pajisjes dhe janë shumë më të lehta për t'u konfiguruar. Por kjo është një histori krejtësisht tjetër. Projekti ishte interesant dhe u gëzova shumë që arrita të marr pjesë në të.

Test i njëkohshëm i shpejtësisë në disa modemë LTE

Burimi: www.habr.com

Shto një koment