Ujian kelajuan serentak pada beberapa modem LTE

Semasa kuarantin, saya telah ditawarkan untuk mengambil bahagian dalam pembangunan peranti untuk mengukur kelajuan modem LTE untuk beberapa pengendali selular.

Ujian kelajuan serentak pada beberapa modem LTE

Pelanggan ingin menilai kelajuan pelbagai pengendali telekomunikasi di lokasi geografi yang berbeza supaya dapat memahami pengendali selular mana yang paling optimum untuknya apabila memasang peralatan menggunakan sambungan LTE, contohnya, untuk siaran video. Pada masa yang sama, masalah itu perlu diselesaikan semudah dan semurah mungkin, tanpa peralatan mahal.

Saya akan katakan dengan segera bahawa tugas itu bukanlah yang paling mudah dan paling intensif pengetahuan; Saya akan memberitahu anda masalah yang saya hadapi dan bagaimana saya menyelesaikannya. Jadi, mari pergi.

Nota

Mengukur kelajuan sambungan LTE adalah perkara yang sangat kompleks: anda perlu memilih peralatan dan teknik pengukuran yang betul, dan juga mempunyai pemahaman yang baik tentang topologi dan operasi rangkaian selular. Selain itu, kelajuan boleh dipengaruhi oleh beberapa faktor: bilangan pelanggan pada sel, keadaan cuaca, malah dari sel ke sel kelajuan boleh berbeza secara mendadak disebabkan topologi rangkaian. Secara umum, ini adalah masalah dengan sejumlah besar yang tidak diketahui, dan hanya pengendali telekomunikasi boleh menyelesaikannya dengan betul.

Pada mulanya, pelanggan hanya mahu memandu kurier dengan telefon pengendali, mengambil ukuran terus pada telefon dan kemudian menulis hasil pengukuran kelajuan dalam buku nota. Penyelesaian saya untuk mengukur kelajuan rangkaian lte, walaupun tidak ideal, menyelesaikan masalah.

Oleh kerana kekurangan masa, saya membuat keputusan bukan memihak kepada kemudahan atau kepraktisan, tetapi memihak kepada kepantasan pembangunan. Sebagai contoh, ssh terbalik digunakan untuk akses jauh, bukannya VPN yang lebih praktikal, untuk menjimatkan masa untuk menyediakan pelayan dan setiap pelanggan individu.

Tugas teknikal

Seperti yang dinyatakan dalam artikel Tanpa spesifikasi teknikal: mengapa pelanggan tidak mahukannya: Jangan bekerja tanpa spesifikasi teknikal! Tidak pernah, di mana-mana!

Tugas teknikalnya agak mudah, saya akan mengembangkannya sedikit untuk pemahaman pengguna akhir. Pilihan penyelesaian teknikal dan peralatan ditentukan oleh pelanggan. Jadi, spesifikasi teknikal itu sendiri, selepas semua kelulusan:

Berdasarkan komputer papan tunggal vim2 buat penguji kelajuan untuk sambungan lte melalui modem Huawei e3372h - 153 beberapa operator telekom (daripada satu hingga n). Ia juga perlu untuk menerima koordinat daripada penerima GPS yang disambungkan melalui UART. Buat ukuran kelajuan menggunakan perkhidmatan www.speedtest.net dan letakkannya ke dalam jadual seperti ini:

Ujian kelajuan serentak pada beberapa modem LTE

Jadual dalam format csv. Kemudian hantar tanda ini melalui e-mel setiap 6 jam. Sekiranya berlaku ralat, kelipkan LED yang disambungkan ke GPIO.

Saya menerangkan spesifikasi teknikal dalam bentuk percuma, selepas banyak kelulusan. Tetapi makna tugas itu sudah kelihatan. Seminggu diberi untuk semuanya. Tetapi pada hakikatnya ia berlangsung selama tiga minggu. Ini mengambil kira hakikat bahawa saya melakukan ini hanya selepas kerja utama saya dan pada hujung minggu.

Di sini saya ingin sekali lagi menarik perhatian kepada fakta bahawa pelanggan bersetuju terlebih dahulu mengenai penggunaan perkhidmatan pengukuran kelajuan dan perkakasan, yang sangat mengehadkan keupayaan saya. Bajet juga terhad, jadi tiada apa yang istimewa dibeli. Jadi kami terpaksa bermain mengikut peraturan ini.

Seni bina dan pembangunan

Skim ini mudah dan jelas. Oleh itu, saya akan meninggalkannya tanpa sebarang komen khas.

Ujian kelajuan serentak pada beberapa modem LTE

Saya memutuskan untuk melaksanakan keseluruhan projek dalam python, walaupun pada hakikatnya saya tidak mempunyai pengalaman membangunkan dalam bahasa ini sama sekali. Saya memilihnya kerana terdapat banyak contoh dan penyelesaian siap sedia yang boleh mempercepatkan pembangunan. Oleh itu, saya meminta semua pengaturcara profesional untuk tidak memarahi pengalaman pertama saya mengembangkan ular sawa, dan saya sentiasa gembira mendengar kritikan membina untuk meningkatkan kemahiran saya.

Juga dalam proses itu saya dapati bahawa python mempunyai dua versi berjalan 2 dan 3, hasilnya saya menyelesaikan pada yang ketiga.

Nod perkakasan

Vim2 plat tunggal

Saya diberi komputer papan tunggal sebagai mesin utama saya vim2

Ujian kelajuan serentak pada beberapa modem LTE

Pemproses media yang sangat baik dan berkuasa untuk rumah pintar dan SMART-TV, tetapi sangat tidak sesuai untuk tugas ini, atau, katakan, kurang sesuai. Sebagai contoh, OS utamanya ialah Android, dan Linux ialah OS sekunder, dan oleh itu tiada siapa yang menjamin operasi berkualiti tinggi semua nod dan pemacu di bawah Linux. Dan saya menganggap bahawa beberapa masalah berkaitan dengan pemacu USB platform ini, jadi modem tidak berfungsi seperti yang diharapkan pada papan ini. Ia juga mempunyai dokumentasi yang sangat lemah dan berselerak, jadi setiap operasi mengambil banyak masa untuk menggali dok. Malah kerja biasa dengan GPIO mengambil banyak darah. Sebagai contoh, saya mengambil masa beberapa jam untuk menyediakan LED. Tetapi, untuk menjadi objektif, pada asasnya tidak penting jenis papan tunggal itu, perkara utama ialah ia berfungsi dan terdapat port USB.

Pertama, saya perlu memasang Linux pada papan ini. Untuk tidak meninjau hutan dokumentasi untuk semua orang, dan juga bagi mereka yang akan berurusan dengan sistem papan tunggal ini, saya menulis bab ini.

Terdapat dua pilihan untuk memasang Linux: pada kad SD luaran atau pada MMC dalaman. Saya menghabiskan satu malam cuba memikirkan cara menjadikannya berfungsi dengan kad, jadi saya memutuskan untuk memasangnya pada MMC, walaupun tanpa ragu-ragu ia akan menjadi lebih mudah untuk bekerja dengan kad luaran.

Mengenai perisian tegar bengkok di sini. Saya menterjemah dari pelik ke bahasa Rusia. Untuk memancarkan papan, saya perlu menyambungkan UART perkakasan. Menyambungnya dengan cara berikut.

  • Pin Alat GND: <β€”> Pin17 GPIO VIM
  • Pin Alat TXD: <β€”> Pin18 GPIO VIM (Linux_Rx)
  • Pin Alat RXD: <β€”> Pin19 GPIO VIM (Linux_Tx)
  • VCC Pin Alat: <β€”> Pin20 GPIO VIM

Ujian kelajuan serentak pada beberapa modem LTE

Selepas itu, saya memuat turun firmware oleh itu. Versi perisian tegar khusus VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Untuk memuat naik perisian tegar ini, saya memerlukan utiliti. Butiran lanjut tentang ini di sini. Saya belum cuba menyalakannya di bawah Windows, tetapi saya perlu memberitahu anda beberapa perkataan tentang perisian tegar di bawah Linux. Pertama, saya akan memasang utiliti mengikut arahan.

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

Aaand... Tiada apa-apa yang berkesan. Saya menghabiskan beberapa jam mengedit skrip pemasangan supaya semuanya akan dipasang dengan betul untuk saya. Saya tidak ingat apa yang saya lakukan di sana, tetapi terdapat juga sarkas dengan kuda. Jadi berhati-hati. Tetapi tanpa utiliti ini tidak ada gunanya menyeksa vim2 lebih jauh. Lebih baik jangan kacau dia langsung!

Selepas tujuh bulatan neraka, konfigurasi skrip dan pemasangan, saya menerima pakej utiliti yang berfungsi. Saya menyambungkan papan melalui USB ke komputer Linux saya, dan juga menyambungkan UART mengikut rajah di atas.
Saya sedang menyediakan terminal minikom kegemaran saya untuk kelajuan 115200, tanpa kawalan ralat perkakasan dan perisian. Dan mari kita mulakan.

Ujian kelajuan serentak pada beberapa modem LTE

Apabila memuatkan VIM2 dalam terminal UART, saya menekan kekunci, seperti bar ruang, untuk berhenti memuatkan. Selepas baris muncul

kvim2# 

Saya masukkan arahan:

kvim2# run update

Pada hos yang kami muatkan, saya laksanakan:

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

Itu sahaja, phew. Saya menyemak, terdapat Linux di papan. Log masuk/kata laluan khadas:khadas.

Selepas itu, beberapa tetapan awal kecil. Untuk kerja selanjutnya, saya melumpuhkan kata laluan untuk sudo (ya, tidak selamat, tetapi mudah).

sudo visudo

Saya mengedit baris ke borang dan menyimpan

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

Kemudian saya menukar tempat semasa supaya masa di Moscow, jika tidak, ia akan berada di Greenwich.

sudo timedatectl set-timezone Europe/Moscow

atau

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

Jika anda merasa sukar, maka jangan gunakan papan ini; Raspberry Pi adalah lebih baik. Sejujurnya.

Modem Huawei e3372h – 153

Modem ini merupakan sumber darah yang penting bagi saya, dan, sebenarnya, ia menjadi hambatan bagi keseluruhan projek. Secara umum, nama "modem" untuk peranti ini sama sekali tidak mencerminkan intipati kerja: ini adalah gabungan yang kuat, perkakasan ini mempunyai peranti komposit yang berpura-pura menjadi CD-ROM untuk memasang pemacu, dan kemudian beralih kepada mod kad rangkaian.

Dari segi seni bina, dari sudut pandangan pengguna Linux, selepas semua tetapan, ia kelihatan seperti ini: selepas menyambungkan modem, saya mempunyai antara muka rangkaian eth*, yang melalui dhcp menerima alamat IP 192.168.8.100, dan get laluan lalai ialah 192.168.8.1.

Dan momen yang paling penting! Model modem ini tidak boleh berfungsi dalam mod modem, yang dikawal oleh arahan AT. Segala-galanya akan menjadi lebih mudah, buat sambungan PPP untuk setiap modem dan kemudian beroperasi dengannya. Tetapi dalam kes saya, "dirinya" (lebih tepat, penyelam Linux mengikut peraturan udev), mencipta antara muka eth dan memberikan alamat IP kepadanya melalui dhcp.

Untuk mengelakkan kekeliruan lanjut, saya cadangkan untuk melupakan perkataan "modem" dan menyebut kad rangkaian dan gerbang, kerana pada dasarnya, ia seperti menyambungkan kad rangkaian baharu dengan pintu masuk.
Apabila terdapat satu modem, ini tidak menyebabkan sebarang masalah khas, tetapi apabila terdapat lebih daripada satu, iaitu n-pieces, gambar rangkaian berikut timbul.

Ujian kelajuan serentak pada beberapa modem LTE

Iaitu, n kad rangkaian, dengan alamat IP yang sama, setiap satu dengan get laluan lalai yang sama. Tetapi sebenarnya, setiap daripada mereka disambungkan kepada pengendalinya sendiri.

Pada mulanya, saya mempunyai penyelesaian mudah: menggunakan arahan ifconfig atau ip, matikan semua antara muka dan hanya hidupkan satu pada gilirannya dan mengujinya. Penyelesaiannya adalah baik untuk semua orang, kecuali semasa detik bertukar saya tidak dapat menyambung ke peranti. Dan kerana pensuisan adalah kerap dan pantas, saya sebenarnya tidak mempunyai peluang untuk menyambung sama sekali.

Oleh itu, saya memilih laluan menukar alamat IP modem secara manual dan kemudian memandu trafik menggunakan tetapan penghalaan.

Ujian kelajuan serentak pada beberapa modem LTE

Ini bukan penamat masalah saya dengan modem: sekiranya berlaku masalah kuasa, ia terputus, dan bekalan kuasa stabil yang baik ke hab USB diperlukan. Saya menyelesaikan masalah ini dengan memateri keras kuasa terus ke hab. Satu lagi masalah yang saya hadapi dan yang merosakkan keseluruhan projek: selepas but semula atau permulaan sejuk peranti, tidak semua modem dikesan dan tidak selalu, dan saya tidak dapat menentukan mengapa ini berlaku dan dengan algoritma apa. Tetapi perkara pertama dahulu.

Untuk modem berfungsi dengan betul, saya memasang pakej usb-modeswitch.

sudo apt update
sudo apt install -y usb-modeswitch

Selepas itu, selepas menyambung, modem akan dikesan dan dikonfigurasikan dengan betul oleh subsistem udev. Saya menyemak dengan hanya menyambungkan modem dan memastikan rangkaian muncul.
Satu lagi masalah yang tidak dapat saya selesaikan: bagaimana saya boleh mendapatkan nama operator yang kami bekerjasama daripada modem ini? Nama operator terkandung dalam antara muka web modem di 192.168.8.1. Ini adalah halaman web dinamik yang menerima data melalui permintaan Ajax, jadi hanya wget halaman dan menghuraikan nama tidak akan berfungsi. Jadi saya mula melihat cara untuk membangunkan halaman web, dsb., dan menyedari bahawa saya melakukan sesuatu yang tidak masuk akal. Akibatnya, dia meludah, dan pengendali mula menerima menggunakan API Speedtest itu sendiri.

Lebih mudah jika modem mempunyai akses melalui arahan AT. Ia mungkin untuk mengkonfigurasi semula, membuat sambungan ppp, menetapkan IP, mendapatkan operator telekomunikasi, dsb. Tetapi malangnya, saya bekerja dengan apa yang telah diberikan kepada saya.

GPS

Penerima GPS yang saya berikan mempunyai antara muka dan kuasa UART. Ia bukan penyelesaian terbaik, tetapi ia masih boleh dilaksanakan dan mudah. Penerima kelihatan seperti ini.

Ujian kelajuan serentak pada beberapa modem LTE

Sejujurnya, ini adalah kali pertama saya bekerja dengan penerima GPS, tetapi seperti yang saya jangkakan, segala-galanya telah lama difikirkan untuk kami. Jadi kami hanya menggunakan penyelesaian siap sedia.

Pertama, saya dayakan uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) untuk menyambungkan GPS.

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

Selepas itu saya menyemak kejayaan operasi.

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

Perintah ini nampaknya mengedit devtree dengan cepat, yang sangat mudah.

Selepas kejayaan operasi ini, but semula dan pasang daemon GPS.

khadas@Khadas:~$ sudo reboot

Memasang daemon GPS. Saya memasang semuanya dan memotongnya serta-merta untuk konfigurasi selanjutnya.

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

Mengedit fail tetapan.

sudo vim /etc/default/gpsd

Saya sedang memasang UART di mana GPS akan digantung.

DEVICES="/dev/ttyS4"

Dan kemudian kita menghidupkan segala-galanya dan mula.

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

Selepas itu, saya menyambungkan GPS.

Ujian kelajuan serentak pada beberapa modem LTE

Wayar GPS berada di tangan saya, wayar debugger UART kelihatan di bawah jari saya.

Saya but semula dan menyemak operasi GPS menggunakan program gpsmon.

Ujian kelajuan serentak pada beberapa modem LTE

Anda tidak dapat melihat satelit dalam tangkapan skrin ini, tetapi anda boleh melihat komunikasi dengan penerima GPS, dan ini bermakna semuanya baik-baik saja.

Dalam python, saya mencuba banyak pilihan untuk bekerja dengan daemon ini, tetapi saya menetapkan pilihan yang berfungsi dengan betul dengan python 3.

Saya memasang perpustakaan yang diperlukan.

sudo -H pip3 install gps3 

Dan saya mengukir kod kerja.

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

Jika saya perlu mendapatkan koordinat, ini dilakukan dengan panggilan berikut:

longitude, latitude = getPositionData(agps_thread)

Dan dalam masa 1-10 saat saya sama ada akan mendapat koordinat atau tidak. Ya, saya mempunyai sepuluh percubaan untuk mendapatkan koordinat. Tidak optimum, bengkok dan serong, tetapi ia berfungsi. Saya memutuskan untuk melakukan ini kerana GPS boleh mempunyai penerimaan yang lemah dan tidak selalu menerima data. Jika anda menunggu untuk menerima data, maka jika anda bekerja di bilik terpencil, program akan membeku di tempat ini. Oleh itu, saya melaksanakan pilihan tidak elegan ini.

Pada dasarnya, jika terdapat lebih banyak masa, adalah mungkin untuk menerima data dari GPS secara langsung melalui UART, menghuraikannya dalam benang yang berasingan dan bekerja dengannya. Tetapi tidak ada masa sama sekali, oleh itu kod hodoh yang kejam. Dan ya, saya tidak malu.

Diod pemancar cahaya

Menyambungkan LED adalah mudah dan sukar pada masa yang sama. Kesukaran utama ialah nombor pin dalam sistem tidak sepadan dengan nombor pin pada papan dan kerana dokumentasi ditulis di sebelah kiri. Untuk membandingkan nombor pin perkakasan dan nombor pin dalam OS, anda perlu menjalankan arahan:

gpio readall

Jadual surat-menyurat pin dalam sistem dan pada papan akan dipaparkan. Selepas itu saya sudah boleh mengendalikan pin dalam OS itu sendiri. Dalam kes saya, LED disambungkan ke GPIOH_5.

Ujian kelajuan serentak pada beberapa modem LTE

Saya menukar pin GPIO kepada mod output.

gpio -g mode 421 out

Saya menulis sifar.

gpio -g write 421 0

Saya tulis satu.

gpio -g write 421 1

Ujian kelajuan serentak pada beberapa modem LTE
Semuanya menyala, selepas menulis "1"

#gpio subsistem
def gpio_init():
	os.system("gpio -g mode 421 out")
	os.system("gpio -g write 421 1")

def gpio_set(val):
	os.system("gpio -g write 421 %d" % val)
	
def error_blink():
	gpio_set(0)
	time.sleep(0.1)
	gpio_set(1)
	time.sleep(0.1)
	gpio_set(0)
	time.sleep(0.1)
	gpio_set(1)
	time.sleep(0.1)
	gpio_set(0)
	time.sleep(1.0)
	gpio_set(1)

def good_blink():
	gpio_set(1)

Sekarang, sekiranya berlaku ralat, saya memanggil error_blink() dan LED akan berkelip dengan indah.

Nod perisian

API Speedtest

Sungguh menggembirakan kerana perkhidmatan speedtest.net mempunyai python-API sendiri, anda boleh lihat Github.

Perkara yang baik ialah terdapat kod sumber yang juga boleh dilihat. Cara bekerja dengan API ini (contoh mudah) boleh didapati dalam bahagian yang berkaitan.

Saya memasang perpustakaan python dengan arahan berikut.

sudo -H pip3 install speedtest-cli

Sebagai contoh, anda juga boleh memasang penguji kelajuan di Ubuntu terus daripada perisian. Ini adalah aplikasi python yang sama, yang kemudiannya boleh dilancarkan terus dari konsol.

sudo apt install speedtest-cli -y

Dan ukur kelajuan Internet anda.

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

Akibatnya, seperti yang saya lakukan. Saya terpaksa masuk ke dalam kod sumber ujian kelajuan ini untuk melaksanakannya dengan lebih lengkap ke dalam projek saya. Salah satu tugas yang paling penting ialah mendapatkan nama pengendali telekomunikasi untuk menggantikannya ke dalam plat.

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"
#Ρ‚ΡƒΡ‚ ΠΈΠ΄Π΅Ρ‚ запись Π² Ρ„Π°ΠΉΠ» Π»ΠΎΠ³ΠΎΠ²

Di sini juga, semuanya ternyata tidak begitu mudah, walaupun ia kelihatan lebih mudah. Pada mulanya, parameter pelayan adalah sama dengan [], mereka berkata, pilih pelayan terbaik. Akibatnya, saya mempunyai pelayan rawak, dan, seperti yang anda rasa, kelajuan berubah-ubah. Ini adalah topik yang agak kompleks, menggunakan pelayan tetap, jika ya, statik atau dinamik, memerlukan penyelidikan. Tetapi berikut ialah contoh graf ukuran kelajuan untuk pengendali Beeline apabila memilih pelayan ujian dan pelayan tetap secara statik secara dinamik.

Ujian kelajuan serentak pada beberapa modem LTE
Hasil daripada mengukur kelajuan apabila memilih pelayan dinamik.

Ujian kelajuan serentak pada beberapa modem LTE
Hasil ujian kelajuan, dengan satu pelayan yang dipilih dengan ketat.

Semasa ujian, terdapat "bulu" di kedua-dua tempat, dan ia perlu dikeluarkan menggunakan kaedah matematik. Tetapi dengan pelayan tetap ia kurang sedikit dan amplitudnya lebih stabil.
Secara umum, ini adalah tempat penyelidikan yang hebat. Dan saya akan mengukur kelajuan pelayan saya menggunakan utiliti iperf. Tetapi kami berpegang pada spesifikasi teknikal.

Menghantar mel dan ralat

Untuk menghantar mel, saya mencuba beberapa dozen pilihan yang berbeza, tetapi akhirnya saya menyelesaikan perkara berikut. Saya mendaftarkan peti mel di Yandex dan kemudian mengambil Ini adalah contoh menghantar mel. Saya menyemaknya dan melaksanakannya ke dalam program. Contoh ini mengkaji pelbagai pilihan, termasuk menghantar dari gmail, dsb. Saya tidak mahu bersusah payah menyediakan pelayan mel saya dan tidak mempunyai masa untuk itu, tetapi ternyata kemudian, ia juga sia-sia.

Log dihantar mengikut penjadual, jika ada kaitan, setiap 6 jam: pada pukul 00, 06 pagi, 12 tengah hari dan 18 malam. Dihantar seperti berikut.

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

Ralat juga telah dihantar pada mulanya. Sebagai permulaan, mereka terkumpul dalam senarai, dan kemudian dihantar juga menggunakan penjadual, jika terdapat sambungan. Walau bagaimanapun, masalah timbul dengan fakta bahawa Yandex mempunyai had pada bilangan mesej yang dihantar setiap hari (ini adalah kesakitan, kesedihan dan penghinaan). Oleh kerana mungkin terdapat sejumlah besar ralat walaupun seminit, kami terpaksa meninggalkan ralat menghantar melalui mel. Oleh itu, perlu diingat apabila secara automatik menghantar maklumat tentang masalah sedemikian melalui perkhidmatan Yandex.

Pelayan maklum balas

Untuk mempunyai akses kepada perkakasan jauh dan dapat menyesuaikan dan mengkonfigurasi semulanya, saya memerlukan pelayan luaran. Secara umum, untuk bersikap adil, adalah betul untuk menghantar semua data ke pelayan dan membina semua graf yang indah dalam antara muka web. Tetapi tidak sekaligus.

Untuk VPS saya pilih ruvds.com. Anda boleh menggunakan pelayan yang paling mudah. Dan secara umum, untuk tujuan saya ini sudah cukup. Tetapi kerana saya tidak membayar untuk pelayan daripada poket saya sendiri, saya memutuskan untuk mengambilnya dengan rizab yang kecil supaya cukup jika kami menggunakan antara muka web, pelayan SMTP kami sendiri, VPN, dll. Selain itu, dapat menyediakan bot Telegram dan tidak menghadapi masalah dengan ia disekat. Oleh itu, saya memilih Amsterdam dan parameter berikut.

Ujian kelajuan serentak pada beberapa modem LTE

Sebagai kaedah komunikasi dengan perkakasan, vim2 memilih sambungan ssh terbalik dan, seperti yang ditunjukkan oleh amalan, ia bukanlah yang terbaik. Jika sambungan terputus, pelayan memegang port dan mustahil untuk menyambung melaluinya untuk beberapa waktu. Oleh itu, adalah lebih baik untuk menggunakan kaedah komunikasi lain, contohnya VPN. Pada masa hadapan saya mahu beralih kepada VPN, tetapi tidak mempunyai masa.

Saya tidak akan pergi ke butiran menyediakan tembok api, menyekat hak, melumpuhkan sambungan root ssh dan truisme lain untuk menubuhkan VPS. Saya ingin percaya bahawa anda sudah mengetahui segala-galanya. Untuk sambungan jauh, saya mencipta pengguna baharu pada pelayan.

adduser vimssh

Saya menjana kunci sambungan ssh pada perkakasan kami.

ssh-keygen

Dan saya menyalinnya ke pelayan kami.

ssh-copy-id [email protected]

Pada perkakasan kami, saya mencipta sambungan ssh terbalik automatik pada setiap but.

[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

Beri perhatian kepada port 8083: ia menentukan port mana yang akan saya gunakan untuk menyambung melalui ssh terbalik. Tambahkannya pada permulaan dan mulakan.

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

Anda juga boleh melihat status:

sudo systemctl status autossh.service

Sekarang, pada pelayan VPS kami, jika kami menjalankan:

ssh -p 8083 khadas@localhost

Kemudian saya sampai ke bahagian ujian perkakasan saya. Dan dari perkakasan saya juga boleh menghantar log dan sebarang data melalui ssh ke pelayan saya, yang sangat mudah.

Meletakkannya bersama-sama

Ujian kelajuan serentak pada beberapa modem LTE
Menghidupkan, mari mulakan pembangunan dan nyahpepijat

Fuh, itu sahaja, saya menerangkan semua nod. Kini tiba masanya untuk mengumpulkan semuanya. Anda boleh melihat kod tersebut di sini.

Perkara penting dengan kod: Projek ini mungkin tidak bermula seperti ini, kerana ia telah disesuaikan untuk tugas tertentu, seni bina tertentu. Walaupun saya memberikan kod sumber, saya masih akan menerangkan perkara yang paling berharga di sini, betul-betul dalam teks, jika tidak, ia benar-benar tidak dapat difahami.

Pada mulanya, saya memulakan gps, gpio dan melancarkan benang penjadual yang berasingan.

#запуск ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°
pShedulerThread = threading.Thread(target=ShedulerThread, args=(1,))
pShedulerThread.start()

Penjadual agak mudah: ia kelihatan untuk melihat sama ada masanya telah tiba untuk menghantar mesej dan status ralat semasa. Jika terdapat bendera ralat, maka kita kelipkan LED.

#sheduler
def ShedulerThread(name):
	global ready_to_send
	while True:
		d = datetime.today()
		time_x = d.strftime('%H:%M')
		if time_x in time_send_csv:
			ready_to_send = True
		if error_status:
			error_blink()
		else:
			good_blink()
		time.sleep(1)

Bahagian yang paling sukar dalam projek ini ialah mengekalkan sambungan ssh terbalik untuk setiap ujian. Setiap ujian melibatkan konfigurasi semula get laluan lalai dan pelayan DNS. Oleh kerana tiada siapa yang membaca, ketahuilah bahawa kereta api itu tidak menaiki rel kayu. Sesiapa yang menjumpai telur Paskah mendapat gula-gula.

Untuk melakukan ini, saya mencipta jadual penghalaan yang berasingan -set-mark 0x2 dan peraturan untuk mengubah hala lalu lintas.

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

Anda boleh mengetahui lebih lanjut tentang cara ia berfungsi baca dalam artikel ini.

Selepas itu saya pergi ke gelung yang tidak berkesudahan, di mana setiap kali kita mendapat senarai modem yang disambungkan (untuk mengetahui sama ada konfigurasi rangkaian telah berubah secara tiba-tiba).

network_list = getNetworklist()

Mendapatkan senarai antara muka rangkaian agak mudah.

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

Selepas menerima senarai, saya menetapkan alamat IP kepada semua antara muka, seperti yang saya tunjukkan dalam gambar dalam bab tentang modem.

SetIpAllNetwork(network_list)

def SetIpAllNetwork(network_list):
	for iface in network_list:
		lastip = "%d" % (3 + network_list.index(iface))
		cmd_run ("sudo ifconfig " + iface + " 192.168.8." + lastip +" up")

Kemudian saya hanya melalui setiap antara muka dalam satu gelung. Dan saya mengkonfigurasi setiap antara muka.

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

Saya menyemak antara muka untuk kefungsian, jika tiada rangkaian, maka saya menjana ralat. Jika ada rangkaian, maka sudah tiba masanya untuk bertindak!

Di sini saya mengkonfigurasi penghalaan ssh ke antara muka ini (jika ia belum dilakukan), hantar ralat ke pelayan jika masanya telah tiba, hantar log dan akhirnya jalankan ujian laju dan simpan log ke fail csv.

if not NetworkAvalible():
....
#Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ ошибки
....
else: #Π•ΡΡ‚ΡŒ ΡΠ΅Ρ‚ΡŒ, ΡƒΡ€Π°, Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ!
#Если Ρƒ нас ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹ΠΉ интСрфСйс, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ssh, Ρ‚ΠΎ мСняСм Π΅Π³ΠΎ
  if (sshint == lastbanint or sshint =="free"):
    print("********** Setup SSH ********************")
    if sshint !="free":
      сmd_run("sudo ip route del default via 192.168.8.1 dev " + sshint +" table 102")
    SetupReverseSSH(iface)
    sshint = iface
#Ρ€Π°Π· сСтка Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ρ‚ΠΎ Π΄Π°Π²Π°ΠΉ срочно всС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ!!!
    if ready_to_send:
      print ("**** Ready to send!!!")
        if sendLogs():
          ready_to_send = False
        if error_status:
          SendErrors()
#ΠΈ Π΄Π°Π»Π΅Π΅ тСстируСм ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ сохраняСм Π»ΠΎΠ³ΠΈ. 

Perlu disebutkan fungsi menyediakan ssh terbalik.

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

Dan sudah tentu, anda perlu menambah semua keindahan ini untuk permulaan. Untuk melakukan ini saya membuat fail:

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

Dan saya menulis di dalamnya:

[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

Saya menghidupkan autoloading dan mula!

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

Sekarang saya dapat melihat log tentang apa yang berlaku menggunakan arahan:

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

Penemuan

Nah, sekarang perkara yang paling penting ialah, apa yang berlaku akibatnya? Berikut adalah beberapa graf yang saya berjaya tangkap semasa proses pembangunan dan penyahpepijatan. Graf telah dibina menggunakan gnuplot dengan skrip berikut.

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

Pengalaman pertama adalah dengan pengendali Tele2, yang saya kendalikan selama beberapa hari.

Ujian kelajuan serentak pada beberapa modem LTE

Di sini saya menggunakan pelayan pengukur dinamik. Pengukuran kelajuan berfungsi, tetapi sangat turun naik, tetapi beberapa nilai purata masih kelihatan, dan ini boleh diperolehi dengan menapis data, contohnya, dengan purata bergerak.

Kemudian saya membina beberapa graf untuk pengendali telekomunikasi lain. Dalam kes ini, sudah ada satu pelayan ujian, dan hasilnya juga sangat menarik.

Ujian kelajuan serentak pada beberapa modem LTE

Ujian kelajuan serentak pada beberapa modem LTE

Ujian kelajuan serentak pada beberapa modem LTE

Ujian kelajuan serentak pada beberapa modem LTE

Seperti yang anda lihat, topik ini sangat luas untuk penyelidikan dan pemprosesan data ini, dan jelas tidak bertahan selama beberapa minggu bekerja. Tetapi…

Hasil kerja

Kerja itu tiba-tiba siap kerana keadaan di luar kawalan saya. Salah satu kelemahan projek ini, pada pendapat subjektif saya, adalah modem, yang tidak benar-benar mahu berfungsi serentak dengan modem lain, dan membuat helah sedemikian setiap kali ia dimuatkan. Untuk tujuan ini, terdapat sejumlah besar model modem lain; biasanya mereka sudah dalam format Mini PCI-e dan dipasang di dalam peranti dan lebih mudah untuk dikonfigurasikan. Tetapi itu cerita yang sama sekali berbeza. Projek itu menarik dan saya sangat gembira kerana saya dapat mengambil bahagian di dalamnya.

Ujian kelajuan serentak pada beberapa modem LTE

Sumber: www.habr.com

Tambah komen