Simultano testiranje brzine na nekoliko LTE modema

Tijekom karantene ponuđeno mi je da sudjelujem u razvoju uređaja za mjerenje brzine LTE modema za nekoliko mobilnih operatera.

Simultano testiranje brzine na nekoliko LTE modema

Kupac je želio procijeniti brzinu različitih telekom operatera na različitim geografskim lokacijama kako bi mogao razumjeti koji je mobilni operater za njega najoptimalniji kada instalira opremu koja koristi LTE vezu, na primjer, za video emitiranje. Pritom je problem trebalo riješiti što jednostavnije i jeftinije, bez skupe opreme.

Odmah ću reći da zadatak nije najjednostavniji i najzahtjevniji, reći ću vam na koje sam probleme naišao i kako sam ih riješio. Pa, idemo.

Primijetiti

Mjerenje brzine LTE veze vrlo je složena stvar: morate odabrati pravu opremu i tehniku ​​mjerenja, a također dobro razumjeti topologiju i rad mobilne mreže. Osim toga, na brzinu može utjecati nekoliko čimbenika: broj pretplatnika na ćeliji, vremenski uvjeti, čak i od ćelije do ćelije brzina može dramatično varirati zbog topologije mreže. Općenito, radi se o problemu s ogromnim brojem nepoznanica i samo ga teleoperater može ispravno riješiti.

U početku je kupac samo želio voziti kurira s telefonima operatera, izvršiti mjerenja izravno na telefonu i zatim zapisati rezultate mjerenja brzine u bilježnicu. Moje rješenje za mjerenje brzine lte mreža, iako nije idealno, rješava problem.

Zbog nedostatka vremena, odluke nisam donosio u korist praktičnosti ili praktičnosti, već u korist brzine razvoja. Na primjer, obrnuti ssh korišten je za daljinski pristup, umjesto praktičnijeg VPN-a, kako bi se uštedjelo vrijeme na postavljanju poslužitelja i svakog pojedinog klijenta.

Tehnički zadatak

Kao što je navedeno u članku Bez tehničkih specifikacija: zašto klijent to ne želi: Ne radite bez tehničkih specifikacija! Nikad, nigdje!

Tehnički zadatak je bio prilično jednostavan, malo ću ga proširiti radi razumijevanja krajnjeg korisnika. Izbor tehničkih rješenja i opreme diktirao je kupac. Dakle, sama tehnička specifikacija, nakon svih odobrenja:

Temeljeno na računalu s jednom pločom vim2 napravi tester brzine za lte veze preko H modemauawei e3372h - 153 nekoliko telekom operatera (od jednog do n). Također je potrebno primiti koordinate od GPS prijemnika spojenog putem UART-a. Izvršite mjerenja brzine pomoću usluge www.speedtest.net i stavite ih u tablicu kao što je:

Simultano testiranje brzine na nekoliko LTE modema

Tablica u csv formatu. Zatim šaljite ovaj znak e-poštom svakih 6 sati. U slučaju grešaka, treperi LED koji je povezan na GPIO.

Tehničke specifikacije sam opisao u slobodnom obliku, nakon mnogih odobrenja. Ali smisao zadatka je već vidljiv. Za sve je dan tjedan dana. Ali u stvarnosti je to trajalo tri tjedna. Ovo uzimajući u obzir činjenicu da sam to radio samo nakon glavnog posla i vikendom.

Ovdje još jednom želim skrenuti pozornost da je korisnik unaprijed dogovorio korištenje usluge mjerenja brzine i hardvera, što je uvelike ograničilo moje mogućnosti. Budžet je također bio ograničen, pa se ništa posebno nije kupovalo. Stoga smo morali igrati po ovim pravilima.

Arhitektura i razvoj

Shema je jednostavna i očita. Stoga ću ga ostaviti bez posebnih komentara.

Simultano testiranje brzine na nekoliko LTE modema

Odlučio sam cijeli projekt implementirati u pythonu, unatoč činjenici da nisam imao nikakvog iskustva u razvoju na ovom jeziku. Odabrao sam ga jer je bilo hrpa gotovih primjera i rješenja koja su mogla ubrzati razvoj. Stoga molim sve profesionalne programere da ne grde moje prvo iskustvo razvijanja u pythonu, a ja uvijek rado čujem konstruktivne kritike kako bih unaprijedio svoje vještine.

Također sam tijekom procesa otkrio da python ima dvije verzije 2 i 3, pa sam se odlučio za treću.

Hardverski čvorovi

Jednopločni vim2

Dobio sam jednopločno računalo kao glavni stroj vim2

Simultano testiranje brzine na nekoliko LTE modema

Izvrstan, moćan medijski procesor za pametnu kuću i SMART-TV, ali krajnje neprikladan za ovaj zadatak, ili, recimo, slabo prikladan. Na primjer, njegov glavni OS je Android, a Linux je sekundarni OS, pa prema tome nitko ne jamči kvalitetan rad svih čvorova i upravljačkih programa pod Linuxom. Pretpostavljam da su neki od problema bili povezani s USB drajverima ove platforme, tako da modemi nisu radili kako se očekivalo na ovoj ploči. Također ima vrlo lošu i raštrkanu dokumentaciju, pa je svaka operacija oduzimala dosta vremena za kopanje po dokovima. Čak i obični rad s GPIO-om odnio je puno krvi. Na primjer, trebalo mi je nekoliko sati da postavim LED. Ali, da budemo objektivni, u osnovi nije bilo važno kakva je to bila jednopločna ploča, glavna stvar je bila da radi i da postoje USB priključci.

Prvo moram instalirati Linux na ovu ploču. Kako ne bih preturao po bespućima dokumentacije za sve, a i za one koji će se baviti ovim jednopločnim sustavom, pišem ovo poglavlje.

Postoje dvije mogućnosti instaliranja Linuxa: na vanjsku SD karticu ili na interni MMC. Proveo sam večer pokušavajući smisliti kako da radi s karticom, pa sam ga odlučio instalirati na MMC, iako bi bez sumnje bilo puno lakše raditi s eksternom karticom.

O firmware-u krivo rečeno ovdje. Prevodim sa stranog na ruski. Kako bih flashirao ploču, moram spojiti hardverski UART. Povezao ga kako slijedi.

  • Pin alata GND: <—> Pin17 GPIO-a VIM-a
  • Alat Pin TXD: <—> Pin18 GPIO-a VIM-a (Linux_Rx)
  • Alat Pin RXD: <—> Pin19 GPIO-a VIM-a (Linux_Tx)
  • Pin alata VCC: <—> Pin20 GPIO-a VIM-a

Simultano testiranje brzine na nekoliko LTE modema

Nakon toga sam preuzeo firmware stoga. Specifična verzija firmvera VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Kako bih prenio ovaj firmware, trebaju mi ​​uslužni programi. Više detalja o ovome ovdje. Nisam ga pokušao flashati pod Windowsima, ali moram vam reći nekoliko riječi o firmveru pod Linuxom. Prvo ću instalirati pomoćne programe prema uputama.

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

Aaa... Ništa ne radi. Proveo sam par sati uređujući instalacijske skripte kako bi mi se sve ispravno instaliralo. Ne sjećam se što sam tamo radio, ali bio je i onaj cirkus s konjima. Pa budi oprezan. Ali bez ovih uslužnih programa nema smisla dalje mučiti vim2. Bolje je da se uopće ne petljate s njim!

Nakon sedam krugova pakla, konfiguracije skripte i instalacije, dobio sam paket radnih alata. Spojio sam ploču putem USB-a na svoje Linux računalo, a također sam spojio UART prema gornjem dijagramu.
Postavljam svoj omiljeni minicom terminal za brzinu od 115200, bez hardverske i softverske kontrole grešaka. I počnimo.

Simultano testiranje brzine na nekoliko LTE modema

Prilikom učitavanja VIM2 u UART terminalu, pritisnem tipku, kao što je razmaknica, da zaustavim učitavanje. Nakon što se pojavi linija

kvim2# 

Unosim naredbu:

kvim2# run update

Na hostu s kojeg učitavamo izvršavam:

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

To je to, fuj. Provjerio sam, na ploči je Linux. Prijava/lozinka khadas:khadas.

Nakon toga neka manja početna podešavanja. Za daljnji rad onemogućujem lozinku za sudo (da, nije sigurno, ali zgodno).

sudo visudo

Uređujem redak obrasca i spremam

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

Zatim mijenjam trenutni lokalitet tako da je vrijeme u Moskvi, inače će biti u Greenwichu.

sudo timedatectl set-timezone Europe/Moscow

ili

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

Ako vam je teško, nemojte koristiti ovu ploču; Raspberry Pi je bolji. iskreno.

Modem Huawei e3372h – 153

Ovaj modem je za mene bio značajan izvor krvi, i zapravo je postao usko grlo cijelog projekta. Općenito, naziv "modem" za ove uređaje uopće ne odražava bit rada: ovo je moćan kombajn, ovaj komad hardvera ima kompozitni uređaj koji se pretvara da je CD-ROM kako bi instalirao upravljačke programe, a zatim prelazi u način rada mrežne kartice.

Arhitektonski gledano, sa stajališta Linux korisnika, nakon svih postavki, to izgleda ovako: nakon spajanja modema imam eth* mrežno sučelje, koje preko dhcp-a dobiva IP adresu 192.168.8.100, te default gateway je 192.168.8.1.

I najvažniji trenutak! Ovaj model modema ne može raditi u modemskom načinu rada, kojim upravljaju AT naredbe. Sve bi bilo mnogo jednostavnije, kreirati PPP veze za svaki modem i onda raditi s njima. Ali u mom slučaju "sam" (točnije Linux diver po udev pravilima), kreira eth sučelje i dodjeljuje mu IP adresu preko dhcp-a.

Kako bismo izbjegli daljnju zabunu, predlažem da zaboravite riječ "modem" i kažete mrežna kartica i pristupnik, jer u biti, to je kao da povezujete novu mrežnu karticu s pristupnikom.
Kada postoji jedan modem, to ne stvara posebne probleme, ali kada ih je više od jednog, odnosno n-komada, nastaje sljedeća mrežna slika.

Simultano testiranje brzine na nekoliko LTE modema

To jest, n mrežnih kartica, s istom IP adresom, svaka s istim zadanim pristupnikom. Ali zapravo je svaki od njih povezan sa svojim operaterom.

U početku sam imao jednostavno rješenje: koristeći ifconfig ili ip naredbu, isključiti sva sučelja i jednostavno uključiti jedno po redu i testirati ga. Rješenje je bilo dobro za sve, osim što se u trenucima prebacivanja nisam mogao spojiti na uređaj. A kako je prebacivanje često i brzo, zapravo se uopće nisam imao prilike spojiti.

Stoga sam odabrao ručnu promjenu IP adresa modema i zatim usmjeravanje prometa pomoću postavki usmjeravanja.

Simultano testiranje brzine na nekoliko LTE modema

Tu nije bio kraj mojim problemima s modemima: u slučaju problema s napajanjem otpadali su, a bilo je potrebno i dobro stabilno napajanje USB huba. Riješio sam ovaj problem tvrdim lemljenjem napajanja izravno na čvorište. Još jedan problem s kojim sam se susreo i koji je uništio cijeli projekt: nakon ponovnog pokretanja ili hladnog pokretanja uređaja nisu bili detektirani svi modemi i ne uvijek, a nisam mogao utvrditi zašto se to dogodilo i kojim algoritmom. Ali prvo o svemu.

Da bi modem ispravno radio, instalirao sam usb-modeswitch paket.

sudo apt update
sudo apt install -y usb-modeswitch

Nakon čega će, nakon povezivanja, modem biti ispravno detektiran i konfiguriran od strane udev podsustava. Provjeravam tako da jednostavno spojim modem i uvjerim se da se mreža pojavljuje.
Još jedan problem koji nisam uspio riješiti: kako mogu iz ovog modema saznati ime operatera s kojim surađujemo? Naziv operatera sadržan je u web sučelju modema na adresi 192.168.8.1. Ovo je dinamička web stranica koja prima podatke preko Ajax zahtjeva, tako da jednostavno dohvaćanje stranice i raščlanjivanje naziva neće raditi. Pa sam počeo tražiti kako razviti web stranicu itd. i shvatio da radim nekakvu glupost. Kao rezultat toga, on je pljunuo, a operater je počeo primati koristeći sam Speedtest API.

Bilo bi puno lakše da modem ima pristup putem AT naredbi. Bilo bi ga moguće rekonfigurirati, napraviti ppp vezu, dodijeliti IP, dobiti telekom operatera itd. Ali nažalost, radim s onim što sam dobio.

GPS

GPS prijemnik koji sam dobio imao je UART sučelje i napajanje. Nije to bilo najbolje rješenje, ali je ipak bilo izvedivo i jednostavno. Prijemnik je izgledao otprilike ovako.

Simultano testiranje brzine na nekoliko LTE modema

Iskreno govoreći, prvi put sam radio s GPS prijemnikom, ali kao što sam i očekivao, kod nas je sve odavno smišljeno. Stoga koristimo samo gotova rješenja.

Prvo, omogućujem uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) za povezivanje GPS-a.

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

Nakon toga provjeravam uspješnost operacije.

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

Ova naredba očito uređuje devtree u hodu, što je vrlo zgodno.

Nakon uspjeha ove operacije, ponovno pokrenite sustav i instalirajte GPS demon.

khadas@Khadas:~$ sudo reboot

Instaliranje GPS demona. Sve instaliram i odmah odsiječem radi daljnje konfiguracije.

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

Uređivanje datoteke postavki.

sudo vim /etc/default/gpsd

Instaliram UART na kojem će GPS visjeti.

DEVICES="/dev/ttyS4"

I onda sve uključimo i počnemo.

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

Nakon toga spajam GPS.

Simultano testiranje brzine na nekoliko LTE modema

GPS žica je u mojim rukama, žice UART debuggera se vide pod mojim prstima.

Ponovno se dižem i provjeravam rad GPS-a pomoću programa gpsmon.

Simultano testiranje brzine na nekoliko LTE modema

Na ovoj snimci zaslona ne možete vidjeti satelite, ali možete vidjeti komunikaciju s GPS prijamnikom, što znači da je sve u redu.

U pythonu sam isprobao mnogo opcija za rad s ovim demonom, ali sam se odlučio za onu koja je ispravno radila s pythonom 3.

Instaliram potrebnu biblioteku.

sudo -H pip3 install gps3 

I klešem radni kod.

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

Ako trebam dobiti koordinate, to se radi pomoću sljedećeg poziva:

longitude, latitude = getPositionData(agps_thread)

I u roku od 1-10 sekundi ili ću dobiti koordinatu ili ne. Da, imao sam deset pokušaja da dobijem koordinate. Nije optimalno, krivo i nakoso, ali radi. Odlučio sam to učiniti jer GPS može imati loš prijem i ne prima uvijek podatke. Ako čekate da primite podatke, a zatim ako radite u udaljenoj prostoriji, program će se zamrznuti na ovom mjestu. Stoga sam implementirao ovu neelegantnu opciju.

U principu, da je bilo više vremena, bilo bi moguće primati podatke s GPS-a izravno putem UART-a, analizirati ih u zasebnoj niti i raditi s njima. Ali nije bilo vremena, pa otuda brutalno ružna šifra. I da, nije me sram.

Dioda koja emitira svjetlo

Spajanje LED-a bilo je jednostavno i teško u isto vrijeme. Glavna poteškoća je što broj pina u sustavu ne odgovara broju pina na ploči i zato što se dokumentacija piše lijevom rukom. Da biste usporedili hardverski pin broj i pin broj u OS-u, morate pokrenuti naredbu:

gpio readall

Prikazat će se tablica korespondencije pinova u sustavu i na ploči. Nakon čega već mogu upravljati pinom u samom OS-u. U mom slučaju LED je spojen na GPIOH_5.

Simultano testiranje brzine na nekoliko LTE modema

Prebacujem GPIO pin u izlazni mod.

gpio -g mode 421 out

Zapisujem nulu.

gpio -g write 421 0

Zapisujem jednu.

gpio -g write 421 1

Simultano testiranje brzine na nekoliko LTE modema
Sve svijetli, nakon upisa "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)

Sada, u slučaju pogreške, pozivam error_blink() i LED će lijepo treperiti.

Softverski čvorovi

Speedtest API

Velika je radost što servis speedtest.net ima vlastiti python-API, možete pogledati Github.

Dobra stvar je što postoje izvorni kodovi koji se također mogu vidjeti. Kako raditi s ovim API-jem (jednostavni primjeri) možete pronaći u relevantni odjeljak.

Instaliram python biblioteku sljedećom naredbom.

sudo -H pip3 install speedtest-cli

Na primjer, možete čak instalirati tester brzine u Ubuntu izravno iz softvera. Ovo je ista python aplikacija, koja se zatim može pokrenuti izravno s konzole.

sudo apt install speedtest-cli -y

I izmjerite svoju brzinu interneta.

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

Kao rezultat toga, baš kao i ja. Morao sam ući u izvorne kodove ovog testa brzine kako bih ih potpunije implementirao u svoj projekt. Jedan od najvažnijih zadataka je nabaviti naziv teleoperatera kako bi ga zamijenili na pločici.

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

I ovdje se pokazalo da sve nije tako jednostavno, iako bi se činilo mnogo jednostavnije. U početku je parametar poslužitelja bio jednak [], kažu, odaberite najbolji poslužitelj. Kao rezultat toga, imao sam nasumične poslužitelje i, kao što možete pretpostaviti, promjenjivu brzinu. Ovo je prilično složena tema, korištenje fiksnog poslužitelja, ako je tako, statičnog ili dinamičkog, zahtijeva istraživanje. Ali ovdje je primjer grafikona mjerenja brzine za operatera Beeline pri dinamičkom odabiru testnog poslužitelja i statički fiksnog.

Simultano testiranje brzine na nekoliko LTE modema
Rezultat mjerenja brzine pri odabiru dinamičkog poslužitelja.

Simultano testiranje brzine na nekoliko LTE modema
Rezultat testiranja brzine, s jednim striktno odabranim serverom.

Tijekom testiranja na oba mjesta postoji “krzno” koje je potrebno ukloniti matematičkim metodama. Ali kod fiksnog poslužitelja nešto je manje i amplituda je stabilnija.
Općenito, ovo je mjesto velikog istraživanja. I mjerio bih brzinu svog poslužitelja pomoću uslužnog programa iperf. Ali držimo se tehničkih specifikacija.

Slanje pošte i greške

Za slanje pošte isprobao sam nekoliko desetaka različitih opcija, ali na kraju sam se odlučio za sljedeće. Registrirao sam poštanski sandučić na Yandexu, a zatim uzeo Ovo je primjer slanja pošte. Provjerio sam to i implementirao u program. Ovaj primjer ispituje razne opcije, uključujući slanje s gmaila itd. Nisam se htio zamarati postavljanjem svog mail servera i nisam imao vremena za to, ali kako se kasnije pokazalo, i to je bilo uzalud.

Dnevnici su poslani prema rasporedu, ako postoji veza, svakih 6 sati: u 00 sati, 06 sati ujutro, 12 sati i 18 sati. Poslao na sljedeći način.

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

Pogreške su također poslane u početku. Za početak, akumulirani su na popisu, a zatim su također poslani pomoću planera, ako je postojala veza. Međutim, tada su se pojavili problemi s činjenicom da Yandex ima ograničenje broja poruka poslanih dnevno (ovo je bol, tuga i poniženje). Budući da je čak i po minuti mogao biti ogroman broj grešaka, morali smo odustati od slanja grešaka poštom. Stoga imajte na umu kada automatski šaljete informacije o takvom problemu putem usluga Yandex.

Poslužitelj za povratne informacije

Kako bih imao pristup udaljenom dijelu hardvera i mogao ga prilagoditi i ponovno konfigurirati, trebao mi je vanjski poslužitelj. Općenito, da budemo pošteni, bilo bi ispravno poslati sve podatke na poslužitelj i izgraditi sve lijepe grafikone u web sučelju. Ali ne sve odjednom.

Za VPS sam odabrao ruvds.com. Možete uzeti najjednostavniji poslužitelj. I općenito, za moje potrebe ovo bi bilo dovoljno. No kako server nisam platio iz vlastitog džepa, odlučio sam ga uzeti s malom rezervom kako bi bilo dovoljno da postavimo web sučelje, vlastiti SMTP server, VPN itd. Osim toga, moći ćete postaviti Telegram bot i nećete imati problema s njegovim blokiranjem. Stoga sam odabrao Amsterdam i sljedeće parametre.

Simultano testiranje brzine na nekoliko LTE modema

Kao način komunikacije s hardverom, vim2 je odabrao obrnutu ssh vezu i, kako je praksa pokazala, nije najbolja. Ako se veza izgubi, poslužitelj zadržava port i neko vrijeme se preko njega nije moguće spojiti. Stoga je ipak bolje koristiti druge načine komunikacije, primjerice VPN. U budućnosti sam želio prijeći na VPN, ali nisam imao vremena.

Neću ulaziti u detalje postavljanja vatrozida, ograničavanja prava, onemogućavanja root ssh veza i drugih truizama postavljanja VPS-a. Želio bih vjerovati da već sve znate. Za udaljenu vezu stvaram novog korisnika na poslužitelju.

adduser vimssh

Generiram ssh ključeve veze na našem hardveru.

ssh-keygen

I kopiram ih na naš poslužitelj.

ssh-copy-id [email protected]

Na našem hardveru stvaram automatsku obrnutu ssh vezu pri svakom pokretanju.

[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

Obratite pozornost na port 8083: on određuje koji ću port koristiti za povezivanje putem obrnutog ssh-a. Dodajte ga u startup i pokrenite.

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

Možete čak vidjeti i status:

sudo systemctl status autossh.service

Sada, na našem VPS poslužitelju, ako pokrenemo:

ssh -p 8083 khadas@localhost

Zatim dolazim do svog testnog komada hardvera. A od hardvera također mogu slati logove i sve podatke putem ssh-a na svoj poslužitelj, što je vrlo zgodno.

Stavljajući sve zajedno

Simultano testiranje brzine na nekoliko LTE modema
Uključivanje, počnimo razvoj i uklanjanje pogrešaka

Fuj, pa to je to, opisao sam sve čvorove. Sada je vrijeme da se sve spoji. Možete vidjeti kod ovdje.

Važna točka koda: Ovaj projekt možda neće ovako započeti, jer je skrojen za određeni zadatak, specifične arhitekture. Iako dajem izvorni kod, ipak ću ovdje, u tekstu, objasniti ono najvrjednije, inače je potpuno nerazumljivo.

Na početku inicijaliziram gps, gpio i pokrećem posebnu nit planera.

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

Planer je prilično jednostavan: gleda je li došlo vrijeme za slanje poruka i koji je trenutni status pogreške. Ako postoji zastavica greške, tada trepćemo 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)

Najteži dio ovog projekta je održavanje obrnute ssh veze za svaki test. Svaki test uključuje ponovno konfiguriranje zadanog pristupnika i DNS poslužitelja. Kako ionako nitko ne čita, znajte da vlak ne vozi po drvenim tračnicama. Tko pronađe uskršnje jaje, dobiva slatkiš.

Da bih to učinio, kreiram zasebnu tablicu usmjeravanja -set-mark 0x2 i pravilo za preusmjeravanje prometa.

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

Možete saznati više o tome kako funkcionira pročitajte u ovom članku.

Nakon toga ulazim u beskonačnu petlju, gdje svaki put dobijemo popis spojenih modema (da saznamo je li se mrežna konfiguracija iznenada promijenila).

network_list = getNetworklist()

Dobivanje popisa mrežnih sučelja vrlo je jednostavno.

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

Nakon što sam primio popis, postavio sam IP adrese svim sučeljima, kao što sam pokazao na slici u poglavlju o modemu.

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

Zatim jednostavno prolazim kroz svako sučelje u petlji. I konfiguriram svako sučelje.

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

Provjeravam funkcionalnost sučelja, ako nema mreže, generiram pogreške. Ako postoji mreža, onda je vrijeme za djelovanje!

Ovdje konfiguriram ssh usmjeravanje na ovo sučelje (ako nije učinjeno), šaljem pogreške poslužitelju ako je došlo vrijeme, šaljem zapisnike i na kraju pokrećem test brzine i spremam zapisnike u csv datoteku.

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

Vrijedno je spomenuti funkciju postavljanja obrnutog ssh-a.

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

I naravno, morate dodati svu ovu ljepotu startupu. Da bih to učinio, kreiram datoteku:

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

I u njemu pišem:

[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

Uključujem automatsko učitavanje i počinjem!

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

Sada mogu vidjeti zapise onoga što se događa pomoću naredbe:

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

Nalazi

E, sad ono najvažnije, što se dogodilo kao rezultat? Evo nekoliko grafikona koje sam uspio snimiti tijekom procesa razvoja i otklanjanja pogrešaka. Grafikoni su izgrađeni korištenjem gnuplota sa sljedećom skriptom.

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

Prvo iskustvo bilo je s Tele2 operaterom, koje sam provodio nekoliko dana.

Simultano testiranje brzine na nekoliko LTE modema

Ovdje sam koristio dinamički mjerni poslužitelj. Mjerenja brzine rade, ali jako fluktuiraju, ali neka prosječna vrijednost je ipak vidljiva, a to se može dobiti filtriranjem podataka, na primjer, s pomičnim prosjekom.

Kasnije sam napravio brojne grafikone za druge telekom operatere. U ovom slučaju već je postojao jedan server za testiranje, a rezultati su također bili vrlo zanimljivi.

Simultano testiranje brzine na nekoliko LTE modema

Simultano testiranje brzine na nekoliko LTE modema

Simultano testiranje brzine na nekoliko LTE modema

Simultano testiranje brzine na nekoliko LTE modema

Kao što vidite, tema je vrlo opsežna za istraživanje i obradu ovih podataka i očito ne traje par tjedana rada. Ali…

Ishod rada

Posao je naglo završen zbog okolnosti na koje nisam mogao utjecati. Jedna od slabosti ovog projekta, po mom subjektivnom mišljenju, bio je modem, koji baš i nije htio raditi istovremeno s ostalim modemima, te je pravio takve trikove svaki put kad bi se učitao. Za te potrebe postoji veliki broj drugih modela modema, obično su već u Mini PCI-e formatu i instalirani su unutar uređaja te ih je puno lakše konfigurirati. Ali to je sasvim druga priča. Projekt je bio zanimljiv i bilo mi je jako drago što sam mogao sudjelovati u njemu.

Simultano testiranje brzine na nekoliko LTE modema

Izvor: www.habr.com

Dodajte komentar