Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Карантин кезінде маған бірнеше ұялы байланыс операторлары үшін LTE модемдерінің жылдамдығын өлшейтін құрылғыны әзірлеуге қатысу ұсынылды.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Тұтынушы LTE қосылымын, мысалы, бейнехабарларды тарату үшін жабдықты орнату кезінде қай ұялы байланыс операторы ең оңтайлы екенін түсіну үшін әртүрлі географиялық орындардағы әртүрлі байланыс операторларының жылдамдығын бағалағысы келді. Сонымен қатар, мәселені қымбат жабдықсыз, мүмкіндігінше қарапайым және арзан шешуге тура келді.

Мен бірден айтамын, бұл тапсырма ең қарапайым және ең көп білімді қажет етеді, мен сізге қандай мәселелерге тап болғанымды және оларды қалай шешкенімді айтамын. Ендеше, кеттік.

ескерту

LTE қосылымының жылдамдығын өлшеу өте күрделі мәселе: дұрыс жабдықты және өлшеу техникасын таңдау керек, сондай-ақ ұялы желі топологиясы мен жұмысын жақсы түсіну керек. Сонымен қатар, жылдамдыққа бірнеше факторлар әсер етуі мүмкін: ұяшықтағы абоненттер саны, ауа райы жағдайлары, тіпті ұяшықтан ұяшыққа жылдамдық желі топологиясына байланысты күрт өзгеруі мүмкін. Тұтастай алғанда, бұл белгісіздердің үлкен саны бар мәселе және оны тек байланыс операторы дұрыс шеше алады.

Бастапқыда тұтынушы курьерді операторлардың телефондарымен жүргізіп, тікелей телефон арқылы өлшеу жүргізгісі келді, содан кейін жылдамдықты өлшеу нәтижелерін ноутбукке жазғысы келді. Lte желілерінің жылдамдығын өлшеуге арналған менің шешімім идеалды болмаса да, мәселені шешеді.

Уақыттың тапшылығына байланысты мен ыңғайлылық немесе практикалық емес, даму жылдамдығын жақтайтын шешімдер қабылдадым. Мысалы, серверді және әрбір жеке клиентті орнату уақытын үнемдеу үшін практикалық VPN орнына қашықтан қол жеткізу үшін кері ssh пайдаланылды.

Техникалық тапсырма

Мақалада айтылғандай Техникалық сипаттамаларсыз: неге клиент мұны қаламайды: Техникалық сипаттамаларсыз жұмыс істемеңіз! Ешқашан, еш жерде!

Техникалық тапсырма өте қарапайым болды, мен оны соңғы пайдаланушының түсінуі үшін аздап кеңейтемін. Техникалық шешімдер мен жабдықты таңдауды тапсырыс беруші белгіледі. Сонымен, техникалық сипаттаманың өзі барлық мақұлдаулардан кейін:

Бір борттық компьютерге негізделген vim2 H модемдері арқылы lte қосылымдары үшін жылдамдықты тексеру құралын жасаңызuawei e3372h - 153 бірнеше байланыс операторлары (бірден n дейін). Сондай-ақ UART арқылы қосылған GPS қабылдағышынан координаттарды алу қажет. Қызметті пайдаланып жылдамдықты өлшеңіз www.speedtest.net және оларды келесідей кестеге қойыңыз:

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Csv пішіміндегі кесте. Содан кейін бұл белгіні әр 6 сағат сайын электрондық пошта арқылы жіберіңіз. Қателер болған жағдайда GPIO желісіне қосылған жарық диодты жыпылықтаңыз.

Мен көптеген мақұлдаулардан кейін техникалық сипаттамаларды еркін түрде сипаттадым. Бірақ тапсырманың мәні қазірдің өзінде көрінеді. Барлығына бір апта берілді. Бірақ іс жүзінде бұл үш аптаға созылды. Бұл менің негізгі жұмысымнан кейін және демалыс күндері ғана осылай істегенімді ескере отырып.

Бұл жерде тағы да назар аударғым келеді, бұл тапсырыс беруші жылдамдықты өлшеу қызметі мен аппараттық құралдарды пайдалану туралы алдын ала келіскен, бұл менің мүмкіндіктерімді айтарлықтай шектеді. Бюджет те шектеулі болды, сондықтан ерекше ештеңе сатып алынған жоқ. Сондықтан біз осы ережелер бойынша ойнауымыз керек еді.

Сәулет және даму

Схема қарапайым және түсінікті. Сондықтан, мен оны арнайы түсініктемесіз қалдырамын.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Мен бұл тілде даму тәжірибем болмағанына қарамастан, бүкіл жобаны python тілінде жүзеге асыруды шештім. Мен оны таңдадым, өйткені дамуды тездететін көптеген дайын мысалдар мен шешімдер бар. Сондықтан мен барлық кәсіби бағдарламашылардан python тіліндегі алғашқы даму тәжірибемді ұрыспауларын сұраймын және мен өз дағдыларымды жетілдіру үшін сындарлы сындарды естуге әрқашан қуаныштымын.

Сондай-ақ, процесте мен питонның екі жұмыс істейтін 2 және 3 нұсқасы бар екенін білдім, нәтижесінде мен үшіншіге орналастым.

Аппараттық түйіндер

Бір пластиналы vim2

Маған негізгі машина ретінде бір тақталы компьютер берілді vim2

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Ақылды үй мен SMART-теледидарға арналған тамаша, қуатты медиа процессор, бірақ бұл тапсырма үшін өте жарамсыз немесе, айталық, нашар жарамды. Мысалы, оның негізгі ОЖ Android болып табылады, ал Linux қосымша ОЖ болып табылады және сәйкесінше Linux астында барлық түйіндер мен драйверлердің жоғары сапалы жұмысына ешкім кепілдік бермейді. Менің ойымша, кейбір мәселелер осы платформаның USB драйверлеріне қатысты болды, сондықтан модемдер бұл тақтада күткендей жұмыс істемеді. Сондай-ақ өте нашар және шашыраңқы құжаттамаға ие, сондықтан әрбір операция доктарды қазуға көп уақытты алды. Тіпті GPIO-мен қарапайым жұмыс көп қан алды. Мысалы, жарық диодты орнату үшін маған бірнеше сағат қажет болды. Бірақ объективті болу үшін оның қандай бір тақта екені маңызды емес еді, ең бастысы ол жұмыс істеді және USB порттары болды.

Алдымен осы тақтаға Linux орнатуым керек. Барлық адамдар үшін, сондай-ақ осы бір тақталы жүйемен айналысатындар үшін құжаттаманың жабайы түрлерін іздемеу үшін мен осы тарауды жазып жатырмын.

Linux орнатудың екі нұсқасы бар: сыртқы SD картасында немесе ішкі MMC. Мен оны картамен қалай жұмыс істеуге болатынын анықтауға тырысып, бір кеш өткіздім, сондықтан мен оны MMC-ге орнатуды шештім, бірақ сыртқы картамен жұмыс істеу әлдеқайда оңай болатыны сөзсіз.

Микробағдарлама туралы мұнда қисық айтылды. Мен бейтаныс тілден орыс тіліне аударамын. Тақтаны жыпылықтау үшін UART аппараттық құралын қосу керек. Оны қосты келесідей.

  • GND құрал түйреуіші: <—> VIM құрылғыларының GPIO пин17
  • Құрал түйреушісі TXD: <—> VIM GPIO (Linux_Rx) 18 Pin
  • Құрал пин RXD: <—> VIM GPIO (Linux_Tx) Pin19
  • Құрал түйнігі VCC: <—> VIM GPIO 20 Pin

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Осыдан кейін микробағдарламаны жүктеп алдым мұнда. Арнайы микробағдарлама нұсқасы VIM1_Ubuntu-сервер-bionic_Linux-4.9_arm64_EMMC_V20191231.

Бұл микробағдарламаны жүктеп салу үшін маған утилиталар қажет. Бұл туралы толығырақ осында. Мен оны Windows жүйесінде жыпылықтауға тырыспадым, бірақ Linux жүйесіндегі микробағдарлама туралы бірнеше сөз айтуым керек. Алдымен мен утилиталарды нұсқауларға сәйкес орнатамын.

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

Ааа... Ештеңе істемейді. Мен орнату сценарийлерін өңдеуге бірнеше сағат жұмсадым, сонда бәрі маған дұрыс орнатылады. Ол жерде не істегенім есімде жоқ, бірақ аттар бар цирк те болды. Сондықтан сақ болыңыз. Бірақ бұл утилиталарсыз vim2-ні одан әрі қинаудың мағынасы жоқ. Онымен мүлде араласпағаныңыз жөн!

Тозақтың жеті шеңберінен, сценарийді конфигурациялаудан және орнатудан кейін мен жұмыс істейтін утилиталар пакетін алдым. Мен тақтаны USB арқылы Linux компьютеріне қостым, сонымен қатар жоғарыдағы диаграммаға сәйкес UART қостым.
Мен өзімнің сүйікті миником терминалымды аппараттық және бағдарламалық құрал қателерін бақылаусыз 115200 жылдамдыққа орнатып жатырмын. Ал, бастайық.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

UART терминалында VIM2 жүктеген кезде, жүктеуді тоқтату үшін бос орын сияқты пернені басамын. Сызық пайда болғаннан кейін

kvim2# 

Мен пәрменді енгіземін:

kvim2# run update

Біз жүктеп жатқан хостта мен орындаймын:

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

Болды, уф. Мен тексердім, тақтада Linux бар. Логин/пароль khadas:khadas.

Осыдан кейін кейбір кішігірім бастапқы параметрлер. Әрі қарай жұмыс істеу үшін мен sudo паролін өшіремін (иә, қауіпсіз емес, бірақ ыңғайлы).

sudo visudo

Пішінге жолды өңдеп, сақтаймын

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

Содан кейін мен қазіргі тілді уақыт Мәскеуде болатындай етіп өзгертемін, әйтпесе Гринвичте болады.

sudo timedatectl set-timezone Europe/Moscow

немесе

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

Егер сізге қиын болса, онда бұл тақтаны пайдаланбаңыз; Raspberry Pi жақсырақ. Шынымды айтсам.

Модем Huawei e3372h – 153

Бұл модем мен үшін қанның маңызды көзі болды және шын мәнінде ол бүкіл жобаның тар мойнына айналды. Жалпы, бұл құрылғыларға арналған «модем» атауы жұмыстың мәнін мүлдем көрсетпейді: бұл қуатты комбайн, бұл жабдықта драйверлерді орнату үшін CD-ROM сияқты көрінетін композиттік құрылғы бар, содан кейін желілік карта режиміне ауысады.

Архитектуралық тұрғыдан, Linux пайдаланушысының көзқарасы бойынша, барлық параметрлерден кейін, ол келесідей көрінеді: модемді қосқаннан кейін менде dhcp арқылы 192.168.8.100 IP мекенжайын және әдепкі шлюзді алатын eth* желілік интерфейсі бар. 192.168.8.1 болып табылады.

Және ең маңызды сәт! Бұл модем үлгісі AT командаларымен басқарылатын модем режимінде жұмыс істей алмайды. Барлығы әлдеқайда қарапайым болар еді, әр модем үшін PPP қосылымдарын жасаңыз, содан кейін олармен жұмыс жасаңыз. Бірақ менің жағдайда «өзі» (дәлірек айтқанда, udev ережелеріне сәйкес Linux дивері) eth интерфейсін жасайды және оған dhcp арқылы IP мекенжайын тағайындайды.

Бұдан әрі шатастырмау үшін мен «модем» сөзін ұмытып, желілік карта және шлюз деп айтуды ұсынамын, өйткені бұл шын мәнінде жаңа желілік картаны шлюзмен қосу сияқты.
Бір модем болғанда, бұл ешқандай ерекше проблемаларды тудырмайды, бірақ біреуден көп, атап айтқанда n-дана болған кезде келесі желілік сурет пайда болады.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Яғни, бірдей IP мекенжайы бар, әрқайсысының әдепкі шлюзі бірдей n желілік карта. Бірақ іс жүзінде олардың әрқайсысы өз операторына қосылған.

Бастапқыда менде қарапайым шешім болды: ifconfig немесе ip пәрменін пайдаланып, барлық интерфейстерді өшіріп, біреуін кезекпен қосыңыз және оны тексеріңіз. Шешім барлығына жақсы болды, тек ауысу кезінде мен құрылғыға қосыла алмадым. Ал ауысу жиі және жылдам болғандықтан, менде мүлдем қосылу мүмкіндігі болмады.

Сондықтан мен модемдердің IP мекенжайларын қолмен өзгерту жолын таңдадым, содан кейін маршруттау параметрлері арқылы трафикті жүргіздім.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Бұл модемдерге қатысты проблемаларымның соңы емес еді: қуат ақаулары болған жағдайда олар құлап кетті және USB хабына жақсы тұрақты қуат көзі қажет болды. Мен бұл мәселені қуатты тікелей хабқа қатты дәнекерлеу арқылы шештім. Мен кездескен және бүкіл жобаны бұзған тағы бір мәселе: құрылғыны қайта жүктегеннен немесе салқын іске қосқаннан кейін барлық модемдер анықталмады және әрқашан емес, мен бұл неліктен және қандай алгоритммен болғанын анықтай алмадым. Бірақ бірінші нәрсе.

Модем дұрыс жұмыс істеуі үшін мен usb-modeswitch бумасын орнаттым.

sudo apt update
sudo apt install -y usb-modeswitch

Осыдан кейін, қосылғаннан кейін модемді udev ішкі жүйесі дұрыс анықтайды және конфигурациялайды. Мен модемді жай ғана қосу және желі пайда болуын тексеру арқылы тексеремін.
Мен шеше алмаған тағы бір мәселе: осы модемнен біз жұмыс істеп жатқан оператордың атын қалай алуға болады? Оператор атауы модемнің веб-интерфейсінде 192.168.8.1. Бұл Ajax сұраулары арқылы деректерді қабылдайтын динамикалық веб-бет, сондықтан жай ғана бетті ашу және атауды талдау жұмыс істемейді. Сондықтан мен веб-парақшаны қалай әзірлеуге болатынын және т.б. қарай бастадым және қандай да бір ақымақтық жасап жатқанымды түсіндім. Нәтижесінде ол түкірді, ал оператор Speedtest API арқылы қабылдай бастады.

Модемге AT пәрмендері арқылы қол жеткізу оңайырақ болар еді. Оны қайта конфигурациялауға, ppp қосылымын жасауға, IP тағайындауға, байланыс операторын алуға және т.б. мүмкін болар еді. Бірақ, өкінішке орай, мен маған берілген нәрсемен жұмыс істеймін.

GPS

Маған берілген GPS қабылдағышында UART интерфейсі мен қуаты болды. Бұл ең жақсы шешім емес еді, бірақ ол әлі де жұмыс істейтін және қарапайым болды. Қабылдағыш мынандай көрінді.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Шынымды айтсам, бұл менің GPS қабылдағышпен бірінші рет жұмыс істеуім еді, бірақ мен күткендей, бәрі біз үшін бұрыннан ойластырылған. Сондықтан біз тек дайын шешімдерді қолданамыз.

Алдымен GPS қосу үшін uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) қосамын.

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

Содан кейін мен операцияның сәттілігін тексеремін.

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

Бұл пәрмен devtree-ді жылдам өңдейді, бұл өте ыңғайлы.

Бұл операция сәтті болғаннан кейін GPS демонын қайта жүктеп, орнатыңыз.

khadas@Khadas:~$ sudo reboot

GPS демонын орнату. Мен бәрін орнатып, одан әрі конфигурациялау үшін оны дереу кесіп тастаймын.

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

Параметрлер файлын өңдеу.

sudo vim /etc/default/gpsd

Мен GPS ілінетін UART орнатып жатырмын.

DEVICES="/dev/ttyS4"

Содан кейін біз бәрін қосып, бастаймыз.

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

Осыдан кейін мен GPS-ті қосамын.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

GPS сымы менің қолымда, UART отладчик сымдары саусақтардың астында көрінеді.

Мен gpsmon бағдарламасы арқылы GPS жұмысын қайта жүктеп, тексеремін.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Сіз бұл скриншотта жерсеріктерді көре алмайсыз, бірақ GPS қабылдағышымен байланысты көре аласыз, бұл бәрі жақсы дегенді білдіреді.

Питонда мен осы демонмен жұмыс істеудің көптеген нұсқаларын қолданып көрдім, бірақ мен python 3-пен дұрыс жұмыс істейтін нұсқаны таңдадым.

Мен қажетті кітапхананы орнатамын.

sudo -H pip3 install gps3 

Мен жұмыс кодексін мүсіндедім.

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

Егер маған координаттарды алу қажет болса, бұл келесі қоңыраумен орындалады:

longitude, latitude = getPositionData(agps_thread)

Ал 1-10 секунд ішінде мен координатаны аламын немесе алмаймын. Иә, мен координаттарды алуға он әрекет жасадым. Оңтайлы емес, қисық және қисық, бірақ ол жұмыс істейді. Мен мұны істеуді шештім, себебі GPS нашар қабылдауы мүмкін және әрқашан деректерді қабылдай бермейді. Егер сіз деректерді алуды күтсеңіз, қашықтағы бөлмеде жұмыс істесеңіз, бағдарлама осы жерде қатып қалады. Сондықтан мен бұл талғамсыз нұсқаны іске асырдым.

Негізінде, егер көбірек уақыт болса, GPS-тен деректерді UART арқылы тікелей алуға, оны бөлек ағынға талдауға және онымен жұмыс істеуге болады. Бірақ уақыт мүлде болмады, сондықтан қатыгез ұсқынсыз код. Иә, мен ұялмаймын.

Жарық диоды

Жарық диодты қосу бір уақытта қарапайым және қиын болды. Негізгі қиындық жүйедегі пин нөмірі тақтадағы пин нөміріне сәйкес келмеуі және құжаттаманың сол жағында жазылғандықтан. Операциялық жүйедегі аппараттық пин нөмірі мен пин нөмірін салыстыру үшін келесі пәрменді орындау керек:

gpio readall

Жүйедегі және тақтадағы пин сәйкестіктерінің кестесі көрсетіледі. Осыдан кейін мен операциялық жүйенің өзінде түйреуішті басқара аламын. Менің жағдайда жарық диоды қосылған GPIOH_5.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

GPIO істікшесін шығыс режиміне ауыстырамын.

gpio -g mode 421 out

Мен нөлді жазамын.

gpio -g write 421 0

Біреуін жазамын.

gpio -g write 421 1

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру
«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)

Енді қателер туындаған жағдайда, error_blink() деп атаймын және жарық диоды әдемі жыпылықтайды.

Бағдарламалық қамтамасыз ету түйіндері

Speedtest API

Speedtest.net қызметінде өзінің python-API бар екендігі үлкен қуаныш, оны қарауға болады. GitHub.

Жақсы нәрсе - көруге болатын бастапқы кодтар бар. Бұл API-мен жұмыс істеу жолы (қарапайым мысалдар) мына жерден табуға болады тиісті бөлім.

Мен python кітапханасын келесі пәрменмен орнатамын.

sudo -H pip3 install speedtest-cli

Мысалы, Ubuntu жүйесінде жылдамдықты тексеру құралын тікелей бағдарламалық құралдан орнатуға болады. Бұл консольден тікелей іске қосылуы мүмкін бірдей питон қолданбасы.

sudo apt install speedtest-cli -y

Және интернет жылдамдығын өлшеңіз.

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

Нәтижесінде мен сияқты. Мен оларды жобама толық енгізу үшін осы жылдамдықты тексерудің бастапқы кодтарына кіруім керек болды. Ең маңызды міндеттердің бірі - байланыс операторының атын пластинаға ауыстыру үшін алу.

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

Мұнда да бәрі оңай емес болып шықты, бірақ ол әлдеқайда қарапайым болып көрінді. Бастапқыда серверлер параметрі тең болды [], олар ең жақсы серверді таңдайды дейді. Нәтижесінде менде кездейсоқ серверлер болды, және сіз болжағандай, айнымалы жылдамдық. Бұл өте күрделі тақырып, тұрақты серверді пайдалану, егер солай болса, статикалық немесе динамикалық, зерттеуді қажет етеді. Бірақ мұнда сынақ серверін және статикалық бекітілгенін динамикалық таңдау кезінде Beeline операторы үшін жылдамдықты өлшеу графиктерінің мысалы келтірілген.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру
Динамикалық серверді таңдау кезінде жылдамдықты өлшеу нәтижесі.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру
Бір қатаң таңдалған бір сервермен жылдамдықты сынау нәтижесі.

Тестілеу кезінде екі жерде де «жүн» бар, оны математикалық әдістермен алып тастау керек. Бірақ тіркелген серверде ол азырақ және амплитудасы тұрақтырақ.
Жалпы, бұл үлкен зерттеу орны. Мен iperf утилитасын пайдаланып серверімнің жылдамдығын өлшейтін едім. Бірақ біз техникалық сипаттамаларды ұстанамыз.

Хаттарды жіберу және қателер

Пошта жіберу үшін мен бірнеше ондаған түрлі опцияларды қолданып көрдім, бірақ соңында мен келесіге тоқталдым. Мен Яндекске пошта жәшігін тіркедім, содан кейін алдым Бұл поштаны жіберудің мысалы. Мен оны тексеріп, бағдарламаға енгіздім. Бұл мысал әртүрлі опцияларды, соның ішінде gmail поштасынан жіберуді және т.б. қарастырады. Мен өзімнің пошта серверімді орнатумен айналысқым келмеді және оған уақыт болмады, бірақ кейінірек белгілі болғандай, бұл да бекер болды.

Журналдар жоспарлаушыға сәйкес жіберілді, байланыс болса, әр 6 сағат сайын: сағат 00, 06, 12 және 18. Оны келесідей жіберді.

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

Қателер де бастапқыда жіберілді. Бастау үшін олар тізімде жинақталды, содан кейін байланыс болған жағдайда жоспарлаушы арқылы жіберілді. Алайда, содан кейін Яндекстің күніне жіберілетін хабарламалар санына шектеу бар екендігімен проблемалар туындады (бұл ауырсыну, қайғы және қорлау). Тіпті минутына көптеген қателер болуы мүмкін болғандықтан, бізге пошта арқылы қате жіберуден бас тартуға тура келді. Сондықтан Яндекс қызметтері арқылы мұндай мәселе туралы ақпаратты автоматты түрде жіберген кезде есте сақтаңыз.

Кері байланыс сервері

Қашықтағы аппараттық құралға қол жеткізу және оны теңшеу және қайта конфигурациялау үшін маған сыртқы сервер қажет болды. Жалпы, әділдік үшін барлық деректерді серверге жіберіп, веб-интерфейстегі барлық әдемі графиктерді құрастыру дұрыс болар еді. Бірақ бәрі бірден емес.

VPS үшін мен таңдадым ruvds.com. Сіз ең қарапайым серверді ала аласыз. Жалпы, менің мақсаттарым үшін бұл жеткілікті болар еді. Бірақ мен серверге өз қалтамнан ақы төлемегендіктен, веб-интерфейсті, жеке SMTP серверін, VPN-ді және т. Сонымен қатар, Telegram ботын орнатып, оның бұғатталуына байланысты проблемалар туындамайды. Сондықтан мен Амстердамды және келесі параметрлерді таңдадым.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Аппараттық құралмен байланысу әдісі ретінде vim2 кері ssh қосылымын таңдады және тәжірибе көрсеткендей, бұл ең жақсы емес. Қосылым жоғалса, сервер портты ұстайды және ол арқылы біраз уақытқа қосылу мүмкін емес. Сондықтан басқа байланыс әдістерін қолданған дұрыс, мысалы, VPN. Болашақта мен VPN-ге ауысқым келді, бірақ уақыт болмады.

Мен брандмауэр орнату, құқықтарды шектеу, түбірлік ssh қосылымдарын өшіру және VPS орнатудың басқа да труизмдері туралы егжей-тегжейлерге тоқталмаймын. Мен сенгім келеді, сенің бәрін білесің. Қашықтағы қосылым үшін мен серверде жаңа пайдаланушы жасаймын.

adduser vimssh

Мен аппараттық құралда ssh қосылым кілттерін жасаймын.

ssh-keygen

Мен оларды серверімізге көшіремін.

ssh-copy-id [email protected]

Біздің аппараттық құралда мен әр жүктеу кезінде автоматты кері ssh қосылымын жасаймын.

[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

8083 портына назар аударыңыз: ол кері ssh арқылы қосылу үшін қай портты пайдаланатынымды анықтайды. Оны іске қосуға қосыңыз және бастаңыз.

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

Сіз тіпті күйді көре аласыз:

sudo systemctl status autossh.service

Енді біздің VPS серверінде, егер біз іске қоссақ:

ssh -p 8083 khadas@localhost

Содан кейін мен аппараттық құралдың сынақ бөлігіне өтемін. Аппараттық құралдан мен журналдарды және кез келген деректерді ssh арқылы серверіме жібере аламын, бұл өте ыңғайлы.

Оны бәріне бірге қою

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру
Қосып, әзірлеуді және жөндеуді бастайық

Уф, міне, мен барлық түйіндерді сипаттадым. Енді барлығын біріктіретін кез келді. Сіз кодты көре аласыз мұнда.

Кодтың маңызды сәті: Бұл жоба осылай басталмауы мүмкін, себебі ол белгілі бір тапсырмаға, нақты архитектураға бейімделген. Бастапқы кодты берсем де, мен ең құнды нәрселерді осы жерде, дәл мәтінде түсіндіремін, әйтпесе бұл мүлдем түсініксіз.

Бастапқыда мен gps, gpio инициализациясын және бөлек жоспарлаушы ағынын іске қосамын.

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

Жоспарлаушы өте қарапайым: ол хабарларды жіберу уақыты келген-келмегенін және ағымдағы қате күйінің қандай екенін көреді. Егер қате жалаушасы болса, біз жарық диоды жыпылықтайды.

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

Бұл жобаның ең қиын бөлігі әрбір сынақ үшін кері ssh қосылымын сақтау болып табылады. Әрбір сынақ әдепкі шлюзді және DNS серверін қайта конфигурациялауды қамтиды. Ешкім бәрібір оқымайтындықтан, пойыздың ағаш рельсте жүрмейтінін біліңіз. Пасха жұмыртқасын тапқан адам кәмпит алады.

Ол үшін мен бөлек маршруттау кестесін жасаймын - 0x2 белгілеу және трафикті қайта бағыттау ережесі.

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

Оның қалай жұмыс істейтіні туралы көбірек біле аласыз осы мақалада оқыңыз.

Осыдан кейін мен шексіз циклге өтемін, онда біз қосылған модемдердің тізімін әр кезде аламыз (желінің конфигурациясының кенеттен өзгергенін білу үшін).

network_list = getNetworklist()

Желілік интерфейстердің тізімін алу өте қарапайым.

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

Тізімді алғаннан кейін модем туралы тараудағы суретте көрсеткендей барлық интерфейстерге IP мекенжайларын қойдым.

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

Содан кейін мен әрбір интерфейсті цикл арқылы өткіземін. Мен әр интерфейсті конфигурациялаймын.

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

Мен интерфейстің функционалдығын тексеремін, егер желі болмаса, қателер жасаймын. Егер желі болса, әрекет ету уақыты келді!

Мұнда мен осы интерфейске ssh маршруттауын конфигурациялаймын (егер ол жасалмаған болса), уақыт келгенде серверге қателерді жіберемін, журналдарды жіберемін және соңында жылдамдықты тексеруді іске қосамын және журналдарды 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()
#и далее тестируем скорость и сохраняем логи. 

Кері 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")

Және, әрине, стартапқа осы сұлулықтың бәрін қосу керек. Мұны істеу үшін мен файлды жасаймын:

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

Мен оған жазамын:

[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

Автоматты жүктеуді қосып, бастаймын!

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

Енді пәрмен арқылы не болып жатқанын журналдарын көре аламын:

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

нәтижелері

Енді, ең бастысы, нәтижесінде не болды? Міне, әзірлеу және жөндеу процесінде мен түсіре алған бірнеше графиктер. Графиктер келесі сценариймен gnuplot көмегімен құрастырылды.

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

Алғашқы тәжірибе Tele2 операторымен болды, мен оны бірнеше күн бойы жүргіздім.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Мұнда мен динамикалық өлшеу серверін қолдандым. Жылдамдықты өлшеу жұмыс істейді, бірақ өте өзгереді, бірақ кейбір орташа мән әлі де көрінеді және оны деректерді сүзу арқылы алуға болады, мысалы, қозғалатын орташа мәнмен.

Кейінірек мен басқа байланыс операторлары үшін бірқатар графиктер құрастырдым. Бұл жағдайда бір тестілеу сервері болды және нәтижелер де өте қызықты болды.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Көріп отырғаныңыздай, тақырып бұл деректерді зерттеу және өңдеу үшін өте кең және бірнеше апталық жұмысқа созылмайды. Бірақ…

Жұмыстың нәтижесі

Менің қолымнан келмейтін жағдайларға байланысты жұмыс кенеттен аяқталды. Бұл жобаның бір осал тұсы, менің субъективті пікірімше, модем болды, ол шынымен де басқа модемдермен бір уақытта жұмыс істегісі келмеді және жүктелген сайын осындай қулықтар жасайды. Осы мақсаттар үшін басқа модем үлгілерінің үлкен саны бар; әдетте олар қазірдің өзінде Mini PCI-e пішімінде және құрылғының ішіне орнатылған және конфигурациялау оңайырақ. Бірақ бұл мүлдем басқа әңгіме. Жоба қызықты болды және мен оған қатыса алғаныма өте қуаныштымын.

Бірнеше LTE модемінде бір мезгілде жылдамдықты тексеру

Ақпарат көзі: www.habr.com

пікір қалдыру