Samtímis hraðapróf á nokkrum LTE mótaldum

Í sóttkví bauðst mér að taka þátt í þróun tækis til að mæla hraða LTE mótalda fyrir nokkra farsímafyrirtæki.

Samtímis hraðapróf á nokkrum LTE mótaldum

Viðskiptavinurinn vildi meta hraða ýmissa fjarskiptafyrirtækja á mismunandi landfræðilegum stöðum til að geta gert sér grein fyrir hvaða farsímafyrirtæki hentaði honum best við uppsetningu á búnaði sem notar LTE-tengingu, til dæmis fyrir myndbandsútsendingar. Jafnframt þurfti að leysa vandann á eins einfaldan og ódýran hátt og hægt var, án dýrs búnaðar.

Ég segi strax að verkefnið er ekki það einfaldasta og þekkingarfreka; ég skal segja þér hvaða vandamál ég lenti í og ​​hvernig ég leysti þau. Svo, við skulum fara.

Athugið

Mæling á hraða LTE-tengingar er mjög flókið mál: þú þarft að velja réttan búnað og mælitækni og hafa einnig góðan skilning á staðfræði og rekstri farsímakerfisins. Auk þess er hægt að hafa áhrif á hraðann af nokkrum þáttum: fjölda áskrifenda á klefi, veðurskilyrði, jafnvel frá klefi til klefa getur hraðinn verið mjög breytilegur vegna svæðiskerfisins. Almennt séð er þetta vandamál með gríðarlegan fjölda óþekkta og aðeins fjarskiptafyrirtæki getur leyst það rétt.

Upphaflega vildi viðskiptavinurinn bara keyra sendiboðann með síma símafyrirtækisins, taka mælingar beint í símann og skrifa svo niður hraðamælingar í fartölvu. Lausnin mín til að mæla hraða lte netkerfa, þó ekki tilvalin, leysir vandamálið.

Vegna tímaskorts tók ég ákvarðanir ekki í þágu þæginda eða hagkvæmni, heldur í þágu þróunarhraða. Til dæmis var öfug ssh notað fyrir fjaraðgang, í stað hagnýtari VPN, til að spara tíma við uppsetningu netþjónsins og hvers viðskiptavinar.

Tæknilegt verkefni

Eins og fram kemur í greininni Án tækniforskrifta: hvers vegna viðskiptavinurinn vill það ekki: Ekki vinna án tækniforskrifta! Aldrei, neins staðar!

Tæknilega verkefnið var frekar einfalt, ég mun útvíkka það aðeins til að skilja notandann. Val á tæknilausnum og búnaði var ákveðið af viðskiptavininum. Svo, tækniforskriftin sjálf, eftir öll samþykki:

Byggt á einni borðtölvu vim2 búa til hraðaprófara fyrir lte tengingar í gegnum H mótalduawei e3372h - 153 nokkur fjarskiptafyrirtæki (frá einum til n). Einnig er nauðsynlegt að taka á móti hnitum frá GPS-móttakara sem er tengdur í gegnum UART. Gerðu hraðamælingar með þjónustunni www.speedtest.net og settu þá í töflu eins og þessa:

Samtímis hraðapróf á nokkrum LTE mótaldum

Tafla á csv sniði. Sendu síðan þetta skilti í tölvupósti á 6 tíma fresti. Ef villur koma upp, blikkar ljósdíóðan sem er tengd við GPIO.

Ég lýsti tækniforskriftunum í frjálsu formi, eftir mörg samþykki. En merking verkefnisins er þegar sýnileg. Vika var gefin fyrir allt. En í rauninni stóð það í þrjár vikur. Þetta er tekið með í reikninginn að ég gerði þetta bara eftir aðalvinnuna mína og um helgar.

Hér vil ég enn og aftur vekja athygli á því að viðskiptavinur samþykkti fyrirfram notkun hraðamælingaþjónustu og vélbúnaðar sem takmarkaði getu mína mjög. Fjárhagurinn var líka takmarkaður og því var ekkert sérstakt keypt. Þannig að við urðum að spila eftir þessum reglum.

Arkitektúr og þróun

Kerfið er einfalt og augljóst. Þess vegna mun ég skilja það eftir án sérstakra athugasemda.

Samtímis hraðapróf á nokkrum LTE mótaldum

Ég ákvað að útfæra allt verkefnið í python þrátt fyrir að ég hefði enga reynslu af því að þróa á þessu tungumáli. Ég valdi það vegna þess að það var fullt af tilbúnum dæmum og lausnum sem gætu flýtt fyrir þróun. Þess vegna bið ég alla faglega forritara að skamma ekki fyrstu reynslu mína af þróun í python og ég er alltaf ánægður með að heyra uppbyggilega gagnrýni til að bæta færni mína.

Einnig í því ferli uppgötvaði ég að Python er með tvær keyrandi útgáfur 2 og 3, þar af leiðandi settist ég á þá þriðju.

Vélbúnaðarhnútar

Einplötu vim2

Ég fékk eins borðs tölvu sem aðalvél vim2

Samtímis hraðapróf á nokkrum LTE mótaldum

Frábær, öflugur miðlunarörgjörvi fyrir snjallheimili og SMART-TV, en afar óhentugur í þetta verkefni, eða, við skulum segja, hentar illa. Til dæmis er aðalstýrikerfi þess Android og Linux er aukastýrikerfi og því ábyrgist enginn hágæða rekstur allra hnúta og rekla undir Linux. Og ég geri ráð fyrir að sum vandamálin hafi verið tengd USB rekla þessa vettvangs, þannig að mótaldin virkuðu ekki eins og búist var við á þessu borði. Það hefur líka mjög léleg og dreifð skjöl, þannig að hver aðgerð tók mikinn tíma að grafa í gegnum bryggjurnar. Jafnvel venjuleg vinna með GPIO tók mikið blóð. Til dæmis tók það mig nokkrar klukkustundir að setja upp LED. En til að vera hlutlægur þá var í grundvallaratriðum ekki mikilvægt hvers konar eins borð þetta var, aðalatriðið var að það virkaði og það voru USB tengi.

Fyrst þarf ég að setja upp Linux á þessu borði. Til þess að fara ekki í gegnum villiskjöl skjala fyrir alla, og líka fyrir þá sem munu fást við þetta eins borðs kerfi, er ég að skrifa þennan kafla.

Það eru tveir möguleikar til að setja upp Linux: á ytra SD kort eða á innri MMC. Ég eyddi kvöldi í að reyna að finna út hvernig ég ætti að láta það virka með kortinu og ákvað því að setja það upp á MMC, þó eflaust væri miklu auðveldara að vinna með ytra kort.

Um vélbúnaðinn hrikalega sagt hér. Ég þýði úr undarlegu yfir á rússnesku. Til þess að blikka borðið þarf ég að tengja vélbúnaðinn UART. Tengdi það eins og hér segir.

  • Tool Pin GND: <—> Pin17 af GPIO VIMs
  • Tool Pin TXD: <—> Pin18 á GPIO VIMs (Linux_Rx)
  • Tool Pin RXD: <—> Pin19 af GPIO VIMs (Linux_Tx)
  • Tool Pin VCC: <—> Pin20 af GPIO VIMs

Samtímis hraðapróf á nokkrum LTE mótaldum

Eftir það sótti ég fastbúnaðinn þess vegna. Sérstök vélbúnaðarútgáfa VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Til þess að hlaða upp þessum vélbúnaði þarf ég tól. Nánari upplýsingar um þetta hér. Ég hef ekki reynt að flakka það undir Windows, en ég þarf að segja þér nokkur orð um fastbúnað undir Linux. Í fyrsta lagi mun ég setja upp tólin samkvæmt leiðbeiningunum.

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

Aaand... Ekkert virkar. Ég eyddi nokkrum klukkustundum í að breyta uppsetningarforskriftunum svo að allt myndi setja upp rétt fyrir mig. Ég man ekki hvað ég gerði þarna, en það var líka þessi sirkus með hestum. Svo vertu varkár. En án þessara tóla þýðir ekkert að pína vim2 frekar. Það er betra að skipta sér ekki af honum!

Eftir sjö hringi helvítis, uppsetningu handrita og uppsetningu, fékk ég pakka af virkum tólum. Ég tengdi borðið í gegnum USB við Linux tölvuna mína og tengdi líka UART samkvæmt skýringarmyndinni hér að ofan.
Ég er að setja upp uppáhalds minicom flugstöðina mína fyrir hraðann 115200, án vélbúnaðar og hugbúnaðar villustýringar. Og við skulum byrja.

Samtímis hraðapróf á nokkrum LTE mótaldum

Þegar ég hleð VIM2 í UART flugstöðina ýti ég á takka eins og bilstöngina til að hætta að hlaða. Eftir að línan birtist

kvim2# 

Ég slá inn skipunina:

kvim2# run update

Á gestgjafanum sem við erum að hlaða frá, framkvæma ég:

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

Það er það, púff. Ég athugaði, það er Linux á borðinu. Innskráning/lykilorð khadas:khadas.

Eftir það, nokkrar minniháttar upphafsstillingar. Fyrir frekari vinnu slökkva ég á lykilorðinu fyrir sudo (já, ekki öruggt, en þægilegt).

sudo visudo

Ég breyti línunni í eyðublaðið og vista

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

Svo breyti ég núverandi stað þannig að tíminn sé í Moskvu, annars verður hann í Greenwich.

sudo timedatectl set-timezone Europe/Moscow

eða

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

Ef þér finnst það erfitt skaltu ekki nota þetta borð; Raspberry Pi er betra. Heiðarlega.

Mótald Huawei e3372h – 153

Þetta mótald var veruleg uppspretta blóðs fyrir mig og í raun varð það flöskuhálsinn í öllu verkefninu. Almennt séð endurspeglar nafnið „mótald“ fyrir þessi tæki alls ekki kjarna verksins: þetta er öflug samsetning, þessi vélbúnaður hefur samsett tæki sem þykist vera geisladiskur til að setja upp rekla, og skiptir svo yfir í netkortastillingu.

Byggingarfræðilega séð, frá sjónarhóli Linux notanda, eftir allar stillingar, lítur það svona út: eftir að mótaldið hefur verið tengt er ég með eth* netviðmót, sem í gegnum dhcp fær IP töluna 192.168.8.100 og sjálfgefna gátt er 192.168.8.1.

Og mikilvægasta augnablikið! Þetta mótaldslíkan getur ekki virkað í mótaldsham, sem er stjórnað af AT skipunum. Allt væri miklu einfaldara, búa til PPP tengingar fyrir hvert mótald og starfa síðan með þeim. En í mínu tilfelli, "sjálfur" (nánar tiltekið, Linux kafari samkvæmt udev reglum), býr til eth tengi og úthlutar IP tölu til þess í gegnum dhcp.

Til að forðast frekari rugling, legg ég til að þú gleymir orðinu „mótald“ og segi netkort og gátt, því í raun er það eins og að tengja nýtt netkort við gátt.
Þegar það er eitt mótald veldur það ekki sérstökum vandræðum, en þegar það er meira en eitt, nefnilega n-stykki, kemur upp eftirfarandi netmynd.

Samtímis hraðapróf á nokkrum LTE mótaldum

Það er, n netkort, með sömu IP tölu, hvert með sömu sjálfgefna gátt. En í raun er hver þeirra tengdur eigin rekstraraðila.

Upphaflega hafði ég einfalda lausn: að nota ifconfig eða ip skipunina, slökkva á öllum viðmótum og einfaldlega kveikja á einu í röð og prófa það. Lausnin var góð fyrir alla, nema að á skiptistundum gat ég ekki tengst tækinu. Og þar sem skiptingin er tíð og hröð, hafði ég í raun ekkert tækifæri til að tengjast.

Þess vegna valdi ég þá leið að breyta handvirkt IP tölum mótaldanna og keyra síðan umferð með því að nota leiðarstillingar.

Samtímis hraðapróf á nokkrum LTE mótaldum

Þetta var ekki endir á vandamálum mínum með mótald: ef rafmagnsvandamál komu upp duttu þau af og nauðsynlegt var að hafa góða stöðuga aflgjafa til USB-miðstöðvarinnar. Ég leysti þetta vandamál með því að harðlóða kraftinn beint í miðstöðina. Annað vandamál sem ég lenti í og ​​sem eyðilagði allt verkefnið: eftir endurræsingu eða kaldræsingu tækisins fundust ekki öll mótald og ekki alltaf, og ég gat ekki ákvarðað hvers vegna þetta gerðist og með hvaða reiknirit. En fyrst og fremst.

Til að mótaldið virki rétt setti ég upp usb-modeswitch pakkann.

sudo apt update
sudo apt install -y usb-modeswitch

Eftir það, eftir tengingu, mun mótaldið vera rétt greint og stillt af udev undirkerfinu. Ég athuga með því einfaldlega að tengja mótaldið og ganga úr skugga um að netið birtist.
Annað vandamál sem ég gat ekki leyst: hvernig get ég fengið nafn símafyrirtækisins sem við erum að vinna með frá þessu mótaldi? Nafn símafyrirtækisins er að finna í vefviðmóti mótaldsins á 192.168.8.1. Þetta er kraftmikil vefsíða sem tekur á móti gögnum í gegnum Ajax beiðnir, þannig að einfaldlega að wgeta síðuna og flokka nafnið mun ekki virka. Svo ég fór að skoða hvernig á að þróa vefsíðu o.s.frv., og áttaði mig á því að ég var að gera einhverja vitleysu. Í kjölfarið hrækti hann og stjórnandinn byrjaði að taka á móti með því að nota Speedtest API sjálft.

Mikið væri auðveldara ef mótaldið hefði aðgang í gegnum AT skipanir. Það væri hægt að endurstilla það, búa til ppp tengingu, úthluta IP, fá símafyrirtæki o.s.frv. En því miður, ég er að vinna með það sem mér hefur verið gefið.

GPS

GPS móttakarinn sem ég fékk var með UART tengi og afl. Það var ekki besta lausnin, en hún var samt framkvæmanleg og einföld. Móttakarinn leit einhvern veginn svona út.

Samtímis hraðapróf á nokkrum LTE mótaldum

Satt að segja var þetta í fyrsta skipti sem ég vinn með GPS-móttakara, en eins og ég bjóst við var fyrir löngu hugsað um allt fyrir okkur. Þannig að við notum bara tilbúnar lausnir.

Í fyrsta lagi kveiki ég á uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) til að tengja GPS.

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

Eftir það athuga ég árangur aðgerðarinnar.

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

Þessi skipun breytir greinilega devtree á flugu, sem er mjög þægilegt.

Eftir að þessi aðgerð hefur tekist, endurræstu og settu upp GPS púkann.

khadas@Khadas:~$ sudo reboot

Að setja upp GPS púkann. Ég set allt upp og klippti það strax af til frekari stillingar.

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

Að breyta stillingaskránni.

sudo vim /etc/default/gpsd

Ég er að setja upp UART sem GPS mun hanga á.

DEVICES="/dev/ttyS4"

Og svo kveikjum við á öllu og byrjum.

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

Eftir það tengi ég GPS.

Samtímis hraðapróf á nokkrum LTE mótaldum

GPS vírinn er í höndum mínum, UART villuleitarvírarnir sjást undir fingrunum á mér.

Ég endurræsa og athuga GPS-aðgerðina með því að nota gpsmon forritið.

Samtímis hraðapróf á nokkrum LTE mótaldum

Þú getur ekki séð gervitunglana á þessari skjámynd, en þú getur séð samskipti við GPS móttakara, og þetta þýðir að allt er í lagi.

Í Python reyndi ég marga möguleika til að vinna með þessum púka, en ég settist á þann sem virkaði rétt með Python 3.

Ég set upp nauðsynlegt bókasafn.

sudo -H pip3 install gps3 

Og ég móta vinnukóðann.

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

Ef ég þarf að fá hnit er þetta gert með eftirfarandi símtali:

longitude, latitude = getPositionData(agps_thread)

Og innan 1-10 sekúndna mun ég annað hvort fá hnitið eða ekki. Já, ég átti tíu tilraunir til að fá hnit. Ekki ákjósanlegt, skakkt og skekkt, en það virkar. Ég ákvað að gera þetta vegna þess að GPS getur haft lélegar móttökur og ekki alltaf tekið við gögnum. Ef þú bíður eftir að fá gögn, þá mun forritið frjósa á þessum stað ef þú vinnur í afskekktu herbergi. Þess vegna útfærði ég þennan óeðlilega kost.

Í grundvallaratriðum, ef það væri meiri tími, væri hægt að taka á móti gögnum frá GPS beint í gegnum UART, flokka þau í sérstökum þræði og vinna með þau. En það var enginn tími, þess vegna hrottalega ljóti kóðann. Og já, ég skammast mín ekkert.

Ljósdíóða

Að tengja LED var einfalt og erfitt á sama tíma. Helsti erfiðleikinn er sá að pin-númerið í kerfinu samsvarar ekki pin-númerinu á töflunni og vegna þess að skjölin eru skrifuð með vinstri hendi. Til að bera saman pinnanúmer vélbúnaðar og pinnanúmer í stýrikerfinu þarftu að keyra skipunina:

gpio readall

Tafla með pinnasamsvörun í kerfinu og á töflunni mun birtast. Eftir það get ég nú þegar stjórnað pinnanum í stýrikerfinu sjálfu. Í mínu tilviki er LED tengt við GPIOH_5.

Samtímis hraðapróf á nokkrum LTE mótaldum

Ég breyti GPIO pinnanum í úttaksstillingu.

gpio -g mode 421 out

Ég skrifa núll.

gpio -g write 421 0

Ég skrifa niður eina.

gpio -g write 421 1

Samtímis hraðapróf á nokkrum LTE mótaldum
Allt logar, eftir að hafa skrifað „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)

Nú, ef villur koma upp, kalla ég error_blink() og ljósdíóðan mun blikka fallega.

Hugbúnaðarhnútar

Hraðapróf API

Það er mikil gleði að speedtest.net þjónustan er með sitt eigið python-API, þú getur skoðað GitHub.

Það góða er að það eru frumkóðar sem einnig er hægt að skoða. Hvernig á að vinna með þetta API (einföld dæmi) er að finna í viðkomandi kafla.

Ég set upp python bókasafnið með eftirfarandi skipun.

sudo -H pip3 install speedtest-cli

Til dæmis geturðu jafnvel sett upp hraðaprófara í Ubuntu beint úr hugbúnaðinum. Þetta er sama python forritið, sem síðan er hægt að ræsa beint frá stjórnborðinu.

sudo apt install speedtest-cli -y

Og mæla nethraða þinn.

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

Þar af leiðandi, alveg eins og ég gerði. Ég þurfti að komast inn í frumkóða þessa hraðaprófs til að útfæra þá betur inn í verkefnið mitt. Eitt mikilvægasta verkefnið er að fá nafn símafyrirtækisins til að skipta því inn í plötuna.

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

Hér reyndist líka allt ekki svo einfalt, þó það virtist miklu einfaldara. Upphaflega var breytu netþjónsins jöfn [], segja þeir, velja besta netþjóninn. Fyrir vikið var ég með handahófskennda netþjóna og, eins og þú gætir giska á, breytilegan hraða. Þetta er frekar flókið efni, að nota fastan netþjón, ef svo er, kyrrstæður eða kraftmikill, krefst rannsókna. En hér er dæmi um línurit fyrir hraðamælingar fyrir Beeline rekstraraðila þegar hann velur prófunarþjón og kyrrstöðufastan.

Samtímis hraðapróf á nokkrum LTE mótaldum
Niðurstaðan af hraðamælingum þegar þú velur kraftmikinn netþjón.

Samtímis hraðapróf á nokkrum LTE mótaldum
Niðurstaða hraðaprófunar, með einum stranglega valnum einum netþjóni.

Á meðan á prófun stendur er „feldur“ á báðum stöðum og það þarf að fjarlægja það með stærðfræðilegum aðferðum. En með föstum netþjóni er það aðeins minna og amplitude er stöðugra.
Almennt séð er þetta staður fyrir frábærar rannsóknir. Og ég myndi mæla hraða netþjónsins míns með því að nota iperf tólið. En við höldum okkur við tækniforskriftirnar.

Sendi póst og villur

Til að senda póst reyndi ég nokkra tugi mismunandi valkosta, en á endanum ákvað ég eftirfarandi. Ég skráði pósthólf á Yandex og tók svo Þetta er dæmi um að senda póst. Ég athugaði það og setti það inn í forritið. Þetta dæmi skoðar ýmsa möguleika, þar á meðal að senda frá gmail o.s.frv. Ég vildi ekki nenna að setja upp póstþjóninn minn og hafði ekki tíma fyrir það, en eins og síðar kom í ljós var það líka til einskis.

Logarnir voru sendir samkvæmt tímaáætlun, ef það er samband, á 6 tíma fresti: klukkan 00, 06:12, 18:XNUMX og XNUMX:XNUMX. Sendi það sem hér segir.

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

Einnig voru sendar villur í upphafi. Til að byrja með var þeim safnað í listann og síðan sent einnig með tímaáætluninni, ef það var tenging. Hins vegar komu upp vandamál með þá staðreynd að Yandex hefur takmörk á fjölda skilaboða sem send eru á dag (þetta er sársauki, sorg og niðurlæging). Þar sem það gæti verið gríðarlegur fjöldi villna, jafnvel á mínútu, urðum við að hætta að senda villur með pósti. Svo hafðu í huga þegar þú sendir sjálfkrafa upplýsingar um slíkt vandamál í gegnum Yandex þjónustu.

Feedbackþjónn

Til þess að hafa aðgang að afskekktum vélbúnaði og geta sérsniðið og endurstillt hann þurfti ég utanaðkomandi netþjón. Almennt, til að vera sanngjarn, væri rétt að senda öll gögn á netþjóninn og byggja öll fallegu línuritin í vefviðmótinu. En ekki allt í einu.

Fyrir VPS valdi ég ruvds.com. Þú gætir tekið einfaldasta netþjóninn. Og almennt, í mínum tilgangi væri þetta nóg. En þar sem ég borgaði ekki fyrir netþjóninn úr eigin vasa ákvað ég að taka hann með litlum varasjóði svo að það væri nóg ef við myndum setja upp vefviðmót, okkar eigin SMTP netþjón, VPN o.s.frv. Auk þess að geta sett upp Telegram bot og ekki átt í vandræðum með að það sé lokað. Þess vegna valdi ég Amsterdam og eftirfarandi breytur.

Samtímis hraðapróf á nokkrum LTE mótaldum

Sem samskiptaaðferð við vélbúnaðinn valdi vim2 öfuga ssh tengingu og eins og æfingin hefur sýnt er hún ekki sú besta. Ef tengingin rofnar heldur þjónninn portinu og það er ómögulegt að tengjast í gegnum það í nokkurn tíma. Þess vegna er samt betra að nota aðrar samskiptaaðferðir, til dæmis VPN. Í framtíðinni vildi ég skipta yfir í VPN, en hafði ekki tíma.

Ég mun ekki fara í smáatriði um að setja upp eldvegg, takmarka réttindi, slökkva á root ssh tengingum og önnur sannleiksatriði við að setja upp VPS. Ég vil trúa því að þú veist nú þegar allt. Fyrir fjartengingu bý ég til nýjan notanda á þjóninum.

adduser vimssh

Ég bý til ssh tengilykla á vélbúnaðinum okkar.

ssh-keygen

Og ég afrita þá á netþjóninn okkar.

ssh-copy-id [email protected]

Á vélbúnaðinum okkar bý ég til sjálfvirka öfuga ssh tengingu við hverja ræsingu.

[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

Gefðu gaum að port 8083: það ákvarðar hvaða tengi ég mun nota til að tengjast með öfugri ssh. Bættu því við ræsingu og byrjaðu.

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

Þú getur jafnvel séð stöðuna:

sudo systemctl status autossh.service

Nú, á VPS netþjóninum okkar, ef við keyrum:

ssh -p 8083 khadas@localhost

Þá kem ég að prófunarbúnaðinum mínum. Og frá vélbúnaðinum get ég líka sent logs og öll gögn í gegnum ssh á netþjóninn minn, sem er mjög þægilegt.

Setjið allt saman

Samtímis hraðapróf á nokkrum LTE mótaldum
Kveikt er á, byrjum þróun og villuleit

Úff, jæja, það er það, ég lýsti öllum hnútunum. Nú er kominn tími til að setja þetta allt saman. Þú getur séð kóðann hér.

Mikilvægur punktur með kóðann: Þetta verkefni byrjar kannski ekki svona, vegna þess að það var sérsniðið fyrir ákveðið verkefni, af ákveðnum arkitektúr. Jafnvel þó ég sé að gefa upp frumkóðann, mun ég samt útskýra það sem er dýrmætasta hér, beint í textanum, annars er það algjörlega óskiljanlegt.

Í upphafi frumstilla ég gps, gpio og opna sérstakan tímaáætlunarþráð.

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

Tímaáætlunin er frekar einföld: það lítur út fyrir að sjá hvort tími sé kominn til að senda skilaboð og hver núverandi villustaða er. Ef það er villufáni, þá blikkum við 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)

Erfiðasti hluti þessa verkefnis er að viðhalda öfugri ssh tengingu fyrir hvert próf. Hvert próf felur í sér að endurstilla sjálfgefna gátt og DNS netþjón. Þar sem enginn les samt, veistu að lestin keyrir ekki á tréteinum. Sá sem finnur páskaeggið fær nammi.

Til að gera þetta, bý ég til sérstaka leiðartöflu -set-mark 0x2 og reglu til að beina umferð.

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

Þú getur lært meira um hvernig það virkar lesa í þessari grein.

Eftir það fer ég inn í endalausa lykkju, þar sem við fáum í hvert skipti lista yfir tengd mótald (til að komast að því hvort netuppsetningin hafi skyndilega breyst).

network_list = getNetworklist()

Það er frekar einfalt að fá lista yfir netviðmót.

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

Eftir að hafa fengið listann setti ég IP tölur á öll viðmót eins og ég sýndi á myndinni í kaflanum um mótaldið.

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

Svo fer ég einfaldlega í gegnum hvert viðmót í lykkju. Og ég stilla hvert viðmót.

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

Ég athuga viðmótið fyrir virkni, ef það er ekkert net, þá mynda ég villur. Ef það er net, þá er kominn tími til að bregðast við!

Hér stilla ég ssh routing á þetta viðmót (ef það hefur ekki verið gert), sendi villur á serverinn ef tími er kominn, sendi logs og keyri að lokum speedtest og vista logs í csv skrá.

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

Það er þess virði að minnast á virkni þess að setja upp öfugt 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")

Og auðvitað þarftu að bæta allri þessari fegurð við gangsetningu. Til að gera þetta bý ég til skrá:

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

Og ég skrifa í það:

[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

Ég kveiki á sjálfvirkri hleðslu og byrja!

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

Nú get ég séð skrár yfir hvað er að gerast með því að nota skipunina:

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

Niðurstöður

Jæja, nú er það mikilvægasta, hvað gerðist í kjölfarið? Hér eru nokkur línurit sem mér tókst að fanga á meðan á þróun og kembiforrit stóð. Línuritin voru byggð með gnuplot með eftirfarandi skriftu.

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

Fyrsta reynslan var hjá símafyrirtækinu Tele2, sem ég stundaði í nokkra daga.

Samtímis hraðapróf á nokkrum LTE mótaldum

Hér notaði ég kraftmikinn mæliþjón. Hraðamælingar virka, en sveiflast mjög mikið, en eitthvað meðalgildi er enn sýnilegt og það er hægt að fá með því að sía gögnin, til dæmis með hlaupandi meðaltali.

Seinna smíðaði ég fjölda grafa fyrir önnur fjarskiptafyrirtæki. Í þessu tilfelli var nú þegar einn prófunarþjónn og niðurstöðurnar voru líka mjög áhugaverðar.

Samtímis hraðapróf á nokkrum LTE mótaldum

Samtímis hraðapróf á nokkrum LTE mótaldum

Samtímis hraðapróf á nokkrum LTE mótaldum

Samtímis hraðapróf á nokkrum LTE mótaldum

Eins og þú sérð er umfjöllunarefnið mjög umfangsmikið fyrir rannsóknir og úrvinnslu þessara gagna og endist greinilega ekki í nokkrar vikur af vinnu. En…

Niðurstaða vinnu

Verkinu var skyndilega lokið vegna aðstæðna sem ég hafði ekki stjórn á. Einn af veikleikum þessa verkefnis, að mínu huglægu mati, var mótaldið, sem vildi í raun ekki vinna samtímis með öðrum mótaldum, og gerði slík brellur í hvert sinn sem það var hlaðið. Í þessum tilgangi er til mikill fjöldi annarra mótaldsgerða; venjulega eru þær nú þegar á Mini PCI-e sniði og eru settar upp inni í tækinu og er miklu auðveldara að stilla. En það er allt önnur saga. Verkefnið var áhugavert og ég var mjög ánægður með að hafa fengið að taka þátt í því.

Samtímis hraðapróf á nokkrum LTE mótaldum

Heimild: www.habr.com

Bæta við athugasemd