Hkratni test hitrosti na več modemih LTE

Med karanteno so mi ponudili sodelovanje pri razvoju naprave za merjenje hitrosti LTE modemov za več mobilnih operaterjev.

Hkratni test hitrosti na več modemih LTE

Stranka je želela oceniti hitrost različnih telekomunikacijskih operaterjev na različnih geografskih lokacijah, da bi razumela, kateri mobilni operater je zanj najbolj optimalen pri namestitvi opreme s povezavo LTE, na primer za video oddajanje. Obenem je bilo treba problem rešiti čim bolj enostavno in poceni, brez drage opreme.

Takoj bom rekel, da naloga ni najpreprostejša in najbolj zahtevna, povedal vam bom, na katere težave sem naletel in kako sem jih rešil. Torej, gremo.

Obvestilo

Merjenje hitrosti povezave LTE je zelo kompleksna zadeva: izbrati morate pravo opremo in merilno tehniko ter dobro razumeti topologijo in delovanje mobilnega omrežja. Poleg tega lahko na hitrost vpliva več dejavnikov: število naročnikov v celici, vremenske razmere, celo od celice do celice se lahko hitrost močno razlikuje zaradi topologije omrežja. Na splošno je to problem z ogromno neznankami, ki ga lahko pravilno reši le telekomunikacijski operater.

Sprva je stranka le želela voziti kurirja s telefoni operaterjev, opraviti meritve neposredno na telefonu in nato rezultate meritev hitrosti zapisati v zvezek. Moja rešitev za merjenje hitrosti lte omrežij, čeprav ni idealna, rešuje problem.

Zaradi pomanjkanja časa se nisem odločil v prid priročnosti ali praktičnosti, ampak v prid hitrosti razvoja. Na primer, povratni ssh je bil uporabljen za oddaljeni dostop namesto bolj praktičnega VPN-ja, da bi prihranili čas pri nastavitvi strežnika in vsakega posameznega odjemalca.

Tehnična naloga

Kot je navedeno v članku Brez tehničnih specifikacij: zakaj naročnik tega noče: Ne delajte brez tehničnih specifikacij! Nikoli, nikjer!

Tehnična naloga je bila precej enostavna, za razumevanje končnega uporabnika jo bom malo razširil. Izbiro tehničnih rešitev in opreme je narekoval naročnik. Torej sama tehnična specifikacija po vseh odobritvah:

Temelji na računalniku z eno ploščo vim2 naredi tester hitrosti za lte povezave preko H modemovuawei e3372h - 153 več telekomunikacijskih operaterjev (od enega do n). Prav tako je potrebno prejeti koordinate iz GPS sprejemnika, povezanega prek UART. Izvedite meritve hitrosti s storitvijo www.speedtest.net in jih postavite v tabelo, kot je:

Hkratni test hitrosti na več modemih LTE

Tabela v formatu csv. Nato pošljite ta znak po e-pošti vsakih 6 ur. V primeru napak utripa lučka LED, ki je povezana z GPIO.

Tehnične specifikacije sem opisal v prosti obliki, po številnih odobritvah. Toda smisel naloge je že viden. Teden dni je bil dan za vse. A v resnici je trajalo tri tedne. To je ob upoštevanju dejstva, da sem to počel le po glavni službi in ob koncih tedna.

Tukaj želim ponovno opozoriti na dejstvo, da se je stranka vnaprej dogovorila za uporabo storitve merjenja hitrosti in strojne opreme, kar je močno omejilo moje zmožnosti. Tudi proračun je bil omejen, zato ni bilo kupljeno nič posebnega. Zato smo morali igrati po teh pravilih.

Arhitektura in razvoj

Shema je preprosta in očitna. Zato ga bom pustil brez posebnih komentarjev.

Hkratni test hitrosti na več modemih LTE

Odločil sem se, da bom celoten projekt izvedel v pythonu, kljub temu, da nisem imel nobenih izkušenj z razvojem v tem jeziku. Zanj sem se odločil, ker je bilo kup že pripravljenih primerov in rešitev, ki bi lahko pospešile razvoj. Zato prosim vse profesionalne programerje, da ne grajajo moje prve izkušnje z razvojem v pythonu, in vedno sem vesel konstruktivnih kritik za izboljšanje svojih veščin.

Tudi v procesu sem odkril, da ima python dve delujoči različici 2 in 3, zato sem se odločil za tretjo.

Vozlišča strojne opreme

Enoploščni vim2

Kot moj glavni stroj sem dobil računalnik z eno ploščo vim2

Hkratni test hitrosti na več modemih LTE

Odličen, zmogljiv medijski procesor za pametni dom in SMART-TV, vendar skrajno neprimeren za to nalogo ali, recimo, slabo primeren. Na primer, njegov glavni OS je Android, Linux pa je sekundarni OS, zato nihče ne jamči za kakovostno delovanje vseh vozlišč in gonilnikov pod Linuxom. Predvidevam, da so bile nekatere težave povezane z gonilniki USB te platforme, zato modemi na tej plošči niso delovali po pričakovanjih. Ima tudi zelo slabo in razpršeno dokumentacijo, zato je vsaka operacija vzela veliko časa za kopanje po dokih. Že običajno delo z GPIO je vzelo veliko krvi. Na primer, potreboval sem več ur, da sem nastavil LED. Ampak, če smo objektivni, v bistvu ni bilo pomembno, kakšna enojna plošča je bila, glavna stvar je bila, da je delovala in da so bila vrata USB.

Najprej moram namestiti Linux na to ploščo. Da ne bi brskal po divjini dokumentacije za vse in tudi za tiste, ki se bodo ukvarjali s tem sistemom z eno ploščo, pišem to poglavje.

Obstajata dve možnosti za namestitev Linuxa: na zunanjo kartico SD ali na notranji MMC. Cel večer sem razmišljal, kako naj deluje s kartico, zato sem se odločil, da jo namestim na MMC, čeprav bi bilo brez dvoma veliko lažje delati z zunanjo kartico.

O vdelani programski opremi krivo povedano tukaj. Prevajam iz tujega v ruščino. Za bliskavico plošče moram povezati strojni UART. Povezal kot sledi.

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

Hkratni test hitrosti na več modemih LTE

Po tem sem prenesel firmware zato. Posebna različica vdelane programske opreme VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Za nalaganje te vdelane programske opreme potrebujem pripomočke. Več podrobnosti o tem tukaj. Nisem ga poskusil flashati pod Windows, vendar vam moram povedati nekaj besed o vdelani programski opremi pod Linuxom. Najprej bom namestil pripomočke v skladu z navodili.

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

Aaa... Nič ne deluje. Nekaj ​​ur sem urejal namestitvene skripte, da bi se mi vse pravilno namestilo. Ne spomnim se, kaj sem tam počel, bil pa je tudi tisti cirkus s konji. Zato bodite previdni. Toda brez teh pripomočkov nima smisla nadalje mučiti vim2. Bolje je, da se sploh ne zapletate z njim!

Po sedmih krogih pekla, konfiguraciji skripte in namestitvi sem prejel paket delujočih pripomočkov. Ploščo sem povezal prek USB-ja na svoj računalnik z Linuxom in priključil tudi UART v skladu z zgornjim diagramom.
Nastavljam svoj najljubši minicom terminal za hitrost 115200, brez kontrole napak strojne in programske opreme. In začnimo.

Hkratni test hitrosti na več modemih LTE

Ko nalagam VIM2 v terminal UART, pritisnem tipko, kot je preslednica, da ustavim nalaganje. Ko se pojavi vrstica

kvim2# 

Vpišem ukaz:

kvim2# run update

Na gostitelju, s katerega nalagamo, izvedem:

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

To je to, fuj. Preveril sem, na plošči je Linux. Prijava/geslo khadas:khadas.

Po tem nekaj manjših začetnih nastavitev. Za nadaljnje delo onemogočim geslo za sudo (ja, ni varno, ampak priročno).

sudo visudo

Uredim vrstico v obrazec in shranim

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

Nato spremenim trenutno lokacijo, tako da je čas v Moskvi, sicer bo v Greenwichu.

sudo timedatectl set-timezone Europe/Moscow

ali

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

Če vam je težko, potem ne uporabljajte te plošče; Raspberry Pi je boljši. Iskreno povedano.

Modem Huawei e3372h – 153

Ta modem je bil zame pomemben vir krvi in ​​pravzaprav je postal ozko grlo celotnega projekta. Na splošno ime "modem" za te naprave sploh ne odraža bistva dela: to je zmogljiva kombinacija, ta kos strojne opreme ima sestavljeno napravo, ki se pretvarja, da je CD-ROM za namestitev gonilnikov, in nato preklopi v način omrežne kartice.

Arhitekturno gledano z vidika uporabnika Linuxa po vseh nastavitvah izgleda takole: po priklopu modema imam omrežni vmesnik eth*, ki preko dhcp-ja dobi IP naslov 192.168.8.100 in privzeti prehod. je 192.168.8.1.

In najpomembnejši trenutek! Ta model modema ne more delovati v načinu modema, ki ga nadzirajo ukazi AT. Vse bi bilo veliko enostavneje, ustvariti PPP povezave za vsak modem in nato delovati z njimi. Toda v mojem primeru "sam" (natančneje Linux diver po pravilih udev), ustvari vmesnik eth in mu prek dhcp dodeli IP naslov.

Da bi se izognili nadaljnji zmedi, predlagam, da pozabite na besedo "modem" in rečete omrežna kartica in prehod, ker je v bistvu to tako, kot če bi novo omrežno kartico povezali s prehodom.
Ko je modem en, to ne povzroča posebnih težav, ko pa jih je več, in sicer n-kosov, se pojavi naslednja slika omrežja.

Hkratni test hitrosti na več modemih LTE

To je n omrežnih kartic z istim naslovom IP, vsaka z istim privzetim prehodom. Toda v resnici je vsak od njih povezan s svojim operaterjem.

Na začetku sem imel preprosto rešitev: z ukazom ifconfig ali ip izklopiti vse vmesnike in preprosto vklopiti enega po vrsti ter ga preizkusiti. Rešitev je bila dobra za vse, le da se v trenutkih preklopa nisem mogel povezati z napravo. In ker je preklapljanje pogosto in hitro, pravzaprav sploh nisem imel možnosti vzpostaviti povezave.

Zato sem izbral pot ročnega spreminjanja naslovov IP modemov in nato usmerjanje prometa z nastavitvami usmerjanja.

Hkratni test hitrosti na več modemih LTE

S tem se moje težave z modemi še niso končale: v primeru težav z napajanjem so ti odpadli, potrebno pa je bilo dobro stabilno napajanje USB huba. To težavo sem rešil s trdim spajkanjem napajanja neposredno na pesto. Druga težava, na katero sem naletel in ki je uničila celoten projekt: po ponovnem zagonu ali hladnem zagonu naprave niso bili zaznani vsi modemi in ne vedno in nisem mogel ugotoviti, zakaj se je to zgodilo in po katerem algoritmu. Ampak najprej.

Za pravilno delovanje modema sem namestil paket usb-modeswitch.

sudo apt update
sudo apt install -y usb-modeswitch

Po tem bo po povezavi modem pravilno zaznal in konfiguriral podsistem udev. Preverim tako, da preprosto priklopim modem in se prepričam, da se prikaže omrežje.
Še en problem, ki ga nisem mogel rešiti: kako naj iz tega modema dobim ime operaterja, s katerim delamo? Ime operaterja je v spletnem vmesniku modema na 192.168.8.1. To je dinamična spletna stran, ki prejema podatke prek zahtev Ajax, zato preprosto pridobivanje strani in razčlenjevanje imena ne bo delovalo. Tako sem začel iskati, kako razviti spletno stran itd., in ugotovil, da počnem neko neumnost. Posledično je pljunil in operater je začel prejemati s samim API-jem Speedtest.

Veliko lažje bi bilo, če bi modem imel dostop preko AT ukazov. Možno bi ga bilo prekonfigurirati, ustvariti ppp povezavo, dodeliti IP, pridobiti telekom operaterja itd. Ampak žal, delam s tem, kar mi je dano.

GPS

Sprejemnik GPS, ki sem ga dobil, je imel vmesnik UART in napajanje. To ni bila najboljša rešitev, vendar je bila vseeno izvedljiva in preprosta. Sprejemnik je izgledal nekako takole.

Hkratni test hitrosti na več modemih LTE

Če sem iskren, sem prvič delal z GPS sprejemnikom, a kot sem pričakoval, je bilo pri nas vse že zdavnaj domišljeno. Zato uporabljamo le že pripravljene rešitve.

Najprej omogočim uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) za povezavo GPS.

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

Nato preverim uspešnost operacije.

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

Ta ukaz očitno sproti ureja drevo razvijalcev, kar je zelo priročno.

Po uspehu te operacije znova zaženite in namestite demon GPS.

khadas@Khadas:~$ sudo reboot

Namestitev GPS demona. Vse namestim in takoj odrežem za nadaljnjo konfiguracijo.

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

Urejanje datoteke z nastavitvami.

sudo vim /etc/default/gpsd

Inštaliram UART na katerem bo GPS visel.

DEVICES="/dev/ttyS4"

In potem vse vklopimo in začnemo.

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

Po tem priklopim GPS.

Hkratni test hitrosti na več modemih LTE

GPS žica je v mojih rokah, žice UART debuggerja so vidne pod mojimi prsti.

Ponovno zaženem in preverim delovanje GPS s programom gpsmon.

Hkratni test hitrosti na več modemih LTE

Na tem posnetku zaslona ne vidite satelitov, vidite pa komunikacijo s sprejemnikom GPS, kar pomeni, da je vse v redu.

V pythonu sem poskusil veliko možnosti za delo s tem demonom, vendar sem se odločil za tisto, ki je pravilno delovala s pythonom 3.

Namestim potrebno knjižnico.

sudo -H pip3 install gps3 

In klešem delovni kodeks.

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

Če potrebujem koordinate, to storim z naslednjim klicem:

longitude, latitude = getPositionData(agps_thread)

In v 1-10 sekundah bom dobil koordinato ali ne. Da, imel sem deset poskusov pridobiti koordinate. Ni optimalno, ukrivljeno in poševno, vendar deluje. Za to sem se odločil, ker ima GPS lahko slab sprejem in ne sprejema vedno podatkov. Če čakate na prejem podatkov, potem, če delate v oddaljeni sobi, bo program zamrznil na tem mestu. Zato sem uporabil to neelegantno možnost.

Načeloma, če bi bilo več časa, bi bilo mogoče prejemati podatke iz GPS neposredno prek UART, jih razčleniti v ločeni niti in delati z njimi. Toda časa sploh ni bilo, zato brutalno grda koda. In ja, ni me sram.

LED

Priključitev LED je bila preprosta in zahtevna hkrati. Glavna težava je v tem, da številka pina v sistemu ne ustreza številki pina na plošči in ker je dokumentacija napisana z levo roko. Če želite primerjati številko pin strojne opreme in številko pin v OS, morate zagnati ukaz:

gpio readall

Prikazana bo tabela korespondence pinov v sistemu in na plošči. Po tem lahko že upravljam pin v samem OS. V mojem primeru je LED priključena na GPIOH_5.

Hkratni test hitrosti na več modemih LTE

Preklopim pin GPIO v izhodni način.

gpio -g mode 421 out

Zapišem nulo.

gpio -g write 421 0

Zapišem eno.

gpio -g write 421 1

Hkratni test hitrosti na več modemih LTE
Vse sveti, po zapisu "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)

Zdaj v primeru napak pokličem error_blink() in LED bo lepo utripala.

Programska vozlišča

Speedtest API

V veliko veselje je, da ima storitev speedtest.net lasten python-API, lahko si ogledate GitHub.

Dobra stvar je, da obstajajo izvorne kode, ki si jih je mogoče tudi ogledati. Kako delati s tem API-jem (preprosti primeri) lahko najdete v ustrezni razdelek.

Knjižnico python namestim z naslednjim ukazom.

sudo -H pip3 install speedtest-cli

Na primer, lahko celo namestite tester hitrosti v Ubuntu neposredno iz programske opreme. To je ista aplikacija python, ki jo je mogoče zagnati neposredno s konzole.

sudo apt install speedtest-cli -y

In izmerite hitrost 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

Posledično tako kot jaz. Moral sem vstopiti v izvorne kode tega preizkusa hitrosti, da sem jih lahko v celoti implementiral v svoj projekt. Ena najpomembnejših nalog je pridobiti ime telekomunikacijskega operaterja, da ga nadomestimo na tablici.

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

Tudi tukaj se je izkazalo, da vse ni tako preprosto, čeprav bi se zdelo veliko preprostejše. Sprva je bil parameter strežnikov enak [], pravijo, izberite najboljši strežnik. Posledično sem imel naključne strežnike in, kot morda ugibate, spremenljivo hitrost. To je precej zapletena tema, uporaba fiksnega strežnika, če je tako, statičnega ali dinamičnega, zahteva raziskavo. Toda tukaj je primer grafov merjenja hitrosti za operaterja Beeline pri dinamični izbiri testnega strežnika in statično fiksnega.

Hkratni test hitrosti na več modemih LTE
Rezultat merjenja hitrosti pri izbiri dinamičnega strežnika.

Hkratni test hitrosti na več modemih LTE
Rezultat testiranja hitrosti, z enim strogo izbranim strežnikom.

Med testiranjem je na obeh mestih "krzno", ki ga je treba odstraniti z matematičnimi metodami. Toda pri fiksnem strežniku je nekoliko manj in amplituda je bolj stabilna.
Na splošno je to kraj velikih raziskav. Hitrost svojega strežnika bi izmeril s pripomočkom iperf. Ostajamo pa pri tehničnih specifikacijah.

Pošiljanje pošte in napake

Za pošiljanje pošte sem poskusil več deset različnih možnosti, a na koncu sem se odločil za naslednje. Registriral sem nabiralnik na Yandexu in nato vzel To je primer pošiljanja pošte. Preveril sem in implementiral v program. Ta primer preučuje različne možnosti, vključno s pošiljanjem iz gmaila itd. Z nastavitvijo poštnega strežnika se nisem želel ukvarjati in za to nisem imel časa, a kot se je kasneje izkazalo, je bilo tudi zaman.

Dnevniki so bili poslani po urniku, če obstaja povezava, vsakih 6 ur: ob 00, 06, 12 in 18. Poslano na naslednji 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

Na začetku so bile poslane tudi napake. Za začetek so se zbrali na seznamu in nato poslali tudi s pomočjo razporejevalnika, če je obstajala povezava. Vendar so se potem pojavile težave z dejstvom, da ima Yandex omejitev števila poslanih sporočil na dan (to je bolečina, žalost in ponižanje). Ker je napak lahko tudi na minuto ogromno, smo morali opustiti pošiljanje napak po pošti. Zato upoštevajte, ko samodejno pošiljate informacije o takšni težavi prek storitev Yandex.

Strežnik za povratne informacije

Da bi imel dostop do oddaljenega dela strojne opreme in ga lahko prilagodil in znova konfiguriral, sem potreboval zunanji strežnik. Na splošno bi bilo pošteno rečeno pravilno poslati vse podatke na strežnik in zgraditi vse čudovite grafe v spletnem vmesniku. Ampak ne vse naenkrat.

Za VPS sem izbral ruvds.com. Lahko vzamete najpreprostejši strežnik. In na splošno bi bilo za moje namene to dovolj. Ker pa strežnika nisem plačal iz lastnega žepa, sem se odločil, da ga vzamem z majhno rezervo, da bi bilo dovolj, če bi postavili spletni vmesnik, svoj SMTP strežnik, VPN itd. Poleg tega lahko nastavite bota za Telegram in ne boste imeli težav z njegovo blokado. Zato sem izbral Amsterdam in naslednje parametre.

Hkratni test hitrosti na več modemih LTE

Kot način komunikacije s strojno opremo je vim2 izbral obratno ssh povezavo in kot je pokazala praksa, ni najboljša. Če se povezava prekine, strežnik zadrži vrata in prek njih nekaj časa ni mogoče vzpostaviti povezave. Zato je še vedno bolje uporabiti druge načine komunikacije, na primer VPN. V prihodnosti sem želel preklopiti na VPN, vendar nisem imel časa.

Ne bom se spuščal v podrobnosti nastavitve požarnega zidu, omejevanja pravic, onemogočanja korenskih ssh povezav in drugih resnic nastavitve VPS. Rad bi verjel, da že vse veš. Za oddaljeno povezavo ustvarim novega uporabnika na strežniku.

adduser vimssh

Na naši strojni opremi ustvarim povezovalne ključe ssh.

ssh-keygen

In jih kopiram na naš strežnik.

ssh-copy-id [email protected]

Na naši strojni opremi ustvarim samodejno povratno ssh povezavo ob vsakem zagonu.

[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

Bodite pozorni na vrata 8083: določajo, katera vrata bom uporabil za povezavo prek povratnega ssh. Dodajte ga v zagon in zaženite.

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

Vidite lahko celo stanje:

sudo systemctl status autossh.service

Če zdaj na našem strežniku VPS zaženemo:

ssh -p 8083 khadas@localhost

Nato pridem do testnega dela strojne opreme. In iz strojne opreme lahko pošiljam tudi dnevnike in morebitne podatke preko ssh na svoj strežnik, kar je zelo priročno.

Vse skupaj

Hkratni test hitrosti na več modemih LTE
Vklopimo, začnimo z razvojem in odpravljanjem napak

Fuj, to je to, opisal sem vsa vozlišča. Zdaj je čas, da vse skupaj sestavimo. Lahko vidite kodo tukaj.

Pomembna točka pri kodi: ta projekt se morda ne bo začel tako, ker je bil prilagojen za specifično nalogo, specifične arhitekture. Čeprav podajam izvorno kodo, bom najbolj dragocene stvari razložil tukaj, kar v besedilu, sicer je popolnoma nerazumljivo.

Na začetku inicializiram gps, gpio in zaženem ločeno nit planerja.

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

Razporejevalnik je precej preprost: preveri, ali je prišel čas za pošiljanje sporočil in kakšno je trenutno stanje napake. Če je zastavica napake, potem utripa 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žji del tega projekta je vzdrževanje povratne povezave ssh za vsak preizkus. Vsak preizkus vključuje ponovno konfiguracijo privzetega prehoda in strežnika DNS. Ker itak nihče ne bere, vedite, da vlak ne vozi po lesenih tirnicah. Kdor najde velikonočno jajce, dobi sladkarije.

Da bi to naredil, ustvarim ločeno usmerjevalno tabelo -set-mark 0x2 in pravilo za preusmeritev 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")

Izvedete lahko več o tem, kako deluje preberite v tem članku.

Nato grem v neskončno zanko, kjer vsakič dobimo seznam povezanih modemov (da ugotovimo, ali se je konfiguracija omrežja nenadoma spremenila).

network_list = getNetworklist()

Pridobivanje seznama omrežnih vmesnikov je zelo preprosto.

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

Po prejemu seznama sem vsem vmesnikom nastavil IP naslove, kot sem prikazal na sliki v poglavju 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")

Nato preprosto grem skozi vsak vmesnik v zanki. In konfiguriram vsak vmesnik.

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

Preverim funkcionalnost vmesnika, če ni omrežja, ustvarim napake. Če obstaja mreža, potem je čas za ukrepanje!

Tukaj konfiguriram usmerjanje ssh do tega vmesnika (če še ni bilo narejeno), pošljem napake strežniku, če je prišel čas, pošljem dnevnike in na koncu zaženem preizkus hitrosti ter shranim dnevnike v datoteko 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()
#и далее тестируем скорость и сохраняем логи. 

Omeniti velja še funkcijo nastavitve povratnega ssh.

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

In seveda, vso to lepoto morate dodati zagonu. Za to ustvarim datoteko:

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

In v njem 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

Vklopim samodejno nalaganje in začnem!

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

Zdaj lahko vidim dnevnike dogajanja z ukazom:

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

Ugotovitve

No, zdaj pa je najbolj pomembno, kaj se je zgodilo posledično? Tukaj je nekaj grafov, ki mi jih je uspelo zajeti med postopkom razvoja in odpravljanja napak. Grafi so bili zgrajeni z uporabo gnuplot z naslednjim 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"

Prva izkušnja je bila z operaterjem Tele2, ki sem jo izvajal več dni.

Hkratni test hitrosti na več modemih LTE

Tukaj sem uporabil dinamični merilni strežnik. Meritve hitrosti delujejo, vendar zelo nihajo, vendar je neka povprečna vrednost vseeno vidna, to pa lahko pridobimo s filtriranjem podatkov, na primer z drsečim povprečjem.

Kasneje sem zgradil številne grafe za druge telekomunikacijske operaterje. V tem primeru je že obstajal en testni strežnik in tudi rezultati so bili zelo zanimivi.

Hkratni test hitrosti na več modemih LTE

Hkratni test hitrosti na več modemih LTE

Hkratni test hitrosti na več modemih LTE

Hkratni test hitrosti na več modemih LTE

Kot lahko vidite, je tema zelo obsežna za raziskovanje in obdelavo teh podatkov in očitno ne zdrži nekaj tednov dela. ampak...

Rezultat dela

Delo je bilo nenadoma zaključeno zaradi okoliščin, na katere nisem mogel vplivati. Ena od slabosti tega projekta je bil po mojem subjektivnem mnenju modem, ki pravzaprav ni želel sočasno delovati z drugimi modemi in je ob vsakem nalaganju delal takšne trike. Za te namene obstaja ogromno drugih modelov modemov, običajno so že v formatu Mini PCI-e in so nameščeni znotraj naprave ter jih je veliko lažje konfigurirati. A to je povsem druga zgodba. Projekt je bil zanimiv in zelo sem bil vesel, da sem lahko sodeloval pri njem.

Hkratni test hitrosti na več modemih LTE

Vir: www.habr.com

Dodaj komentar