Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Yn ystod cwarantîn, cynigiwyd i mi gymryd rhan yn natblygiad dyfais ar gyfer mesur cyflymder modemau LTE ar gyfer sawl gweithredwr cellog.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Roedd y cwsmer eisiau gwerthuso cyflymder gwahanol weithredwyr telathrebu mewn gwahanol leoliadau daearyddol er mwyn gallu deall pa weithredwr cellog oedd fwyaf optimaidd iddo wrth osod offer gan ddefnyddio cysylltiad LTE, er enghraifft, ar gyfer darllediadau fideo. Ar yr un pryd, roedd yn rhaid datrys y broblem mor syml a rhad â phosibl, heb offer drud.

Dywedaf ar unwaith nad y dasg yw'r un symlaf a mwyaf dwys o ran gwybodaeth; dywedaf wrthych pa broblemau y deuthum ar eu traws a sut y gwnes i eu datrys. Felly, gadewch i ni fynd.

Nodyn

Mae mesur cyflymder cysylltiad LTE yn fater cymhleth iawn: mae angen i chi ddewis yr offer a'r dechneg fesur gywir, a hefyd meddu ar ddealltwriaeth dda o dopoleg a gweithrediad y rhwydwaith cellog. Hefyd, gall y cyflymder gael ei ddylanwadu gan sawl ffactor: nifer y tanysgrifwyr ar gell, amodau tywydd, hyd yn oed o gell i gell, gall y cyflymder amrywio'n ddramatig oherwydd topoleg y rhwydwaith. Yn gyffredinol, mae hon yn broblem gyda nifer fawr o bethau anhysbys, a dim ond gweithredwr telathrebu all ei datrys yn gywir.

I ddechrau, roedd y cwsmer eisiau gyrru'r negesydd gyda ffonau'r gweithredwyr, cymryd mesuriadau'n uniongyrchol ar y ffôn ac yna ysgrifennu'r canlyniadau mesur cyflymder mewn llyfr nodiadau. Mae fy ateb ar gyfer mesur cyflymder rhwydweithiau lte, er nad yw'n ddelfrydol, yn datrys y broblem.

Oherwydd diffyg amser, gwnes benderfyniadau nid o blaid cyfleustra nac ymarferoldeb, ond o blaid cyflymder datblygiad. Er enghraifft, defnyddiwyd ssh cefn ar gyfer mynediad o bell, yn lle'r VPN mwy ymarferol, er mwyn arbed amser ar sefydlu'r gweinydd a phob cleient unigol.

Tasg dechnegol

Fel y dywedir yn yr erthygl Heb fanylebau technegol: pam nad yw'r cleient ei eisiau: Peidiwch â gweithio heb fanylebau technegol! Byth, unrhyw le!

Roedd y dasg dechnegol yn eithaf syml, byddaf yn ei ehangu ychydig ar gyfer dealltwriaeth y defnyddiwr terfynol. Y cwsmer oedd yn pennu'r dewis o atebion technegol ac offer. Felly, y fanyleb dechnegol ei hun, ar ôl pob cymeradwyaeth:

Yn seiliedig ar gyfrifiadur bwrdd sengl vim2 gwneud profwr cyflymder ar gyfer cysylltiadau lte trwy fodemau Huawei e3372h - 153 sawl gweithredwr telathrebu (o un i n). Mae hefyd angen derbyn cyfesurynnau gan dderbynnydd GPS sydd wedi'i gysylltu trwy UART. Gwneud mesuriadau cyflymder gan ddefnyddio'r gwasanaeth www.speedtest.net a'u rhoi mewn bwrdd fel:

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Tabl mewn fformat csv. Yna anfonwch yr arwydd hwn trwy e-bost bob 6 awr. Mewn achos o wallau, amrantu'r LED sydd wedi'i gysylltu â'r GPIO.

Disgrifiais y manylebau technegol ar ffurf rydd, ar ôl llawer o gymeradwyaethau. Ond mae ystyr y dasg eisoes yn weladwy. Rhoddwyd wythnos i bopeth. Ond mewn gwirionedd fe barhaodd am dair wythnos. Mae hyn yn cymryd i ystyriaeth y ffaith mai dim ond ar ôl fy mhrif swydd ac ar benwythnosau y gwnes i hyn.

Yma rwyf am dynnu sylw unwaith eto at y ffaith bod y cwsmer wedi cytuno ymlaen llaw ar y defnydd o'r gwasanaeth mesur cyflymder a chaledwedd, a oedd yn cyfyngu'n fawr ar fy ngalluoedd. Roedd y gyllideb hefyd yn gyfyngedig, felly ni phrynwyd unrhyw beth arbennig. Felly roedd yn rhaid i ni chwarae yn ôl y rheolau hyn.

Pensaernïaeth a datblygiad

Mae'r cynllun yn syml ac yn amlwg. Felly, gadawaf ef heb unrhyw sylwadau arbennig.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Penderfynais weithredu’r prosiect cyfan yn python, er gwaethaf y ffaith nad oedd gennyf unrhyw brofiad o ddatblygu yn yr iaith hon o gwbl. Fe'i dewisais oherwydd bod yna griw o enghreifftiau parod ac atebion a allai gyflymu datblygiad. Felly, gofynnaf i’r holl raglenwyr proffesiynol beidio â dirmygu fy mhrofiad cyntaf o ddatblygu mewn python, ac rwyf bob amser yn hapus i glywed beirniadaeth adeiladol i wella fy sgiliau.

Hefyd yn y broses darganfyddais fod gan python ddwy fersiwn rhedeg 2 a 3, o ganlyniad fe wnes i setlo ar y trydydd.

Nodau caledwedd

vim2 plât sengl

Cefais gyfrifiadur un bwrdd fel fy mhrif beiriant vim2

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Prosesydd cyfryngau rhagorol, pwerus ar gyfer cartref craff a SMART-TV, ond yn hynod anaddas ar gyfer y dasg hon, neu, gadewch i ni ddweud, sy'n addas iawn. Er enghraifft, ei brif OS yw Android, ac mae Linux yn OS eilaidd, ac yn unol â hynny nid oes neb yn gwarantu gweithrediad o ansawdd uchel yr holl nodau a gyrwyr o dan Linux. Ac rwy'n tybio bod rhai o'r problemau'n gysylltiedig â gyrwyr USB y platfform hwn, felly nid oedd y modemau yn gweithio yn ôl y disgwyl ar y bwrdd hwn. Mae ganddo hefyd ddogfennaeth wael a gwasgaredig iawn, felly cymerodd pob llawdriniaeth lawer o amser yn cloddio trwy'r dociau. Roedd hyd yn oed gwaith cyffredin gyda GPIO yn cymryd llawer o waed. Er enghraifft, cymerodd sawl awr i mi sefydlu'r LED. Ond, i fod yn wrthrychol, nid oedd yn sylfaenol bwysig pa fath o fwrdd sengl ydoedd, y prif beth oedd ei fod yn gweithio ac roedd porthladdoedd USB.

Yn gyntaf, mae angen i mi osod Linux ar y bwrdd hwn. Er mwyn peidio â sgwrio gwylltion dogfennaeth i bawb, a hefyd i'r rhai a fydd yn delio â'r system un bwrdd hon, rwy'n ysgrifennu'r bennod hon.

Mae dau opsiwn i osod Linux: ar gerdyn SD allanol neu ar MMC mewnol. Treuliais noson yn ceisio darganfod sut i wneud iddo weithio gyda'r cerdyn, felly penderfynais ei osod ar yr MMC, er heb amheuaeth byddai'n llawer haws gweithio gyda cherdyn allanol.

Ynglŷn â'r firmware cam a ddywedir yma. Rwy'n cyfieithu o rhyfedd i Rwsieg. Er mwyn fflachio'r bwrdd, mae angen i mi gysylltu'r caledwedd UART. Wedi'i gysylltu yn y modd canlynol.

  • Pin Offer GND: <—> Pin 17 GPIO VIMs
  • Pin Offer TXD: <—> Pin 18 o GPIO VIMs (Linux_Rx)
  • Pin Offer RXD: <—> Pin 19 o GPIO VIMs (Linux_Tx)
  • Pin Offer VCC: <—> Pin20 GPIO VIMs

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Ar ôl hynny, lawrlwythais y firmware felly. Fersiwn firmware penodol VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Er mwyn llwytho'r cadarnwedd hwn i fyny, mae angen cyfleustodau arnaf. Mwy o fanylion am hyn yma. Nid wyf wedi ceisio ei fflachio o dan Windows, ond mae angen i mi ddweud ychydig eiriau wrthych am firmware o dan Linux. Yn gyntaf, byddaf yn gosod y cyfleustodau yn unol â'r cyfarwyddiadau.

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

Aaa... dim byd yn gweithio. Treuliais ychydig oriau yn golygu'r sgriptiau gosod fel y byddai popeth yn gosod yn gywir i mi. Dydw i ddim yn cofio beth wnes i yno, ond roedd y syrcas honno gyda cheffylau hefyd. Felly byddwch yn ofalus. Ond heb y cyfleustodau hyn nid oes diben arteithio vim2 ymhellach. Mae'n well peidio â llanast ag ef o gwbl!

Ar ôl saith cylch o uffern, cyfluniad sgript a gosod, derbyniais becyn o gyfleustodau gweithio. Cysylltais y bwrdd trwy USB â'm cyfrifiadur Linux, a chysylltais yr UART hefyd yn ôl y diagram uchod.
Rwy'n sefydlu fy hoff derfynell minicom ar gyfer cyflymder o 115200, heb reolaeth gwall caledwedd a meddalwedd. A gadewch i ni ddechrau arni.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Wrth lwytho VIM2 yn y derfynell UART, rwy'n pwyso allwedd, fel gofod, i roi'r gorau i lwytho. Ar ôl i'r llinell ymddangos

kvim2# 

Rwy'n nodi'r gorchymyn:

kvim2# run update

Ar y gwesteiwr yr ydym yn llwytho ohono, rwy'n gweithredu:

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

Dyna fe, phew. Gwiriais, mae Linux ar y bwrdd. Mewngofnodi / cyfrinair khadas: khadas.

Ar ôl hynny, mae rhai gosodiadau cychwynnol bach. Ar gyfer gwaith pellach, rwy'n analluogi'r cyfrinair ar gyfer sudo (ie, ddim yn ddiogel, ond yn gyfleus).

sudo visudo

Rwy'n golygu'r llinell i'r ffurflen ac yn cadw

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

Yna rwy'n newid y locale presennol fel bod yr amser ym Moscow, fel arall bydd yn Greenwich.

sudo timedatectl set-timezone Europe/Moscow

neu

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

Os ydych chi'n ei chael hi'n anodd, yna peidiwch â defnyddio'r bwrdd hwn; Mae Raspberry Pi yn well. Yn onest.

Modem Huawei e3372h – 153

Roedd y modem hwn yn ffynhonnell sylweddol o waed i mi, ac, mewn gwirionedd, daeth yn dagfa i'r prosiect cyfan. Yn gyffredinol, nid yw'r enw "modem" ar gyfer y dyfeisiau hyn yn adlewyrchu hanfod y gwaith o gwbl: mae hwn yn gyfuniad pwerus, mae gan y darn hwn o galedwedd ddyfais gyfansawdd sy'n esgus bod yn CD-ROM er mwyn gosod gyrwyr, ac yna'n newid i fodd cerdyn rhwydwaith.

Yn bensaernïol, o safbwynt defnyddiwr Linux, ar ôl yr holl osodiadau, mae'n edrych fel hyn: ar ôl cysylltu'r modem, mae gen i ryngwyneb rhwydwaith eth *, sydd trwy dhcp yn derbyn y cyfeiriad IP 192.168.8.100, a'r porth rhagosodedig yn 192.168.8.1.

A'r foment bwysicaf! Ni all y model modem hwn weithio yn y modd modem, a reolir gan orchmynion AT. Byddai popeth yn llawer symlach, creu cysylltiadau PPP ar gyfer pob modem ac yna gweithredu gyda nhw. Ond yn fy achos i, mae “ei hun” (yn fwy manwl gywir, deifiwr Linux yn unol â rheolau udev), yn creu rhyngwyneb eth ac yn aseinio cyfeiriad IP iddo trwy dhcp.

Er mwyn osgoi dryswch pellach, rwy'n awgrymu anghofio'r gair "modem" a dweud cerdyn rhwydwaith a phorth, oherwydd yn y bôn, mae fel cysylltu cerdyn rhwydwaith newydd â phorth.
Pan fydd un modem, nid yw hyn yn achosi unrhyw broblemau arbennig, ond pan fydd mwy nag un, sef n-darnau, mae'r llun rhwydwaith canlynol yn codi.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Hynny yw, n cardiau rhwydwaith, gyda'r un cyfeiriad IP, pob un â'r un porth rhagosodedig. Ond mewn gwirionedd, mae pob un ohonynt yn gysylltiedig â'i weithredwr ei hun.

I ddechrau, roedd gen i ateb syml: gan ddefnyddio'r gorchymyn ifconfig neu ip, trowch yr holl ryngwynebau i ffwrdd a throwch un ymlaen yn ei dro a'i brofi. Roedd yr ateb yn dda i bawb, ac eithrio yn ystod yr eiliadau newid nid oeddwn yn gallu cysylltu â'r ddyfais. A chan fod y newid yn aml ac yn gyflym, mewn gwirionedd nid oedd gennyf gyfle i gysylltu o gwbl.

Felly, dewisais y llwybr o newid cyfeiriadau IP y modemau â llaw ac yna gyrru traffig gan ddefnyddio gosodiadau llwybro.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Nid dyma ddiwedd fy mhroblemau gyda modemau: rhag ofn y byddai problemau pŵer, fe wnaethant ddisgyn, ac roedd angen cyflenwad pŵer sefydlog da i'r canolbwynt USB. Datrysais y broblem hon trwy sodro'r pŵer yn uniongyrchol i'r canolbwynt. Problem arall y deuthum ar ei thraws ac a ddifethodd y prosiect cyfan: ar ôl ailgychwyn neu gychwyn oer y ddyfais, ni chanfuwyd pob modem ac nid bob amser, ac ni allwn benderfynu pam y digwyddodd hyn a thrwy ba algorithm. Ond pethau cyntaf yn gyntaf.

Er mwyn i'r modem weithio'n gywir, gosodais y pecyn usb-modeswitch.

sudo apt update
sudo apt install -y usb-modeswitch

Ar ôl hynny, ar ôl cysylltu, bydd y modem yn cael ei ganfod yn gywir a'i ffurfweddu gan yr is-system udev. Rwy'n gwirio trwy gysylltu'r modem yn unig a gwneud yn siŵr bod y rhwydwaith yn ymddangos.
Problem arall na allwn ei datrys: sut y gallaf gael enw'r gweithredwr yr ydym yn gweithio ag ef o'r modem hwn? Mae enw'r gweithredwr wedi'i gynnwys yn y rhyngwyneb gwe modem yn 192.168.8.1. Mae hon yn dudalen we ddeinamig sy'n derbyn data trwy geisiadau Ajax, felly ni fydd wgeting y dudalen a dosrannu'r enw yn gweithio. Felly dechreuais edrych ar sut i ddatblygu tudalen we, ac ati, a sylweddoli fy mod yn gwneud rhyw fath o nonsens. O ganlyniad, poerodd, a dechreuodd y gweithredwr dderbyn gan ddefnyddio'r API Speedtest ei hun.

Byddai'n llawer haws pe bai gan y modem fynediad trwy orchmynion AT. Byddai'n bosibl ei ail-gyflunio, creu cysylltiad ppp, aseinio IP, cael gweithredwr telathrebu, ac ati. Ond gwaetha'r modd, rwy'n gweithio gyda'r hyn a roddwyd i mi.

GPS

Roedd gan y derbynnydd GPS a roddwyd i mi ryngwyneb UART a phŵer. Nid dyma'r ateb gorau, ond roedd yn dal yn ymarferol ac yn syml. Roedd y derbynnydd yn edrych rhywbeth fel hyn.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

A dweud y gwir, dyma oedd fy nhro cyntaf yn gweithio gyda derbynnydd GPS, ond fel roeddwn i'n disgwyl, roedd popeth wedi'i feddwl i ni amser maith yn ôl. Felly rydyn ni'n defnyddio atebion parod yn unig.

Yn gyntaf, rwy'n galluogi uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) i gysylltu GPS.

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

Wedi hynny rwy'n gwirio llwyddiant y llawdriniaeth.

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

Mae'n debyg bod y gorchymyn hwn yn golygu'r devtree ar y hedfan, sy'n gyfleus iawn.

Ar ôl llwyddiant y llawdriniaeth hon, ailgychwyn a gosod yr daemon GPS.

khadas@Khadas:~$ sudo reboot

Gosod yr daemon GPS. Rwy'n gosod popeth ac yn ei dorri i ffwrdd ar unwaith ar gyfer cyfluniad pellach.

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

Wrthi'n golygu'r ffeil gosodiadau.

sudo vim /etc/default/gpsd

Rwy'n gosod UART y bydd y GPS yn hongian arno.

DEVICES="/dev/ttyS4"

Ac yna rydyn ni'n troi popeth ymlaen ac yn dechrau.

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

Ar ôl hynny, rwy'n cysylltu'r GPS.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Mae'r wifren GPS yn fy nwylo, mae'r gwifrau dadfygiwr UART i'w gweld o dan fy mysedd.

Rwy'n ailgychwyn ac yn gwirio gweithrediad GPS gan ddefnyddio'r rhaglen gpsmon.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Ni allwch weld y lloerennau yn y sgrin hon, ond gallwch weld cyfathrebu â'r derbynnydd GPS, ac mae hyn yn golygu bod popeth yn iawn.

Yn python, ceisiais lawer o opsiynau ar gyfer gweithio gyda'r daemon hwn, ond fe wnes i setlo ar yr un a oedd yn gweithio'n gywir gyda python 3.

Rwy'n gosod y llyfrgell angenrheidiol.

sudo -H pip3 install gps3 

Ac fe wnes i gerflunio'r cod gwaith.

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

Os bydd angen i mi gael cyfesurynnau, gwneir hyn gyda'r alwad ganlynol:

longitude, latitude = getPositionData(agps_thread)

Ac o fewn 1-10 eiliad byddaf naill ai'n cael y cyfesuryn ai peidio. Do, cefais ddeg ymgais i gael cyfesurynnau. Ddim yn optimaidd, yn gam ac yn askew, ond mae'n gweithio. Penderfynais wneud hyn oherwydd gall GPS gael derbyniad gwael ac nid yw bob amser yn derbyn data. Os arhoswch i dderbyn data, yna os ydych chi'n gweithio mewn ystafell anghysbell, bydd y rhaglen yn rhewi yn y lle hwn. Felly, rhoddais yr opsiwn anhylaw hwn ar waith.

Mewn egwyddor, pe bai mwy o amser, byddai'n bosibl derbyn data o GPS yn uniongyrchol trwy UART, ei ddosrannu mewn edefyn ar wahân a gweithio gydag ef. Ond doedd dim amser o gwbl, a dyna pam y cod creulon hyll. Ac ydw, does gen i ddim cywilydd.

Deuod allyrru golau

Roedd cysylltu'r LED yn syml ac yn anodd ar yr un pryd. Y prif anhawster yw nad yw rhif y pin yn y system yn cyfateb i'r rhif pin ar y bwrdd ac oherwydd bod y ddogfennaeth wedi'i hysgrifennu â'r llaw chwith. I gymharu'r rhif pin caledwedd a'r rhif pin yn yr OS, mae angen i chi redeg y gorchymyn:

gpio readall

Bydd tabl o ohebiaeth pin yn y system ac ar y bwrdd yn cael ei arddangos. Ar ôl hynny gallaf eisoes weithredu'r pin yn yr OS ei hun. Yn fy achos i mae'r LED wedi'i gysylltu â GPOH_5.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Rwy'n newid y pin GPIO i'r modd allbwn.

gpio -g mode 421 out

Rwy'n ysgrifennu sero.

gpio -g write 421 0

Rwy'n ysgrifennu un i lawr.

gpio -g write 421 1

Prawf cyflymdra ar yr un pryd ar sawl modem LTE
Mae popeth wedi'i oleuo, ar ôl ysgrifennu "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)

Nawr, rhag ofn y bydd gwallau, galwaf error_blink () a bydd y LED yn blincio'n hyfryd.

Nodau meddalwedd

Speedtest API

Mae'n bleser mawr bod gan y gwasanaeth speedtest.net ei python-API ei hun, gallwch chi edrych arno Github.

Y peth da yw bod yna godau ffynhonnell y gellir eu gweld hefyd. Mae sut i weithio gyda'r API hwn (enghreifftiau syml) i'w gweld yn adran berthnasol.

Rwy'n gosod y llyfrgell python gyda'r gorchymyn canlynol.

sudo -H pip3 install speedtest-cli

Er enghraifft, gallwch chi hyd yn oed osod profwr cyflymder yn Ubuntu yn uniongyrchol o'r meddalwedd. Dyma'r un cymhwysiad python, y gellir ei lansio'n uniongyrchol o'r consol.

sudo apt install speedtest-cli -y

A mesur eich cyflymder Rhyngrwyd.

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

O ganlyniad, yn union fel y gwnes i. Roedd yn rhaid i mi fynd i mewn i godau ffynhonnell y prawf cyflymder hwn er mwyn eu gweithredu'n llawnach yn fy mhrosiect. Un o'r tasgau pwysicaf yw cael enw'r gweithredwr telathrebu er mwyn ei amnewid yn y plât.

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

Yma, hefyd, trodd popeth ddim mor syml, er y byddai'n ymddangos yn llawer symlach. I ddechrau, roedd y paramedr gweinyddwyr yn hafal i [], maen nhw'n dweud, dewiswch y gweinydd gorau. O ganlyniad, roedd gen i weinyddion ar hap, ac, fel y gallech chi ddyfalu, cyflymder amrywiol. Mae hwn yn bwnc eithaf cymhleth, ac mae angen ymchwil i ddefnyddio gweinydd sefydlog, os felly, statig neu ddeinamig. Ond dyma enghraifft o graffiau mesur cyflymder ar gyfer gweithredwr Beeline wrth ddewis gweinydd prawf ac un sefydlog yn ddeinamig.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE
Canlyniad mesur cyflymder wrth ddewis gweinydd deinamig.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE
Canlyniad profion cyflymder, gydag un gweinydd wedi'i ddewis yn llym.

Yn ystod y profion, mae “ffwr” yn y ddau le, ac mae angen ei dynnu gan ddefnyddio dulliau mathemategol. Ond gyda gweinydd sefydlog mae ychydig yn llai ac mae'r osgled yn fwy sefydlog.
Yn gyffredinol, mae hwn yn fan ymchwil gwych. A byddwn yn mesur cyflymder fy gweinydd gan ddefnyddio'r cyfleustodau iperf. Ond rydym yn cadw at y manylebau technegol.

Anfon post a gwallau

I anfon post, ceisiais sawl dwsin o wahanol opsiynau, ond yn y diwedd penderfynais ar y canlynol. Cofrestrais flwch post ar Yandex ac yna cymerais Dyma enghraifft o anfon post. Fe wnes i ei wirio a'i roi ar waith yn y rhaglen. Mae'r enghraifft hon yn archwilio opsiynau amrywiol, gan gynnwys anfon o gmail, ac ati. Nid oeddwn am drafferthu sefydlu fy gweinydd post ac nid oedd gennyf amser ar ei gyfer, ond fel y digwyddodd yn ddiweddarach, roedd hefyd yn ofer.

Anfonwyd y logiau yn ôl y trefnydd, os oes cysylltiad, bob 6 awr: am 00 o'r gloch, 06 am, hanner dydd a 12 pm. Wedi ei anfon fel y canlyn.

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

Anfonwyd gwallau i ddechrau hefyd. I ddechrau, cawsant eu cronni yn y rhestr, ac yna eu hanfon hefyd gan ddefnyddio'r amserlen, os oedd cysylltiad. Fodd bynnag, yna cododd problemau gyda'r ffaith bod gan Yandex gyfyngiad ar nifer y negeseuon a anfonir bob dydd (mae hyn yn boen, tristwch a chywilydd). Gan y gallai fod nifer enfawr o wallau hyd yn oed y funud, bu'n rhaid i ni roi'r gorau i anfon gwallau drwy'r post. Felly cadwch mewn cof wrth anfon gwybodaeth am broblem o'r fath yn awtomatig trwy wasanaethau Yandex.

Gweinydd adborth

Er mwyn cael mynediad at ddarn o galedwedd o bell a gallu ei addasu a'i ailgyflunio, roedd angen gweinydd allanol arnaf. Yn gyffredinol, i fod yn deg, byddai'n gywir anfon yr holl ddata i'r gweinydd ac adeiladu'r holl graffiau hardd yn y rhyngwyneb gwe. Ond nid y cyfan ar unwaith.

Ar gyfer VPS dewisais ruvds.com. Gallech chi gymryd y gweinydd symlaf. Ac yn gyffredinol, at fy nibenion byddai hyn yn ddigon. Ond gan na wnes i dalu am y gweinydd allan o fy mhoced fy hun, penderfynais ei gymryd gyda chronfa wrth gefn fechan fel y byddai'n ddigon pe baem yn defnyddio rhyngwyneb gwe, ein gweinydd SMTP ein hunain, VPN, ac ati. Hefyd, gallu sefydlu bot Telegram a pheidio â chael problemau wrth iddo gael ei rwystro. Felly, dewisais Amsterdam a'r paramedrau canlynol.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Fel dull o gyfathrebu â'r caledwedd, dewisodd vim2 gysylltiad ssh gwrthdro ac, fel y dangosodd arfer, nid dyma'r gorau. Os collir y cysylltiad, mae'r gweinydd yn dal y porthladd ac mae'n amhosibl cysylltu trwyddo am beth amser. Felly, mae'n dal yn well defnyddio dulliau cyfathrebu eraill, er enghraifft VPN. Yn y dyfodol roeddwn i eisiau newid i VPN, ond doedd gen i ddim amser.

Nid af i fanylion am sefydlu wal dân, cyfyngu ar hawliau, analluogi cysylltiadau ssh gwraidd a gwirebau eraill o sefydlu VPS. Hoffwn gredu eich bod chi'n gwybod popeth yn barod. Ar gyfer cysylltiad anghysbell, rwy'n creu defnyddiwr newydd ar y gweinydd.

adduser vimssh

Rwy'n cynhyrchu allweddi cysylltiad ssh ar ein caledwedd.

ssh-keygen

Ac rwy'n eu copïo i'n gweinydd.

ssh-copy-id [email protected]

Ar ein caledwedd, rwy'n creu cysylltiad ssh gwrthdroi awtomatig ar bob cychwyn.

[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

Rhowch sylw i borthladd 8083: mae'n pennu pa borthladd y byddaf yn ei ddefnyddio i gysylltu trwy ssh cefn. Ychwanegwch ef i gychwyn a chychwyn.

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

Gallwch hyd yn oed weld y statws:

sudo systemctl status autossh.service

Nawr, ar ein gweinydd VPS, os ydym yn rhedeg:

ssh -p 8083 khadas@localhost

Yna rwy'n cyrraedd fy narn prawf o galedwedd. Ac o'r caledwedd gallaf hefyd anfon logiau ac unrhyw ddata trwy ssh i'm gweinydd, sy'n gyfleus iawn.

Rhoi'r cyfan at ei gilydd

Prawf cyflymdra ar yr un pryd ar sawl modem LTE
Gan droi ymlaen, gadewch i ni ddechrau datblygu a dadfygio

Phew, wel, dyna ni, disgrifiais yr holl nodau. Nawr mae'n bryd rhoi'r cyfan at ei gilydd. Gallwch weld y cod yma.

Pwynt pwysig gyda'r cod: Efallai na fydd y prosiect hwn yn dechrau fel hyn, oherwydd ei fod wedi'i deilwra ar gyfer tasg benodol, o bensaernïaeth benodol. Er fy mod yn rhoi'r cod ffynhonnell, byddaf yn dal i egluro'r pethau mwyaf gwerthfawr yma, yn y testun, fel arall mae'n gwbl annealladwy.

Ar y dechrau, rwy'n cychwyn gps, gpio ac yn lansio edefyn amserlennydd ar wahân.

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

Mae'r trefnydd yn eithaf syml: mae'n edrych i weld a yw'r amser wedi dod i anfon negeseuon a beth yw'r statws gwall presennol. Os oes baner gwall, yna rydym yn blincio'r 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)

Rhan anoddaf y prosiect hwn yw cynnal y cysylltiad ssh cefn ar gyfer pob prawf. Mae pob prawf yn cynnwys ail-ffurfweddu'r porth rhagosodedig a gweinydd DNS. Gan nad oes neb yn darllen beth bynnag, gwyddoch nad yw'r trên yn reidio ar reiliau pren. Mae pwy bynnag sy'n dod o hyd i'r wy Pasg yn cael candy.

I wneud hyn, rwy'n creu tabl llwybro ar wahân -set-mark 0x2 a rheol i ailgyfeirio traffig.

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

Gallwch ddysgu mwy am sut mae'n gweithio darllenwch yn yr erthygl hon.

Ar ôl hynny rydw i'n mynd i mewn i ddolen ddiddiwedd, lle rydyn ni'n cael rhestr o modemau cysylltiedig bob tro (i ddarganfod a yw cyfluniad y rhwydwaith wedi newid yn sydyn).

network_list = getNetworklist()

Mae cael rhestr o ryngwynebau rhwydwaith yn eithaf syml.

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

Ar ôl derbyn y rhestr, gosodais gyfeiriadau IP i bob rhyngwyneb, fel y dangosais yn y llun yn y bennod am y 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")

Yna dwi'n mynd trwy bob rhyngwyneb mewn dolen. Ac rwy'n ffurfweddu pob rhyngwyneb.

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

Rwy'n gwirio'r rhyngwyneb am ymarferoldeb, os nad oes rhwydwaith, yna rwy'n cynhyrchu gwallau. Os oes rhwydwaith, yna mae'n bryd gweithredu!

Yma rwy'n ffurfweddu llwybro ssh i'r rhyngwyneb hwn (os nad yw wedi'i wneud), anfon gwallau i'r gweinydd os yw'r amser wedi dod, anfon logiau ac yn olaf rhedeg speedtest a chadw'r logiau i ffeil 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()
#и далее тестируем скорость и сохраняем логи. 

Mae'n werth sôn am swyddogaeth sefydlu ssh cefn.

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

Ac wrth gwrs, mae angen ichi ychwanegu'r holl harddwch hwn at gychwyn. I wneud hyn dwi'n creu ffeil:

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

Ac rwy'n ysgrifennu ynddo:

[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

Rwy'n troi autoloading ymlaen ac yn dechrau!

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

Nawr gallaf weld logiau o'r hyn sy'n digwydd gan ddefnyddio'r gorchymyn:

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

Canfyddiadau

Wel, nawr y peth pwysicaf yw, beth ddigwyddodd o ganlyniad? Dyma ychydig o graffiau y llwyddais i eu dal yn ystod y broses ddatblygu a dadfygio. Adeiladwyd y graffiau gan ddefnyddio gnuplot gyda'r sgript ganlynol.

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

Roedd y profiad cyntaf gyda gweithredwr Tele2, a gynhaliais am sawl diwrnod.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Yma defnyddiais weinydd mesur deinamig. Mae mesuriadau cyflymder yn gweithio, ond yn amrywio'n fawr, ond mae rhywfaint o werth cyfartalog yn dal i'w weld, a gellir cael hyn trwy hidlo'r data, er enghraifft, gyda chyfartaledd symudol.

Yn ddiweddarach adeiladais nifer o graffiau ar gyfer gweithredwyr telathrebu eraill. Yn yr achos hwn, roedd un gweinydd profi eisoes, ac roedd y canlyniadau hefyd yn ddiddorol iawn.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Fel y gallwch weld, mae'r pwnc yn helaeth iawn ar gyfer ymchwil a phrosesu'r data hwn, ac yn amlwg nid yw'n para am ychydig wythnosau o waith. Ond…

Canlyniad y gwaith

Cwblhawyd y gwaith yn sydyn oherwydd amgylchiadau y tu hwnt i'm rheolaeth. Un o wendidau'r prosiect hwn, yn fy marn oddrychol i, oedd y modem, nad oedd wir eisiau gweithio ar yr un pryd â modemau eraill, ac yn gwneud triciau o'r fath bob tro y'i llwythwyd. At y dibenion hyn, mae yna nifer fawr o fodelau modem eraill; fel arfer maent eisoes yn y fformat Mini PCI-e ac wedi'u gosod y tu mewn i'r ddyfais ac maent yn llawer haws eu ffurfweddu. Ond mae honno'n stori hollol wahanol. Roedd y prosiect yn ddiddorol ac roeddwn yn falch iawn fy mod wedi gallu cymryd rhan ynddo.

Prawf cyflymdra ar yr un pryd ar sawl modem LTE

Ffynhonnell: hab.com

Ychwanegu sylw