Tes kecepatan simultan pada beberapa modem LTE

Selama masa karantina, saya ditawari untuk ikut serta dalam pengembangan alat pengukur kecepatan modem LTE untuk beberapa operator seluler.

Tes kecepatan simultan pada beberapa modem LTE

Pelanggan ingin mengevaluasi kecepatan berbagai operator telekomunikasi di lokasi geografis yang berbeda agar dapat memahami operator seluler mana yang paling optimal baginya saat memasang peralatan menggunakan koneksi LTE, misalnya untuk siaran video. Pada saat yang sama, masalah tersebut harus diselesaikan sesederhana dan semurah mungkin, tanpa peralatan yang mahal.

Saya akan segera mengatakan bahwa tugas ini bukanlah tugas yang paling sederhana dan padat pengetahuan, saya akan memberi tahu Anda masalah apa yang saya temui dan bagaimana saya menyelesaikannya. Jadi ayo pergi.

Catatan

Mengukur kecepatan koneksi LTE adalah masalah yang sangat kompleks: Anda harus memilih peralatan dan teknik pengukuran yang tepat, serta memiliki pemahaman yang baik tentang topologi dan pengoperasian jaringan seluler. Ditambah lagi, kecepatan dapat dipengaruhi oleh beberapa faktor: jumlah pelanggan pada suatu sel, kondisi cuaca, bahkan dari sel ke sel kecepatannya dapat sangat bervariasi karena topologi jaringan. Secara umum, ini adalah masalah dengan banyak hal yang tidak diketahui, dan hanya operator telekomunikasi yang dapat menyelesaikannya dengan benar.

Awalnya pelanggan hanya ingin mengantar kurir dengan ponsel operator, melakukan pengukuran langsung di ponsel lalu menuliskan hasil pengukuran kecepatan di buku catatan. Solusi saya untuk mengukur kecepatan jaringan LTE, meskipun tidak ideal, memecahkan masalah.

Karena kurangnya waktu, saya membuat keputusan bukan demi kenyamanan atau kepraktisan, tetapi demi kecepatan pengembangan. Misalnya, reverse ssh digunakan untuk akses jarak jauh, bukan VPN yang lebih praktis, untuk menghemat waktu dalam menyiapkan server dan masing-masing klien.

tugas teknis

Seperti yang tertuang dalam artikel tersebut Tanpa spesifikasi teknis: mengapa klien tidak menginginkannya: Jangan bekerja tanpa spesifikasi teknis! Tidak pernah, dimanapun!

Tugas teknisnya cukup sederhana, saya akan memperluasnya sedikit agar dapat dipahami oleh pengguna akhir. Pilihan solusi teknis dan peralatan ditentukan oleh pelanggan. Jadi, spesifikasi teknisnya sendiri, setelah semua persetujuan:

Berdasarkan komputer papan tunggal vim2 membuat penguji kecepatan untuk koneksi LTE melalui modem Huawei e3372h - 153 beberapa operator telekomunikasi (dari satu hingga n). Penting juga untuk menerima koordinat dari penerima GPS yang terhubung melalui UART. Lakukan pengukuran kecepatan menggunakan layanan ini www.speedtest.net dan menaruhnya ke dalam tabel seperti ini:

Tes kecepatan simultan pada beberapa modem LTE

Tabel dalam format csv. Kemudian kirimkan tanda ini melalui email setiap 6 jam. Jika terjadi kesalahan, kedipkan LED yang terhubung ke GPIO.

Saya menjelaskan spesifikasi teknis dalam bentuk bebas, setelah banyak persetujuan. Namun arti dari tugas tersebut sudah terlihat. Seminggu diberikan untuk semuanya. Namun kenyataannya itu berlangsung selama tiga minggu. Ini mengingat fakta bahwa saya melakukan ini hanya setelah pekerjaan utama saya dan pada akhir pekan.

Di sini saya ingin sekali lagi menarik perhatian pada fakta bahwa pelanggan telah menyetujui sebelumnya penggunaan layanan pengukuran kecepatan dan perangkat keras, yang sangat membatasi kemampuan saya. Anggarannya juga terbatas, jadi tidak ada pembelian khusus. Jadi kami harus bermain sesuai aturan ini.

Arsitektur dan pembangunan

Skemanya sederhana dan jelas. Oleh karena itu, saya akan membiarkannya tanpa komentar khusus.

Tes kecepatan simultan pada beberapa modem LTE

Saya memutuskan untuk mengimplementasikan seluruh proyek dengan python, meskipun faktanya saya tidak memiliki pengalaman sama sekali dalam mengembangkan bahasa ini. Saya memilihnya karena ada banyak contoh dan solusi siap pakai yang dapat mempercepat pengembangan. Oleh karena itu, saya meminta semua programmer profesional untuk tidak memarahi pengalaman pertama saya mengembangkan python, dan saya selalu senang mendengar kritik yang membangun untuk meningkatkan keterampilan saya.

Juga dalam prosesnya saya menemukan bahwa python memiliki dua versi 2 dan 3 yang sedang berjalan, sebagai hasilnya saya memilih versi ketiga.

Node perangkat keras

Vim2 pelat tunggal

Saya diberi komputer papan tunggal sebagai mesin utama saya vim2

Tes kecepatan simultan pada beberapa modem LTE

Prosesor media yang luar biasa dan kuat untuk rumah pintar dan SMART-TV, tetapi sangat tidak cocok untuk tugas ini, atau, katakanlah, tidak cocok. Misalnya, OS utamanya adalah Android, dan Linux adalah OS sekunder, dan karenanya tidak ada yang menjamin pengoperasian semua node dan driver di Linux berkualitas tinggi. Dan saya berasumsi bahwa beberapa masalah terkait dengan driver USB platform ini, sehingga modem tidak berfungsi seperti yang diharapkan pada board ini. Dokumentasinya juga sangat buruk dan tersebar, sehingga setiap operasi memerlukan banyak waktu untuk menggali dermaga. Bahkan pekerjaan biasa dengan GPIO membutuhkan banyak darah. Misalnya, saya memerlukan waktu beberapa jam untuk menyiapkan LED. Tapi, untuk bersikap obyektif, pada dasarnya tidak penting jenis papan tunggalnya, yang utama berfungsi dan ada port USB.

Pertama, saya perlu menginstal Linux di board ini. Agar tidak menjelajahi belantara dokumentasi untuk semua orang, dan juga bagi mereka yang akan berurusan dengan sistem papan tunggal ini, saya menulis bab ini.

Ada dua pilihan untuk menginstal Linux: pada kartu SD eksternal atau pada MMC internal. Saya menghabiskan satu malam mencoba memikirkan cara membuatnya berfungsi dengan kartu tersebut, jadi saya memutuskan untuk menginstalnya di MMC, meskipun tidak diragukan lagi akan lebih mudah untuk bekerja dengan kartu eksternal.

Tentang firmware diceritakan secara tidak benar di sini. Saya menerjemahkan dari aneh ke dalam bahasa Rusia. Untuk mem-flash papan, saya perlu menghubungkan UART perangkat keras. Menghubungkannya sebagai berikut.

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

Tes kecepatan simultan pada beberapa modem LTE

Setelah itu, saya mendownload firmwarenya karenanya. Versi firmware tertentu VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Untuk mengunggah firmware ini, saya memerlukan utilitas. Lebih detail tentang ini di sini. Saya belum mencoba mem-flash-nya di Windows, tetapi saya perlu memberi tahu Anda beberapa kata tentang firmware di Linux. Pertama, saya akan menginstal utilitas sesuai petunjuk.

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

Aaand... Tidak ada yang berhasil. Saya menghabiskan beberapa jam mengedit skrip instalasi sehingga semuanya dapat diinstal dengan benar untuk saya. Saya tidak ingat apa yang saya lakukan di sana, tapi ada juga sirkus dengan kuda. Jadi berhati-hatilah. Tapi tanpa utilitas ini tidak ada gunanya menyiksa vim2 lebih jauh. Lebih baik jangan main-main dengannya sama sekali!

Setelah tujuh lingkaran neraka, konfigurasi dan instalasi skrip, saya menerima paket utilitas yang berfungsi. Saya menghubungkan papan melalui USB ke komputer Linux saya, dan juga menghubungkan UART sesuai dengan diagram di atas.
Saya menyiapkan terminal minicom favorit saya untuk kecepatan 115200, tanpa kontrol kesalahan perangkat keras dan perangkat lunak. Dan mari kita mulai.

Tes kecepatan simultan pada beberapa modem LTE

Saat memuat VIM2 di terminal UART, saya menekan tombol, seperti spasi, untuk menghentikan pemuatan. Setelah garis muncul

kvim2# 

Saya memasukkan perintah:

kvim2# run update

Di host tempat kami memuat, saya menjalankan:

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

Itu saja, fiuh. Saya memeriksa, ada Linux di papan. Login/kata sandi khadas:khadas.

Setelah itu, beberapa pengaturan awal kecil. Untuk pekerjaan lebih lanjut, saya menonaktifkan kata sandi untuk sudo (ya, tidak aman, tapi nyaman).

sudo visudo

Saya mengedit baris ke formulir dan menyimpannya

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

Lalu saya ubah lokasi saat ini sehingga waktunya di Moskow, jika tidak maka di Greenwich.

sudo timedatectl set-timezone Europe/Moscow

atau

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

Jika Anda merasa kesulitan, jangan gunakan board ini; Raspberry Pi lebih baik. Sejujurnya.

ModemHuawei e3372h – 153

Modem ini merupakan sumber darah yang signifikan bagi saya, dan, pada kenyataannya, menjadi penghambat keseluruhan proyek. Secara umum, nama “modem” untuk perangkat ini tidak mencerminkan esensi pekerjaan sama sekali: ini adalah kombinasi yang kuat, perangkat keras ini memiliki perangkat komposit yang berpura-pura menjadi CD-ROM untuk menginstal driver, dan kemudian beralih ke mode kartu jaringan.

Secara arsitektural, dari sudut pandang pengguna Linux, setelah semua pengaturan, tampilannya seperti ini: setelah menghubungkan modem, saya memiliki antarmuka jaringan eth*, yang melalui dhcp menerima alamat IP 192.168.8.100, dan gateway default adalah 192.168.8.1.

Dan momen terpenting! Model modem ini tidak dapat bekerja dalam mode modem yang dikendalikan oleh perintah AT. Semuanya akan lebih sederhana, buat koneksi PPP untuk setiap modem dan kemudian operasikan dengannya. Namun dalam kasus saya, "dirinya" (lebih tepatnya, penyelam Linux menurut aturan udev), membuat antarmuka eth dan memberikan alamat IP melalui dhcp.

Untuk menghindari kebingungan lebih lanjut, saya sarankan untuk melupakan kata “modem” dan menyebutkan kartu jaringan dan gateway, karena pada intinya, ini seperti menghubungkan kartu jaringan baru dengan gateway.
Jika modemnya satu maka tidak menimbulkan masalah khusus, namun bila modemnya lebih dari satu yaitu n-piece maka akan muncul gambaran jaringan sebagai berikut.

Tes kecepatan simultan pada beberapa modem LTE

Yaitu, n kartu jaringan, dengan alamat IP yang sama, masing-masing dengan gateway default yang sama. Namun nyatanya, masing-masing terhubung ke operatornya masing-masing.

Awalnya, saya punya solusi sederhana: menggunakan perintah ifconfig atau ip, matikan semua antarmuka dan cukup aktifkan satu antarmuka dan ujilah. Solusinya baik untuk semua orang, kecuali pada saat peralihan saya tidak dapat terhubung ke perangkat. Dan karena peralihannya sering dan cepat, saya sebenarnya tidak punya kesempatan untuk terhubung sama sekali.

Oleh karena itu, saya memilih jalur mengubah alamat IP modem secara manual dan kemudian mengarahkan lalu lintas menggunakan pengaturan perutean.

Tes kecepatan simultan pada beberapa modem LTE

Ini bukanlah akhir dari masalah saya dengan modem: jika ada masalah listrik, modem akan mati, dan diperlukan catu daya stabil yang baik ke hub USB. Saya memecahkan masalah ini dengan menyolder daya langsung ke hub. Masalah lain yang saya temui dan merusak keseluruhan proyek: setelah reboot atau cold start perangkat, tidak semua modem terdeteksi dan tidak selalu, dan saya tidak dapat menentukan mengapa ini terjadi dan dengan algoritma apa. Tapi hal pertama yang pertama.

Agar modem berfungsi dengan benar, saya menginstal paket usb-modeswitch.

sudo apt update
sudo apt install -y usb-modeswitch

Setelah itu, setelah terhubung, modem akan terdeteksi dan dikonfigurasi dengan benar oleh subsistem udev. Saya memeriksanya hanya dengan menghubungkan modem dan memastikan jaringan muncul.
Masalah lain yang tidak dapat saya selesaikan: bagaimana cara mendapatkan nama operator yang kami gunakan dari modem ini? Nama operator terdapat pada antarmuka web modem di 192.168.8.1. Ini adalah halaman web dinamis yang menerima data melalui permintaan Ajax, jadi hanya mengubah halaman dan mengurai namanya tidak akan berhasil. Jadi saya mulai mencari cara mengembangkan halaman web, dll., dan menyadari bahwa saya melakukan sesuatu yang tidak masuk akal. Akibatnya, dia meludah, dan operator mulai menerima menggunakan Speedtest API itu sendiri.

Akan lebih mudah jika modem memiliki akses melalui perintah AT. Dimungkinkan untuk mengkonfigurasi ulang, membuat koneksi ppp, menetapkan IP, mendapatkan operator telekomunikasi, dll. Namun sayangnya, saya bekerja dengan apa yang telah diberikan kepada saya.

GPS

Penerima GPS yang diberikan kepada saya memiliki antarmuka dan kekuatan UART. Itu bukan solusi terbaik, tapi masih bisa diterapkan dan sederhana. Penerimanya terlihat seperti ini.

Tes kecepatan simultan pada beberapa modem LTE

Sejujurnya, ini adalah pertama kalinya saya bekerja dengan penerima GPS, tetapi seperti yang saya harapkan, semuanya sudah dipikirkan sejak lama. Jadi kami hanya menggunakan solusi yang sudah jadi.

Pertama, saya aktifkan uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) untuk menghubungkan GPS.

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

Setelah itu saya memeriksa keberhasilan operasi.

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

Perintah ini tampaknya mengedit devtree dengan cepat, yang sangat nyaman.

Setelah operasi ini berhasil, reboot dan instal daemon GPS.

khadas@Khadas:~$ sudo reboot

Menginstal daemon GPS. Saya menginstal semuanya dan segera memotongnya untuk konfigurasi lebih lanjut.

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 file pengaturan.

sudo vim /etc/default/gpsd

Saya sedang memasang UART tempat GPS akan digantung.

DEVICES="/dev/ttyS4"

Dan kemudian kami menyalakan semuanya dan memulai.

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

Setelah itu, saya menghubungkan GPS.

Tes kecepatan simultan pada beberapa modem LTE

Kabel GPS ada di tangan saya, kabel debugger UART terlihat di bawah jari saya.

Saya reboot dan memeriksa pengoperasian GPS menggunakan program gpsmon.

Tes kecepatan simultan pada beberapa modem LTE

Anda tidak dapat melihat satelit di tangkapan layar ini, tetapi Anda dapat melihat komunikasi dengan penerima GPS, yang berarti semuanya baik-baik saja.

Dengan python, saya mencoba banyak opsi untuk bekerja dengan daemon ini, tetapi saya memilih salah satu yang berfungsi dengan benar dengan python 3.

Saya menginstal perpustakaan yang diperlukan.

sudo -H pip3 install gps3 

Dan saya membuat kode 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 1-10 detik saya akan mendapatkan koordinatnya atau tidak. Ya, saya sudah sepuluh kali mencoba mendapatkan koordinat. Kurang maksimal, bengkok dan miring, tapi berhasil. Saya memutuskan untuk melakukan ini karena GPS memiliki penerimaan yang buruk dan tidak selalu menerima data. Jika Anda menunggu untuk menerima data, maka jika Anda bekerja di ruangan terpencil, program akan terhenti di tempat ini. Oleh karena itu, saya menerapkan opsi yang tidak elegan ini.

Pada prinsipnya, jika ada lebih banyak waktu, dimungkinkan untuk menerima data dari GPS secara langsung melalui UART, menguraikannya dalam thread terpisah dan bekerja dengannya. Tapi tidak ada waktu sama sekali, karena itu kodenya sangat jelek. Dan ya, saya tidak malu.

LED

Menghubungkan LED itu sederhana dan sekaligus sulit. Kesulitan utamanya adalah nomor pin pada sistem tidak sesuai dengan nomor pin di papan dan karena dokumentasi ditulis dengan tangan kiri. Untuk membandingkan nomor pin perangkat keras dan nomor pin di OS, Anda perlu menjalankan perintah:

gpio readall

Tabel korespondensi pin di sistem dan di papan akan ditampilkan. Setelah itu saya sudah bisa mengoperasikan pin di OS itu sendiri. Dalam kasus saya, LED terhubung ke GPIOH_5.

Tes kecepatan simultan pada beberapa modem LTE

Saya mengalihkan pin GPIO ke mode keluaran.

gpio -g mode 421 out

Saya menuliskan nol.

gpio -g write 421 0

Saya menulis satu.

gpio -g write 421 1

Tes kecepatan simultan pada beberapa modem LTE
Semuanya menyala, setelah 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, jika terjadi kesalahan, saya memanggil error_blink() dan LED akan berkedip indah.

Node perangkat lunak

API Tes Kecepatan

Sangat menyenangkan bahwa layanan speedtest.net memiliki API python sendiri, Anda dapat melihatnya Github.

Hal baiknya adalah ada kode sumber yang juga bisa dilihat. Cara bekerja dengan API ini (contoh sederhana) dapat ditemukan di bagian yang relevan.

Saya menginstal perpustakaan python dengan perintah berikut.

sudo -H pip3 install speedtest-cli

Misalnya, Anda bahkan dapat menginstal penguji kecepatan di Ubuntu langsung dari perangkat lunaknya. Ini adalah aplikasi python yang sama, yang kemudian dapat diluncurkan langsung dari konsol.

sudo apt install speedtest-cli -y

Dan ukur kecepatan 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

Hasilnya, seperti yang saya lakukan. Saya harus memahami kode sumber tes kecepatan ini agar dapat mengimplementasikannya secara lebih lengkap ke dalam proyek saya. Salah satu tugas terpenting adalah mendapatkan nama operator telekomunikasi untuk menggantikannya di pelat.

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 sesederhana itu, meski tampak jauh lebih sederhana. Awalnya, parameter server sama dengan [], kata mereka, pilih server terbaik. Hasilnya, saya memiliki server acak, dan, seperti yang Anda duga, kecepatannya bervariasi. Ini adalah topik yang cukup kompleks, menggunakan server tetap, apakah statis atau dinamis, memerlukan penelitian. Namun berikut adalah contoh grafik pengukuran kecepatan untuk operator Beeline saat memilih server uji secara dinamis dan server tetap secara statis.

Tes kecepatan simultan pada beberapa modem LTE
Hasil pengukuran kecepatan saat memilih server dinamis.

Tes kecepatan simultan pada beberapa modem LTE
Hasil pengujian kecepatan, dengan satu server yang dipilih secara ketat.

Selama pengujian, terdapat “bulu” di kedua tempat tersebut, dan perlu dihilangkan menggunakan metode matematika. Namun dengan server tetap, amplitudonya sedikit lebih kecil dan lebih stabil.
Secara umum, ini adalah tempat penelitian yang bagus. Dan saya akan mengukur kecepatan server saya menggunakan utilitas iperf. Tapi kami tetap berpegang pada spesifikasi teknis.

Mengirim email dan kesalahan

Untuk mengirim email, saya mencoba beberapa lusin opsi berbeda, tetapi pada akhirnya saya memilih yang berikut ini. Saya mendaftarkan kotak surat di Yandex dan kemudian mengambilnya Ini adalah contoh pengiriman surat. Saya memeriksanya dan menerapkannya ke dalam program. Contoh ini membahas berbagai opsi, termasuk mengirim dari gmail, dll. Saya tidak ingin repot menyiapkan server email saya dan tidak punya waktu untuk itu, tetapi ternyata kemudian, sia-sia juga.

Log dikirim sesuai dengan penjadwal, jika ada koneksi, setiap 6 jam: pukul 00, 06 pagi, 12 siang, dan 18 malam. Dikirim sebagai 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

Kesalahan juga dikirim pada awalnya. Pertama-tama, mereka diakumulasikan dalam daftar, dan kemudian dikirim juga menggunakan penjadwal, jika ada koneksi. Namun, kemudian muncul masalah dengan fakta bahwa Yandex memiliki batasan jumlah pesan yang dikirim per hari (ini adalah rasa sakit, kesedihan, dan penghinaan). Karena mungkin ada banyak sekali kesalahan bahkan dalam satu menit, kami harus menghentikan kesalahan pengiriman melalui surat. Jadi perlu diingat ketika secara otomatis mengirim informasi tentang masalah seperti itu melalui layanan Yandex.

Server umpan balik

Untuk memiliki akses ke perangkat keras jarak jauh dan dapat menyesuaikan dan mengkonfigurasi ulang, saya memerlukan server eksternal. Secara umum, agar adil, mengirim semua data ke server dan membuat semua grafik indah di antarmuka web adalah hal yang benar. Namun tidak sekaligus.

Untuk VPS saya pilih ruvds.com. Anda dapat menggunakan server yang paling sederhana. Dan secara umum, untuk tujuan saya ini sudah cukup. Tetapi karena saya tidak mengeluarkan biaya sendiri untuk server tersebut, saya putuskan untuk mengambilnya dengan sedikit cadangan sehingga cukup jika kami menggunakan antarmuka web, server SMTP kami sendiri, VPN, dll. Selain itu, dapat mengatur bot Telegram dan tidak mengalami masalah pemblokiran. Oleh karena itu, saya memilih Amsterdam dan parameter berikut.

Tes kecepatan simultan pada beberapa modem LTE

Sebagai metode komunikasi dengan perangkat keras, vim2 memilih koneksi ssh terbalik dan, seperti yang ditunjukkan oleh praktik, ini bukan yang terbaik. Jika koneksi terputus, server menahan port tersebut dan tidak mungkin untuk terhubung melalui port tersebut selama beberapa waktu. Oleh karena itu, masih lebih baik menggunakan metode komunikasi lain, misalnya VPN. Kedepannya saya ingin beralih ke VPN, tetapi tidak punya waktu.

Saya tidak akan membahas detail pengaturan firewall, pembatasan hak, menonaktifkan koneksi root ssh, dan kebenaran lain dalam menyiapkan VPS. Saya ingin percaya bahwa Anda sudah mengetahui segalanya. Untuk koneksi jarak jauh, saya membuat pengguna baru di server.

adduser vimssh

Saya membuat kunci koneksi ssh di perangkat keras kami.

ssh-keygen

Dan saya menyalinnya ke server kami.

ssh-copy-id [email protected]

Pada perangkat keras kami, saya membuat koneksi ssh terbalik otomatis pada setiap boot.

[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

Perhatikan port 8083: ini menentukan port mana yang akan saya gunakan untuk terhubung melalui ssh terbalik. Tambahkan ke startup dan mulai.

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

Anda bahkan dapat melihat statusnya:

sudo systemctl status autossh.service

Sekarang, di server VPS kita, jika kita menjalankan:

ssh -p 8083 khadas@localhost

Lalu saya mendapatkan perangkat keras uji saya. Dan dari perangkat keras saya juga dapat mengirim log dan data apa pun melalui ssh ke server saya, yang sangat nyaman.

Putuskan semuanya

Tes kecepatan simultan pada beberapa modem LTE
Aktifkan, mari mulai pengembangan dan debugging

Fiuh, itu saja, saya sudah menjelaskan semua nodenya. Sekarang saatnya menyatukan semuanya. Anda dapat melihat kodenya di sini.

Poin penting dengan kode ini: Proyek ini mungkin tidak dimulai seperti ini, karena dirancang untuk tugas tertentu, arsitektur tertentu. Meskipun saya memberikan kode sumbernya, saya akan tetap menjelaskan hal yang paling berharga di sini, tepat di teks, jika tidak maka sama sekali tidak dapat dipahami.

Pada awalnya, saya menginisialisasi gps, gpio dan meluncurkan thread penjadwal terpisah.

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

Penjadwalnya cukup sederhana: ia melihat apakah waktunya telah tiba untuk mengirim pesan dan apa status kesalahan saat ini. Jika ada tanda error, maka kita kedipkan LEDnya.

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

Bagian tersulit dari proyek ini adalah mempertahankan koneksi ssh terbalik untuk setiap pengujian. Setiap pengujian melibatkan konfigurasi ulang gateway default dan server DNS. Karena toh tidak ada yang membaca, ketahuilah bahwa kereta tidak menaiki rel kayu. Siapa pun yang menemukan telur Paskah mendapat permen.

Untuk melakukan ini, saya membuat tabel perutean terpisah -set-mark 0x2 dan aturan untuk mengarahkan 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 dapat mempelajari lebih lanjut tentang cara kerjanya baca di artikel ini.

Setelah itu saya masuk ke loop tanpa akhir, di mana setiap kali kita mendapatkan daftar modem yang terhubung (untuk mengetahui apakah konfigurasi jaringan tiba-tiba berubah).

network_list = getNetworklist()

Mendapatkan daftar antarmuka jaringan cukup sederhana.

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

Setelah menerima daftarnya, saya mengatur alamat IP ke semua antarmuka, seperti yang saya tunjukkan pada gambar di 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")

Lalu saya cukup menelusuri setiap antarmuka dalam satu lingkaran. Dan saya mengkonfigurasi setiap antarmuka.

	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 memeriksa fungsionalitas antarmuka, jika tidak ada jaringan, maka saya menghasilkan kesalahan. Jika ada jaringan, maka inilah saatnya bertindak!

Di sini saya mengkonfigurasi perutean ssh ke antarmuka ini (jika belum dilakukan), mengirim kesalahan ke server jika waktunya telah tiba, mengirim log dan terakhir menjalankan tes kecepatan dan menyimpan log ke file 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 pengaturan 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 tentu saja, Anda perlu menambahkan semua keindahan ini ke dalam startup. Untuk melakukan ini saya membuat file:

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 mengaktifkan autoloading dan memulai!

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

Sekarang saya dapat melihat log tentang apa yang terjadi menggunakan perintah:

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

Temuan

Nah, sekarang yang terpenting adalah, apa yang terjadi sebagai hasilnya? Berikut beberapa grafik yang berhasil saya tangkap selama proses pengembangan dan debugging. Grafik dibuat 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 dengan operator Tele2 yang saya lakukan selama beberapa hari.

Tes kecepatan simultan pada beberapa modem LTE

Di sini saya menggunakan server pengukuran dinamis. Pengukuran kecepatan berfungsi, tetapi sangat berfluktuasi, tetapi beberapa nilai rata-rata masih terlihat, dan ini dapat diperoleh dengan memfilter data, misalnya dengan rata-rata bergerak.

Kemudian saya membuat sejumlah grafik untuk operator telekomunikasi lainnya. Dalam hal ini sudah ada satu server pengujian, dan hasilnya juga sangat menarik.

Tes kecepatan simultan pada beberapa modem LTE

Tes kecepatan simultan pada beberapa modem LTE

Tes kecepatan simultan pada beberapa modem LTE

Tes kecepatan simultan pada beberapa modem LTE

Seperti yang Anda lihat, topik penelitian dan pemrosesan data ini sangat luas, dan jelas tidak akan bertahan selama beberapa minggu kerja. Tetapi…

Hasil pekerjaan

Pekerjaan itu tiba-tiba selesai karena keadaan di luar kendali saya. Salah satu kelemahan proyek ini, menurut subjektif saya, adalah modemnya yang tidak terlalu ingin bekerja bersamaan dengan modem lain, dan melakukan trik seperti itu setiap kali dimuat. Untuk tujuan ini, ada banyak sekali model modem lainnya; biasanya model tersebut sudah dalam format Mini PCI-e dan dipasang di dalam perangkat serta lebih mudah untuk dikonfigurasi. Tapi itu cerita yang sama sekali berbeda. Proyek ini menarik dan saya sangat senang bisa berpartisipasi di dalamnya.

Tes kecepatan simultan pada beberapa modem LTE

Sumber: www.habr.com

Tambah komentar