Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Karantin paytida menga bir nechta uyali aloqa operatorlari uchun LTE modemlari tezligini o'lchash qurilmasini ishlab chiqishda ishtirok etish taklif qilindi.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Mijoz, masalan, video eshittirishlar uchun LTE ulanishidan foydalangan holda uskunani o'rnatishda qaysi uyali aloqa operatori o'zi uchun eng maqbul ekanligini tushunish uchun turli xil geografik joylardagi turli aloqa operatorlarining tezligini baholamoqchi edi. Shu bilan birga, muammoni imkon qadar sodda va arzon narxda, qimmatbaho uskunalarsiz hal qilish kerak edi.

Men darhol aytamanki, vazifa eng oddiy va eng bilim talab qiladigan vazifa emas, men sizga qanday muammolarga duch kelganimni va ularni qanday hal qilganimni aytib beraman. Xo'sh, ketaylik.

nota

LTE ulanish tezligini o'lchash juda murakkab masala: siz to'g'ri uskuna va o'lchash texnikasini tanlashingiz, shuningdek, uyali tarmoq topologiyasi va ishlashini yaxshi tushunishingiz kerak. Bundan tashqari, tezlikka bir nechta omillar ta'sir qilishi mumkin: hujayradagi abonentlar soni, ob-havo sharoiti, hatto hujayradan hujayragacha tezlik tarmoq topologiyasi tufayli keskin farq qilishi mumkin. Umuman olganda, bu juda ko'p sonli noma'lum muammodir va faqat aloqa operatori uni to'g'ri hal qilishi mumkin.

Dastlab, mijoz faqat kurerni operatorlarning telefonlari bilan haydashni, to'g'ridan-to'g'ri telefonda o'lchovlarni olishni va keyin tezlikni o'lchash natijalarini daftarga yozishni xohladi. Lte tarmoqlarining tezligini o'lchash bo'yicha mening yechimim ideal bo'lmasa ham, muammoni hal qiladi.

Vaqt yo'qligi sababli men qulaylik yoki amaliylik foydasiga emas, balki rivojlanish tezligi foydasiga qarorlar qabul qildim. Masalan, serverni va har bir mijozni sozlashda vaqtni tejash uchun amaliyroq VPN o'rniga masofaviy kirish uchun teskari ssh ishlatilgan.

Texnik vazifa

Maqolada aytilganidek Texnik xususiyatlarsiz: nima uchun mijoz buni xohlamaydi: Texnik shartlarsiz ishlamang! Hech qachon, hech qayerda!

Texnik vazifa juda oddiy edi, men oxirgi foydalanuvchi tushunishi uchun uni biroz kengaytiraman. Texnik echimlar va jihozlarni tanlash mijoz tomonidan belgilandi. Shunday qilib, texnik xususiyatlarning o'zi, barcha tasdiqlashlardan keyin:

Bitta platali kompyuterga asoslangan vim2 H modemlari orqali lte ulanishlari uchun tezlikni tekshirgichni yaratinguawei e3372h - 153 bir nechta aloqa operatorlari (birdan n gacha). Shuningdek, UART orqali ulangan GPS qabul qilgichdan koordinatalarni olish kerak. Xizmatdan foydalanib tezlikni o'lchashni amalga oshiring www.speedtest.net va ularni jadvalga qo'ying:

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Csv formatida jadval. Keyin bu belgini har 6 soatda elektron pochta orqali yuboring. Xatolar bo'lsa, GPIO ga ulangan LEDni o'chiring.

Men texnik xususiyatlarni ko'plab tasdiqlashlardan keyin bepul shaklda tasvirlab berdim. Ammo vazifaning ma'nosi allaqachon ko'rinib turibdi. Hamma narsa uchun bir hafta berildi. Ammo aslida bu uch hafta davom etdi. Bu men buni faqat asosiy ishimdan keyin va dam olish kunlari qilganimni hisobga olgan holda.

Bu erda yana bir bor e'tiborni mijoz tezlikni o'lchash xizmati va apparat vositalaridan foydalanish bo'yicha oldindan kelishib olganiga e'tibor qaratmoqchiman, bu mening imkoniyatlarimni sezilarli darajada cheklab qo'ydi. Byudjet ham cheklangan edi, shuning uchun maxsus hech narsa sotib olinmadi. Shuning uchun biz ushbu qoidalar bo'yicha o'ynashimiz kerak edi.

Arxitektura va rivojlanish

Sxema oddiy va tushunarli. Shuning uchun men uni hech qanday maxsus izohlarsiz qoldiraman.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Men bu tilni rivojlantirish bo'yicha umuman tajribam bo'lmaganiga qaramay, butun loyihani python tilida amalga oshirishga qaror qildim. Men buni tanladim, chunki rivojlanishni tezlashtiradigan tayyor misollar va echimlar to'plami bor edi. Shuning uchun, men barcha professional dasturchilardan python-da rivojlanish bo'yicha birinchi tajribamni tanqid qilmasliklarini so'rayman va men o'z mahoratimni oshirish uchun konstruktiv tanqidlarni eshitishdan doimo xursandman.

Bundan tashqari, jarayonda men pythonning ikkita ishlaydigan 2 va 3 versiyalari borligini aniqladim, natijada men uchinchisiga o'tirdim.

Uskuna tugunlari

Bir plastinkali vim2

Menga asosiy mashinam sifatida bitta platali kompyuter berildi vim2

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Aqlli uy va SMART-TV uchun ajoyib, kuchli media protsessor, lekin bu vazifa uchun juda yaroqsiz yoki aytaylik, yomon mos keladi. Masalan, uning asosiy operatsion tizimi Android, Linux esa ikkilamchi OS bo'lib, shunga mos ravishda hech kim Linux ostida barcha tugunlar va drayverlarning yuqori sifatli ishlashiga kafolat bermaydi. Va menimcha, ba'zi muammolar ushbu platformaning USB drayverlari bilan bog'liq edi, shuning uchun modemlar ushbu platada kutilganidek ishlamadi. Shuningdek, u juda kambag'al va tarqoq hujjatlarga ega, shuning uchun har bir operatsiya doklar orqali qazish uchun ko'p vaqt talab qildi. GPIO bilan oddiy ish ham juda ko'p qon oldi. Misol uchun, LEDni o'rnatish uchun menga bir necha soat kerak bo'ldi. Ammo, ob'ektiv bo'lish uchun, bu qanday turdagi bitta plata ekanligi muhim emas edi, asosiysi u ishlagan va USB portlari bor edi.

Birinchidan, men ushbu plataga Linuxni o'rnatishim kerak. Hujjatlarning yovvoyiligini hamma uchun, shuningdek, ushbu bitta taxtali tizim bilan shug'ullanadiganlar uchun tekshirmaslik uchun men ushbu bobni yozyapman.

Linuxni o'rnatishning ikkita varianti mavjud: tashqi SD kartada yoki ichki MMCda. Men uni karta bilan qanday ishlashini tushunish uchun bir oqshom o'tkazdim, shuning uchun uni MMC-ga o'rnatishga qaror qildim, garchi shubhasiz, tashqi karta bilan ishlash ancha oson bo'ladi.

Mikrodastur haqida bu yerda qiyshiq aytilgan. Men g'alatidan rus tiliga tarjima qilaman. Doskani miltillash uchun men UART apparatini ulashim kerak. Ulandi quyida bayon qilinganidek.

  • Asbob Pin GND: <—> VIM-larning GPIO-ning 17-pin
  • Asbob pin TXD: <—> VIM GPIO-ning 18-pin (Linux_Rx)
  • Asbob pin RXD: <—> VIM GPIO ning 19-pin (Linux_Tx)
  • Tool Pin VCC: <—> VIM-larning GPIO-ning Pin20

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Shundan so'ng, men proshivkani yuklab oldim shu yerda. Maxsus mikrodastur versiyasi VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Ushbu proshivkani yuklash uchun menga yordamchi dasturlar kerak. Bu haqida batafsil ma'lumot shu yerda. Men uni Windows ostida miltillashga urinmadim, lekin Linux ostida proshivka haqida bir necha so'z aytishim kerak. Birinchidan, men ko'rsatmalarga muvofiq yordamchi dasturlarni o'rnataman.

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

Aaand... Hech narsa ishlamayapti. O'rnatish skriptlarini tahrirlash uchun bir necha soat vaqt sarfladim, shunda hamma narsa men uchun to'g'ri o'rnatiladi. U erda nima qilganimni eslay olmayman, lekin otlar bilan sirk ham bor edi. Shuning uchun ehtiyot bo'ling. Ammo bu yordamchi dasturlarsiz vim2 ni qiynoqqa solishning ma'nosi yo'q. U bilan umuman aralashmaslik yaxshiroqdir!

Do'zaxning etti doirasi, skript konfiguratsiyasi va o'rnatilishidan so'ng men ishlaydigan yordamchi dasturlar to'plamini oldim. Men platani USB orqali Linux kompyuterimga uladim, shuningdek, yuqoridagi diagrammaga muvofiq UART ni uladim.
Men o'zimning sevimli minikom terminalimni apparat va dasturiy ta'minot xatolarini nazorat qilmasdan 115200 tezlikka sozlayapman. Va keling, boshlaylik.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

VIM2-ni UART terminaliga yuklayotganda, yuklashni to'xtatish uchun bo'sh joy kabi tugmachani bosaman. Chiziq paydo bo'lgandan keyin

kvim2# 

Men buyruqni kiritaman:

kvim2# run update

Biz yuklayotgan xostda men quyidagilarni bajaraman:

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

Bo'pti, vay. Men tekshirdim, doskada Linux bor. Login/parol xadas:khadas.

Shundan so'ng, ba'zi bir kichik boshlang'ich sozlamalar. Keyingi ish uchun men sudo uchun parolni o'chirib qo'yaman (ha, xavfsiz emas, lekin qulay).

sudo visudo

Shaklga qatorni tahrir qilaman va saqlayman

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

Keyin men hozirgi joyni o'zgartiraman, shunda vaqt Moskvada, aks holda u Grinvichda bo'ladi.

sudo timedatectl set-timezone Europe/Moscow

yoki

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

Agar sizga qiyin bo'lsa, unda bu taxtadan foydalanmang; Raspberry Pi yaxshiroq. Rostini aytsam.

Modem Huawei e3372h – 153

Ushbu modem men uchun qonning muhim manbai bo'ldi va aslida u butun loyihaning darbog'iga aylandi. Umuman olganda, ushbu qurilmalar uchun "modem" nomi ishning mohiyatini umuman aks ettirmaydi: bu kuchli kombinat, bu uskunada drayverlarni o'rnatish uchun CD-ROMga o'xshash kompozitsion qurilma mavjud, va keyin tarmoq kartasi rejimiga o'tadi.

Arxitektura nuqtai nazaridan, Linux foydalanuvchisi nuqtai nazaridan, barcha sozlamalardan so'ng, u quyidagicha ko'rinadi: modemni ulagandan so'ng, menda dhcp orqali 192.168.8.100 IP manzilini va standart shlyuzni oladigan eth* tarmoq interfeysi mavjud. 192.168.8.1 hisoblanadi.

Va eng muhim daqiqa! Ushbu modem modeli AT buyruqlari bilan boshqariladigan modem rejimida ishlay olmaydi. Hammasi ancha sodda bo'lardi, har bir modem uchun PPP ulanishlarini yarating va keyin ular bilan ishlang. Lekin mening holimda "o'zi" (aniqrog'i, udev qoidalariga ko'ra Linux sho'ng'ichi) eth interfeysini yaratadi va unga dhcp orqali IP-manzilni tayinlaydi.

Keyinchalik chalkashmaslik uchun men "modem" so'zini unutib, tarmoq kartasi va shlyuzni aytishni taklif qilaman, chunki mohiyatiga ko'ra, bu yangi tarmoq kartasini shlyuz bilan ulashga o'xshaydi.
Bitta modem mavjud bo'lganda, bu hech qanday maxsus muammolarni keltirib chiqarmaydi, lekin bir nechta, ya'ni n-bo'laklar mavjud bo'lganda, quyidagi tarmoq rasmi paydo bo'ladi.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Ya'ni, bir xil IP-manzilga ega, har biri bir xil standart shlyuzga ega bo'lgan n tarmoq kartalari. Lekin, aslida, ularning har biri o'z operatoriga ulangan.

Dastlab, menda oddiy yechim bor edi: ifconfig yoki ip buyrug'idan foydalanib, barcha interfeyslarni o'chirib qo'ying va shunchaki navbatma-navbat birini yoqing va uni sinab ko'ring. Yechim hamma uchun yaxshi edi, faqat o'tish paytida men qurilmaga ulana olmadim. Va kommutatsiya tez-tez va tez bo'lgani uchun, menda umuman ulanish imkoniyati yo'q edi.

Shuning uchun, men modemlarning IP-manzillarini qo'lda o'zgartirish yo'lini tanladim va keyin marshrutlash sozlamalari yordamida trafikni haydash.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Bu mening modemlar bilan bog'liq muammolarimning oxiri emas edi: elektr quvvati bilan bog'liq muammolar bo'lsa, ular tushib ketdi va USB hubga yaxshi barqaror quvvat manbai kerak edi. Men bu muammoni quvvatni to'g'ridan-to'g'ri markazga qattiq lehimlash orqali hal qildim. Men duch kelgan va butun loyihani buzgan yana bir muammo: qurilma qayta ishga tushirilgandan yoki sovuq ishga tushirilgandan so'ng, barcha modemlar aniqlanmadi va har doim ham emas va men nima uchun bu sodir bo'lganini va qanday algoritm bilan aniqlay olmadim. Lekin birinchi narsa birinchi.

Modem to'g'ri ishlashi uchun men usb-modeswitch paketini o'rnatdim.

sudo apt update
sudo apt install -y usb-modeswitch

Shundan so'ng, ulangandan so'ng, modem udev quyi tizimi tomonidan to'g'ri aniqlanadi va sozlanadi. Men shunchaki modemni ulash va tarmoq paydo bo'lishiga ishonch hosil qilish orqali tekshiraman.
Men hal qila olmagan yana bir muammo: ushbu modemdan biz ishlayotgan operator nomini qanday olsam bo'ladi? Operator nomi modem veb-interfeysida 192.168.8.1 da joylashgan. Bu Ajax so'rovlari orqali ma'lumotlarni qabul qiladigan dinamik veb-sahifa, shuning uchun sahifani ochish va nomni tahlil qilish ishlamaydi. Shunday qilib, men veb-sahifani qanday ishlab chiqishni va hokazolarni ko'rib chiqa boshladim va qandaydir bema'nilik qilayotganimni angladim. Natijada, u tupurdi va operator Speedtest API-ning o'zidan foydalanishni boshladi.

Agar modem AT buyruqlari orqali kirish imkoniga ega bo'lsa, ancha oson bo'lar edi. Uni qayta sozlash, ppp ulanishini yaratish, IP belgilash, aloqa operatorini olish va h.k. mumkin bo'ladi. Ammo, afsuski, menga berilgan narsalar bilan ishlayapman.

GPS

Menga berilgan GPS qabul qiluvchisi UART interfeysi va quvvatiga ega edi. Bu eng yaxshi yechim emas edi, lekin u baribir amalda va sodda edi. Qabul qiluvchining ko'rinishi shunday edi.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Rostini aytsam, bu mening GPS qabul qiluvchisi bilan birinchi marta ishlaganim edi, lekin men kutganimdek, hamma narsa biz uchun uzoq vaqt oldin o'ylab topilgan edi. Shuning uchun biz faqat tayyor echimlardan foydalanamiz.

Birinchidan, GPS ulanishi uchun uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) ni yoqaman.

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

Keyin operatsiyaning muvaffaqiyatini tekshiraman.

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

Bu buyruq devtree-ni tezda tahrirlaydi, bu juda qulay.

Ushbu operatsiya muvaffaqiyatli bo'lgandan so'ng, GPS daemonini qayta ishga tushiring va o'rnating.

khadas@Khadas:~$ sudo reboot

GPS demonini o'rnatish. Men hamma narsani o'rnataman va keyingi sozlash uchun darhol uni kesib tashlayman.

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

Sozlamalar faylini tahrirlash.

sudo vim /etc/default/gpsd

Men GPS osilgan UART ni o'rnatyapman.

DEVICES="/dev/ttyS4"

Va keyin biz hamma narsani yoqamiz va boshlaymiz.

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

Shundan so'ng men GPS-ni ulayman.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

GPS simi mening qo'limda, UART disk raskadrovka simlari barmoqlarim ostida ko'rinadi.

Men qayta ishga tushiraman va gpsmon dasturi yordamida GPS ishini tekshiraman.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Ushbu skrinshotda siz sun'iy yo'ldoshlarni ko'ra olmaysiz, lekin siz GPS qabul qilgich bilan aloqani ko'rishingiz mumkin va bu hamma narsa yaxshi ekanligini anglatadi.

Pythonda men ushbu demon bilan ishlashning ko'plab variantlarini sinab ko'rdim, lekin men python 3 bilan to'g'ri ishlaydigan variantga qaror qildim.

Men kerakli kutubxonani o'rnataman.

sudo -H pip3 install gps3 

Va men ish kodini haykaltarosh qildim.

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

Agar koordinatalarni olishim kerak bo'lsa, bu quyidagi qo'ng'iroq bilan amalga oshiriladi:

longitude, latitude = getPositionData(agps_thread)

Va 1-10 soniya ichida men koordinatani olaman yoki yo'q. Ha, men koordinatalarni olishga o'nta urinib ko'rdim. Optimal emas, qiyshiq va qiyshiq, lekin u ishlaydi. Men buni qilishga qaror qildim, chunki GPS yomon qabul qilishi mumkin va har doim ham ma'lumotlarni qabul qila olmaydi. Agar siz ma'lumot olishni kutsangiz, uzoq xonada ishlasangiz, dastur shu joyda muzlaydi. Shuning uchun men ushbu nomaqbul variantni amalga oshirdim.

Aslida, agar ko'proq vaqt bo'lsa, GPS-dan to'g'ridan-to'g'ri UART orqali ma'lumot olish, uni alohida mavzuda tahlil qilish va u bilan ishlash mumkin edi. Ammo umuman vaqt yo'q edi, shuning uchun shafqatsiz xunuk kod. Ha, men uyalmayman.

Yorug'lik chiqaradigan diod

LEDni ulash bir vaqtning o'zida oddiy va qiyin edi. Asosiy qiyinchilik, tizimdagi pin raqami doskadagi pin raqamiga mos kelmasligi va hujjatlar chap qo'l bilan yozilganligi sababli. Operatsion tizimdagi apparat pin raqami va pin raqamini solishtirish uchun siz quyidagi buyruqni bajarishingiz kerak:

gpio readall

Tizimdagi va doskadagi pin yozishmalari jadvali ko'rsatiladi. Shundan so'ng men operatsion tizimning o'zida pinni ishlata olaman. Mening holimda LED ulangan GPIOH_5.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

GPIO pinini chiqish rejimiga o'tkazaman.

gpio -g mode 421 out

Men nol yozaman.

gpio -g write 421 0

Men bittasini yozaman.

gpio -g write 421 1

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi
“1” yozgandan keyin hamma narsa yonadi

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

Endi, xatolar bo'lsa, men error_blink() ni chaqiraman va LED chiroyli tarzda miltillaydi.

Dasturiy ta'minot tugunlari

Speedtest API

Speedtest.net xizmatining o'z python-API-ga ega bo'lishi katta quvonch, siz ko'rishingiz mumkin Github.

Yaxshi tomoni shundaki, ko'rish mumkin bo'lgan manba kodlari mavjud. Ushbu API bilan qanday ishlashni (oddiy misollar) topishingiz mumkin tegishli bo'lim.

Python kutubxonasini quyidagi buyruq bilan o'rnataman.

sudo -H pip3 install speedtest-cli

Masalan, Ubuntu-da tezlikni tekshirgichni to'g'ridan-to'g'ri dasturiy ta'minotdan o'rnatishingiz mumkin. Bu xuddi shu python ilovasi bo'lib, uni to'g'ridan-to'g'ri konsoldan ishga tushirish mumkin.

sudo apt install speedtest-cli -y

Va Internet tezligini o'lchang.

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

Natijada, xuddi men qilgandek. Loyihamga to'liqroq tatbiq etish uchun men ushbu tezlik testining manba kodlariga kirishim kerak edi. Eng muhim vazifalardan biri bu aloqa operatorining nomini plastinkaga almashtirish uchun olishdir.

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

Bu erda ham hamma narsa unchalik oddiy emas edi, garchi u ancha sodda bo'lib tuyulsa ham. Dastlab, serverlar parametri teng edi [], deyishadi, eng yaxshi serverni tanlang. Natijada, menda tasodifiy serverlar bor edi va siz taxmin qilganingizdek, o'zgaruvchan tezlik. Bu juda murakkab mavzu bo'lib, qattiq serverdan foydalanish, agar shunday bo'lsa, statik yoki dinamik tadqiqotni talab qiladi. Ammo bu erda "Bilayn" operatori uchun dinamik ravishda test serverini va statik ravishda o'rnatilgan serverni tanlashda tezlikni o'lchash grafiklarining misoli keltirilgan.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi
Dinamik serverni tanlashda tezlikni o'lchash natijasi.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi
Bitta qat'iy tanlangan bitta server bilan tezlikni sinovdan o'tkazish natijasi.

Sinov paytida ikkala joyda ham "mo'yna" mavjud va uni matematik usullar yordamida olib tashlash kerak. Ammo sobit server bilan u biroz kamroq va amplituda barqarorroq.
Umuman olganda, bu ajoyib tadqiqot joyi. Va men serverimning tezligini iperf yordam dasturi yordamida o'lchagan bo'lardim. Ammo biz texnik shartlarga rioya qilamiz.

Xat yuborish va xatolar

Pochta jo'natish uchun men bir necha o'nlab turli xil variantlarni sinab ko'rdim, lekin oxirida men quyidagilarga qaror qildim. Men Yandex-da pochta qutisini ro'yxatdan o'tkazdim va keyin oldim Bu pochta jo'natishning namunasidir. Men uni tekshirib, dasturga kiritdim. Ushbu misol turli xil variantlarni, jumladan, gmail-dan yuborish va hokazolarni ko'rib chiqadi. Men pochta serverimni o'rnatish bilan bezovta qilishni xohlamadim va bunga vaqtim yo'q edi, lekin keyinroq ma'lum bo'lishicha, bu ham behuda edi.

Jurnallar rejalashtiruvchiga muvofiq yuborildi, aloqa mavjud bo'lsa, har 6 soatda: soat 00:06, 12:18, XNUMX:XNUMX va XNUMX:XNUMX da. Uni quyidagicha yubordi.

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

Xatolar ham dastlab yuborilgan. Boshlash uchun ular ro'yxatda to'plangan va keyin ulanish mavjud bo'lsa, rejalashtiruvchi yordamida ham yuborilgan. Biroq, keyin Yandex-da kuniga yuborilgan xabarlar soni bo'yicha cheklov borligi bilan bog'liq muammolar paydo bo'ldi (bu og'riq, qayg'u va tahqirlash). Hatto daqiqada juda ko'p xatolar bo'lishi mumkinligi sababli, biz xat orqali xat yuborishdan voz kechishimiz kerak edi. Shunday qilib, Yandex xizmatlari orqali bunday muammo haqida avtomatik ravishda ma'lumot yuborayotganda unutmang.

Fikr-mulohaza serveri

Masofaviy uskunaga kirish va uni sozlash va qayta sozlash imkoniyatiga ega bo'lish uchun menga tashqi server kerak edi. Umuman olganda, adolat uchun, barcha ma'lumotlarni serverga yuborish va veb-interfeysda barcha chiroyli grafiklarni yaratish to'g'ri bo'ladi. Lekin hammasi birdan emas.

VPS uchun men tanladim ruvds.com. Siz eng oddiy serverni olishingiz mumkin. Va umuman olganda, mening maqsadlarim uchun bu etarli bo'ladi. Ammo men server uchun o'z cho'ntagimdan pul to'lamaganim uchun uni kichik zaxira bilan olishga qaror qildim, shunda biz veb-interfeysni, o'zimizning SMTP serverimizni, VPN va boshqalarni o'rnatsak etarli bo'ladi. Qolaversa, Telegram botini sozlash imkoniyatiga ega bo‘ling va uning bloklanishi bilan bog‘liq muammolarga duch kelmang. Shuning uchun men Amsterdamni va quyidagi parametrlarni tanladim.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Uskuna bilan aloqa qilish usuli sifatida vim2 teskari ssh ulanishini tanladi va amaliyot ko'rsatganidek, bu eng yaxshisi emas. Agar ulanish yo'qolsa, server portni ushlab turadi va u orqali bir muncha vaqt ulanish mumkin emas. Shuning uchun, boshqa aloqa usullaridan, masalan, VPNdan foydalanish yaxshiroqdir. Kelajakda men VPN-ga o'tmoqchi edim, lekin vaqtim yo'q edi.

Men xavfsizlik devorini o'rnatish, huquqlarni cheklash, root ssh ulanishlarini o'chirib qo'yish va VPS o'rnatishning boshqa truizmlari haqida batafsil ma'lumot bermayman. Siz hamma narsani allaqachon bilganingizga ishonishni istardim. Masofaviy ulanish uchun men serverda yangi foydalanuvchi yarataman.

adduser vimssh

Men apparatimizda ssh ulanish kalitlarini yarataman.

ssh-keygen

Va men ularni serverimizga ko'chiraman.

ssh-copy-id [email protected]

Bizning uskunamizda men har bir yuklashda avtomatik teskari ssh ulanishini yarataman.

[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 portiga e'tibor bering: u teskari ssh orqali ulanish uchun qaysi portdan foydalanishimni aniqlaydi. Uni ishga tushirish va ishga tushirishga qo'shing.

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

Siz hatto holatni ko'rishingiz mumkin:

sudo systemctl status autossh.service

Endi, bizning VPS serverimizda, agar biz ishga tushirsak:

ssh -p 8083 khadas@localhost

Keyin men sinov qurilmamga o'taman. Va apparatdan men jurnallar va har qanday ma'lumotlarni ssh orqali serverimga yuborishim mumkin, bu juda qulay.

Hammasini bir joyga qo'yish

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi
Yoqib, ishlab chiqish va disk raskadrovkani boshlaylik

Voy, shunday, men barcha tugunlarni tasvirlab berdim. Endi hammasini birlashtirish vaqti keldi. Kodni ko'rishingiz mumkin Bu erda.

Kod bilan bog'liq muhim nuqta: Bu loyiha bunday boshlanmasligi mumkin, chunki u ma'lum bir vazifaga, ma'lum bir arxitekturaga moslashtirilgan. Men manba kodini berayotgan bo'lsam ham, men hali ham bu erda eng qimmatli narsalarni matnda tushuntiraman, aks holda bu mutlaqo tushunarsiz.

Boshida men gps, gpio-ni ishga tushiraman va alohida rejalashtiruvchi ipni ishga tushiraman.

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

Rejalashtiruvchi juda oddiy: u xabarlarni jo'natish vaqti kelgan yoki yo'qligini va hozirgi xato holatini ko'radi. Agar xato belgisi bo'lsa, biz LEDni miltillaymiz.

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

Ushbu loyihaning eng qiyin qismi har bir test uchun teskari ssh ulanishini saqlab qolishdir. Har bir test standart shlyuz va DNS serverni qayta sozlashni o'z ichiga oladi. Hech kim baribir o'qimagani uchun, bilingki, poezd yog'och relslarda yurmaydi. Kim Pasxa tuxumini topsa, u shirinlik oladi.

Buning uchun men alohida marshrutlash jadvalini yarataman - 0x2 belgilang va trafikni qayta yo'naltirish qoidasi.

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

Bu qanday ishlashi haqida ko'proq bilib olishingiz mumkin ushbu maqolada o'qing.

Shundan so'ng men cheksiz tsiklga o'taman, u erda har safar ulangan modemlar ro'yxatini olamiz (tarmoq konfiguratsiyasi to'satdan o'zgarganligini bilish uchun).

network_list = getNetworklist()

Tarmoq interfeyslari ro'yxatini olish juda oddiy.

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

Ro'yxatni olganimdan so'ng, modem haqidagi bobdagi rasmda ko'rsatganimdek, barcha interfeyslarga IP manzillarini o'rnatdim.

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

Keyin men har bir interfeysni halqada o'tkazaman. Va men har bir interfeysni sozlayman.

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

Men interfeysni funksionallik uchun tekshiraman, agar tarmoq bo'lmasa, men xatolarni yarataman. Agar tarmoq mavjud bo'lsa, unda harakat qilish vaqti keldi!

Bu erda men ushbu interfeysga ssh marshrutini sozlayman (agar u bajarilmagan bo'lsa), agar vaqt kelgan bo'lsa, serverga xatolar yuboraman, jurnallarni yuboraman va nihoyat tezlik testini o'tkazaman va jurnallarni csv fayliga saqlang.

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

Teskari ssh-ni o'rnatish funktsiyasini eslatib o'tish kerak.

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

Va, albatta, siz ushbu go'zallikning barchasini startapga qo'shishingiz kerak. Buning uchun men fayl yarataman:

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

Va men unda yozaman:

[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

Men avtomatik yuklashni yoqaman va boshlayman!

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

Endi men buyruq yordamida sodir bo'layotgan voqealar jurnallarini ko'rishim mumkin:

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

Natijalar

Xo'sh, endi eng muhimi, natijada nima bo'ldi? Mana, ishlab chiqish va disk raskadrovka jarayonida suratga olishga muvaffaq bo'lgan bir nechta grafikalar. Grafiklar quyidagi skript bilan gnuplot yordamida qurilgan.

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

Birinchi tajriba men bir necha kun davomida olib borgan Tele2 operatorida bo'ldi.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Bu erda men dinamik o'lchash serveridan foydalandim. Tezlik o'lchovlari ishlaydi, lekin juda ko'p o'zgarib turadi, lekin ba'zi o'rtacha qiymat hali ham ko'rinadi va buni ma'lumotlarni filtrlash orqali olish mumkin, masalan, harakatlanuvchi o'rtacha.

Keyinchalik men boshqa aloqa operatorlari uchun bir qator grafiklarni qurdim. Bu holatda, allaqachon bitta sinov serveri mavjud edi va natijalar ham juda qiziqarli edi.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Ko'rib turganingizdek, mavzu ushbu ma'lumotlarni o'rganish va qayta ishlash uchun juda keng va bir necha haftalik ish uchun davom etmasligi aniq. Lekin…

Ish natijasi

Menga bog'liq bo'lmagan holatlar tufayli ish birdan yakunlandi. Ushbu loyihaning zaif tomonlaridan biri, mening sub'ektiv fikrimcha, modem bo'lib, u haqiqatan ham boshqa modemlar bilan bir vaqtda ishlashni istamaydi va har safar yuklanganda shunday nayranglar qiladi. Ushbu maqsadlar uchun juda ko'p boshqa modem modellari mavjud; odatda ular allaqachon Mini PCI-e formatida bo'lib, qurilma ichiga o'rnatilgan va ularni sozlash ancha oson. Ammo bu butunlay boshqacha hikoya. Loyiha qiziqarli bo'ldi va men unda ishtirok eta olganimdan juda xursand bo'ldim.

Bir nechta LTE modemlarida bir vaqtning o'zida tezlik testi

Manba: www.habr.com

a Izoh qo'shish