Aldibereko abiadura proba hainbat LTE modemetan

Berrogeialdian, hainbat operadore zelularentzako LTE modemen abiadura neurtzeko gailu baten garapenean parte hartzea proposatu zidaten.

Aldibereko abiadura proba hainbat LTE modemetan

Bezeroak hainbat telekomunikazio-operadoreren abiadura ebaluatu nahi zuen kokapen geografiko desberdinetan, LTE konexioa erabiliz ekipoak instalatzean, adibidez, bideo-emisioetarako, zein operadore zelular zen egokiena ulertu ahal izateko. Aldi berean, arazoa ahalik eta errazen eta merkeen konpondu behar zen, ekipamendu garestirik gabe.

Berehala esango dut zeregina ez dela errazena eta ezagutza intentsiboena; esango dizut zer arazo aurkitu ditudan eta nola konpondu ditudan. Beraz, goazen.

Kontuan izan

LTE konexio baten abiadura neurtzea oso kontu konplexua da: ekipamendu eta neurketa teknika egokiak aukeratu behar dituzu, eta sare zelularren topologia eta funtzionamendua ere ondo ezagutu behar dituzu. Gainera, abiaduran hainbat faktorek eragin dezakete: zelula bateko harpidedun kopuruak, eguraldi-baldintzak, nahiz eta zelula batetik bestera abiadura izugarri alda daiteke sarearen topologiaren ondorioz. Oro har, ezezagun asko dituen arazoa da, eta telekomunikazio-operadore batek bakarrik konpondu dezake behar bezala.

Hasieran, bezeroak operadoreen telefonoekin mezularitza gidatu nahi zuen, telefonoan zuzenean neurketak egin eta gero abiadura neurketaren emaitzak koaderno batean idatzi nahi zituen. Lte sareen abiadura neurtzeko nire soluzioak, ideala ez bada ere, arazoa konpontzen du.

Denbora faltagatik, ez erosotasunaren edo praktikotasunaren aldeko erabakiak hartu nituen, garapenaren abiaduraren aldekoak baizik. Adibidez, alderantzizko ssh erabili zen urruneko sarbiderako, VPN praktikoagoaren ordez, zerbitzaria eta bezero bakoitza konfiguratzeko denbora aurrezteko.

Zeregin teknikoa

artikuluan esaten den bezala Zehaztapen teknikorik gabe: zergatik bezeroak ez du nahi: Ez egin lan zehaztapen teknikorik gabe! Inoiz, inon!

Zeregin teknikoa nahiko erraza zen, pixka bat zabalduko dut azken erabiltzaileak ulertzeko. Irtenbide teknikoen eta ekipamenduen aukeraketa bezeroak agindu zuen. Beraz, zehaztapen teknikoa bera, onespen guztien ondoren:

Plaka-ordenagailu bakarrean oinarrituta vim2 egin abiadura probatzaile bat H modem bidez lte konexioetarakouawei e3372h - 153 hainbat telekomunikazio-operadore (batetik n-ra). UART bidez konektatuta dagoen GPS hargailu batetik koordenatuak jasotzea ere beharrezkoa da. Egin abiadura neurketak zerbitzua erabiliz www.speedtest.net eta jarri itzazu mahai batean:

Aldibereko abiadura proba hainbat LTE modemetan

Taula csv formatuan. Ondoren, bidali seinale hau posta elektronikoz 6 orduz behin. Akatsak izanez gero, kliskatu GPIOra konektatuta dagoen LEDa.

Zehaztapen teknikoak forma librean deskribatu nituen, onarpen askoren ostean. Baina zereginaren esanahia ikusgai dago jada. Astebete eman zen denerako. Baina, egia esan, hiru aste iraun zuen. Hau nire lan nagusiaren ondoren eta asteburuetan bakarrik egiten nuela kontuan hartuta.

Hemen berriro ere arreta jarri nahi dut bezeroak aldez aurretik adostu zuela abiadura neurtzeko zerbitzuaren eta hardwarearen erabilera, eta horrek asko mugatu zituen nire gaitasunak. Aurrekontua ere mugatua zen, beraz, ez zen ezer berezirik erosi. Beraz, arau hauekin jokatu behar genuen.

Arkitektura eta garapena

Eskema sinplea eta bistakoa da. Horregatik, iruzkin berezirik gabe utziko dut.

Aldibereko abiadura proba hainbat LTE modemetan

Proiektu osoa python-en ezartzea erabaki nuen, hizkuntza honetan garatzeko esperientziarik ez nuen arren. Aukeratu nuen garapena bizkortu zezaketen adibide eta irtenbide mordoa zeudelako. Hori dela eta, programatzaile profesional guztiei eskatzen diet python-en garatzeko nire lehen esperientzia ez errieta egiteko, eta beti pozten naiz nire gaitasunak hobetzeko kritika eraikitzaileak entzuten ditudalako.

Prozesuan ere deskubritu nuen python-ek bi bertsio exekutatzen dituela 2 eta 3, ondorioz hirugarrenean finkatu nintzen.

Hardware nodoak

Plaka bakarreko vim2

Mahai bakarreko ordenagailu bat eman zidaten nire makina nagusi gisa vim2

Aldibereko abiadura proba hainbat LTE modemetan

Multimedia-prozesadore bikaina eta indartsua etxe adimendunerako eta SMART-TVrako, baina oso desegokia zeregin honetarako, edo, demagun, ez egokia. Esate baterako, bere sistema eragile nagusia Android da, eta Linux bigarren mailako sistema eragilea da, eta, ondorioz, inork ez du bermatzen Linuxen pean nodo eta kontrolatzaile guztien kalitate handiko funtzionamendua. Eta suposatzen dut arazoetako batzuk plataforma honetako USB kontrolatzaileekin zerikusia zutela, beraz, modemek ez zuten espero bezala funtzionatu plaka honetan. Gainera, dokumentazio oso eskasa eta sakabanatua du, beraz, eragiketa bakoitzak denbora asko behar izan zuen kaiak zulatzen. GPIOrekin egindako lan arruntak ere odol asko hartu zuen. Adibidez, hainbat ordu behar izan ditut LEDa konfiguratzeko. Baina, objektiboa izateko, funtsean ez zen garrantzitsua zer-nolako plaka bakarra zen, gauza nagusia funtzionatzen zuela eta USB atakak zeudela zen.

Lehenik eta behin, Linux instalatu behar dut plaka honetan. Guztiontzako dokumentazioaren basatiak ez arakatzeko, eta baita taula bakarreko sistema hau landuko dutenentzat ere, kapitulu hau idazten ari naiz.

Linux instalatzeko bi aukera daude: kanpoko SD txartelean edo barneko MMC batean. Arratsalde bat eman nuen txartelarekin nola funtzionatzen zuen asmatzen saiatzen, horregatik MMCan instalatzea erabaki nuen, nahiz eta dudarik gabe kanpoko txartel batekin lan egitea askoz errazagoa izango zen.

Firmwareari buruz makurki kontatua hemen. Arrarotik errusierara itzultzen dut. Plaka flash egiteko, hardware UART konektatu behar dut. Konektatu egin zuen honela jarraitzen du.

  • Tresna Pin GND: <—> VIMs-en GPIOren Pin17
  • Tresnaren Pin TXD: <—> VIMs-en GPIOren Pin18 (Linux_Rx)
  • Tresnaren Pin RXD: <—> VIMs-en GPIOren Pin19 (Linux_Tx)
  • Tresna Pin VCC: <—> VIMs-en GPIOren Pin20

Aldibereko abiadura proba hainbat LTE modemetan

Horren ostean, firmwarea deskargatu nuen beraz,. Firmware bertsio zehatza VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Firmware hau kargatzeko, utilitateak behar ditut. Honi buruzko xehetasun gehiago Hemen. Ez naiz saiatu Windows-en keinuka egiten, baina Linux-en firmwareari buruz hitz batzuk esan behar dizkizut. Lehenik eta behin, utilitateak instalatuko ditut argibideen arabera.

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

Aaand... Ezerk ez du funtzionatzen. Ordu pare bat eman nituen instalazio-scriptak editatzen, dena behar bezala instalatu zitzaidala. Ez dut gogoratzen zer egin nuen han, baina zaldiekin zirko hura ere bazegoen. Beraz, kontuz ibili. Baina erabilgarritasun horiek gabe ez dago vim2 gehiago torturatzeko balio. Hobe da harekin batere ez nahastea!

Infernuko zazpi zirkulu, script-en konfigurazioa eta instalazioa egin ondoren, lan-erabilgarritasun pakete bat jaso nuen. Plaka USB bidez konektatu nuen nire Linux ordenagailura, eta UART ere konektatu nuen goiko diagramaren arabera.
Nire minicom terminal gogokoena 115200 abiadurarako konfiguratzen ari naiz, hardware eta software akatsen kontrolarik gabe. Eta has gaitezen.

Aldibereko abiadura proba hainbat LTE modemetan

VIM2 UART terminalean kargatzean, tekla bat sakatzen dut, zuriune-barra adibidez, kargatzeari uzteko. Lerroa agertu ondoren

kvim2# 

Komandoa sartzen dut:

kvim2# run update

Kargatzen ari garen ostalarian, exekutatzen dut:

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

Hori da, uf. Egiaztatu nuen, Linux dago taulan. Saio-hasiera/pasahitza khadas:khadas.

Horren ondoren, hasierako ezarpen txiki batzuk. Lan gehiago egiteko, sudorako pasahitza desgaitzen dut (bai, ez segurua, baina erosoa).

sudo visudo

Lerroa inprimakian editatzen dut eta gordetzen dut

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

Orduan uneko lokala aldatzen dut ordua Moskun izan dadin, bestela Greenwichen izango da.

sudo timedatectl set-timezone Europe/Moscow

edo

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

Zaila iruditzen bazaizu, ez erabili plaka hau; Raspberry Pi hobea da. Egia esanda.

Modema Huawei e3372h – 153

Modem hori odol-iturri esanguratsua izan zen niretzat, eta, hain zuzen ere, proiektu osoaren botila-lepo bihurtu zen. Oro har, gailu hauentzako "modem" izenak ez du batere islatzen lanaren funtsa: konbinazio indartsua da hau, hardware-pieza honek CD-ROM baten itxura duen gailu konposatua du kontrolatzaileak instalatzeko, eta gero sare-txartelaren modura aldatzen da.

Arkitektura aldetik, Linux erabiltzaile baten ikuspuntutik, ezarpen guztiak egin ondoren, honelakoa da: modema konektatu ondoren, eth* sare interfaze bat daukat, dhcp bidez 192.168.8.100 IP helbidea jasotzen duena, eta atebide lehenetsia. 192.168.8.1 da.

Eta momenturik garrantzitsuena! Modem-eredu honek ezin du modem moduan funtzionatu, AT komandoek kontrolatzen duten moduan. Dena askoz errazagoa izango litzateke, PPP konexioak sortu modem bakoitzarentzat eta gero haiekin funtzionatu. Baina nire kasuan, "berak" (zehazkiago, Linux urpekari bat udev arauen arabera), eth interfaze bat sortzen du eta IP helbide bat esleitzen dio dhcp bidez.

Nahasmen gehiago ekiditeko, "modem" hitza ahaztea eta sare-txartela eta atebidea esatea proposatzen dut, funtsean, sare-txartel berri bat atebide batekin konektatzea bezalakoa baita.
Modem bat dagoenean, horrek ez du arazo berezirik sortzen, baina bat baino gehiago daudenean, hots, n piezak, sareko irudi hau sortzen da.

Aldibereko abiadura proba hainbat LTE modemetan

Hau da, n sare-txartelak, IP helbide berdina dutenak, bakoitza atebide lehenetsi berdinarekin. Baina, hain zuzen ere, horietako bakoitza bere operadorearekin konektatuta dago.

Hasieran, irtenbide sinple bat nuen: ifconfig edo ip komandoa erabiliz, interfaze guztiak itzali eta, besterik gabe, txandaka bat piztu eta probatu. Irtenbidea guztiontzat ona zen, aldaketa-uneetan ezin izan nintzela gailura konektatu izan ezik. Eta aldaketa maiz eta azkarra denez, ez nuen konektatzeko aukerarik izan.

Hori dela eta, modemen IP helbideak eskuz aldatzeko eta gero trafikoa bideratze ezarpenak erabiliz gidatzeko bidea aukeratu nuen.

Aldibereko abiadura proba hainbat LTE modemetan

Honela ez zen amaitu modemekin ditudan arazoak: elektrizitate-arazoak izanez gero, erortzen ziren, eta USB hubrako elikadura egonkor on bat behar zen. Arazo hau konpontzen nuen potentzia zuzenean zentrora gogor soldatuz. Aurkitu nuen beste arazo bat eta proiektu osoa hondatu zuena: gailua berrabiarazi edo hotz hasi ondoren, ez ziren modem guztiak detektatu eta ez beti, eta ezin izan nuen zehaztu zergatik gertatu zen eta zer algoritmoren bidez. Baina lehenik eta behin.

Modemak behar bezala funtziona dezan, usb-modeswitch paketea instalatu dut.

sudo apt update
sudo apt install -y usb-modeswitch

Horren ondoren, konektatu ondoren, modema behar bezala detektatu eta konfiguratuko du udev azpisistemak. Modema konektatu eta sarea agertzen dela egiaztatzen dut.
Ebatzi ezin izan dudan beste arazo bat: nola lor dezaket modem honetatik lan egiten ari garen operadorearen izena? Operadorearen izena 192.168.8.1 modemaren web interfazean dago. Datuak Ajax-en eskaeren bidez jasotzen dituen web orri dinamikoa da, beraz, orria bistaratzea eta izena analizatzea ez da funtzionatuko. Beraz, web orri bat eta abar nola garatu aztertzen hasi nintzen eta nolabaiteko zentzugabekeria egiten ari nintzela konturatu nintzen. Ondorioz, tu egin zuen, eta operadorea Speedtest APIa bera erabiliz jasotzen hasi zen.

Askoz errazagoa izango litzateke modemak AT komandoen bidez sarbidea izango balu. Posible izango litzateke birkonfiguratzea, ppp konexioa sortzea, IP bat esleitzea, telekomunikazio-operadore bat lortzea, etab. Baina ai, emandakoarekin ari naiz lanean.

GPS

Eman zidaten GPS hargailuak UART interfazea eta boterea zituen. Ez zen irtenbiderik onena, baina hala ere egingarria eta erraza zen. Hartzaileak horrelako zerbait zuen.

Aldibereko abiadura proba hainbat LTE modemetan

Egia esateko, GPS hargailu batekin lan egiten nuen lehen aldia izan zen, baina espero nuen bezala, dena aspaldi pentsatu genuen. Beraz, prest dauden irtenbideak erabiltzen ditugu.

Lehenik eta behin, uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) gaitzen dut GPSa konektatzeko.

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

Ondoren, operazioaren arrakasta egiaztatzen dut.

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

Komando honek itxuraz devtree editatzen du hegan, eta hori oso erosoa da.

Eragiketa hau arrakastatsua izan ondoren, berrabiarazi eta instalatu GPS deabrua.

khadas@Khadas:~$ sudo reboot

GPS deabrua instalatzen. Dena instalatzen dut eta berehala mozten dut konfigurazio gehiagorako.

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

Ezarpen fitxategia editatzen.

sudo vim /etc/default/gpsd

UART bat instalatzen ari naiz eta bertan GPSa eskegiko da.

DEVICES="/dev/ttyS4"

Eta gero dena piztu eta hasten gara.

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

Horren ostean, GPSa konektatzen dut.

Aldibereko abiadura proba hainbat LTE modemetan

GPS kablea nire esku dago, UART araztearen hariak nire hatz azpian ikusten dira.

Berrabiarazi eta GPS funtzionamendua egiaztatzen dut gpsmon programa erabiliz.

Aldibereko abiadura proba hainbat LTE modemetan

Pantaila-argazki honetan ezin dituzu sateliteak ikusi, baina GPS hargailuarekin komunikazioa ikus dezakezu, eta horrek esan nahi du dena ondo dagoela.

Python-en, deabru honekin lan egiteko aukera asko probatu nituen, baina python 3-rekin behar bezala funtzionatzen zuenarekin finkatu nintzen.

Beharrezko liburutegia instalatzen dut.

sudo -H pip3 install gps3 

Eta lan kodea zizelkatzen dut.

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

Koordenatuak lortu behar baditut, honako dei honekin egiten da:

longitude, latitude = getPositionData(agps_thread)

Eta 1-10 segundo barru koordenatua lortuko dut edo ez. Bai, hamar saiakera izan nituen koordenatuak lortzeko. Ez da optimoa, okerra eta okerra, baina funtzionatzen du. Hau egitea erabaki nuen, GPSak harrera txarra izan dezakeelako eta ez beti datuak jasotzea. Datuak jasotzeko itxaronez gero, urruneko gela batean lan egiten baduzu, programa leku honetan izoztuko da. Hori dela eta, dotoretasunik gabeko aukera hau ezarri nuen.

Printzipioz, denbora gehiago egongo balitz, GPSko datuak zuzenean UART bidez jaso, aparteko hari batean analizatu eta harekin lan egin ahal izango litzateke. Baina ez zegoen batere denborarik, hortik kode basati itsusi hura. Eta bai, ez naiz lotsatzen.

argi-igorle diodo

LEDa konektatzea erraza eta zaila zen aldi berean. Zailtasun nagusia da sistemako pin zenbakia ez datorrela bat arbeleko pin zenbakiarekin eta dokumentazioa ezkerreko eskuarekin idazten delako. Hardware-pin-zenbakia eta OS-ko pin-zenbakia alderatzeko, komandoa exekutatu behar duzu:

gpio readall

Sisteman eta arbelean pin korrespondentziaren taula bat bistaratuko da. Horren ondoren, PINa OSan bertan funtziona dezaket. Nire kasuan LED-a konektatuta dago GPIOH_5.

Aldibereko abiadura proba hainbat LTE modemetan

GPIO pina irteera modura aldatzen dut.

gpio -g mode 421 out

Zero idazten dut.

gpio -g write 421 0

bat idazten dut.

gpio -g write 421 1

Aldibereko abiadura proba hainbat LTE modemetan
Dena piztuta dago, "1" idatzi ondoren

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

Orain, akatsak izanez gero, error_blink() deitzen diot eta LEDak ederki keinu egingo du.

Software nodoak

Speedtest APIa

Poz handia da speedtest.net zerbitzuak bere python-APIa izatea, begiratu dezakezu Github.

Gauza ona da iturburu-kodeak ere ikus daitezkeela. API honekin nola lan egin (adibide sinpleak) aurki daiteke dagokion atala.

Python liburutegia hurrengo komandoarekin instalatzen dut.

sudo -H pip3 install speedtest-cli

Adibidez, Ubuntun abiadura probatzaile bat instala dezakezu zuzenean softwaretik. Hau python aplikazio bera da, eta gero zuzenean abiarazi daiteke kontsolatik.

sudo apt install speedtest-cli -y

Eta neurtu zure Interneteko abiadura.

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

Ondorioz, nik egin nuen bezala. Abiadura-proba honen iturburu-kodeetan sartu behar izan nuen nire proiektuan guztiz inplementatzeko. Eginkizun garrantzitsuenetako bat telekomunikazio-operadorearen izena lortzea da, plakan ordezkatzeko.

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

Hemen ere dena ez zen hain sinplea izan, askoz sinpleagoa dirudien arren. Hasieran, zerbitzarien parametroa berdina zen [], esaten dute, aukeratu zerbitzari onena. Ondorioz, ausazko zerbitzariak nituen, eta, asma dezakezun bezala, abiadura aldakorra. Nahiko gai konplexua da, zerbitzari finko bat erabiltzeak, hala bada, estatikoa edo dinamikoa, ikerketa eskatzen du. Baina hona hemen Beeline operadore batentzako abiadura neurtzeko grafikoen adibide bat probako zerbitzari bat eta estatikoki finko bat hautatzen duenean.

Aldibereko abiadura proba hainbat LTE modemetan
Zerbitzari dinamikoa aukeratzerakoan abiadura neurtzearen emaitza.

Aldibereko abiadura proba hainbat LTE modemetan
Abiadura proben emaitza, zerbitzari bat zorrozki hautatuta.

Probetan zehar, bi lekuetan "fura" dago, eta metodo matematikoen bidez kendu behar da. Baina zerbitzari finko batekin zertxobait txikiagoa da eta anplitudea egonkorragoa da.
Oro har, ikerketa handiko lekua da. Eta nire zerbitzariaren abiadura neurtuko nuke iperf utilitatea erabiliz. Baina zehaztapen teknikoei eusten diegu.

Posta eta akatsak bidaltzea

Posta bidaltzeko, hainbat dozena aukera ezberdin probatu nituen, baina azkenean honako hau erabaki nuen. Yandex-en postontzi bat erregistratu eta gero hartu nuen Hau posta bidaltzeko adibide bat da. Egiaztatu eta programan inplementatu nuen. Adibide honetan hainbat aukera aztertzen dira, besteak beste, gmailetik bidaltzea, etab. Ez nuen nire posta zerbitzaria konfiguratzearekin traba egin nahi eta ez nuen horretarako astirik izan, baina gerora atera zenez, alferrik izan zen ere.

Erregistroak programatzailearen arabera bidali ziren, konexiorik badago, 6 orduz behin: 00:06etan, 12:18etan, XNUMX:XNUMXetan eta XNUMX:XNUMXetan. Honela bidali du.

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

Akatsak ere bidali ziren hasieran. Hasteko, zerrendan pilatzen ziren, eta gero ere bidaltzen ziren programatzailea erabiliz, konexiorik bazegoen. Hala ere, orduan arazoak sortu ziren Yandex-ek egunean bidaltzen dituen mezu kopuruan muga bat duelako (mina, tristura eta umiliazioa da). Minutuan ere errore kopuru handia egon zitekeenez, postaz akatsak bidaltzeari utzi behar izan genion. Beraz, kontuan izan Yandex zerbitzuen bidez arazo bati buruzko informazioa automatikoki bidaltzean.

Iritzi-zerbitzaria

Urruneko hardwarerako sarbidea izateko eta pertsonalizatu eta birkonfiguratu ahal izateko, kanpoko zerbitzari bat behar nuen. Oro har, bidezkoa izateko, zuzena izango litzateke datu guztiak zerbitzarira bidaltzea eta grafiko eder guztiak web interfazean eraikitzea. Baina ez denak batera.

VPSrako aukeratu nuen ruvds.com. Zerbitzaririk errazena har dezakezu. Eta, oro har, nire helburuetarako nahikoa izango litzateke. Baina zerbitzaria nire poltsikotik ordaindu ez nuenez, erreserba txiki batekin hartzea erabaki nuen, nahikoa izango zen web interfazea, gure SMTP zerbitzaria, VPN eta abar zabalduko bagenu. Gainera, Telegram bot bat konfiguratu ahal izango duzu eta blokeatzeko arazorik ez izan. Horregatik, Amsterdam eta ondorengo parametroak aukeratu ditut.

Aldibereko abiadura proba hainbat LTE modemetan

Hardwarearekin komunikatzeko metodo gisa, vim2-k alderantzizko ssh konexioa aukeratu zuen eta, praktikak erakutsi duen bezala, ez da onena. Konexioa galtzen bada, zerbitzariak portuari eusten dio eta ezinezkoa da denbora batez konektatzea. Hori dela eta, oraindik hobe da beste komunikazio-metodo batzuk erabiltzea, adibidez VPN. Etorkizunean VPNra aldatu nahi nuen, baina ez nuen denborarik izan.

Ez naiz sartuko suebaki bat konfiguratzeko, eskubideak murrizteko, root ssh konexioak desgaitzeko eta VPS bat konfiguratzeko beste truisms batzuk. Sinetsi nahiko nuke jadanik dena dakizula. Urruneko konexio baterako, erabiltzaile berri bat sortzen dut zerbitzarian.

adduser vimssh

Ssh konexio gakoak sortzen ditut gure hardwarean.

ssh-keygen

Eta kopiatzen ditut gure zerbitzarian.

ssh-copy-id [email protected]

Gure hardwarean, alderantzizko ssh konexio automatikoa sortzen dut abio bakoitzean.

[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

Erreparatu 8083 atakari: alderantzizko ssh bidez konektatzeko zein ataka erabiliko dudan zehazten du. Gehitu abiarazteko eta hasi.

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

Egoera ere ikus dezakezu:

sudo systemctl status autossh.service

Orain, gure VPS zerbitzarian, exekutatzen badugu:

ssh -p 8083 khadas@localhost

Ondoren, nire probako hardwarera iristen naiz. Eta hardwaretik erregistroak eta edozein datu ere bidali ditzaket ssh bidez nire zerbitzarira, eta hori oso erosoa da.

Elkarrekin jartzea

Aldibereko abiadura proba hainbat LTE modemetan
Piztuta, has gaitezen garapena eta arazketa

Uf, tira, hori da, nodo guztiak deskribatu ditut. Orain dena batzeko garaia da. Kodea ikus dezakezu hemen.

Kodearen puntu garrantzitsu bat: baliteke proiektu hau ez horrela hasiko, zeregin zehatz baterako, arkitektura zehatz baterako, egokituta zegoelako. Iturburu kodea ematen ari naizen arren, baliotsuenak hemen azalduko ditut, testuan bertan, bestela guztiz ulertezina da.

Hasieran, gps, gpio hasieratzen dut eta programatzaileen hari bereizi bat abiarazten dut.

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

Antolatzailea nahiko sinplea da: mezuak bidaltzeko ordua iritsi den eta uneko akats-egoera zein den ikusten du. Errore-marka bat badago, LED-a keinu egingo dugu.

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

Proiektu honen zatirik zailena proba bakoitzerako alderantzizko ssh konexioa mantentzea da. Proba bakoitzak atebide lehenetsia eta DNS zerbitzaria berriro konfiguratzea dakar. Inork irakurtzen ez duenez, jakin ezazu trena ez dela egurrezko errailetan ibiltzen. Pazko arrautza aurkitzen duenak gozoki batzuk jasoko ditu.

Horretarako, bideratze-taula bereizi bat sortzen dut -set-mark 0x2 eta trafikoa birbideratzeko arau bat.

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

Funtzionamenduari buruz gehiago jakin dezakezu irakurri artikulu honetan.

Horren ondoren, amaigabeko begizta batean sartzen naiz, non aldi bakoitzean konektatutako modem zerrenda bat jasotzen dugun (sarearen konfigurazioa bat-batean aldatu den jakiteko).

network_list = getNetworklist()

Sareko interfazeen zerrenda lortzea nahiko erraza da.

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

Zerrenda jaso ondoren, IP helbideak ezarri ditut interfaze guztietan, modem-ari buruzko kapituluko irudian erakusten dudan bezala.

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

Ondoren, interfaze bakoitza begizta batean igarotzen dut. Eta interfaze bakoitza konfiguratzen dut.

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

Interfazearen funtzionaltasuna egiaztatzen dut, sarerik ez badago, akatsak sortzen ditut. Sare bat badago, orduan jarduteko garaia da!

Hemen ssh bideratzea interfaze honetara konfiguratzen dut (egin ez bada), akatsak zerbitzariari bidaltzen dizkiot ordua iritsi bada, erregistroak bidali eta azkenik speedtest bat exekutatu eta erregistroak csv fitxategi batean gorde.

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

Aipatzekoa da alderantzizko ssh konfiguratzeko funtzioa.

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

Eta, noski, edertasun hori guztia abiarazteko gehitu behar duzu. Horretarako fitxategi bat sortzen dut:

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

Eta bertan idazten dut:

[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

Karga automatikoa aktibatu eta hasten naiz!

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

Orain komandoa erabiliz gertatzen ari denaren erregistroak ikus ditzaket:

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

Findings

Beno, orain garrantzitsuena da, zer gertatu zen ondorioz? Hona hemen garapen eta arazketa prozesuan atzematea lortu dudan grafiko batzuk. Grafikoak gnuplot erabiliz eraiki dira honako script honekin.

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

Lehen esperientzia Tele2 operadorearekin izan zen, hainbat egunetan egin nuena.

Aldibereko abiadura proba hainbat LTE modemetan

Hemen neurketa zerbitzari dinamiko bat erabili dut. Abiadura-neurketak funtzionatzen du, baina asko aldatzen dira, baina batez besteko balio batzuk oraindik ikusten dira, eta hori datuak iragaziz lor daiteke, adibidez, batez besteko mugikor batekin.

Geroago, beste telekomunikazio-operadore batzuentzat grafiko batzuk eraiki nituen. Kasu honetan, dagoeneko bazegoen proba-zerbitzari bat, eta emaitzak ere oso interesgarriak izan ziren.

Aldibereko abiadura proba hainbat LTE modemetan

Aldibereko abiadura proba hainbat LTE modemetan

Aldibereko abiadura proba hainbat LTE modemetan

Aldibereko abiadura proba hainbat LTE modemetan

Ikus dezakezunez, gaia oso zabala da datu horiek ikertzeko eta prozesatzeko, eta argi dago ez duela pare bat aste lanetan irauten. Baina…

Lanaren emaitza

Lanak bat-batean amaitu ziren, nire esku ez zeuden egoerak zirela eta. Proiektu honen ahulguneetako bat, nire ustez subjektiboaren ustez, modema zen, ez baitzuen benetan beste modemekin aldi berean lan egin nahi, eta horrelako trikimailuak egiten zituen kargatzen zen bakoitzean. Helburu horietarako, beste modem modelo ugari daude; normalean, dagoeneko Mini PCI-e formatuan daude eta gailuaren barruan instalatuta daude eta askoz errazagoak dira konfiguratzeko. Baina hori guztiz bestelako istorio bat da. Proiektua interesgarria izan zen eta oso poztu nintzen bertan parte hartu ahal izan nuelako.

Aldibereko abiadura proba hainbat LTE modemetan

Iturria: www.habr.com

Gehitu iruzkin berria