Bir neçə LTE modemində eyni vaxtda sürət testi

Karantin zamanı mənə bir neçə mobil operator üçün LTE modemlərinin sürətini ölçən cihazın hazırlanmasında iştirak etməyi təklif etdilər.

Bir neçə LTE modemində eyni vaxtda sürət testi

Müştəri, məsələn, video yayımlar üçün LTE bağlantısından istifadə edən avadanlıq quraşdırarkən hansı mobil operatorun onun üçün ən optimal olduğunu başa düşmək üçün müxtəlif coğrafi yerlərdə müxtəlif telekommunikasiya operatorlarının sürətini qiymətləndirmək istədi. Eyni zamanda, problem bahalı avadanlıq olmadan mümkün qədər sadə və ucuz həll edilməli idi.

Dərhal deyəcəyəm ki, tapşırıq ən sadə və ən çox bilik tələb edən iş deyil, sizə hansı problemlərlə qarşılaşdığımı və onları necə həll etdiyimi söyləyəcəyəm. Beləliklə, gedək.

Qeyd

LTE bağlantısının sürətinin ölçülməsi çox mürəkkəb məsələdir: düzgün avadanlıq və ölçmə texnikasını seçməli, həmçinin mobil şəbəkənin topologiyasını və işini yaxşı başa düşməlisiniz. Üstəlik, sürətə bir neçə amil təsir edə bilər: hüceyrədəki abunəçilərin sayı, hava şəraiti, hətta hüceyrədən hüceyrəyə sürət şəbəkə topologiyasına görə kəskin şəkildə dəyişə bilər. Ümumiyyətlə, bu, çox sayda bilinməyən problemdir və yalnız bir telekommunikasiya operatoru bunu düzgün həll edə bilər.

Əvvəlcə müştəri operatorların telefonları ilə kuryer sürmək, birbaşa telefonda ölçmə aparmaq və sonra sürət ölçmə nəticələrini notebooka yazmaq istəyirdi. Lte şəbəkələrinin sürətini ölçmək üçün həllim, ideal olmasa da, problemi həll edir.

Vaxt az olduğu üçün rahatlıq və ya praktiklik lehinə deyil, inkişafın sürəti lehinə qərarlar verdim. Məsələn, serverin və hər bir fərdi müştərinin qurulmasına vaxta qənaət etmək üçün daha praktik VPN əvəzinə uzaqdan giriş üçün əks ssh istifadə edilmişdir.

Texniki tapşırıq

Məqalədə deyildiyi kimi Texniki xüsusiyyətlər olmadan: müştəri niyə istəmir: Texniki şərtlər olmadan işləməyin! Heç vaxt, heç yerdə!

Texniki tapşırıq olduqca sadə idi, son istifadəçinin başa düşülməsi üçün onu bir az genişləndirəcəyəm. Texniki həllərin və avadanlıqların seçimi müştəri tərəfindən diktə edildi. Beləliklə, bütün təsdiqlərdən sonra texniki spesifikasiyanın özü:

Tək lövhəli kompüterə əsaslanır vim2 H modemləri vasitəsilə lte əlaqələri üçün sürət test cihazı edinuawei e3372h - 153 bir neçə telekommunikasiya operatoru (birdən n-ə qədər). UART vasitəsilə qoşulmuş GPS qəbuledicisindən də koordinatları almaq lazımdır. Xidmətdən istifadə edərək sürət ölçmə aparın www.speedtest.net və onları cədvələ qoyun:

Bir neçə LTE modemində eyni vaxtda sürət testi

Csv formatında cədvəl. Sonra bu işarəni hər 6 saatdan bir e-poçtla göndərin. Səhvlər olarsa, GPIO-ya qoşulmuş LED-i yanıb-sönün.

Mən çoxlu təsdiqlərdən sonra texniki xüsusiyyətləri sərbəst şəkildə təsvir etdim. Ancaq tapşırığın mənası artıq görünür. Hər şey üçün bir həftə vaxt verildi. Amma əslində üç həftə davam etdi. Bu, mənim bunu yalnız əsas işimdən sonra və həftə sonlarında etdiyimi nəzərə alır.

Burada bir daha diqqəti cəlb etmək istəyirəm ki, müştəri mənim imkanlarımı xeyli məhdudlaşdıran sürət ölçmə xidməti və aparatının istifadəsi barədə əvvəlcədən razılaşıb. Büdcə də məhdud idi, buna görə də xüsusi bir şey alınmadı. Ona görə də bu qaydalarla oynamalı idik.

Memarlıq və inkişaf

Sxem sadə və aydındır. Ona görə də heç bir xüsusi şərhsiz buraxacağam.

Bir neçə LTE modemində eyni vaxtda sürət testi

Bu dildə ümumiyyətlə inkişaf təcrübəm olmamasına baxmayaraq, bütün layihəni python dilində həyata keçirmək qərarına gəldim. Mən onu seçdim, çünki inkişafı sürətləndirə biləcək bir çox hazır nümunələr və həllər var idi. Ona görə də bütün peşəkar proqramçılardan xahiş edirəm ki, mənim ilk python inkişaf təcrübəmi danlamasınlar və bacarıqlarımı təkmilləşdirmək üçün konstruktiv tənqidləri eşitməkdən həmişə məmnunam.

Həmçinin prosesdə python-un 2 və 3-cü iki işləyən versiyası olduğunu kəşf etdim, nəticədə üçüncüdə qərarlaşdım.

Aparat qovşaqları

Tək lövhəli vim2

Mənə əsas maşın kimi bir lövhəli kompüter verdilər vim2

Bir neçə LTE modemində eyni vaxtda sürət testi

Ağıllı ev və SMART-TV üçün əla, güclü media prosessoru, lakin bu iş üçün son dərəcə uyğun deyil və ya deyək ki, zəif uyğundur. Məsələn, onun əsas ƏS Android-dir, Linux isə ikinci dərəcəli ƏS-dir və buna görə heç kim Linux altında bütün qovşaqların və sürücülərin yüksək keyfiyyətli işləməsinə zəmanət vermir. Və güman edirəm ki, bəzi problemlər bu platformanın USB sürücüləri ilə bağlı idi, ona görə də modemlər bu lövhədə gözlənildiyi kimi işləmədi. Həm də çox zəif və səpələnmiş sənədlərə malikdir, buna görə də hər bir əməliyyat dokları qazmaq üçün çox vaxt apardı. GPIO ilə adi iş belə çox qan aldı. Məsələn, LED-i quraşdırmaq mənə bir neçə saat çəkdi. Ancaq obyektiv olmaq üçün onun hansı tək lövhə olması prinsipial əhəmiyyət kəsb etmirdi, əsas odur ki, işləyirdi və USB portları var.

Əvvəlcə bu lövhədə Linux quraşdırmalıyam. Hər kəs üçün, eləcə də bu tək lövhəli sistemlə məşğul olacaqlar üçün sənədlərin vəhşiliyini araşdırmamaq üçün bu fəsli yazıram.

Linux-u quraşdırmanın iki variantı var: xarici SD kartda və ya daxili MMC-də. Mən bir axşam onu ​​kartla necə işləməyi başa düşməyə çalışdım, ona görə də onu MMC-yə quraşdırmaq qərarına gəldim, baxmayaraq ki, şübhəsiz ki, xarici kartla işləmək daha asan olacaq.

Firmware haqqında burada əyri danışıb. Qəribədən rus dilinə tərcümə edirəm. Lövhəni yandırmaq üçün UART aparatını bağlamalıyam. Bağladı Aşağıdakı kimi.

  • Alət Pin GND: <—> VIM-lərin GPIO-nun Pin17
  • Alət Pin TXD: <—> VIM-lərin GPIO-nun Pin18 (Linux_Rx)
  • Alət Pin RXD: <—> VIM-lərin GPIO-nun Pin19 (Linux_Tx)
  • Alət Pin VCC: <—> VIM-lərin GPIO-nun Pin20

Bir neçə LTE modemində eyni vaxtda sürət testi

Bundan sonra proqram təminatını yüklədim buradan. Xüsusi proqram təminatı versiyası VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Bu proqram təminatını yükləmək üçün mənə utilitlər lazımdır. Bu barədə ətraflı məlumat burada. Mən onu Windows-da yandırmağa çalışmamışam, lakin sizə Linux-da proqram təminatı haqqında bir neçə söz deməliyəm. Əvvəlcə təlimatlara uyğun olaraq kommunalları quraşdıracağam.

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

Aaand... Heç nə işləmir. Quraşdırma skriptlərini redaktə etmək üçün bir neçə saat sərf etdim ki, hər şey mənim üçün düzgün qurulsun. Orada nə etdiyimi xatırlamıram, amma atların olduğu sirk də var idi. Buna görə diqqətli olun. Ancaq bu kommunal xidmətlər olmadan vim2-yə daha çox işgəncə verməyin mənası yoxdur. Onunla heç qarışmamaq daha yaxşıdır!

Yeddi cəhənnəm dairəsi, skript konfiqurasiyası və quraşdırılmasından sonra bir iş kommunal paketi aldım. Lövhəni USB vasitəsilə Linux kompüterimə qoşdum və yuxarıdakı diaqrama uyğun olaraq UART-ı da bağladım.
Ən sevdiyim minikom terminalını 115200 sürət üçün aparat və proqram xətasına nəzarət etmədən qururam. Və başlayaq.

Bir neçə LTE modemində eyni vaxtda sürət testi

UART terminalında VIM2-ni yükləyərkən yükləməni dayandırmaq üçün boşluq kimi düyməni sıxıram. Xətt göründükdən sonra

kvim2# 

Komandanı daxil edirəm:

kvim2# run update

Yüklədiyimiz hostda mən yerinə yetirirəm:

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

Budur, füf. Yoxladım, lövhədə Linux var. Giriş/parol xadas:khadas.

Bundan sonra bəzi kiçik ilkin parametrlər. Sonrakı iş üçün sudo üçün parolu deaktiv edirəm (bəli, təhlükəsiz deyil, lakin rahatdır).

sudo visudo

Mən formaya xətti düzəldirəm və saxlayıram

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

Sonra mən hazırkı dili dəyişirəm ki, vaxt Moskvada olsun, əks halda Qrinviçdə olsun.

sudo timedatectl set-timezone Europe/Moscow

və ya

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

Əgər sizə çətin gəlirsə, onda bu lövhədən istifadə etməyin; Raspberry Pi daha yaxşıdır. Vicdanla.

Modem Huawei e3372h – 153

Bu modem mənim üçün əhəmiyyətli qan mənbəyi idi və əslində bütün layihənin darboğazına çevrildi. Ümumiyyətlə, bu qurğular üçün “modem” adı işin mahiyyətini qətiyyən əks etdirmir: bu, güclü kombinatdır, bu aparatda drayverləri quraşdırmaq üçün CD-ROM kimi görünən kompozit qurğu var, və sonra şəbəkə kartı rejiminə keçir.

Arxitektura baxımından, Linux istifadəçisi baxımından, bütün parametrlərdən sonra belə görünür: modemi birləşdirdikdən sonra dhcp vasitəsilə 192.168.8.100 IP ünvanını və standart şlüzünü qəbul edən eth* şəbəkə interfeysi var. 192.168.8.1-dir.

Və ən vacib an! Bu modem modeli AT əmrləri ilə idarə olunan modem rejimində işləyə bilməz. Hər şey daha sadə olardı, hər bir modem üçün PPP əlaqələri yaradın və sonra onlarla işləyin. Amma mənim vəziyyətimdə “özü” (daha doğrusu, udev qaydalarına görə Linux dalğıc) eth interfeysi yaradır və ona dhcp vasitəsilə IP ünvanı təyin edir.

Daha çox çaşqınlığın qarşısını almaq üçün mən “modem” sözünü unutmağı və şəbəkə kartı və şlüz deməyi təklif edirəm, çünki mahiyyət etibarilə bu, yeni şəbəkə kartını şlüzlə birləşdirməyə bənzəyir.
Bir modem olduqda, bu heç bir xüsusi problem yaratmır, lakin birdən çox, yəni n-parça olduqda, aşağıdakı şəbəkə şəkli yaranır.

Bir neçə LTE modemində eyni vaxtda sürət testi

Yəni, eyni IP ünvanlı, hər biri eyni standart şluz olan n şəbəkə kartı. Amma əslində onların hər biri öz operatoruna bağlıdır.

Əvvəlcə sadə bir həll yolu tapdım: ifconfig və ya ip əmrindən istifadə edərək, bütün interfeysləri söndürün və sadəcə birini növbə ilə yandırın və sınaqdan keçirin. Bu həll hər kəs üçün yaxşı idi, yalnız keçid anlarında mən cihaza qoşula bilmədim. Və keçid tez-tez və sürətli olduğundan, mənim ümumiyyətlə qoşulmaq imkanım yox idi.

Buna görə də, modemlərin IP ünvanlarını əl ilə dəyişdirmək və sonra marşrutlaşdırma parametrlərindən istifadə edərək trafiki idarə etmək yolunu seçdim.

Bir neçə LTE modemində eyni vaxtda sürət testi

Bu, modemlərlə bağlı problemlərimin sonu deyildi: enerji problemi olduqda, onlar yıxıldı və USB mərkəzinə yaxşı sabit enerji təchizatı tələb olunurdu. Gücü birbaşa mərkəzə bərk lehimləməklə bu problemi həll etdim. Qarşılaşdığım və bütün layihəni məhv edən başqa bir problem: cihazın yenidən başlamasından və ya soyuq işə salınmasından sonra bütün modemlər aşkar edilmədi və həmişə deyil, bunun niyə baş verdiyini və hansı alqoritmlə olduğunu müəyyən edə bilmədim. Ancaq ilk şeylər.

Modemin düzgün işləməsi üçün usb-modeswitch paketini quraşdırdım.

sudo apt update
sudo apt install -y usb-modeswitch

Bundan sonra, qoşulduqdan sonra modem udev alt sistemi tərəfindən düzgün aşkar ediləcək və konfiqurasiya ediləcək. Mən sadəcə modemi qoşaraq və şəbəkənin göründüyünə əmin olmaqla yoxlayıram.
Həll edə bilmədiyim başqa bir problem: bu modemdən işlədiyimiz operatorun adını necə ala bilərəm? Operatorun adı modemin veb interfeysində 192.168.8.1-də var. Bu, Ajax sorğuları vasitəsilə məlumatları qəbul edən dinamik veb səhifədir, ona görə də sadəcə səhifəni əldə etmək və adı təhlil etmək işləməyəcək. Beləliklə, veb səhifəni necə inkişaf etdirməyi və s.-yə baxmağa başladım və bir növ cəfəngiyyat etdiyimi başa düşdüm. Nəticədə o, tüpürdü və operator Speedtest API-nin özündən istifadə edərək qəbul etməyə başladı.

Modemin AT əmrləri ilə çıxışı olsaydı, çox asan olardı. Onu yenidən konfiqurasiya etmək, ppp bağlantısı yaratmaq, IP təyin etmək, telekom operatoru almaq və s. Amma təəssüf ki, mənə verilən şeylərlə işləyirəm.

GPS

Mənə verilən GPS qəbuledicisinin UART interfeysi və gücü var idi. Bu, ən yaxşı həll yolu deyildi, amma yenə də işlək və sadə idi. Qəbuledici belə görünürdü.

Bir neçə LTE modemində eyni vaxtda sürət testi

Düzünü desəm, ilk dəfə idi ki, GPS qəbuledicisi ilə işləyirdim, amma gözlədiyim kimi, hər şey bizim üçün çoxdan düşünülmüşdü. Beləliklə, biz yalnız hazır həllərdən istifadə edirik.

Əvvəlcə GPS-ə qoşulmaq üçün uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) funksiyasını işə salıram.

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

Sonra əməliyyatın müvəffəqiyyətini yoxlayıram.

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

Bu əmr, görünür, devtree-ni tez redaktə edir, bu da çox rahatdır.

Bu əməliyyatın müvəffəqiyyətindən sonra GPS demonunu yenidən başladın və quraşdırın.

khadas@Khadas:~$ sudo reboot

GPS demonunun quraşdırılması. Mən hər şeyi quraşdırıram və əlavə konfiqurasiya üçün dərhal kəsirəm.

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

Parametrlər faylının redaktə edilməsi.

sudo vim /etc/default/gpsd

Mən GPS-in asılacağı UART quraşdırıram.

DEVICES="/dev/ttyS4"

Və sonra hər şeyi yandırırıq və başlayırıq.

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

Bundan sonra GPS-ə qoşuluram.

Bir neçə LTE modemində eyni vaxtda sürət testi

GPS teli mənim əlimdədir, UART sazlama telləri barmaqlarımın altında görünür.

Mən yenidən başladım və gpsmon proqramından istifadə edərək GPS əməliyyatını yoxlayıram.

Bir neçə LTE modemində eyni vaxtda sürət testi

Bu ekran görüntüsündə peykləri görə bilməzsiniz, ancaq GPS qəbuledicisi ilə əlaqəni görə bilərsiniz və bu, hər şeyin qaydasında olduğunu göstərir.

Pythonda mən bu demonla işləmək üçün bir çox variantı sınadım, lakin python 3 ilə düzgün işləyən birinə qərar verdim.

Lazım olan kitabxananı quraşdırıram.

sudo -H pip3 install gps3 

Və iş kodunu heykəlləndirirəm.

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

Əgər koordinatları əldə etməliyəmsə, bu, aşağıdakı zənglə edilir:

longitude, latitude = getPositionData(agps_thread)

Və 1-10 saniyə ərzində ya koordinatı alacağam, ya da yox. Bəli, koordinatları əldə etmək üçün on cəhd etdim. Optimal, əyri və əyri deyil, amma işləyir. Bunu etmək qərarına gəldim, çünki GPS zəif qəbul edə bilər və həmişə məlumat qəbul etmir. Məlumat qəbul etməyi gözləsəniz, uzaq bir otaqda işləsəniz, proqram bu yerdə donacaq. Ona görə də bu qeyri-qanuni variantı həyata keçirdim.

Prinsipcə, daha çox vaxt olsaydı, GPS-dən məlumatları birbaşa UART vasitəsilə qəbul etmək, ayrı bir mövzuda təhlil etmək və onunla işləmək olardı. Ancaq ümumiyyətlə vaxt yox idi, buna görə də vəhşicəsinə çirkin kod. Və bəli, mən utanmıram.

LED

LED-i birləşdirmək eyni zamanda sadə və çətin idi. Əsas çətinlik sistemdəki pin nömrəsinin lövhədəki pin nömrəsinə uyğun gəlməməsi və sənədlərin sol əllə yazılmasıdır. ƏS-də aparat pin nömrəsini və pin nömrəsini müqayisə etmək üçün əmri yerinə yetirməlisiniz:

gpio readall

Sistemdə və lövhədə pin yazışmaları cədvəli göstərilir. Bundan sonra mən artıq OS-də pin işlədə bilərəm. Mənim vəziyyətimdə LED bağlıdır GPIOH_5.

Bir neçə LTE modemində eyni vaxtda sürət testi

GPIO pinini çıxış rejiminə keçirirəm.

gpio -g mode 421 out

Sıfır yazıram.

gpio -g write 421 0

birini yazıram.

gpio -g write 421 1

Bir neçə LTE modemində eyni vaxtda sürət testi
“1” yazdıqdan sonra hər şey yanır

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

İndi səhvlər olarsa, error_blink() çağırıram və LED gözəl yanıb-sönəcək.

Proqram qovşaqları

Speedtest API

Speedtest.net xidmətinin öz python-API-yə malik olması böyük sevincdir, baxa bilərsiniz Github.

Yaxşısı budur ki, baxıla bilən mənbə kodları var. Bu API ilə necə işləmək olar (sadə nümunələr) burada tapa bilərsiniz müvafiq bölmə.

Python kitabxanasını aşağıdakı əmrlə quraşdırıram.

sudo -H pip3 install speedtest-cli

Məsələn, hətta birbaşa proqramdan Ubuntu-da sürət test cihazını quraşdıra bilərsiniz. Bu, daha sonra birbaşa konsoldan işə salına bilən eyni python proqramıdır.

sudo apt install speedtest-cli -y

Və İnternet sürətinizi ölçün.

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

Nəticədə, mənim etdiyim kimi. Layihəmə daha tam şəkildə tətbiq etmək üçün bu sürət testinin mənbə kodlarına daxil olmalı idim. Ən vacib vəzifələrdən biri də telekommunikasiya operatorunun adını lövhədə əvəz etmək üçün əldə etməkdir.

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

Burada da hər şey daha sadə görünsə də, o qədər də sadə olmadığı ortaya çıxdı. Əvvəlcə server parametri bərabər idi [], deyirlər ki, ən yaxşı serveri seçin. Nəticədə, təsadüfi serverlərim və təxmin etdiyiniz kimi dəyişən sürətim var idi. Bu olduqca mürəkkəb bir mövzudur, sabit serverdən istifadə etmək, əgər belədirsə, statik və ya dinamik tədqiqat tələb edir. Ancaq burada bir sınaq serveri və statik olaraq sabit olanı dinamik olaraq seçərkən Beeline operatoru üçün sürət ölçmə qrafiklərinin bir nümunəsidir.

Bir neçə LTE modemində eyni vaxtda sürət testi
Dinamik server seçərkən sürətin ölçülməsinin nəticəsi.

Bir neçə LTE modemində eyni vaxtda sürət testi
Bir ciddi seçilmiş bir server ilə sürət testinin nəticəsi.

Sınaq zamanı hər iki yerdə "xəz" var və onu riyazi üsullarla çıxarmaq lazımdır. Ancaq sabit bir server ilə bir qədər azdır və amplituda daha sabitdir.
Ümumiyyətlə, bura böyük araşdırma yeridir. Və mən iperf yardım proqramından istifadə edərək serverimin sürətini ölçərdim. Ancaq biz texniki xüsusiyyətlərə sadiqik.

Poçt göndərilməsi və səhvlər

Poçt göndərmək üçün bir neçə onlarla fərqli variantı sınadım, amma sonunda aşağıdakılara qərar verdim. Yandex-də bir poçt qutusunu qeyd etdim və sonra götürdüm Bu poçt göndərmə nümunəsidir. Yoxladım və proqrama daxil etdim. Bu nümunə müxtəlif variantları, o cümlədən gmail-dən göndərmə və s. Mən poçt serverimi qurmaqla məşğul olmaq istəmirdim və buna vaxtım da yox idi, amma sonradan məlum oldu ki, bu da boşuna idi.

Günlüklər planlaşdırıcıya uyğun olaraq göndərildi, əlaqə varsa, hər 6 saatdan bir: saat 00, 06, 12 və 18. Aşağıdakı kimi göndərdi.

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

Səhvlər də əvvəlcə göndərildi. Başlamaq üçün, onlar siyahıda toplandı və sonra əlaqə varsa, planlaşdırıcıdan istifadə edərək göndərildi. Ancaq sonra Yandex-in gündə göndərilən mesajların sayına məhdudiyyət qoyması ilə bağlı problemlər yarandı (bu ağrı, kədər və alçaqlıqdır). Hətta dəqiqədə çox sayda səhv ola biləcəyi üçün biz poçtla səhvlər göndərməkdən imtina etməli olduq. Beləliklə, Yandex xidmətləri vasitəsilə avtomatik olaraq belə bir problem haqqında məlumat göndərərkən unutmayın.

Əlaqə serveri

Uzaq bir aparat parçasına daxil olmaq və onu fərdiləşdirmək və yenidən konfiqurasiya etmək üçün mənə xarici server lazım idi. Ümumiyyətlə, ədalətli olmaq üçün bütün məlumatları serverə göndərmək və veb interfeysində bütün gözəl qrafikləri qurmaq düzgün olardı. Ancaq hamısı birdən deyil.

VPS üçün mən seçdim ruvds.com. Ən sadə serveri götürə bilərsiniz. Və ümumiyyətlə, mənim məqsədlərim üçün bu kifayətdir. Ancaq serverin pulunu öz cibimdən ödəmədiyim üçün onu kiçik bir ehtiyatla götürmək qərarına gəldim ki, veb interfeysi, öz SMTP serverimizi, VPN və s. yerləşdirsək kifayət edər. Üstəlik, Telegram botunu qurmağı bacarın və onun bloklanması ilə bağlı problem yaşamayın. Buna görə də Amsterdamı və aşağıdakı parametrləri seçdim.

Bir neçə LTE modemində eyni vaxtda sürət testi

Aparat ilə əlaqə metodu olaraq vim2 əks ssh bağlantısını seçdi və təcrübədən göründüyü kimi, bu, ən yaxşısı deyil. Bağlantı kəsilirsə, server portu saxlayır və bir müddət onun vasitəsilə qoşulmaq mümkün deyil. Buna görə də, digər rabitə üsullarından, məsələn, VPN-dən istifadə etmək daha yaxşıdır. Gələcəkdə VPN-ə keçmək istədim, amma vaxtım yox idi.

Mən təhlükəsizlik duvarının qurulması, hüquqların məhdudlaşdırılması, kök ssh əlaqələrinin söndürülməsi və VPS-nin qurulmasının digər təfərrüatlarına girməyəcəyəm. İnanmaq istərdim ki, siz artıq hər şeyi bilirsiniz. Uzaqdan əlaqə üçün mən serverdə yeni istifadəçi yaradıram.

adduser vimssh

Aparatımızda ssh əlaqə açarları yaradıram.

ssh-keygen

Və mən onları serverimizə kopyalayıram.

ssh-copy-id [email protected]

Aparatımızda hər açılışda avtomatik tərs ssh bağlantısı yaradıram.

[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 portuna diqqət yetirin: əks ssh vasitəsilə qoşulmaq üçün hansı portdan istifadə edəcəyimi müəyyənləşdirir. Onu başlanğıca əlavə edin və başlayın.

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

Siz hətta statusu görə bilərsiniz:

sudo systemctl status autossh.service

İndi VPS serverimizdə, əgər işlədirsək:

ssh -p 8083 khadas@localhost

Sonra test aparatıma keçirəm. Aparatdan mən də serverimə ssh vasitəsilə logları və istənilən məlumatı göndərə bilərəm ki, bu da çox rahatdır.

Hamısını birlikdə qoymaq

Bir neçə LTE modemində eyni vaxtda sürət testi
Yandırın, inkişafa və sazlamaya başlayaq

Vay, bəli, budur, mən bütün qovşaqları təsvir etdim. İndi hamısını bir yerə yığmağın vaxtıdır. Kodu görə bilərsiniz burada.

Kodla bağlı vacib bir məqam: Bu layihə belə başlamaya bilər, çünki o, müəyyən bir tapşırıq üçün, müəyyən bir arxitektura üçün hazırlanmışdır. Mənbə kodunu versəm də, yenə də ən qiymətli şeyləri burada, mətnin içində izah edəcəyəm, əks halda bu, tamamilə anlaşılmazdır.

Başlanğıcda mən gps, gpio-nu işə salıram və ayrıca planlaşdırıcı mövzunu işə salıram.

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

Planlayıcı olduqca sadədir: mesaj göndərməyin vaxtının gəlib çatmadığını və cari səhv statusunun nə olduğunu görür. Səhv bayrağı varsa, LED-i yanıb-sönürük.

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

Bu layihənin ən çətin hissəsi hər bir test üçün əks ssh bağlantısını saxlamaqdır. Hər bir test standart şlüzün və DNS serverinin yenidən konfiqurasiyasını əhatə edir. Onsuz da heç kim oxumadığı üçün bilin ki, qatar taxta relslərə minmir. Pasxa yumurtasını tapan şəxs konfet alır.

Bunu etmək üçün mən ayrıca marşrutlaşdırma cədvəli yaradıram - 0x2 işarəsini təyin edin və trafikin yönləndirilməsi qaydası.

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

Bunun necə işlədiyini daha çox öyrənə bilərsiniz bu yazıda oxuyun.

Bundan sonra mən sonsuz bir döngəyə girirəm, burada hər dəfə qoşulmuş modemlərin siyahısını alırıq (şəbəkə konfiqurasiyasının qəfil dəyişdiyini öyrənmək üçün).

network_list = getNetworklist()

Şəbəkə interfeyslərinin siyahısını əldə etmək olduqca sadədir.

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

Siyahını aldıqdan sonra modem haqqında fəsildə şəkildə göstərdiyim kimi bütün interfeyslərə İP ünvanlarını təyin etdim.

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

Sonra mən sadəcə olaraq hər bir interfeysdən bir döngədə keçirəm. Və hər bir interfeysi konfiqurasiya edirəm.

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

İnterfeysi funksionallıq üçün yoxlayıram, əgər şəbəkə yoxdursa, səhvlər yaradıram. Şəbəkə varsa, hərəkət etmək vaxtıdır!

Burada mən bu interfeysə ssh marşrutunu konfiqurasiya edirəm (əgər bu edilməmişdirsə), əgər vaxt gəlibsə, serverə səhvlər göndərirəm, logları göndərirəm və nəhayət, sürət testini keçirərək qeydləri csv faylında saxlayıram.

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

Əks ssh-nin qurulması funksiyasını qeyd etmək lazımdır.

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

Və əlbəttə ki, bütün bu gözəlliyi başlanğıca əlavə etməlisiniz. Bunu etmək üçün bir fayl yaradıram:

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

Və orada yazıram:

[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

Avtomatik yükləməni yandırıram və başlayıram!

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

İndi əmrdən istifadə edərək baş verənlərin qeydlərini görə bilərəm:

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

Tapıntılar

Yaxşı, indi ən əsası, nəticədə nə oldu? İnkişaf və sazlama prosesi zamanı çəkə bildiyim bir neçə qrafik var. Qrafiklər aşağıdakı skriptlə gnuplot istifadə edərək qurulmuşdur.

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

İlk təcrübə bir neçə gün apardığım Tele2 operatoru ilə oldu.

Bir neçə LTE modemində eyni vaxtda sürət testi

Burada dinamik ölçmə serverindən istifadə etdim. Sürət ölçmələri işləyir, lakin çox dəyişir, lakin bəzi orta dəyər hələ də görünür və bu, məsələn, hərəkətli ortalama ilə məlumatları süzməklə əldə edilə bilər.

Daha sonra digər telekommunikasiya operatorları üçün bir sıra qrafiklər qurdum. Bu halda, artıq bir test serveri var idi və nəticələr də çox maraqlı idi.

Bir neçə LTE modemində eyni vaxtda sürət testi

Bir neçə LTE modemində eyni vaxtda sürət testi

Bir neçə LTE modemində eyni vaxtda sürət testi

Bir neçə LTE modemində eyni vaxtda sürət testi

Gördüyünüz kimi, mövzu bu məlumatların tədqiqi və emalı üçün çox genişdir və bir neçə həftəlik iş üçün açıq şəkildə davam etmir. Amma…

İşin nəticəsi

Məndən asılı olmayan şəraitə görə iş qəfil tamamlandı. Bu layihənin zəif tərəflərindən biri mənim subyektiv fikrimcə, əslində başqa modemlərlə eyni vaxtda işləmək istəməyən və hər dəfə yüklənəndə belə hiylələr edən modem idi. Bu məqsədlər üçün çox sayda digər modem modelləri var; adətən onlar artıq Mini PCI-e formatındadır və cihazın içərisinə quraşdırılır və konfiqurasiya etmək daha asandır. Amma bu tamam başqa hekayədir. Layihə maraqlı idi və mən orada iştirak edə bildiyimə görə çox sevindim.

Bir neçə LTE modemində eyni vaxtda sürət testi

Mənbə: www.habr.com

Добавить комментарий