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.
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 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:
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
GPS simi mening qo'limda, UART disk raskadrovka simlari barmoqlarim ostida ko'rinadi.
Men qayta ishga tushiraman va gpsmon dasturi yordamida GPS ishini tekshiraman.
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.
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.
Dinamik serverni tanlashda tezlikni o'lchash natijasi.
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.
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.
8083 portiga e'tibor bering: u teskari ssh orqali ulanish uchun qaysi portdan foydalanishimni aniqlaydi. Uni ishga tushirish va ishga tushirishga qo'shing.
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
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.
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")
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.
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
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.
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.
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.