Í 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.
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æ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:
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.
É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.
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.
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.
Þ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.
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.
Þ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.
Þ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.
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.
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.
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ð.
Þú 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.
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.
Niðurstaðan af hraðamælingum þegar þú velur kraftmikinn netþjón.
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.
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.
Þá 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
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áð.
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")
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ð.
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
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.
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.
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í.