Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Wakati wa karantini, nilipewa kushiriki katika uundaji wa kifaa cha kupima kasi ya modemu za LTE kwa waendeshaji kadhaa wa rununu.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Mteja alitaka kutathmini kasi ya waendeshaji mbalimbali wa mawasiliano ya simu katika maeneo tofauti ya kijiografia ili kuweza kuelewa ni operator gani wa simu za mkononi aliyemfaa zaidi wakati wa kusakinisha kifaa kwa kutumia muunganisho wa LTE, kwa mfano, kwa matangazo ya video. Wakati huo huo, tatizo lilipaswa kutatuliwa kwa urahisi na kwa bei nafuu iwezekanavyo, bila vifaa vya gharama kubwa.

Nitasema mara moja kwamba kazi sio rahisi na yenye ujuzi zaidi; nitakuambia ni shida gani nilizokutana nazo na jinsi nilivyozitatua. Kwa hiyo, twende.

Kumbuka

Kupima kasi ya uunganisho wa LTE ni jambo ngumu sana: unahitaji kuchagua vifaa sahihi na mbinu ya kipimo, na pia kuwa na ufahamu mzuri wa topolojia na uendeshaji wa mtandao wa seli. Zaidi, kasi inaweza kuathiriwa na mambo kadhaa: idadi ya waliojiandikisha kwenye seli, hali ya hewa, hata kutoka kwa seli hadi kiini kasi inaweza kutofautiana kwa kiasi kikubwa kutokana na topolojia ya mtandao. Kwa ujumla, hii ni shida na idadi kubwa ya haijulikani, na ni mwendeshaji wa simu tu anayeweza kulitatua kwa usahihi.

Hapo awali, mteja alitaka tu kuendesha courier na simu za waendeshaji, kuchukua vipimo moja kwa moja kwenye simu na kisha kuandika matokeo ya kipimo cha kasi kwenye daftari. Suluhisho langu la kupima kasi ya mitandao ya lte, ingawa sio bora, hutatua shida.

Kwa sababu ya ukosefu wa wakati, nilifanya maamuzi sio kwa urahisi au vitendo, lakini kwa kupendelea kasi ya maendeleo. Kwa mfano, reverse ssh ilitumika kwa ufikiaji wa mbali, badala ya VPN ya vitendo zaidi, ili kuokoa muda wa kusanidi seva na kila mteja binafsi.

Kazi ya kiufundi

Kama ilivyoelezwa katika makala Bila maelezo ya kiufundi: kwa nini mteja hataki: Usifanye kazi bila vipimo vya kiufundi! Kamwe, popote!

Kazi ya kiufundi ilikuwa rahisi sana, nitaipanua kidogo kwa uelewa wa mtumiaji wa mwisho. Uchaguzi wa ufumbuzi wa kiufundi na vifaa uliagizwa na mteja. Kwa hivyo, vipimo vya kiufundi yenyewe, baada ya idhini zote:

Kulingana na kompyuta ya bodi moja vim2 tengeneza kipima kasi cha miunganisho ya lte kupitia modemu za Huawei e3372h - 153 waendeshaji kadhaa wa mawasiliano ya simu (kutoka moja hadi n). Pia ni muhimu kupokea kuratibu kutoka kwa kipokea GPS kilichounganishwa kupitia UART. Fanya vipimo vya kasi kwa kutumia huduma www., na kuziweka kwenye meza kama:

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Jedwali katika umbizo la csv. Kisha tuma ishara hii kwa barua-pepe kila baada ya saa 6. Ikitokea makosa, blink LED ambayo imeunganishwa na GPIO.

Nilielezea vipimo vya kiufundi katika fomu ya bure, baada ya vibali vingi. Lakini maana ya kazi tayari inaonekana. Wiki ilitolewa kwa kila kitu. Lakini kwa kweli ilidumu kwa wiki tatu. Hii inazingatia ukweli kwamba nilifanya hivi tu baada ya kazi yangu kuu na wikendi.

Hapa nataka tena kuzingatia ukweli kwamba mteja alikubali mapema juu ya matumizi ya huduma ya kipimo cha kasi na vifaa, ambavyo vilipunguza sana uwezo wangu. Bajeti pia ilikuwa ndogo, kwa hiyo hakuna kitu maalum kilichonunuliwa. Kwa hivyo tulilazimika kucheza kwa sheria hizi.

Usanifu na maendeleo

Mpango huo ni rahisi na dhahiri. Kwa hivyo, nitaiacha bila maoni yoyote maalum.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Niliamua kutekeleza mradi mzima katika python, licha ya ukweli kwamba sikuwa na uzoefu wa kuendeleza lugha hii hata kidogo. Niliichagua kwa sababu kulikuwa na rundo la mifano iliyotengenezwa tayari na suluhisho ambazo zinaweza kuharakisha maendeleo. Kwa hivyo, ninawauliza waandaaji programu wote wa kitaalamu wasikemee uzoefu wangu wa kwanza wa kukuza katika chatu, na ninafurahi kila wakati kusikia ukosoaji wa kujenga ili kuboresha ujuzi wangu.

Pia katika mchakato huo niligundua kuwa python ina matoleo mawili yanayoendesha 2 na 3, kwa sababu hiyo nilitulia kwenye ya tatu.

Nodi za vifaa

Sahani moja vim2

Nilipewa kompyuta yenye ubao mmoja kama mashine yangu kuu vim2

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Kichakataji bora, chenye nguvu cha media kwa nyumba mahiri na SMART-TV, lakini haifai sana kwa kazi hii, au, tuseme, haifai vizuri. Kwa mfano, OS yake kuu ni Android, na Linux ni OS ya sekondari, na ipasavyo hakuna mtu anayehakikishia uendeshaji wa hali ya juu wa nodi zote na madereva chini ya Linux. Na nadhani kwamba baadhi ya matatizo yalihusiana na madereva ya USB ya jukwaa hili, kwa hiyo modem hazikufanya kazi kama ilivyotarajiwa kwenye ubao huu. Pia ina nyaraka duni sana na zilizotawanyika, kwa hivyo kila operesheni ilichukua muda mwingi kuchimba kupitia kizimbani. Hata kazi ya kawaida na GPIO ilichukua damu nyingi. Kwa mfano, ilinichukua saa kadhaa kusanidi LED. Lakini, kuwa na lengo, kimsingi haikuwa muhimu ni aina gani ya bodi moja, jambo kuu ni kwamba ilifanya kazi na kulikuwa na bandari za USB.

Kwanza, ninahitaji kusakinisha Linux kwenye ubao huu. Ili si kuzunguka pori la nyaraka kwa kila mtu, na pia kwa wale ambao watashughulika na mfumo huu wa bodi moja, ninaandika sura hii.

Kuna chaguo mbili za kusakinisha Linux: kwenye kadi ya SD ya nje au kwenye MMC ya ndani. Nilitumia jioni kujaribu kujua jinsi ya kuifanya ifanye kazi na kadi, kwa hivyo niliamua kuiweka kwenye MMC, ingawa bila shaka itakuwa rahisi zaidi kufanya kazi na kadi ya nje.

Kuhusu firmware aliambiwa hapa kwa uwongo. Ninatafsiri kutoka kwa kushangaza hadi kwa Kirusi. Ili kuwasha ubao, ninahitaji kuunganisha UART ya vifaa. Imeunganishwa kwa njia ifuatayo.

  • Bandika Zana GND: <β€”> Pin17 ya GPIO ya VIM
  • Pin Tool TXD: <β€”> Pin18 ya GPIO ya VIM (Linux_Rx)
  • Chombo cha Pin RXD: <β€”> Pin19 ya GPIO ya VIM (Linux_Tx)
  • Bandika Zana VCC: <β€”> Pin20 ya GPIO ya VIM

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Baada ya hapo, nilipakua firmware hivyo. Toleo maalum la firmware VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Ili kupakia programu dhibiti hii, ninahitaji huduma. Maelezo zaidi kuhusu hili hapa. Sijajaribu kuiwasha chini ya Windows, lakini ninahitaji kukuambia maneno machache kuhusu firmware chini ya Linux. Kwanza, nitasanikisha huduma kulingana na maagizo.

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

Aaand... Hakuna kinachofanya kazi. Nilitumia masaa kadhaa kuhariri hati za usakinishaji ili kila kitu kinisanikishe kwa usahihi. Sikumbuki nilifanya nini huko, lakini pia kulikuwa na circus na farasi. Kwa hiyo kuwa makini. Lakini bila huduma hizi hakuna maana katika kutesa vim2 zaidi. Ni bora kutochanganyikiwa naye hata kidogo!

Baada ya miduara saba ya kuzimu, usanidi wa hati na usakinishaji, nilipokea kifurushi cha huduma za kufanya kazi. Niliunganisha ubao kupitia USB kwenye kompyuta yangu ya Linux, na pia niliunganisha UART kulingana na mchoro hapo juu.
Ninaweka terminal yangu ya minicom ninayopenda kwa kasi ya 115200, bila udhibiti wa makosa ya maunzi na programu. Na tuanze.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Wakati wa kupakia VIM2 kwenye terminal ya UART, mimi hubonyeza kitufe, kama vile upau wa nafasi, ili kuacha upakiaji. Baada ya mstari kuonekana

kvim2# 

Ninaingiza amri:

kvim2# run update

Kwenye seva pangishi ambayo tunapakia, mimi hutekeleza:

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

Hiyo ni, phew. Niliangalia, kuna Linux kwenye ubao. Ingia/nenosiri khadas:khadas.

Baada ya hayo, mipangilio midogo ya awali. Kwa kazi zaidi, ninazima nenosiri la sudo (ndio, si salama, lakini ni rahisi).

sudo visudo

Ninahariri mstari kwa fomu na kuhifadhi

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

Kisha mimi hubadilisha eneo la sasa ili wakati uko Moscow, vinginevyo itakuwa katika Greenwich.

sudo timedatectl set-timezone Europe/Moscow

au

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

Ikiwa unaona ni ngumu, basi usitumie ubao huu; Raspberry Pi ni bora zaidi. Kwa uaminifu.

Modem ya Huawei e3372h – 153

Modem hii ilikuwa chanzo kikubwa cha damu kwangu, na, kwa kweli, ikawa kizuizi cha mradi mzima. Kwa ujumla, jina "modem" la vifaa hivi haionyeshi kiini cha kazi kabisa: hii ni mchanganyiko wenye nguvu, kipande hiki cha vifaa kina kifaa cha mchanganyiko ambacho kinajifanya kuwa CD-ROM ili kufunga madereva, na kisha kubadili kwa modi ya kadi ya mtandao.

Kwa usanifu, kutoka kwa mtazamo wa mtumiaji wa Linux, baada ya mipangilio yote, inaonekana kama hii: baada ya kuunganisha modem, nina interface ya mtandao ya eth *, ambayo kupitia dhcp inapokea anwani ya IP 192.168.8.100, na lango la msingi. ni 192.168.8.1.

Na wakati muhimu zaidi! Mfano huu wa modem hauwezi kufanya kazi katika hali ya modem, ambayo inadhibitiwa na amri za AT. Kila kitu kitakuwa rahisi zaidi, unda miunganisho ya PPP kwa kila modem na kisha ufanye kazi nayo. Lakini katika kesi yangu, "mwenyewe" (kwa usahihi zaidi, diver ya Linux kulingana na sheria za udev), huunda kiolesura cha eth na huipa anwani ya IP kupitia dhcp.

Ili kuepuka kuchanganyikiwa zaidi, napendekeza kusahau neno "modem" na kusema kadi ya mtandao na lango, kwa sababu kwa asili, ni sawa na kuunganisha kadi mpya ya mtandao na lango.
Wakati kuna modem moja, hii haina kusababisha matatizo yoyote maalum, lakini wakati kuna zaidi ya moja, yaani n-vipande, picha ya mtandao ifuatayo inatokea.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Hiyo ni, n kadi za mtandao, zilizo na anwani sawa ya IP, kila moja ikiwa na lango la msingi sawa. Lakini kwa kweli, kila mmoja wao ameunganishwa na operator wake mwenyewe.

Hapo awali, nilikuwa na suluhisho rahisi: kwa kutumia ifconfig au ip amri, zima miingiliano yote na uwashe moja kwa zamu na uijaribu. Suluhisho lilikuwa nzuri kwa kila mtu, isipokuwa kwamba wakati wa kubadili sikuweza kuunganisha kwenye kifaa. Na kwa kuwa kubadili ni mara kwa mara na kwa haraka, kwa kweli sikuwa na fursa ya kuunganisha kabisa.

Kwa hivyo, nilichagua njia ya kubadilisha kwa mikono anwani za IP za modem na kisha kuendesha trafiki kwa kutumia mipangilio ya uelekezaji.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Huu haukuwa mwisho wa matatizo yangu na modem: katika kesi ya matatizo ya nguvu, walianguka, na usambazaji mzuri wa umeme kwa kitovu cha USB ulihitajika. Nilitatua shida hii kwa kuuza nguvu moja kwa moja kwenye kitovu. Shida nyingine ambayo nilikutana nayo na ambayo iliharibu mradi mzima: baada ya kuanza upya au kuanza kwa baridi kwa kifaa, sio modem zote ziligunduliwa na sio kila wakati, na sikuweza kuamua kwa nini hii ilitokea na kwa algorithm gani. Lakini mambo ya kwanza kwanza.

Ili modem ifanye kazi kwa usahihi, niliweka kifurushi cha usb-modeswitch.

sudo apt update
sudo apt install -y usb-modeswitch

Baada ya hapo, baada ya kuunganisha, modem itatambuliwa kwa usahihi na kusanidiwa na mfumo mdogo wa udev. Ninaangalia kwa kuunganisha modem tu na kuhakikisha kuwa mtandao unaonekana.
Shida nyingine ambayo sikuweza kutatua: ninawezaje kupata jina la opereta tunayefanya naye kazi kutoka kwa modemu hii? Jina la opereta liko kwenye kiolesura cha wavuti cha modemu katika 192.168.8.1. Huu ni ukurasa wa wavuti unaobadilika ambao hupokea data kupitia maombi ya Ajax, kwa hivyo kuweka tu ukurasa na kuchanganua jina haitafanya kazi. Kwa hivyo nilianza kuangalia jinsi ya kuunda ukurasa wa wavuti, nk, na nikagundua kuwa nilikuwa nikifanya upuuzi wa aina fulani. Kama matokeo, alitema mate, na mwendeshaji akaanza kupokea kwa kutumia Speedtest API yenyewe.

Ingekuwa rahisi zaidi ikiwa modem ingekuwa na ufikiaji kupitia amri za AT. Itawezekana kuiweka upya, kuunda muunganisho wa ppp, kugawa IP, kupata operator wa mawasiliano ya simu, nk. Lakini ole wangu, ninafanya kazi na kile nilichopewa.

GPS

Kipokezi cha GPS nilichopewa kilikuwa na kiolesura cha UART na nguvu. Haikuwa suluhisho bora, lakini bado ilikuwa rahisi kufanya kazi na rahisi. Mpokeaji alionekana kitu kama hiki.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Kuwa waaminifu, hii ilikuwa mara yangu ya kwanza kufanya kazi na kipokea GPS, lakini kama nilivyotarajia, kila kitu kilifikiriwa kwa muda mrefu uliopita. Kwa hivyo tunatumia suluhisho zilizotengenezwa tayari.

Kwanza, ninawezesha uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) kuunganisha GPS.

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

Baadaye ninaangalia mafanikio ya operesheni.

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

Amri hii inaonekana huhariri devtree kwenye kuruka, ambayo ni rahisi sana.

Baada ya mafanikio ya operesheni hii, fungua upya na usakinishe daemon ya GPS.

khadas@Khadas:~$ sudo reboot

Inasakinisha daemon ya GPS. Ninasakinisha kila kitu na kuikata mara moja kwa usanidi zaidi.

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

Kuhariri faili ya mipangilio.

sudo vim /etc/default/gpsd

Ninasanikisha UART ambayo GPS itaning'inia.

DEVICES="/dev/ttyS4"

Na kisha tunawasha kila kitu na kuanza.

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

Baada ya hapo, ninaunganisha GPS.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Waya ya GPS iko mikononi mwangu, waya za utatuzi wa UART zinaonekana chini ya vidole vyangu.

Ninaanzisha tena na kuangalia operesheni ya GPS kwa kutumia programu ya gpsmon.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Huwezi kuona satelaiti kwenye picha ya skrini hii, lakini unaweza kuona mawasiliano na kipokezi cha GPS, na hii ina maana kwamba kila kitu kiko sawa.

Kwenye python, nilijaribu chaguzi nyingi za kufanya kazi na daemon hii, lakini nilitulia kwenye ile iliyofanya kazi kwa usahihi na python 3.

Ninaweka maktaba muhimu.

sudo -H pip3 install gps3 

Na mimi huchonga nambari ya kazi.

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

Ikiwa ninahitaji kupata kuratibu, hii inafanywa na simu ifuatayo:

longitude, latitude = getPositionData(agps_thread)

Na ndani ya sekunde 1-10 nitapata kuratibu au la. Ndiyo, nilikuwa na majaribio kumi ya kupata viwianishi. Sio bora, iliyopotoka na isiyo na maana, lakini inafanya kazi. Niliamua kufanya hivi kwa sababu GPS inaweza kuwa na mapokezi duni na sio kupokea data kila wakati. Ikiwa unasubiri kupokea data, basi ikiwa unafanya kazi katika chumba cha mbali, programu itafungia mahali hapa. Kwa hiyo, nilitekeleza chaguo hili lisilofaa.

Kimsingi, ikiwa kungekuwa na muda zaidi, ingewezekana kupokea data kutoka kwa GPS moja kwa moja kupitia UART, kuichanganua kwenye uzi tofauti na ufanye kazi nayo. Lakini hapakuwa na wakati hata kidogo, kwa hivyo kanuni mbaya ya kikatili. Na ndio, sioni aibu.

Njia inayotoa mwangaza

Kuunganisha LED ilikuwa rahisi na ngumu kwa wakati mmoja. Ugumu kuu ni kwamba nambari ya siri katika mfumo hailingani na nambari ya siri kwenye ubao na kwa sababu nyaraka zimeandikwa kwa mkono wa kushoto. Ili kulinganisha nambari ya pini ya vifaa na nambari ya siri kwenye OS, unahitaji kutekeleza amri:

gpio readall

Jedwali la mawasiliano ya siri katika mfumo na kwenye ubao itaonyeshwa. Baada ya hapo naweza tayari kutumia pini kwenye OS yenyewe. Katika kesi yangu LED imeunganishwa na GPIOH_5.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Ninabadilisha pini ya GPIO kuwa modi ya pato.

gpio -g mode 421 out

Ninaandika sifuri.

gpio -g write 421 0

Ninaandika moja.

gpio -g write 421 1

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE
Kila kitu kinawaka, baada ya kuandika "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)

Sasa, ikiwa kuna makosa, ninaita error_blink() na LED itaangaza kwa uzuri.

Nodi za programu

Speedtest API

Ni furaha kubwa kuwa huduma ya speedtest.net ina python-API yake, unaweza kuangalia Github.

Jambo zuri ni kwamba kuna misimbo ya chanzo ambayo inaweza pia kutazamwa. Jinsi ya kufanya kazi na API hii (mifano rahisi) inaweza kupatikana ndani sehemu husika.

Ninasanikisha maktaba ya python na amri ifuatayo.

sudo -H pip3 install speedtest-cli

Kwa mfano, unaweza hata kusakinisha kipima kasi katika Ubuntu moja kwa moja kutoka kwa programu. Hii ni programu sawa ya python, ambayo inaweza kuzinduliwa moja kwa moja kutoka kwa console.

sudo apt install speedtest-cli -y

Na kupima kasi ya mtandao wako.

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

Kama matokeo, kama nilivyofanya. Ilinibidi niingie kwenye nambari za chanzo za jaribio hili la kasi ili kuzitekeleza kikamilifu katika mradi wangu. Moja ya kazi muhimu zaidi ni kupata jina la mwendeshaji wa mawasiliano ya simu ili kuibadilisha kwenye sahani.

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"
#Ρ‚ΡƒΡ‚ ΠΈΠ΄Π΅Ρ‚ запись Π² Ρ„Π°ΠΉΠ» Π»ΠΎΠ³ΠΎΠ²

Hapa, pia, kila kitu kiligeuka kuwa sio rahisi sana, ingawa ingeonekana kuwa rahisi zaidi. Hapo awali, parameta ya seva ilikuwa sawa na [], wanasema, chagua seva bora zaidi. Kama matokeo, nilikuwa na seva za nasibu, na, kama unavyoweza kudhani, kasi ya kutofautisha. Hii ni mada ngumu sana, kwa kutumia seva isiyobadilika, ikiwa ni hivyo, tuli au yenye nguvu, inahitaji utafiti. Lakini hapa kuna mfano wa grafu za kipimo cha kasi kwa opereta wa Beeline wakati wa kuchagua seva ya majaribio na ile iliyowekwa tuli.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE
Matokeo ya kupima kasi wakati wa kuchagua seva yenye nguvu.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE
Matokeo ya kupima kasi, na seva moja iliyochaguliwa madhubuti.

Wakati wa kupima, kuna "manyoya" katika maeneo yote mawili, na inahitaji kuondolewa kwa kutumia mbinu za hisabati. Lakini kwa seva iliyowekwa ni kidogo kidogo na amplitude ni thabiti zaidi.
Kwa ujumla, hapa ni mahali pa utafiti mkubwa. Na ningepima kasi ya seva yangu kwa kutumia matumizi ya iperf. Lakini tunashikamana na maelezo ya kiufundi.

Kutuma barua na makosa

Kutuma barua, nilijaribu chaguzi kadhaa tofauti, lakini mwisho nilikaa kwa zifuatazo. Nilisajili sanduku la barua kwenye Yandex na kisha nikachukua Huu ni mfano wa kutuma barua. Niliiangalia na kuitekeleza kwenye programu. Mfano huu unachunguza chaguzi mbalimbali, ikiwa ni pamoja na kutuma kutoka kwa gmail, nk. Sikutaka kujisumbua na kuanzisha seva yangu ya barua na sikuwa na wakati wake, lakini kama ilivyotokea baadaye, pia ilikuwa bure.

Magogo yalitumwa kwa mujibu wa mratibu, ikiwa kuna uhusiano, kila saa 6: saa 00, 06 asubuhi, 12 jioni na 18 jioni. Imetumwa kama ifuatavyo.

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

Makosa pia yalitumwa mwanzoni. Kuanza, walikusanywa kwenye orodha, na kisha kutumwa pia kwa kutumia mpangilio, ikiwa kulikuwa na unganisho. Hata hivyo, basi matatizo yalitokea na ukweli kwamba Yandex ina kikomo kwa idadi ya ujumbe uliotumwa kwa siku (hii ni maumivu, huzuni na unyonge). Kwa kuwa kunaweza kuwa na idadi kubwa ya makosa hata kwa dakika, ilitubidi kuacha kutuma makosa kwa barua. Kwa hiyo kumbuka wakati wa kutuma moja kwa moja habari kuhusu tatizo hilo kupitia huduma za Yandex.

Seva ya maoni

Ili kupata kifaa cha mbali cha vifaa na kuweza kubinafsisha na kusanidi upya, nilihitaji seva ya nje. Kwa ujumla, kuwa sawa, itakuwa sahihi kutuma data zote kwa seva na kujenga grafu zote nzuri kwenye kiolesura cha wavuti. Lakini si wote mara moja.

Kwa VPS nilichagua ruvds.com. Unaweza kuchukua seva rahisi zaidi. Na kwa ujumla, kwa madhumuni yangu hii itakuwa ya kutosha. Lakini kwa kuwa sikulipia seva kutoka kwa mfuko wangu mwenyewe, niliamua kuichukua na hifadhi ndogo ili iwe ya kutosha ikiwa tutapeleka interface ya wavuti, seva yetu ya SMTP, VPN, nk. Zaidi, uweze kusanidi bot ya Telegraph na usiwe na shida na kuzuiwa. Kwa hiyo, nilichagua Amsterdam na vigezo vifuatavyo.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Kama njia ya mawasiliano na vifaa, vim2 ilichagua muunganisho wa nyuma wa ssh na, kama mazoezi yameonyesha, sio bora zaidi. Ikiwa uunganisho umepotea, seva inashikilia bandari na haiwezekani kuunganisha kwa njia hiyo kwa muda fulani. Kwa hiyo, bado ni bora kutumia njia nyingine za mawasiliano, kwa mfano VPN. Katika siku zijazo nilitaka kubadili VPN, lakini sikuwa na wakati.

Sitaingia katika maelezo ya kusanidi firewall, haki za kuzuia, kuzima miunganisho ya ssh ya mizizi na maoni mengine ya kuanzisha VPS. Ningependa kuamini kuwa tayari unajua kila kitu. Kwa muunganisho wa mbali, ninaunda mtumiaji mpya kwenye seva.

adduser vimssh

Ninatoa funguo za unganisho za ssh kwenye vifaa vyetu.

ssh-keygen

Na mimi nakala yao kwa server yetu.

ssh-copy-id [email protected]

Kwenye vifaa vyetu, mimi hutengeneza muunganisho wa kiotomatiki wa ssh kwenye kila buti.

[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

Zingatia bandari 8083: huamua ni bandari gani nitatumia kuunganisha kupitia reverse ssh. Iongeze kwenye kuanzisha na uanze.

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

Unaweza hata kuona hali:

sudo systemctl status autossh.service

Sasa, kwenye seva yetu ya VPS, ikiwa tunaendesha:

ssh -p 8083 khadas@localhost

Kisha ninafika kwenye kipande changu cha vifaa vya majaribio. Na kutoka kwa vifaa naweza pia kutuma kumbukumbu na data yoyote kupitia ssh kwa seva yangu, ambayo ni rahisi sana.

Kuweka yote pamoja

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE
Kuwasha, wacha tuanze ukuzaji na utatuzi

Phew, ndivyo hivyo, nilielezea nodes zote. Sasa ni wakati wa kuweka yote pamoja. Unaweza kuona msimbo hapa.

Hoja muhimu na nambari: Mradi huu unaweza usianze hivi, kwa sababu uliundwa kwa kazi maalum, ya usanifu maalum. Ingawa ninatoa msimbo wa chanzo, bado nitaelezea mambo muhimu zaidi hapa, kwenye maandishi, vinginevyo haieleweki kabisa.

Mwanzoni, ninaanzisha gps, gpio na kuzindua uzi tofauti wa mpangilio.

#запуск ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°
pShedulerThread = threading.Thread(target=ShedulerThread, args=(1,))
pShedulerThread.start()

Kipanga ratiba ni rahisi sana: inaonekana kuona ikiwa wakati umefika wa kutuma ujumbe na hali ya makosa ya sasa ni nini. Ikiwa kuna alama ya makosa, basi tunapepesa 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)

Sehemu ngumu zaidi ya mradi huu ni kudumisha muunganisho wa nyuma wa ssh kwa kila jaribio. Kila jaribio linahusisha kusanidi upya lango chaguo-msingi na seva ya DNS. Kwa kuwa hakuna mtu anayesoma hata hivyo, ujue kwamba treni haipande reli za mbao. Yeyote anayepata yai ya Pasaka anapata pipi.

Ili kufanya hivyo, ninaunda meza tofauti ya uelekezaji -set-mark 0x2 na sheria ya kuelekeza trafiki.

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

Unaweza kujifunza zaidi kuhusu jinsi inavyofanya kazi soma katika nakala hii.

Baada ya hapo ninaingia kwenye kitanzi kisicho na mwisho, ambapo kila wakati tunapata orodha ya modem zilizounganishwa (ili kujua ikiwa usanidi wa mtandao umebadilika ghafla).

network_list = getNetworklist()

Kupata orodha ya miingiliano ya mtandao ni rahisi sana.

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

Baada ya kupokea orodha, niliweka anwani za IP kwenye miingiliano yote, kama nilivyoonyesha kwenye picha kwenye sura kuhusu modem.

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

Kisha mimi hupitia kila kiolesura kwa kitanzi. Na mimi husanidi kila kiolesura.

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

Ninaangalia kiolesura cha utendaji, ikiwa hakuna mtandao, basi mimi hutoa makosa. Ikiwa kuna mtandao, basi ni wakati wa kutenda!

Hapa ninasanidi uelekezaji wa ssh kwa kiolesura hiki (ikiwa hakijafanywa), tuma makosa kwa seva ikiwa wakati umefika, tuma magogo na mwishowe endesha kasi zaidi na uhifadhi kumbukumbu kwenye faili ya csv.

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()
#ΠΈ Π΄Π°Π»Π΅Π΅ тСстируСм ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ сохраняСм Π»ΠΎΠ³ΠΈ. 

Inafaa kutaja kazi ya kusanidi reverse 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")

Na bila shaka, unahitaji kuongeza uzuri huu wote kuanza. Ili kufanya hivyo, ninaunda faili:

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

Na ninaandika ndani yake:

[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

Ninawasha upakiaji kiotomatiki na kuanza!

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

Sasa naweza kuona kumbukumbu za kile kinachotokea kwa kutumia amri:

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

Matokeo

Kweli, sasa jambo la muhimu zaidi ni, nini kilitokea kama matokeo? Hapa kuna grafu chache ambazo nilifanikiwa kunasa wakati wa mchakato wa ukuzaji na utatuzi. Grafu zilijengwa kwa kutumia gnuplot na hati ifuatayo.

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

Uzoefu wa kwanza ulikuwa na opereta wa Tele2, ambayo nilifanya kwa siku kadhaa.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Hapa nilitumia seva ya kupimia yenye nguvu. Vipimo vya kasi hufanya kazi, lakini hubadilika sana, lakini thamani fulani ya wastani bado inaonekana, na hii inaweza kupatikana kwa kuchuja data, kwa mfano, na wastani wa kusonga.

Baadaye nilijenga idadi ya grafu kwa waendeshaji wengine wa mawasiliano ya simu. Katika kesi hii, tayari kulikuwa na seva moja ya kupima, na matokeo pia yalikuwa ya kuvutia sana.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Kama unaweza kuona, mada ni pana sana kwa utafiti na usindikaji wa data hii, na ni wazi haidumu kwa wiki kadhaa za kazi. Lakini…

Matokeo ya kazi

Kazi ilikamilishwa ghafla kutokana na mazingira yaliyo nje ya uwezo wangu. Moja ya udhaifu wa mradi huu, kwa maoni yangu ya kibinafsi, ilikuwa modem, ambayo haikutaka kufanya kazi wakati huo huo na modem zingine, na ilifanya hila kama hizo kila wakati ilipopakiwa. Kwa madhumuni haya, kuna idadi kubwa ya miundo mingine ya modemu; kwa kawaida tayari iko katika umbizo la Mini PCI-e na imewekwa ndani ya kifaa na ni rahisi zaidi kusanidi. Lakini hiyo ni hadithi tofauti kabisa. Mradi huo ulikuwa wa kuvutia na nilifurahi sana kwamba niliweza kushiriki katika hilo.

Jaribio la kasi la wakati mmoja kwenye modemu kadhaa za LTE

Chanzo: mapenzi.com

Kuongeza maoni