Berrogeialdian, hainbat operadore zelularentzako LTE modemen abiadura neurtzeko gailu baten garapenean parte hartzea proposatu zidaten.
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 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:
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
GPS kablea nire esku dago, UART araztearen hariak nire hatz azpian ikusten dira.
Berrabiarazi eta GPS funtzionamendua egiaztatzen dut gpsmon programa erabiliz.
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.
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.
Zerbitzari dinamikoa aukeratzerakoan abiadura neurtzearen emaitza.
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.
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.
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
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.
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")
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.
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
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.
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.
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.