Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

KarantÄ«nas laikā man piedāvāja piedalÄ«ties LTE modemu ātruma mērÄ«Å”anas ierÄ«ces izstrādē vairākiem mobilo sakaru operatoriem.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Klients vēlējās novērtēt dažādu telekomunikāciju operatoru ātrumu dažādās Ä£eogrāfiskās vietās, lai varētu saprast, kurÅ” mobilo sakaru operators viņam ir optimālākais, uzstādot LTE pieslēgumu izmantojoÅ”o aprÄ«kojumu, piemēram, video pārraidēm. Tajā paŔā laikā problēma bija jāatrisina pēc iespējas vienkārŔāk un lētāk, bez dārga aprÄ«kojuma.

Uzreiz teikÅ”u, ka uzdevums nav no vienkārŔākajiem un zināŔanu ietilpÄ«gākajiem, pastāstÄ«Å”u, ar kādām problēmām saskāros un kā tās atrisināju. Tātad, ejam.

Piezīme

LTE savienojuma ātruma mērÄ«Å”ana ir ļoti sarežģīts jautājums: jums ir jāizvēlas pareizais aprÄ«kojums un mērÄ«Å”anas tehnika, kā arÄ« labi jāizprot mobilā tÄ«kla topoloÄ£ija un darbÄ«ba. Turklāt ātrumu var ietekmēt vairāki faktori: abonentu skaits Ŕūnā, laika apstākļi, pat dažādās Ŕūnās ātrums var krasi atŔķirties tÄ«kla topoloÄ£ijas dēļ. Kopumā Ŕī ir problēma ar lielu skaitu nezināmo, un tikai telekomunikāciju operators var to pareizi atrisināt.

Sākotnēji klients vēlējies tikai braukt ar kurjeru ar operatoru telefoniem, veikt mērÄ«jumus tieÅ”i telefonā un pēc tam pierakstÄ«t piezÄ«mju grāmatiņā ātruma mērÄ«jumu rezultātus. Mans risinājums LTE tÄ«klu ātruma mērÄ«Å”anai, lai gan tas nav ideāls, atrisina problēmu.

Laika trÅ«kuma dēļ lēmumus pieņēmu nevis par labu ērtÄ«bām vai praktiskumam, bet gan par labu attÄ«stÄ«bas ātrumam. Piemēram, attālinātajai piekļuvei tika izmantots reversais ssh, nevis praktiskāks VPN, lai ietaupÄ«tu laiku servera un katra atseviŔķa klienta iestatÄ«Å”anai.

Tehniskais uzdevums

Kā teikts rakstā Bez tehniskām specifikācijām: kāpēc klients to nevēlas: Nestrādājiet bez tehniskajām specifikācijām! Nekad, nekur!

Tehniskais uzdevums bija pavisam vienkārÅ”s, nedaudz izvērsÄ«Å”u gala lietotāja izpratnei. Tehnisko risinājumu un aprÄ«kojuma izvēli diktēja pasÅ«tÄ«tājs. Tātad pati tehniskā specifikācija pēc visiem apstiprinājumiem:

BalstÄ«ts uz viena borta datora 2 izveidojiet ātruma testeri LTE savienojumiem, izmantojot H modemusuawei e3372h - 153 vairāki telekomunikāciju operatori (no viena lÄ«dz n). Ir nepiecieÅ”ams arÄ« saņemt koordinātas no GPS uztvērēja, kas savienots, izmantojot UART. Veiciet ātruma mērÄ«jumus, izmantojot pakalpojumu www.speedtest.net un ievieto tos tabulā, piemēram:

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Tabula csv formātā. Pēc tam nosÅ«tiet Å”o zÄ«mi pa e-pastu ik pēc 6 stundām. Kļūdu gadÄ«jumā mirgojiet gaismas diode, kas ir savienota ar GPIO.

Tehniskās specifikācijas aprakstīju brīvā formā, pēc daudziem saskaņojumiem. Bet uzdevuma jēga jau ir redzama. Visam tika dota nedēļa. Bet patiesībā tas ilga trīs nedēļas. Tas tiek ņemts vērā, ka es to darīju tikai pēc pamatdarba un brīvdienās.

Å eit vēlos vēlreiz vērst uzmanÄ«bu uz to, ka klients iepriekÅ” vienojās par ātruma mērÄ«Å”anas servisa un aparatÅ«ras izmantoÅ”anu, kas stipri ierobežoja manas iespējas. Budžets arÄ« bija ierobežots, tāpēc nekas Ä«paÅ”s netika iegādāts. Tāpēc mums bija jāspēlē pēc Å”iem noteikumiem.

Arhitektūra un attīstība

Shēma ir vienkārÅ”a un acÄ«mredzama. Tāpēc atstāŔu to bez Ä«paÅ”iem komentāriem.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Es nolēmu visu projektu Ä«stenot python, neskatoties uz to, ka man vispār nebija pieredzes attÄ«stÄ«ties Å”ajā valodā. Izvēlējos, jo bija kaudze gatavu piemēru un risinājumu, kas varētu paātrināt attÄ«stÄ«bu. Tāpēc es lÅ«dzu visus profesionālos programmētājus nelamāt manu pirmo pieredzi, izstrādājot python, un vienmēr priecājos dzirdēt konstruktÄ«vu kritiku, lai uzlabotu savas prasmes.

Arī Ŕajā procesā atklāju, ka python ir divas darbības versijas 2 un 3, kā rezultātā es apmetos uz treŔo.

Aparatūras mezgli

Vienas plāksnes vim2

Man kā galveno maŔīnu iedeva viena borta datoru 2

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Lielisks, jaudÄ«gs multivides procesors viedajai mājai un SMART-TV, taču Å”im uzdevumam ārkārtÄ«gi nepiemērots vai, teiksim, slikti piemērots. Piemēram, tā galvenā operētājsistēma ir Android, un Linux ir sekundāra operētājsistēma, un attiecÄ«gi neviens negarantē visu Linux mezglu un draiveru kvalitatÄ«vu darbÄ«bu. Un pieļauju, ka dažas problēmas bija saistÄ«tas ar Ŕīs platformas USB draiveriem, tāpēc modemi uz Ŕīs plates nestrādāja kā cerēts. Tam ir arÄ« ļoti slikta un izkaisÄ«ta dokumentācija, tāpēc katra darbÄ«ba prasÄ«ja daudz laika, rakņājoties pa dokiem. Pat parasts darbs ar GPIO paņēma daudz asiņu. Piemēram, LED iestatÄ«Å”ana man prasÄ«ja vairākas stundas. Bet, lai bÅ«tu objektÄ«vi, principā nebija svarÄ«gi, kāda veida vienplate tas ir, galvenais, ka tas strādāja un bija USB porti.

Pirmkārt, man ir jāinstalē Linux Å”ajā platē. Lai visi, kā arÄ« tie, kas nodarbosies ar Å”o vienas tāfeles sistēmu, neapmeklētu dokumentāciju, es rakstu Å”o nodaļu.

Ir divas Linux instalÄ“Å”anas iespējas: ārējā SD kartē vai iekŔējā MMC. Vakaru pavadÄ«ju, mēģinot izdomāt, kā to panākt ar karti, tāpēc nolēmu to instalēt MMC, lai gan, bez Å”aubām, ar ārējo karti strādāt bÅ«tu daudz vieglāk.

Par programmaparatūru te greizi pateikts. Tulkoju no dīvaina uz krievu valodu. Lai mirgotu plati, man ir jāpievieno aparatūras UART. Savienoja to Ŕādi.

  • RÄ«ka Pin GND: <ā€”> PIN17 no VIM GPIO
  • RÄ«ka PIN kods TXD: <ā€”> PIN18 no VIM GPIO (Linux_Rx)
  • RÄ«ka Pin RXD: <ā€”> PIN19 no VIM GPIO (Linux_Tx)
  • RÄ«ka Pin VCC: <ā€”> PIN20 no VIM GPIO

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Pēc tam es lejupielādēju programmaparatūru tātad. Konkrēta programmaparatūras versija VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Lai augÅ”upielādētu Å”o programmaparatÅ«ru, man ir vajadzÄ«gas utilÄ«tas. SÄ«kāka informācija par Å”o Å”eit. Es neesmu mēģinājis to mirgot operētājsistēmā Windows, taču man ir jāpasaka daži vārdi par programmaparatÅ«ru operētājsistēmā Linux. Pirmkārt, es instalÄ“Å”u utilÄ«tas saskaņā ar instrukcijām.

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

Ā un... Nekas nedarbojas. Pāris stundas pavadÄ«ju, rediģējot instalācijas skriptus, lai man viss uzstādÄ«tos pareizi. Es neatceros, ko es tur darÄ«ju, bet bija arÄ« cirks ar zirgiem. Tāpēc esiet uzmanÄ«gi. Bet bez Å”iem komunālajiem pakalpojumiem nav jēgas mocÄ«t vim2 tālāk. Labāk ar viņu nemaz nejaukāties!

Pēc septiņiem elles apļiem, skripta konfigurÄ“Å”anas un instalÄ“Å”anas es saņēmu darba utilÄ«tu paketi. Es pievienoju plati, izmantojot USB, savam Linux datoram, kā arÄ« pievienoju UART saskaņā ar iepriekÅ” redzamo shēmu.
Es iestatu savu iecienÄ«tāko minicom termināli ātrumam 115200 XNUMX bez aparatÅ«ras un programmatÅ«ras kļūdu kontroles. Un sāksim.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Ielādējot VIM2 UART terminālÄ«, es nospiežu taustiņu, piemēram, atstarpes taustiņu, lai pārtrauktu ielādi. Pēc rindas parādÄ«Å”anās

kvim2# 

Es ievadu komandu:

kvim2# run update

Uz resursdatora, no kura mēs ielādējam, es izpildu:

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

Tas tā, fu. Es pārbaudīju, uz tāfeles ir Linux. PieteikŔanās/parole khadas:khadas.

Pēc tam daži nelieli sākotnējie iestatÄ«jumi. Tālākam darbam atspējoju sudo paroli (jā, ne droÅ”i, bet ērti).

sudo visudo

Rediģēju rindiņu uz formu un saglabāju

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

Tad es mainu paÅ”reizējo lokalizāciju, lai laiks bÅ«tu Maskavā, pretējā gadÄ«jumā tas bÅ«s Griničā.

sudo timedatectl set-timezone Europe/Moscow

vai

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

Ja jums tas ir grÅ«ti, neizmantojiet Å”o dēli; Raspberry Pi ir labāks. GodÄ«gi.

Modems Huawei e3372h ā€“ 153

Å is modems man bija nozÄ«mÄ«gs asins avots, un patiesÄ«bā tas kļuva par visa projekta saÅ”aurinājumu. Kopumā Å”o ierīču nosaukums ā€œmodemsā€ vispār neatspoguļo darba bÅ«tÄ«bu: Å”is ir jaudÄ«gs kombains, Å”ai aparatÅ«rai ir salikta ierÄ«ce, kas izliekas par CD-ROM, lai instalētu draiverus, un pēc tam pārslēdzas uz tÄ«kla kartes režīmu.

Arhitektoniski no Linux lietotāja viedokļa pēc visiem iestatÄ«jumiem izskatās Ŕādi: pēc modema pieslēgÅ”anas man ir eth* tÄ«kla interfeiss, kas caur dhcp saņem IP adresi 192.168.8.100, un noklusējuma vārteju. ir 192.168.8.1.

Un pats svarÄ«gākais brÄ«dis! Å is modema modelis nevar darboties modema režīmā, ko kontrolē AT komandas. Viss bÅ«tu daudz vienkārŔāk, izveidojiet PPP savienojumus katram modemam un pēc tam darbojieties ar tiem. Bet manā gadÄ«jumā ā€œpatsā€ (precÄ«zāk Linux nirējs pēc udev noteikumiem) izveido eth interfeisu un caur dhcp tam pieŔķir IP adresi.

Lai izvairÄ«tos no turpmākas neskaidrÄ«bas, iesaku aizmirst vārdu ā€œmodemsā€ un pateikt tÄ«kla karti un vārteju, jo bÅ«tÄ«bā tas ir kā jaunas tÄ«kla kartes savienoÅ”ana ar vārteju.
Ja ir viens modems, tas nerada Ä«paÅ”as problēmas, bet, ja ir vairāk nekā viens, proti, n-gabali, rodas Ŕāda tÄ«kla bilde.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Tas ir, n tÄ«kla kartes ar vienu un to paÅ”u IP adresi, katrai ar vienu un to paÅ”u noklusējuma vārteju. Bet patiesÄ«bā katrs no tiem ir savienots ar savu operatoru.

Sākotnēji man bija vienkārÅ”s risinājums: izmantojot komandu ifconfig vai ip, atspējojiet visas saskarnes un vienkārÅ”i ieslēdziet vienu pēc kārtas un pārbaudiet to. Risinājums bija labs visiem, izņemot to, ka pārslēgÅ”anas brīžos es nevarēju izveidot savienojumu ar ierÄ«ci. Un tā kā pārslēgÅ”anās notiek bieži un ātri, man faktiski nebija iespējas izveidot savienojumu.

Tāpēc es izvēlējos ceļu manuāli mainÄ«t modemu IP adreses un pēc tam vadÄ«t trafiku, izmantojot marÅ”rutÄ“Å”anas iestatÄ«jumus.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Ar to manas problēmas ar modemiem nebeidzās: strāvas problēmu gadÄ«jumā tie nokrita, un bija nepiecieÅ”ama laba stabila baroÅ”ana USB centrmezglam. Es atrisināju Å”o problēmu, pielodējot strāvu tieÅ”i centrmezglam. Vēl viena problēma, ar kuru es saskāros un kas sabojāja visu projektu: pēc ierÄ«ces atsāknÄ“Å”anas vai aukstās palaiÅ”anas ne visi modemi tika atklāti un ne vienmēr, un es nevarēju noteikt, kāpēc tas notika un pēc kāda algoritma. Bet vispirms vispirms.

Lai modems darbotos pareizi, es instalēju usb-modeswitch pakotni.

sudo apt update
sudo apt install -y usb-modeswitch

Pēc tam, pēc savienojuma izveides, udev apakÅ”sistēma pareizi atklās un konfigurēs modemu. Es pārbaudu, vienkārÅ”i pievienojot modemu un pārliecinoties, ka parādās tÄ«kls.
Vēl viena problēma, kuru nevarēju atrisināt: kā no Ŕī modema iegÅ«t tā operatora nosaukumu, ar kuru mēs strādājam? Operatora nosaukums ir ietverts modema tÄ«mekļa saskarnē 192.168.8.1. Å Ä« ir dinamiska tÄ«mekļa lapa, kas saņem datus, izmantojot Ajax pieprasÄ«jumus, tāpēc vienkārÅ”a lapas izveidoÅ”ana un nosaukuma parsÄ“Å”ana nedarbosies. Tā nu sāku skatÄ«ties, kā izveidot web lapu utt., un sapratu, ka daru kaut kādas muļķības. Rezultātā viņŔ izspļāva, un operators sāka saņemt, izmantojot paÅ”u Speedtest API.

Daudz bÅ«tu vieglāk, ja modemam bÅ«tu piekļuve, izmantojot AT komandas. Varētu to pārkonfigurēt, izveidot ppp savienojumu, pieŔķirt IP, dabÅ«t telekomunikāciju operatoru utt. Bet diemžēl es strādāju ar to, kas man ir dots.

GPS

Man pieŔķirtajam GPS uztvērējam bija UART interfeiss un jauda. Tas nebija labākais risinājums, taču tas joprojām bija praktiski lietojams un vienkārÅ”s. Uztvērējs izskatÄ«jās apmēram Ŕādi.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

GodÄ«gi sakot, Ŕī bija mana pirmā reize, kad strādāju ar GPS uztvērēju, bet, kā jau gaidÄ«ju, mums viss jau sen bija izdomāts. Tāpēc mēs izmantojam tikai gatavus risinājumus.

Pirmkārt, es iespējoju uart_AO_B (UART_RX_AO_B, UART_TX_AO_B), lai izveidotu savienojumu ar GPS.

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

Pēc tam es pārbaudu operācijas panākumus.

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

Šī komanda acīmredzot rediģē devtree lidojumā, kas ir ļoti ērti.

Pēc veiksmÄ«gas Ŕīs darbÄ«bas pārstartējiet un instalējiet GPS dēmonu.

khadas@Khadas:~$ sudo reboot

GPS dēmona instalÄ“Å”ana. Es visu instalēju un nekavējoties nogriežu tālākai konfigurÄ“Å”anai.

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

IestatÄ«jumu faila rediģēŔana.

sudo vim /etc/default/gpsd

Es instalēju UART, uz kura GPS karājas.

DEVICES="/dev/ttyS4"

Un tad mēs visu ieslēdzam un sākam.

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

Pēc tam pievienoju GPS.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

GPS vads ir manās rokās, UART atkļūdotāja vadi ir redzami zem pirkstiem.

Es atsāknēju un pārbaudu GPS darbību, izmantojot gpsmon programmu.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Šajā ekrānuzņēmumā nav redzami satelīti, taču ir redzama saziņa ar GPS uztvērēju, un tas nozīmē, ka viss ir kārtībā.

Python es izmēģināju daudzas iespējas darbam ar Å”o dēmonu, taču es izvēlējos to, kas darbojās pareizi ar python 3.

Instalēju nepiecieÅ”amo bibliotēku.

sudo -H pip3 install gps3 

Un es veidoju darba kodu.

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

Ja man ir jāsaņem koordinātas, to var izdarÄ«t ar Ŕādu zvanu:

longitude, latitude = getPositionData(agps_thread)

Un 1-10 sekunžu laikā es vai nu saņemÅ”u koordinātu, vai nē. Jā, man bija desmit mēģinājumi iegÅ«t koordinātas. Nav optimāls, greizs un Ŕķībs, bet tas darbojas. Es nolēmu to darÄ«t, jo GPS var slikti uztvert un ne vienmēr saņemt datus. Ja gaidāt datu saņemÅ”anu, tad, ja strādājat attālā telpā, programma Å”ajā vietā iesaldēsies. Tāpēc es ieviesu Å”o neeleganto variantu.

Principā, ja bÅ«tu vairāk laika, varētu saņemt datus no GPS tieÅ”i caur UART, parsēt atseviŔķā pavedienā un strādāt ar tiem. Bet laika nebija vispār, tāpēc brutāli neglÄ«ts kods. Un jā, man nav kauna.

LED

LED pievienoÅ”ana bija vienkārÅ”a un sarežģīta vienlaikus. Galvenās grÅ«tÄ«bas rada tas, ka PIN numurs sistēmā neatbilst PIN numuram uz tāfeles un tāpēc, ka dokumentācija ir rakstÄ«ta ar kreiso roku. Lai salÄ«dzinātu aparatÅ«ras PIN numuru un PIN numuru operētājsistēmā, jums ir jāizpilda komanda:

gpio readall

Tiks parādÄ«ta tapu atbilstÄ«bas tabula sistēmā un uz tāfeles. Pēc tam es jau varu darbināt tapu paŔā OS. Manā gadÄ«jumā LED ir savienots ar GPIOH_5.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Es pārslēdzu GPIO tapu uz izvades režīmu.

gpio -g mode 421 out

Es pierakstu nulli.

gpio -g write 421 0

Es pierakstu vienu.

gpio -g write 421 1

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem
Pēc ā€œ1ā€ uzrakstÄ«Å”anas viss iedegas

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

Tagad kļūdu gadījumā izsaucu error_blink() un LED smuki mirgos.

Programmatūras mezgli

Speedtest API

Liels prieks, ka speedtest.net pakalpojumam ir savs python-API, varat apskatīties GitHub.

Labi ir tas, ka ir pirmkodi, kurus var arÄ« apskatÄ«t. Kā strādāt ar Å”o API (vienkārÅ”us piemērus), var atrast attiecÄ«gā sadaļa.

Es instalēju python bibliotēku ar Ŕādu komandu.

sudo -H pip3 install speedtest-cli

Piemēram, jÅ«s pat varat instalēt ātruma pārbaudÄ«tāju Ubuntu tieÅ”i no programmatÅ«ras. Å Ä« ir tā pati python lietojumprogramma, kuru pēc tam var palaist tieÅ”i no konsoles.

sudo apt install speedtest-cli -y

Un izmēriet savu interneta ātrumu.

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

Rezultātā, tāpat kā es. Man bija jāiedziļinās Ŕī ātruma testa pirmkodos, lai tos pilnÄ«gāk ieviestu savā projektā. Viens no svarÄ«gākajiem uzdevumiem ir iegÅ«t telekomunikāciju operatora nosaukumu, lai to aizstātu plāksnÄ«tē.

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"
#тут ŠøŠ“ŠµŃ‚ Š·Š°ŠæŠøсь Š² фŠ°Š¹Š» Š»Š¾Š³Š¾Š²

ArÄ« Å”eit viss izrādÄ«jās ne tik vienkārÅ”i, lai gan tas Ŕķistu daudz vienkārŔāk. Sākotnēji servera parametrs bija vienāds ar [], viņi saka, izvēlieties labāko serveri. Tā rezultātā man bija nejauÅ”i serveri un, kā jÅ«s varētu nojaust, mainÄ«gs ātrums. Å Ä« ir diezgan sarežģīta tēma, izmantojot fiksētu serveri, ja tā, statisku vai dinamisku, ir nepiecieÅ”ama izpēte. Bet Å”eit ir Beeline operatora ātruma mērÄ«Å”anas grafiku piemērs, dinamiski izvēloties testa serveri un statiski fiksētu serveri.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem
Ātruma mērÄ«Å”anas rezultāts, izvēloties dinamisku serveri.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem
Ātruma pārbaudes rezultāts, ar vienu stingri atlasītu vienu serveri.

Pārbaudes laikā abās vietās ir ā€œkažokādaā€, un tā ir jānoņem ar matemātiskām metodēm. Bet ar fiksētu serveri tas ir nedaudz mazāks un amplitÅ«da ir stabilāka.
Kopumā Ŕī ir lielas izpētes vieta. Un es mērÄ«tu sava servera ātrumu, izmantojot iperf utilÄ«tu. Bet mēs pieturamies pie tehniskajām specifikācijām.

Pasta sūtīŔana un kļūdas

Lai nosÅ«tÄ«tu pastu, es izmēģināju vairākus desmitus dažādu iespēju, bet beigās es izlēmu par sekojoÅ”o. Es reÄ£istrēju pastkastÄ«ti Yandex un pēc tam paņēmu Å is ir pasta sÅ«tÄ«Å”anas piemērs. Es to pārbaudÄ«ju un ieviesu programmā. Å ajā piemērā ir apskatÄ«tas dažādas iespējas, tostarp sÅ«tÄ«Å”ana no Gmail u.c. Es negribēju mocÄ«ties ar pasta servera iestatÄ«Å”anu un nebija tam laika, bet, kā vēlāk izrādÄ«jās, arÄ« tas bija veltÄ«gi.

Žurnāli tika nosÅ«tÄ«ti saskaņā ar plānotāju, ja ir savienojums, ik pēc 6 stundām: pulksten 00, 06:12, 18:XNUMX un XNUMX:XNUMX. NosÅ«tÄ«ja Ŕādi.

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

Sākotnēji tika nosÅ«tÄ«tas arÄ« kļūdas. Sākumā tie tika uzkrāti sarakstā un pēc tam nosÅ«tÄ«ti arÄ«, izmantojot plānotāju, ja bija savienojums. Taču tad radās problēmas ar faktu, ka Yandex ir ierobežots dienā nosÅ«tÄ«to ziņojumu skaits (tās ir sāpes, skumjas un pazemojums). Tā kā kļūdu skaits varēja bÅ«t ļoti liels pat minÅ«tē, nācās atteikties no kļūdu sÅ«tÄ«Å”anas pa pastu. Tāpēc paturiet prātā, automātiski nosÅ«tot informāciju par Ŕādu problēmu, izmantojot Yandex pakalpojumus.

Atsauksmju serveris

Lai piekļūtu attālai aparatÅ«rai un varētu to pielāgot un pārkonfigurēt, man bija nepiecieÅ”ams ārējs serveris. Vispār, godÄ«gi sakot, bÅ«tu pareizi visus datus nosÅ«tÄ«t uz serveri un veidot visus skaistos grafikus tÄ«mekļa saskarnē. Bet ne visu uzreiz.

Par VPS es izvēlējos ruvds.com. JÅ«s varētu izvēlēties vienkārŔāko serveri. Un vispār maniem mērÄ·iem ar to pietiktu. Bet, tā kā par serveri nemaksāju no savas kabatas, nolēmu to paņemt ar nelielu rezervi, lai pietiktu, ja izvietosim tÄ«mekļa saskarni, savu SMTP serveri, VPN utt. Turklāt varēsiet iestatÄ«t Telegram robotu un neradÄ«siet problēmas ar tā bloÄ·Ä“Å”anu. Tāpēc izvēlējos Amsterdamu un sekojoÅ”us parametrus.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Kā saziņas metodi ar aparatūru vim2 izvēlējās reverso ssh savienojumu un, kā liecina prakse, tas nav labākais. Ja savienojums tiek zaudēts, serveris aiztur portu un kādu laiku nav iespējams izveidot savienojumu caur to. Tāpēc joprojām ir labāk izmantot citas saziņas metodes, piemēram, VPN. Nākotnē es gribēju pārslēgties uz VPN, bet man nebija laika.

Es neiedziļināŔos detaļās par ugunsmÅ«ra iestatÄ«Å”anu, tiesÄ«bu ierobežoÅ”anu, root ssh savienojumu atspējoÅ”anu un citiem VPS iestatÄ«Å”anas faktiem. Gribētos ticēt, ka tu jau visu zini. Attālajam savienojumam es izveidoju jaunu lietotāju serverÄ«.

adduser vimssh

Es ģenerēju ssh savienojuma atslēgas mūsu aparatūrā.

ssh-keygen

Un es tos kopēju uz mūsu serveri.

ssh-copy-id [email protected]

MÅ«su aparatÅ«rā es izveidoju automātisku reverso ssh savienojumu katrā sāknÄ“Å”anas reizē.

[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

Pievērsiet uzmanÄ«bu portam 8083: tas nosaka, kuru portu es izmantoÅ”u, lai izveidotu savienojumu, izmantojot reverso ssh. Pievienojiet to startÄ“Å”anai un sāciet.

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

Jūs pat varat redzēt statusu:

sudo systemctl status autossh.service

Tagad mūsu VPS serverī, ja mēs palaižam:

ssh -p 8083 khadas@localhost

Pēc tam es nonāku pie savas testējamās aparatūras daļas. Un no aparatūras es varu arī nosūtīt žurnālus un jebkādus datus caur ssh uz savu serveri, kas ir ļoti ērti.

Viss kopā

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem
Ieslēdzot, sāksim izstrādi un atkļūdoÅ”anu

Fu, tas arÄ« viss, es aprakstÄ«ju visus mezglus. Tagad ir pienācis laiks to visu apvienot. JÅ«s varat redzēt kodu Å”eit.

SvarÄ«gs punkts ar kodu: Å”is projekts var nesākties Ŕādi, jo tas tika pielāgots konkrētam uzdevumam, konkrētai arhitektÅ«rai. Pat ja es dodu avota kodu, es joprojām paskaidroÅ”u visvērtÄ«gākās lietas Å”eit, tieÅ”i tekstā, pretējā gadÄ«jumā tas ir pilnÄ«gi nesaprotami.

Sākumā inicializēju gps, gpio un palaižu atseviŔķu plānotāja pavedienu.

#Š·Š°ŠæусŠŗ ŠæŠ¾Ń‚Š¾ŠŗŠ° ŠæŠ»Š°Š½ŠøрŠ¾Š²Ń‰ŠøŠŗŠ°
pShedulerThread = threading.Thread(target=ShedulerThread, args=(1,))
pShedulerThread.start()

Plānotājs ir diezgan vienkārÅ”s: tas skatās, vai ir pienācis laiks nosÅ«tÄ«t ziņojumus un kāds ir paÅ”reizējais kļūdas statuss. Ja ir kļūdas karogs, mēs mirgojam 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)

Sarežģītākā Ŕī projekta daļa ir reversā ssh savienojuma uzturÄ“Å”ana katram testam. Katrs tests ietver noklusējuma vārtejas un DNS servera pārkonfigurÄ“Å”anu. Tā kā neviens tāpat nelasa, ziniet, ka vilciens nebrauc pa koka sliedēm. Tas, kurÅ” atrod Lieldienu olu, saņem konfektes.

Lai to izdarÄ«tu, es izveidoju atseviŔķu marÅ”rutÄ“Å”anas tabulu -set-mark 0x2 un noteikumu trafika novirzÄ«Å”anai.

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

Varat uzzināt vairāk par to, kā tas darbojas lasiet Ŕajā rakstā.

Pēc tam es ieeju bezgalÄ«gā cilpā, kur katru reizi tiek parādÄ«ts pievienoto modemu saraksts (lai uzzinātu, vai tÄ«kla konfigurācija ir pēkŔņi mainÄ«jusies).

network_list = getNetworklist()

TÄ«kla saskarņu saraksta iegÅ«Å”ana ir pavisam vienkārÅ”a.

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

Pēc saraksta saņemÅ”anas uzliku IP adreses visām saskarnēm, kā rādÄ«ju attēlā nodaļā par 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")

Tad es vienkārÅ”i eju cauri katrai saskarnei ciklā. Un es konfigurēju katru interfeisu.

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

Pārbaudu interfeisa funkcionalitāti, ja nav tīkla, tad ģenerēju kļūdas. Ja ir tīkls, ir pienācis laiks rīkoties!

Å eit es konfigurēju ssh marÅ”rutÄ“Å”anu uz Å”o interfeisu (ja tas nav izdarÄ«ts), nosÅ«tu kļūdas uz serveri, ja ir pienācis laiks, nosÅ«ta žurnālus un beidzot palaist ātruma testu un saglabā žurnālus csv failā.

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()
#Šø Š“Š°Š»ŠµŠµ тŠµŃŃ‚ŠøруŠµŠ¼ сŠŗŠ¾Ń€Š¾ŃŃ‚ŃŒ Šø сŠ¾Ń…Ń€Š°Š½ŃŠµŠ¼ Š»Š¾Š³Šø. 

Ir vērts pieminēt reverse ssh iestatÄ«Å”anas funkciju.

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

Un, protams, viss Ŕis skaistums ir jāpievieno startam. Lai to izdarītu, es izveidoju failu:

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

Un es tajā rakstu:

[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

Ieslēdzu automātisko ielādi un sāku!

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

Tagad es varu redzēt notiekoÅ”o žurnālus, izmantojot komandu:

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

rezultātus

Nu, tagad svarÄ«gākais ir, kas notika rezultātā? Å eit ir daži grafiki, kurus man izdevās uzņemt izstrādes un atkļūdoÅ”anas procesa laikā. Grafiki tika izveidoti, izmantojot gnuplot ar Ŕādu skriptu.

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

Pirmā pieredze bija ar Tele2 operatoru, ko vadīju vairākas dienas.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Å eit es izmantoju dinamisko mērÄ«Å”anas serveri. Ātruma mērÄ«jumi darbojas, bet ļoti svārstās, taču joprojām ir redzama kāda vidējā vērtÄ«ba, un to var iegÅ«t, filtrējot datus, piemēram, ar mainÄ«go vidējo.

Vēlāk es izveidoju vairākus grafikus citiem telekomunikāciju operatoriem. Å ajā gadÄ«jumā jau bija viens testÄ“Å”anas serveris, un arÄ« rezultāti bija ļoti interesanti.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Kā redzat, tēma ir ļoti apjomÄ«ga Å”o datu izpētei un apstrādei un nepārprotami ilgst pāris nedēļas. Betā€¦

Darba rezultāts

Darbs tika pēkŔņi pabeigts no manis neatkarÄ«gu apstākļu dēļ. Viena no Ŕī projekta vājajām pusēm, manuprāt, bija modems, kas Ä«sti negribēja darboties vienlaicÄ«gi ar citiem modemiem un ikreiz ielādēja Ŕādus trikus. Å iem nolÅ«kiem ir milzÄ«gs skaits citu modemu modeļu, parasti tie jau ir Mini PCI-e formātā un ir instalēti ierÄ«cē un ir daudz vieglāk konfigurējami. Bet tas ir pavisam cits stāsts. Projekts bija interesants, un man bija liels prieks, ka varēju tajā piedalÄ«ties.

Vienlaicīga ātruma pārbaude vairākiem LTE modemiem

Avots: www.habr.com

Pievieno komentāru