Samanaikainen nopeustesti useissa LTE-modeemeissa

Karanteenin aikana minulle tarjottiin osallistumista useiden matkapuhelinoperaattoreiden LTE-modeemien nopeutta mittaavan laitteen kehittämiseen.

Samanaikainen nopeustesti useissa LTE-modeemeissa

Asiakas halusi arvioida eri teleoperaattoreiden nopeutta eri maantieteellisillä alueilla, jotta hän voisi ymmärtää, mikä matkapuhelinoperaattori on hänelle optimaalinen asentaessaan LTE-yhteyttä käyttäviä laitteita esimerkiksi videolähetyksiä varten. Samalla ongelma oli ratkaistava mahdollisimman yksinkertaisesti ja halvalla ilman kalliita laitteita.

Sanon heti, että tehtävä ei ole yksinkertaisin ja tietointensiivisin; kerron, mitä ongelmia kohtasin ja miten ratkaisin ne. Mennään siis.

Huomata

LTE-yhteyden nopeuden mittaaminen on hyvin monimutkainen asia: sinun on valittava oikeat laitteet ja mittaustekniikka sekä myös hyvä käsitys matkapuhelinverkon topologiasta ja toiminnasta. Lisäksi nopeuteen voivat vaikuttaa useat tekijät: tilaajien määrä solussa, sääolosuhteet, jopa solusta toiseen nopeus voi vaihdella dramaattisesti verkon topologian vuoksi. Yleensä tämä on ongelma, jossa on valtava määrä tuntemattomia, ja vain teleoperaattori voi ratkaista sen oikein.

Aluksi asiakas halusi vain ajaa kuriiria operaattoreiden puhelimilla, ottaa mittaukset suoraan puhelimesta ja kirjoittaa sitten nopeusmittaustulokset muistikirjaan. Ratkaisuni lte-verkkojen nopeuden mittaamiseen, vaikka se ei ole ihanteellinen, ratkaisee ongelman.

Ajan puutteen vuoksi en tehnyt päätöksiä mukavuuden tai käytännöllisyyden, vaan kehityksen nopeuden puolesta. Esimerkiksi käänteistä ssh:ta käytettiin etäkäyttöön käytännöllisemmän VPN:n sijasta, jotta säästettiin aikaa palvelimen ja jokaisen yksittäisen asiakkaan määrittämisessä.

Tekninen tehtävä

Kuten artikkelissa todetaan Ilman teknisiä eritelmiä: miksi asiakas ei halua sitä: Älä työskentele ilman teknisiä tietoja! Ei koskaan, missään!

Tekninen tehtävä oli melko yksinkertainen, laajennan sitä hieman loppukäyttäjän ymmärtämiseksi. Asiakas saneli teknisten ratkaisujen ja laitteiden valinnan. Eli itse tekninen eritelmä kaikkien hyväksyntöjen jälkeen:

Perustuu yksilevytietokoneeseen vim2 tee nopeustesti lte-yhteyksille H-modeemin kauttauawei e3372h - 153 useita teleoperaattoreita (yhdestä n:ään). On myös tarpeen vastaanottaa koordinaatit GPS-vastaanottimesta, joka on liitetty UART:n kautta. Tee nopeusmittauksia palvelun avulla www.speedtest.net ja laita ne seuraavaan taulukkoon:

Samanaikainen nopeustesti useissa LTE-modeemeissa

Taulukko csv-muodossa. Lähetä sitten tämä kyltti sähköpostitse 6 tunnin välein. Virhetapauksissa GPIO-laitteeseen liitetty LED-valo vilkkuu.

Kuvasin tekniset tiedot vapaassa muodossa useiden hyväksyntöjen jälkeen. Mutta tehtävän merkitys on jo nähtävissä. Viikko annettiin kaikkeen. Mutta todellisuudessa se kesti kolme viikkoa. Tämä on otettu huomioon, että tein tämän vain päätyöni jälkeen ja viikonloppuisin.

Haluan tässä vielä kerran kiinnittää huomion siihen, että asiakas sopi etukäteen nopeudenmittauspalvelun ja laitteiston käytöstä, mikä rajoitti suuresti kykyäni. Myös budjetti oli rajallinen, joten mitään erikoista ei ostettu. Joten meidän piti pelata näiden sääntöjen mukaan.

Arkkitehtuuri ja kehitys

Kaava on yksinkertainen ja ilmeinen. Siksi jätän sen ilman erityisiä kommentteja.

Samanaikainen nopeustesti useissa LTE-modeemeissa

Päätin toteuttaa koko projektin pythonilla, vaikka minulla ei ollut kokemusta tällä kielellä kehittymisestä ollenkaan. Valitsin sen, koska siellä oli joukko valmiita esimerkkejä ja ratkaisuja, jotka voisivat nopeuttaa kehitystä. Siksi pyydän kaikkia ammattiohjelmoijia olemaan moitimatta ensimmäistä python-kehityskokemustani, ja olen aina iloinen kuullessani rakentavaa kritiikkiä taitojeni parantamiseksi.

Myös prosessin aikana huomasin, että pythonilla on kaksi käynnissä olevaa versiota 2 ja 3, minkä seurauksena päädyin kolmanteen.

Laitteistosolmut

Yksilevyinen vim2

Minulle annettiin yksilevyinen tietokone pääkoneeksi vim2

Samanaikainen nopeustesti useissa LTE-modeemeissa

Erinomainen, tehokas mediaprosessori älykotiin ja SMART-TV:hen, mutta äärimmäisen sopimaton tähän tehtävään tai sanotaanko huonosti. Esimerkiksi sen pääkäyttöjärjestelmä on Android ja Linux on toissijainen käyttöjärjestelmä, joten kukaan ei takaa kaikkien solmujen ja ohjaimien laadukasta toimintaa Linuxissa. Ja oletan, että osa ongelmista liittyi tämän alustan USB-ajureihin, joten modeemit eivät toimineet odotetulla tavalla tällä levyllä. Siinä on myös erittäin huono ja hajallaan oleva dokumentaatio, joten jokainen toimenpide vei paljon aikaa telakoiden kaivamiseen. Jopa tavallinen työ GPIO:n kanssa vei paljon verta. Esimerkiksi LEDin asettaminen kesti useita tunteja. Mutta ollakseni objektiivinen, sillä ei ollut pohjimmiltaan tärkeää millainen yksilevy se oli, pääasia, että se toimi ja USB-portteja oli.

Ensin minun on asennettava Linux tälle levylle. Kirjoitan tämän luvun, jotta en tutkisi kaikkia dokumentaatioita ja myös niitä, jotka käsittelevät tätä yksilevyjärjestelmää.

Linuxin asentamiseen on kaksi vaihtoehtoa: ulkoiselle SD-kortille tai sisäiselle MMC:lle. Vietin illan yrittäessäni selvittää, kuinka saada se toimimaan kortin kanssa, joten päätin asentaa sen MMC: hen, vaikka epäilemättä olisi paljon helpompaa työskennellä ulkoisella kortilla.

Tietoja laiteohjelmistosta vääristyneesti kerrottu täällä. Käännän oudosta venäjäksi. Minun on kytkettävä UART-laitteisto, jotta voin käynnistää levyn. Yhdisti sen seuraavasti.

  • Työkalupin GND: <—> VIM:iden GPIO:n pin17
  • Työkalupin TXD: <—> VIM:ien GPIO:n pin18 (Linux_Rx)
  • Työkalupin RXD: <—> VIM:n GPIO:n pin19 (Linux_Tx)
  • Työkalupin VCC: <—> VIM:iden GPIO:n pin20

Samanaikainen nopeustesti useissa LTE-modeemeissa

Sen jälkeen latasin laiteohjelmiston siten. Tietty laiteohjelmistoversio VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Tarvitsen apuohjelmia, jotta voin ladata tämän laiteohjelmiston. Lisätietoja tästä täällä. En ole yrittänyt vilkkua sitä Windowsissa, mutta minun on kerrottava sinulle muutama sana laiteohjelmistosta Linuxissa. Ensin asenna apuohjelmat ohjeiden mukaan.

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

Aaand... Mikään ei toimi. Muokkasin asennusskriptejä pari tuntia, jotta kaikki asentuisi oikein. En muista mitä tein siellä, mutta siellä oli myös se sirkus hevosten kanssa. Joten ole varovainen. Mutta ilman näitä apuohjelmia ei ole mitään järkeä kiduttaa vim2:ta enempää. On parempi olla sotkematta hänen kanssaan ollenkaan!

Seitsemän helvetin kierroksen, skriptien määrityksen ja asennuksen jälkeen sain paketin toimivia apuohjelmia. Liitin levyn USB:n kautta Linux-tietokoneeseeni ja liitin myös UART:n yllä olevan kaavion mukaisesti.
Asetan suosikkini minicom-päätteeni nopeudelle 115200 XNUMX ilman laitteisto- ja ohjelmistovirheenhallintaa. Ja aloitetaan.

Samanaikainen nopeustesti useissa LTE-modeemeissa

Kun lataan VIM2:ta UART-päätteeseen, lopetan lataamisen painamalla näppäintä, kuten välilyöntiä. Kun rivi tulee näkyviin

kvim2# 

Annan komennon:

kvim2# run update

Isännässä, josta lataamme, suoritan:

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

Siinä se, huh. Tarkistin, että levyllä on Linux. Kirjautumistunnus/salasana khadas:khadas.

Sen jälkeen pieniä alkuasetuksia. Jatkotyötä varten poistan sudon salasanan käytöstä (kyllä, ei turvallinen, mutta kätevä).

sudo visudo

Muokkaan riviä lomakkeeseen ja tallennan

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

Sitten muutan nykyistä aluetta niin, että aika on Moskovassa, muuten se on Greenwichissä.

sudo timedatectl set-timezone Europe/Moscow

tai

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

Jos se tuntuu vaikealta, älä käytä tätä levyä; Raspberry Pi on parempi. Rehellisesti.

Modeemi Huawei e3372h – 153

Tämä modeemi oli minulle merkittävä verenlähde, ja itse asiassa siitä tuli koko projektin pullonkaula. Yleensä näiden laitteiden nimi "modeemi" ei heijasta työn olemusta ollenkaan: tämä on tehokas yhdistelmä, tässä laitteistossa on yhdistelmälaite, joka teeskentelee olevansa CD-ROM ajurien asentamista varten, ja vaihtaa sitten verkkokorttitilaan.

Arkkitehtonisesti Linux-käyttäjän näkökulmasta se näyttää kaikkien asetusten jälkeen tältä: modeemin kytkemisen jälkeen minulla on eth* verkkoliitäntä, joka saa dhcp:n kautta IP-osoitteen 192.168.8.100 ja oletusyhdyskäytävän. on 192.168.8.1.

Ja tärkein hetki! Tämä modeemimalli ei voi toimia modeemitilassa, jota ohjataan AT-komennoilla. Kaikki olisi paljon yksinkertaisempaa, luoda PPP-yhteydet jokaiselle modeemille ja sitten toimia niiden kanssa. Mutta minun tapauksessani "itse" (tarkemmin sanottuna Linux-sukellus udev-sääntöjen mukaan) luo eth-rajapinnan ja antaa sille IP-osoitteen dhcp:n kautta.

Lisäsekaantumisen välttämiseksi ehdotan, että unohdat sanan "modeemi" ja sanot verkkokortti ja yhdyskäytävä, koska pohjimmiltaan se on kuin uuden verkkokortin yhdistäminen yhdyskäytävään.
Kun modeemeja on yksi, se ei aiheuta erityisiä ongelmia, mutta kun niitä on enemmän kuin yksi, eli n-osaisia, syntyy seuraava verkkokuva.

Samanaikainen nopeustesti useissa LTE-modeemeissa

Eli n verkkokorttia, joilla on sama IP-osoite, jokaisella on sama oletusyhdyskäytävä. Mutta itse asiassa jokainen niistä on kytketty omaan operaattoriinsa.

Aluksi minulla oli yksinkertainen ratkaisu: käyttämällä ifconfig- tai ip-komentoa sammuta kaikki liitännät ja kytke yksi vuorollaan päälle ja testaa sitä. Ratkaisu oli hyvä kaikille, paitsi että kytkentähetkellä en saanut yhteyttä laitteeseen. Ja koska vaihto tapahtuu usein ja nopeasti, minulla ei itse asiassa ollut mahdollisuutta muodostaa yhteyttä ollenkaan.

Siksi valitsin polun muuttaa modeemien IP-osoitteita manuaalisesti ja ohjata sitten liikennettä reititysasetusten avulla.

Samanaikainen nopeustesti useissa LTE-modeemeissa

Tämä ei ollut modeemi-ongelmieni loppu: virta-ongelmien sattuessa ne putosivat ja USB-keskittimeen vaadittiin hyvä vakaa virtalähde. Ratkaisin tämän ongelman juottamalla virran suoraan napaan. Toinen ongelma, jonka kohtasin ja joka tuhosi koko projektin: laitteen uudelleenkäynnistyksen tai kylmäkäynnistyksen jälkeen kaikkia modeemeja ei havaittu eikä aina, enkä voinut määrittää, miksi näin tapahtui ja millä algoritmilla. Mutta ensin asiat ensin.

Jotta modeemi toimisi oikein, asensin usb-modeswitch-paketin.

sudo apt update
sudo apt install -y usb-modeswitch

Sen jälkeen yhteyden muodostamisen jälkeen udev-alijärjestelmä tunnistaa ja määrittää modeemin oikein. Tarkistan yksinkertaisesti kytkemällä modeemin ja varmistamalla, että verkko tulee näkyviin.
Toinen ongelma, jota en pystynyt ratkaisemaan: kuinka saan tämän modeemin operaattorin nimen, jonka kanssa työskentelemme? Operaattorin nimi on modeemin verkkoliittymässä osoitteessa 192.168.8.1. Tämä on dynaaminen web-sivu, joka vastaanottaa tietoja Ajax-pyyntöjen kautta, joten pelkkä sivun wgetointi ja nimen jäsentäminen ei toimi. Aloin siis miettiä, miten voisin kehittää web-sivua jne. ja tajusin tekeväni jonkinlaista hölynpölyä. Tämän seurauksena hän sylki, ja operaattori alkoi vastaanottaa itse Speedtest API:n avulla.

Olisi paljon helpompaa, jos modeemilla olisi pääsy AT-komentojen kautta. Se olisi mahdollista konfiguroida uudelleen, luoda ppp-yhteys, määrittää IP, hankkia teleoperaattori jne. Mutta valitettavasti työskentelen sen kanssa, mitä minulle on annettu.

GPS

Minulle annetussa GPS-vastaanottimessa oli UART-liitäntä ja virta. Se ei ollut paras ratkaisu, mutta se oli silti toimiva ja yksinkertainen. Vastaanotin näytti tältä.

Samanaikainen nopeustesti useissa LTE-modeemeissa

Ollakseni rehellinen, tämä oli ensimmäinen kerta, kun työskentelin GPS-vastaanottimen kanssa, mutta kuten odotin, kaikki mietittiin meille kauan sitten. Käytämme siis vain valmiita ratkaisuja.

Ensin otan käyttöön uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) GPS:n yhdistämiseksi.

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

Sen jälkeen tarkistan toimenpiteen onnistumisen.

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

Tämä komento ilmeisesti muokkaa devtreetä lennossa, mikä on erittäin kätevää.

Kun tämä toiminto on onnistunut, käynnistä uudelleen ja asenna GPS-daemon.

khadas@Khadas:~$ sudo reboot

GPS-demonin asentaminen. Asensin kaiken ja katkaisin sen välittömästi lisäasetuksia varten.

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

Asetustiedoston muokkaaminen.

sudo vim /etc/default/gpsd

Asensen UART:n, johon GPS roikkuu.

DEVICES="/dev/ttyS4"

Ja sitten laitamme kaiken päälle ja aloitamme.

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

Sen jälkeen yhdistän GPS:n.

Samanaikainen nopeustesti useissa LTE-modeemeissa

GPS-johto on käsissäni, UART-debuggerin johdot näkyvät sormieni alla.

Käynnistän uudelleen ja tarkistan GPS:n toiminnan gpsmon-ohjelmalla.

Samanaikainen nopeustesti useissa LTE-modeemeissa

Et näe satelliitteja tässä kuvakaappauksessa, mutta voit nähdä yhteyden GPS-vastaanottimen kanssa, mikä tarkoittaa, että kaikki on kunnossa.

Pythonissa kokeilin monia vaihtoehtoja työskennellä tämän demonin kanssa, mutta päädyin siihen, joka toimi oikein python 3:n kanssa.

Asensin tarvittavan kirjaston.

sudo -H pip3 install gps3 

Ja veisin työkoodin.

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

Jos minun täytyy saada koordinaatit, se tehdään seuraavalla kutsulla:

longitude, latitude = getPositionData(agps_thread)

Ja 1-10 sekunnissa saan joko koordinaatin tai en. Kyllä, minulla oli kymmenen yritystä saada koordinaatit. Ei optimaalinen, vinossa ja vinossa, mutta toimii. Päätin tehdä tämän, koska GPS:llä voi olla huono vastaanotto eikä se aina vastaanota tietoja. Jos odotat tietojen vastaanottamista, niin jos työskentelet etähuoneessa, ohjelma jäätyy tähän paikkaan. Siksi otin käyttöön tämän tyylikkään vaihtoehdon.

Periaatteessa, jos aikaa olisi enemmän, GPS:stä olisi mahdollista vastaanottaa dataa suoraan UARTin kautta, jäsentää se erillisessä säikeessä ja työskennellä sen kanssa. Mutta aikaa ei ollut ollenkaan, joten raa'an ruma koodi. Ja kyllä, en häpeä.

LED

LEDin kytkeminen oli helppoa ja vaikeaa samanaikaisesti. Suurin vaikeus on, että järjestelmän pin-numero ei vastaa taululla olevaa pin-numeroa ja koska dokumentaatio on kirjoitettu vasemmalla kädellä. Vertaaksesi laitteiston PIN-numeroa ja PIN-numeroa käyttöjärjestelmässä, sinun on suoritettava komento:

gpio readall

Näyttöön tulee taulukko nastavastaavuudesta järjestelmässä ja taululla. Sen jälkeen voin jo käyttää nastaa itse käyttöjärjestelmässä. Minun tapauksessani LED on kytketty GPIOH_5.

Samanaikainen nopeustesti useissa LTE-modeemeissa

Vaihdan GPIO-nastan lähtötilaan.

gpio -g mode 421 out

Kirjoitan nollan.

gpio -g write 421 0

Kirjoitan yhden.

gpio -g write 421 1

Samanaikainen nopeustesti useissa LTE-modeemeissa
Kaikki syttyy, kun olet kirjoittanut "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)

Nyt, jos tulee virheitä, kutsun error_blink() ja LED vilkkuu kauniisti.

Ohjelmistosolmut

Speedtest API

On suuri ilo, että speedtest.net-palvelulla on oma python-API, voit katsoa Github.

Hyvä asia on, että on olemassa lähdekoodeja, joita voi myös tarkastella. Kuinka työskennellä tämän API:n kanssa (yksinkertaiset esimerkit) löytyy osoitteesta asiaankuuluva osio.

Asensin python-kirjaston seuraavalla komennolla.

sudo -H pip3 install speedtest-cli

Voit esimerkiksi asentaa Ubuntuun jopa nopeustestin suoraan ohjelmistosta. Tämä on sama python-sovellus, joka voidaan sitten käynnistää suoraan konsolista.

sudo apt install speedtest-cli -y

Ja mittaa Internet-nopeutesi.

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

Seurauksena, aivan kuten minäkin. Minun piti perehtyä tämän nopeustestin lähdekoodeihin voidakseni ottaa ne täydellisemmin käyttöön projektissani. Yksi tärkeimmistä tehtävistä on hankkia teleyrityksen nimi, jotta se voidaan korvata kilvellä.

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

Myös täällä kaikki ei osoittautunut niin yksinkertaiseksi, vaikka se näyttäisikin paljon yksinkertaisemmalta. Aluksi palvelinparametri oli yhtä suuri kuin [], he sanovat, valitse paras palvelin. Tämän seurauksena minulla oli satunnaisia ​​palvelimia ja, kuten arvata saattaa, vaihteleva nopeus. Tämä on melko monimutkainen aihe, kiinteän palvelimen käyttäminen, jos on, staattinen tai dynaaminen, vaatii tutkimusta. Mutta tässä on esimerkki nopeusmittauskaavioista Beeline-operaattorille, kun hän valitsee dynaamisesti testipalvelimen ja staattisesti kiinteän.

Samanaikainen nopeustesti useissa LTE-modeemeissa
Nopeuden mittauksen tulos dynaamista palvelinta valittaessa.

Samanaikainen nopeustesti useissa LTE-modeemeissa
Nopeustestauksen tulos, yksi tiukasti valittu yksi palvelin.

Testauksen aikana molemmissa paikoissa on "turkkia", joka on poistettava matemaattisin menetelmin. Mutta kiinteällä palvelimella se on hieman vähemmän ja amplitudi on vakaampi.
Yleisesti ottaen tämä on suuren tutkimuksen paikka. Ja mittasin palvelimeni nopeuden iperf-apuohjelmalla. Mutta pidämme kiinni teknisistä tiedoista.

Sähköpostin lähetys ja virheet

Sähköpostin lähettämiseksi kokeilin useita kymmeniä eri vaihtoehtoja, mutta lopulta päädyin seuraavaan. Rekisteröin postilaatikon Yandexiin ja otin sitten Tämä on esimerkki postin lähettämisestä. Tarkistin sen ja sisällytin sen ohjelmaan. Tässä esimerkissä tarkastellaan erilaisia ​​vaihtoehtoja, mukaan lukien lähettäminen gmailista jne. En halunnut vaivautua sähköpostipalvelimeni asettamiseen, enkä ehtinyt siihen, mutta kuten myöhemmin kävi ilmi, se oli myös turhaa.

Lokit lähetettiin aikataulun mukaan, jos on yhteys, 6 tunnin välein: klo 00, 06, 12 ja 18. Lähetti seuraavasti.

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

Virheetkin lähetettiin aluksi. Aluksi ne kerättiin listaan ​​ja lähetettiin sitten myös ajastimen avulla, jos yhteys oli olemassa. Sitten ilmeni kuitenkin ongelmia siitä, että Yandexillä on raja päivässä lähetettyjen viestien määrälle (tämä on tuskaa, surua ja nöyryytystä). Koska virheitä saattoi tulla valtavasti jopa minuutissa, jouduimme luopumaan virheiden lähettämisestä postitse. Muista siis, kun lähetät automaattisesti tietoja tällaisesta ongelmasta Yandex-palvelujen kautta.

Palautepalvelin

Tarvitsin ulkoisen palvelimen päästäkseni käsiksi etälaitteistoon ja mukauttamaan ja konfiguroimaan sitä uudelleen. Yleisesti ottaen oikeudenmukaisuuden vuoksi olisi oikein lähettää kaikki tiedot palvelimelle ja rakentaa kaikki kauniit kaaviot verkkokäyttöliittymään. Mutta ei kaikkea kerralla.

VPS:lle valitsin ruvds.com. Voit ottaa yksinkertaisimman palvelimen. Ja yleensä, minun tarkoituksiini tämä riittäisi. Mutta koska en maksanut palvelinta omasta taskustani, päätin ottaa sen pienellä varauksella, jotta se riittäisi, jos otamme käyttöön web-rajapinnan, oman SMTP-palvelimen, VPN:n jne. Lisäksi voit määrittää Telegram-botin, eikä sinulla ole ongelmia sen estämisen kanssa. Siksi valitsin Amsterdamin ja seuraavat parametrit.

Samanaikainen nopeustesti useissa LTE-modeemeissa

Viestintämenetelmäksi laitteiston kanssa vim2 valitsi käänteisen ssh-yhteyden, ja kuten käytäntö on osoittanut, se ei ole paras. Jos yhteys katkeaa, palvelin pitää portin ja on mahdotonta muodostaa yhteyttä sen kautta jonkin aikaa. Siksi on silti parempi käyttää muita viestintätapoja, esimerkiksi VPN: tä. Jatkossa halusin vaihtaa VPN:ään, mutta minulla ei ollut aikaa.

En mene yksityiskohtiin palomuurin asettamisesta, oikeuksien rajoittamisesta, root ssh -yhteyksien poistamisesta ja muista VPS:n perustamisen totuuksista. Haluaisin uskoa, että tiedät jo kaiken. Etäyhteyttä varten luon palvelimelle uuden käyttäjän.

adduser vimssh

Luon ssh-yhteysavaimet laitteistollemme.

ssh-keygen

Ja kopioin ne palvelimellemme.

ssh-copy-id [email protected]

Laitteistollamme luon automaattisen käänteisen ssh-yhteyden jokaisen käynnistyksen yhteydessä.

[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

Kiinnitä huomiota porttiin 8083: se määrittää, mitä porttia käytän yhteyden muodostamiseen käänteisen ssh:n kautta. Lisää se käynnistykseen ja käynnistä.

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

Voit jopa nähdä tilan:

sudo systemctl status autossh.service

Nyt VPS-palvelimellamme, jos käytämme:

ssh -p 8083 khadas@localhost

Sitten pääsen testikappaleeseeni. Ja laitteistosta voin myös lähettää lokit ja kaikki tiedot ssh: n kautta palvelimelleni, mikä on erittäin kätevää.

Kokoaminen

Samanaikainen nopeustesti useissa LTE-modeemeissa
Käynnistäminen, aloitetaan kehitys ja virheenkorjaus

Huh, siinä se, kuvailin kaikki solmut. Nyt on aika laittaa kaikki yhteen. Voit nähdä koodin täällä.

Tärkeä kohta koodissa: Tämä projekti ei ehkä käynnisty näin, koska se oli räätälöity tiettyyn tehtävään, tietyn arkkitehtuurin mukaan. Vaikka annan lähdekoodin, selitän silti arvokkaimmat asiat tässä, suoraan tekstissä, muuten se on täysin käsittämätöntä.

Aluksi alustan gps:n, gpion ja käynnistän erillisen ajastinsäikeen.

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

Ajastin on melko yksinkertainen: se katsoo, onko tullut aika lähettää viestejä ja mikä on nykyinen virhetila. Jos on virhelippu, vilkkumme LED-valoa.

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

Tämän projektin vaikein osa on käänteisen ssh-yhteyden ylläpitäminen jokaisessa testissä. Jokainen testi sisältää oletusyhdyskäytävän ja DNS-palvelimen määrittämisen uudelleen. Koska kukaan ei kuitenkaan lue, tiedä, että juna ei kulje puisilla kiskoilla. Joka löytää pääsiäismunan, saa karkkia.

Tätä varten luon erillisen reititystaulukon -set-mark 0x2 ja säännön liikenteen uudelleenohjaamiseksi.

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

Voit oppia lisää sen toiminnasta lue tästä artikkelista.

Sen jälkeen siirryn loputtomaan silmukkaan, jossa joka kerta saamme luettelon kytketyistä modeemeista (selvittääksemme, onko verkkokokoonpano yhtäkkiä muuttunut).

network_list = getNetworklist()

Verkkoliitäntöjen luettelon saaminen on melko yksinkertaista.

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

Listan vastaanotettuani asetin IP-osoitteet kaikille liitäntöille, kuten modeemia käsittelevän luvun kuvassa näytin.

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

Sitten käyn vain jokaisen käyttöliittymän läpi silmukassa. Ja minä määritän jokaisen käyttöliittymän.

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

Tarkistan käyttöliittymän toimivuuden, jos verkkoa ei ole, luon virheitä. Jos verkosto on olemassa, on aika toimia!

Täällä konfiguroin ssh-reitityksen tähän käyttöliittymään (jos sitä ei ole tehty), lähetän virheet palvelimelle, jos aika on tullut, lähetän lokit ja lopuksi suoritan nopeustestin ja tallennan lokit csv-tiedostoon.

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

On syytä mainita käänteisen ssh:n asettamisen toiminto.

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

Ja tietysti sinun on lisättävä kaikki tämä kauneus käynnistykseen. Tätä varten luon tiedoston:

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

Ja minä kirjoitan siihen:

[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

Laitan automaattilatauksen päälle ja aloitan!

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

Nyt näen lokit siitä, mitä tapahtuu komennolla:

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

Tulokset

No, nyt tärkeintä on, mitä sen seurauksena tapahtui? Tässä on muutamia kaavioita, jotka onnistuin vangitsemaan kehitys- ja virheenkorjausprosessin aikana. Kaaviot rakennettiin gnuplotilla seuraavan skriptin kanssa.

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

Ensimmäinen kokemus oli Tele2-operaattorilla, jota tein useita päiviä.

Samanaikainen nopeustesti useissa LTE-modeemeissa

Tässä käytin dynaamista mittauspalvelinta. Nopeusmittaukset toimivat, mutta vaihtelevat paljon, mutta jonkin verran keskiarvoa on silti näkyvissä, ja tämä voidaan saada suodattamalla tiedot esimerkiksi liukuvalla keskiarvolla.

Myöhemmin rakensin useita kaavioita muille teleoperaattoreille. Tässä tapauksessa oli jo yksi testauspalvelin, ja tulokset olivat myös erittäin mielenkiintoisia.

Samanaikainen nopeustesti useissa LTE-modeemeissa

Samanaikainen nopeustesti useissa LTE-modeemeissa

Samanaikainen nopeustesti useissa LTE-modeemeissa

Samanaikainen nopeustesti useissa LTE-modeemeissa

Kuten näette, aihe on erittäin laaja tämän tiedon tutkimukseen ja käsittelyyn, eikä se selvästikään kestä parin viikon työtä. Mutta…

Työn tulos

Työ valmistui yllättäen minusta riippumattomien olosuhteiden vuoksi. Yksi tämän projektin heikkouksista subjektiivisen käsitykseni mukaan oli modeemi, joka ei todellakaan halunnut toimia samanaikaisesti muiden modeemien kanssa ja teki tällaisia ​​temppuja joka kerta, kun se latautui. Näitä tarkoituksia varten on olemassa valtava määrä muita modeemimalleja; yleensä ne ovat jo Mini PCI-e -muodossa ja asennetaan laitteen sisään ja niitä on paljon helpompi määrittää. Mutta se on täysin eri tarina. Projekti oli mielenkiintoinen ja olin erittäin iloinen, että sain olla mukana.

Samanaikainen nopeustesti useissa LTE-modeemeissa

Lähde: will.com

Lisää kommentti