Speedtest simultan pada beberapa modem LTE

Di karantina, saya ditawari untuk berpartisipasi dalam pengembangan perangkat untuk mengukur kecepatan modem LTE untuk beberapa operator seluler.







Pelanggan ingin mengevaluasi kecepatan semua jenis operator telekomunikasi di lokasi geografis yang berbeda, untuk memahami operator seluler mana yang paling optimal baginya ketika memasang peralatan menggunakan koneksi LTE, misalnya, untuk siaran video. Pada saat yang sama, tugas itu harus diselesaikan sesederhana dan semurah mungkin, tanpa peralatan mahal.



Saya harus segera mengatakan bahwa tugas itu bukan yang paling sederhana dan paling intensif 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 sulit: Anda harus memilih peralatan dan metode pengukuran yang tepat, dan juga memiliki ide bagus tentang topologi dan pengoperasian jaringan seluler. Plus, kecepatan dapat dipengaruhi oleh beberapa faktor: jumlah pelanggan per sel, kondisi cuaca, bahkan dari sel ke sel, kecepatannya bisa sangat berbeda karena topologi jaringan. Secara umum, ini adalah masalah dengan sejumlah besar yang tidak diketahui, dan hanya operator telekomunikasi yang dapat menyelesaikannya dengan benar.



Awalnya, pelanggan hanya ingin mengarahkan kurir dengan ponsel operator, melakukan pengukuran langsung di ponsel dan kemudian menuliskan hasil pengukuran kecepatan di notebook. Solusi saya untuk mengukur kecepatan jaringan LTE, meskipun tidak ideal, menyelesaikan masalah.



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



Tugas teknis



Sebagaimana dinyatakan dalam artikel Tanpa TK: mengapa klien tidak menginginkannya : Jangan bekerja tanpa TK! Tidak pernah, dimanapun!



Tugas teknisnya cukup sederhana, saya akan sedikit mengembangkannya untuk memahami pengguna akhir. Pilihan solusi teknis dan peralatan ditentukan oleh pelanggan. Jadi, TK itu sendiri, setelah semua persetujuan:



vim2 lte- Huawei e3372h β€” 153 ( n). GPS-, UART. www.speedtest.net :







csv. - 6 . , GPIO.


Saya menggambarkan TK dalam bentuk bebas, setelah banyak persetujuan. Namun makna tugas sudah terlihat. Batas waktu untuk semuanya diberikan seminggu. Namun pada kenyataannya itu berlangsung selama tiga minggu. Ini mengingat fakta bahwa saya melakukannya hanya setelah pekerjaan utama dan pada akhir pekan.



Di sini saya ingin menarik perhatian Anda pada kenyataan bahwa pelanggan setuju terlebih dahulu untuk menggunakan layanan pengukuran kecepatan dan perangkat keras, yang sangat membatasi kemampuan saya. Anggarannya juga terbatas, jadi tidak ada yang dibeli selain itu. Jadi saya harus bermain sesuai aturan ini.



Arsitektur dan pengembangan



Skema ini sederhana dan mudah. Karena itu, saya akan meninggalkannya tanpa komentar khusus.







Saya memutuskan untuk mengimplementasikan seluruh proyek dalam python, meskipun pada kenyataannya saya tidak memiliki pengalaman pengembangan dalam bahasa ini sama sekali. 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 dalam pengembangan python, dan saya selalu senang mendengar kritik membangun untuk meningkatkan keterampilan saya.



Juga dalam proses saya menemukan bahwa python memiliki dua versi berjalan 2 dan 3, sebagai hasilnya, saya berhenti di yang ketiga.



Node perangkat keras



Papan tunggal vim2



Sebagai mesin utama, saya diberi vim2 papan tunggal







Media yang luar biasa dan kuat digabungkan untuk rumah pintar dan SMART-TV, tetapi sangat tidak cocok untuk tugas ini, atau, menurut kami, tidak cocok. Sebagai contoh, OS utamanya adalah Android, dan Linux adalah OS yang lewat, dan karenanya tidak ada yang menjamin operasi berkualitas tinggi dari semua node dan driver di Linux. Dan saya kira beberapa masalah terkait dengan driver USB dari platform ini, jadi modem tidak berfungsi seperti yang diharapkan pada board ini. Dia juga memiliki dokumentasi yang sangat buruk dan tersebar, sehingga setiap operasi membutuhkan banyak waktu untuk menggali dermaga. Bahkan pekerjaan biasa dengan GPIO meminum banyak darah. Sebagai contoh, saya butuh beberapa jam untuk mengatur pekerjaan dengan LED. Tetapi, untuk menjadi obyektif, pada dasarnya tidak penting seperti apa perangkat papan tunggal, yang utama adalah bahwa ia harus bekerja dan memiliki port USB.



Pertama, saya perlu menginstal Linux di forum ini. Agar tidak menjelajahi hutan dokumentasi untuk semua orang, serta bagi mereka yang akan berurusan dengan perangkat papan tunggal ini, saya menulis bab ini.



Ada dua opsi untuk menginstal Linux: pada kartu SD eksternal, atau pada MMC internal. Saya kesulitan dengan kartu di malam hari, dan tidak tahu bagaimana cara membuatnya, jadi saya memutuskan untuk menginstalnya di MMC, meskipun tanpa ragu akan lebih mudah untuk bekerja dengan kartu eksternal.



Firmware secara bengkok dijelaskan di sini . Saya menerjemahkan dari aneh ke dalam bahasa Rusia. Untuk mem-flash papan, saya harus menghubungkan perangkat keras UART. Saya menghubungkannya sebagai berikut.



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






Setelah itu, saya mengunduh firmware dari sini . Versi firmware spesifik adalah VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231 .



Untuk mengunggah firmware ini, saya memerlukan utilitas tertentu. Baca lebih lanjut tentang ini di sini . Saya belum mencoba untuk mem-flash-nya di Windows, tetapi saya perlu memberi tahu Anda sedikit tentang firmware Linux. Pertama, saya akan menginstal utilitas sesuai dengan instruksi.



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


Iii ... Tidak ada yang berhasil. Saya menghabiskan beberapa jam mengedit skrip instalasi sehingga semuanya akan diinstal dengan benar untuk saya. Saya tidak ingat apa yang saya lakukan di sana, tetapi juga sirkus dengan kuda. Jadi berhati-hatilah. Tetapi tanpa utilitas ini tidak ada gunanya menyiksa vim2 lebih lanjut. Lebih baik tidak main-main dengan dia sama sekali!



Setelah tujuh lingkaran neraka, konfigurasi skrip dan instalasi, saya mendapat paket utilitas yang berfungsi. Saya menghubungkan papan melalui USB ke komputer Linux saya, dan UART juga terhubung sesuai dengan diagram di atas.

Saya mengatur terminal minicom favorit saya ke 115200, tidak ada kontrol kesalahan perangkat keras atau perangkat lunak. Dan mari kita mulai.







Saat mem-boot VIM2 di terminal UART, saya menekan tombol apa saja, misalnya spasi, untuk menghentikan booting. Setelah garis muncul



kvim2# 


Saya memasukkan perintah:



kvim2# run update


Di host dari tempat kami mengunduh, saya menjalankan:



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


Semuanya, Fiuh. Saya bertanya, ada Linux di papan tulis. Login / kata sandi khadas: khadas.



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



sudo visudo


Saya mengedit baris ke tampilan dan menyimpan



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


Lalu saya mengubah lokal saat ini sehingga waktunya di Moskow, jika tidak maka akan menjadi GMT.



sudo timedatectl set-timezone Europe/Moscow


atau



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


Jika Anda merasa kesulitan, maka jangan gunakan papan ini, Raspberry Pi lebih baik. Adil.



Modem Huawei e3372h - 153



Modem ini meminum darah saya dengan baik, dan, pada kenyataannya, itu menjadi penghambat seluruh proyek. Secara umum, nama "modem" untuk perangkat ini sama sekali tidak mencerminkan esensi pekerjaan: ini adalah kombinasi yang kuat, perangkat keras ini memiliki perangkat komposit yang berpura-pura menjadi CD-ROM untuk menginstal driver, dan kemudian masuk ke mode kartu jaringan.



Secara arsitektur, dari sudut pandang pengguna Linux, setelah semua pengaturan, terlihat seperti ini: setelah menghubungkan modem, saya memiliki antarmuka jaringan eth *, yang menerima alamat ip 192.168.8.100 via dhcp, dan gateway default 192.168.8.1.



Dan poin paling penting! Model modem ini tidak tahu cara bekerja dalam mode modem, yang dikendalikan oleh perintah AT. Semuanya akan jauh lebih mudah, buat koneksi ppp untuk setiap modem dan kemudian beroperasi dengan mereka. Tetapi dalam kasus saya, "saya sendiri" (lebih tepatnya penyelam Linux menurut aturan udev), membuat antarmuka-et dan memberikan alamat-ip ke sana melalui dhcp.



Agar tidak bingung lebih jauh, saya mengusulkan untuk melupakan kata "modem" dan mengatakan kartu jaringan dan gateway, karena sebenarnya itu seperti menghubungkan kartu jaringan baru dengan gateway.

Ketika ada satu modem, ini tidak menyebabkan masalah khusus, tetapi ketika ada lebih dari satu modem, yaitu n-pieces, gambar jaringan berikut muncul.







Yaitu, kartu jaringan n, dengan alamat IP yang sama, masing-masing dengan gateway default yang sama. Namun pada kenyataannya, masing-masing terhubung ke operator sendiri.



Awalnya, saya punya solusi sederhana: menggunakan perintah ifconfig atau ip untuk memadamkan semua antarmuka dan hanya mengaktifkan satu pada gilirannya dan mengujinya. Solusinya baik untuk semua orang, kecuali pada saat-saat beralih, saya tidak dapat terhubung ke perangkat. Dan karena pergantian sering dan cepat, sebenarnya saya tidak punya kesempatan untuk terhubung sama sekali.



Oleh karena itu, saya memilih cara untuk mengubah "secara manual" alamat ip modem dan terus mengarahkan lalu lintas menggunakan pengaturan perutean.







Ini bukan akhir dari masalah saya dengan modem: jika terjadi masalah daya, mereka jatuh, catu daya yang stabil dan stabil ke hub USB diperlukan. Masalah ini diselesaikan dengan menyolder catu daya langsung ke hub. Masalah lain yang saya hadapi dan yang merusak seluruh proyek: setelah reboot atau mulai dingin perangkat, tidak semua modem terdeteksi dan tidak selalu, dan mengapa ini terjadi dan oleh algoritma apa saya tidak bisa menginstal. Tetapi hal pertama yang pertama.



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



sudo apt update
sudo apt install -y usb-modeswitch


Setelah itu, modem setelah koneksi akan terdeteksi dan dikonfigurasikan dengan benar oleh subsistem udev. Saya memeriksa dengan hanya mencolokkan modem dan memastikan jaringan sudah habis.

Masalah lain yang tidak bisa saya pecahkan: bagaimana cara mendapatkan nama operator yang bekerja dengan kami dari modem ini? Nama operator tercantum dalam antarmuka web modem di 192.168.8.1. Ini adalah halaman web dinamis yang menerima data melalui permintaan ajax, jadi Anda tidak bisa hanya membiarkan halaman dan menguraikan namanya. Jadi saya mulai mencari cara mengerjakan halaman web, dll., Dan menyadari bahwa saya melakukan semacam omong kosong. Akibatnya, dia meludah, dan mulai menerima operator menggunakan API dari Speedtest itu sendiri.



Banyak hal akan lebih mudah jika modem dapat diakses melalui perintah AT. Mungkin untuk mengkonfigurasi ulang, membuat koneksi ppp, menetapkan IP, mendapatkan operator, dll. Namun sayang, saya bekerja dengan apa yang saya berikan.



GPS



Penerima GPS yang diberikan kepada saya memiliki antarmuka dan daya UART. Itu bukan solusi terbaik, tetapi tetap berhasil dan sederhana. Penerimanya kira-kira seperti ini.







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



Pertama, saya mengaktifkan 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


Lalu saya periksa keberhasilan operasi.



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


Perintah ini, tampaknya, mengedit devtree on the fly, yang sangat nyaman.



Setelah keberhasilan operasi ini, reboot dan instal daemon gps.



khadas@Khadas:~$ sudo reboot


Menginstal daemon gps. Saya menginstal semuanya dan memotongnya segera 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 memasang UART tempat GPS akan digantung.



DEVICES="/dev/ttyS4"


Dan kemudian kita menghidupkan segalanya dan mulai.



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


Setelah itu, saya menghubungkan GPS.







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



Saya reboot dan memeriksa GPS menggunakan program gpsmon.







Dalam tangkapan layar ini Anda tidak dapat melihat satelit, tetapi Anda dapat melihat komunikasi dengan penerima GPS, dan ini mengatakan bahwa semuanya baik-baik saja.



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



Instal pustaka yang diperlukan.



sudo -H pip3 install gps3 


Dan saya memahat kode kerjanya.



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, maka ini dilakukan dengan panggilan berikut:



longitude, latitude = getPositionData(agps_thread)


Dan dalam 1-10 detik saya akan mendapatkan koordinat atau tidak. Ya, saya punya sepuluh upaya untuk mendapatkan koordinat. Tidak optimal, bengkok dan miring, tetapi berhasil. Saya memutuskan untuk melakukan ini, karena GPS dapat menangkap dengan buruk dan tidak selalu menerima data. Jika Anda menunggu data diterima, maka jika Anda bekerja di ruang jauh, program akan membeku di tempat ini. Karena itu, saya menerapkan opsi yang tidak elegan.



Pada prinsipnya, akan ada lebih banyak waktu, akan mungkin untuk menerima data dari GPS secara langsung melalui UART, menguraikannya dalam aliran yang terpisah dan bekerja dengannya. Tapi tidak ada waktu sama sekali, karenanya kode jelek jelek. Dan ya, saya tidak malu.



Dioda pemancar cahaya



Menghubungkan LED semuanya sederhana dan rumit pada saat bersamaan. Kesulitan utama adalah bahwa nomor pin dalam sistem tidak sesuai dengan nomor pin di papan tulis dan karena dokumentasi ditulis dengan tumit kiri. Untuk mencocokkan 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 .







Saya mentransfer pin GPIO ke mode keluaran.



gpio -g mode 421 out


Saya menuliskan nol.



gpio -g write 421 0


Saya menuliskan satu.



gpio -g write 421 1




Semuanya aktif, setelah merekam "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 berkedip baik untuk kita.



Node perangkat lunak



API Speedtest



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



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



Instal pustaka python dengan perintah berikut.



sudo -H pip3 install speedtest-cli


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



sudo apt install speedtest-cli -y


Dan ukur kecepatan Internet Anda. Akibatnya, seperti yang saya lakukan. Saya harus menggali kode sumber speedtest ini untuk mengimplementasikannya lebih lengkap ke proyek saya. Salah satu tugas paling penting adalah mendapatkan nama operator telekomunikasi untuk menggantikannya di piring.



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








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, meskipun, tampaknya, jauh lebih mudah. Awalnya, parameter server sama dengan [] , kata mereka, pilih server terbaik. Akibatnya, saya memiliki server acak, dan seperti yang Anda duga, kecepatan mengambang. Ini adalah topik yang agak rumit, menggunakan server tetap, jika ya, maka statis atau dinamis, memerlukan penelitian. Tapi di sini adalah contoh grafik untuk mengukur kecepatan operator Beeline dengan pilihan dinamis dari server pengujian dan yang diperbaiki secara statis.





Hasil pengukuran kecepatan ketika memilih server dinamis.





Hasil tes kecepatan, dengan satu server yang dipilih secara ketat.



"Wool" selama pengujian ada di sana-sini, dan itu harus dihapus dengan metode matematika. Tetapi dengan server tetap itu sedikit kurang dan amplitudo lebih stabil.

Secara umum, ini adalah tempat penelitian yang hebat. Dan saya akan mengukur kecepatan ke server saya menggunakan utilitas iperf. Tapi kami tetap pada TK.



Mengirim email dan kesalahan



Saya mencoba beberapa lusin opsi berbeda untuk mengirim surat, tetapi sebagai hasilnya saya memutuskan hal berikut. Saya mendaftarkan kotak surat di yandex dan kemudian mengambil contoh pengiriman surat ini . Saya memeriksanya dan mengimplementasikannya ke dalam program. Contoh ini mengeksplorasi berbagai opsi, termasuk mengirim dari gmail, dll. Saya tidak ingin repot-repot meningkatkan server email saya dan tidak punya waktu untuk ini, tetapi ternyata kemudian, itu juga sia-sia.



Log dikirim sesuai dengan penjadwal, jika ada koneksi , setiap 6 jam: jam 00, 06 pagi, 12 siang dan 18 malam. Saya mengirimnya sebagai berikut.



from send_email import *
...
message_log = "   β„–1"
EmailForSend = ["dlinyj@trololo.ru", "pupkin@trololo.ru"]
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 awalnya diajukan. Untuk mulai dengan, mereka terakumulasi dalam daftar, dan kemudian mengirim mereka juga menggunakan penjadwal, jika ada koneksi. Namun, kemudian ada masalah dengan fakta bahwa yandex memiliki batasan jumlah pesan yang dikirim per hari (ini adalah rasa sakit, kesedihan dan penghinaan). Karena mungkin ada banyak kesalahan bahkan dalam satu menit, perlu untuk menolak mengirim kesalahan melalui surat. Jadi perlu diingat ketika secara otomatis mengirim melalui layanan Yandex tentang masalah seperti itu.



Server umpan balik



Agar dapat mengakses perangkat keras dari jarak jauh dan dapat mengubah dan mengkonfigurasi ulang, saya memerlukan server eksternal. Secara umum, dalam semua kewajaran, akan benar untuk mengirim semua data ke server dan membangun semua grafik yang indah di antarmuka web. Tapi tidak sekaligus.



Saya memilih ruvds.com sebagai VPS . Server paling sederhana dapat diambil. Dan secara umum, untuk tujuan saya, ini sudah cukup untuk mata. Tetapi karena saya tidak membayar server dari saku, saya memutuskan untuk mengambilnya dengan margin kecil sehingga akan cukup jika kita menggunakan antarmuka web, server SMTP kita sendiri, vpn, dll. Plus, untuk dapat mengatur bot Telegram dan tidak memiliki masalah dengan pemblokiran itu. Karena itu, saya memilih Amsterdam dan parameter berikut.







Sebagai cara untuk berkomunikasi dengan perangkat keras, vim2 memilih koneksi ssh terbalik, dan seperti yang ditunjukkan oleh latihan, itu bukan yang terbaik. Jika koneksi terputus, server memegang port dan tidak mungkin untuk terhubung melalui beberapa waktu Oleh karena itu, masih lebih baik menggunakan metode komunikasi lain, misalnya vpn. Di masa depan, saya ingin beralih ke vpn, tetapi tidak punya waktu.



Saya tidak akan masuk ke rincian pengaturan firewall, membatasi hak, menonaktifkan koneksi ssh root dan kebenaran umum lainnya dari pengaturan VPS. Saya ingin percaya bahwa Anda sudah tahu segalanya. Untuk koneksi jarak jauh, saya membuat pengguna baru di server.



adduser vimssh


Pada perangkat keras kami, saya membuat kunci koneksi ssh.



ssh-keygen


Dan saya menyalinnya ke server kami.



ssh-copy-id vimssh@host.com


Pada perangkat keras kami, saya membuat koneksi otomatis ssh terbalik di setiap boot. Perhatikan port 8083: ia menentukan port mana yang akan saya hubungkan melalui ssh terbalik. Tambahkan ke startup dan mulai.



[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 vimssh@host.com

RestartSec=5

Restart=always

[Install]

WantedBy=multi-user.target








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


Anda bahkan dapat melihat statusnya:



sudo systemctl status autossh.service


Sekarang, di server VPS kami, jika Anda menjalankan:



ssh -p 8083 khadas@localhost


Lalu saya sampai ke bagian tes saya. Dan dari sepotong besi saya juga dapat mengirim log dan data apa pun melalui ssh ke server saya, yang sangat nyaman.



Menyatukan semuanya





Menghidupkan, kita mulai mengembangkan dan



men- debug Fuh, well, semuanya tampaknya telah menggambarkan semua node Sekarang saatnya menyatukan semuanya. Kode dapat dilihat di sini .



Poin penting dengan kode: Proyek ini seperti "vlob" ini mungkin tidak dimulai, karena dipertajam pada tugas khusus arsitektur tertentu. Meskipun saya memberikan kode sumber, saya masih akan menganalisis yang paling berharga di sini, tepat di teks, kalau tidak benar-benar tidak bisa dipahami.



Pada awalnya, saya memiliki inisialisasi gps, gpio dan peluncuran thread scheduler terpisah.



#  
pShedulerThread = threading.Thread(target=ShedulerThread, args=(1,))
pShedulerThread.start()


Penjadwal cukup sederhana: kelihatannya untuk melihat apakah sudah tiba waktunya untuk mengirim pesan dan apa status kesalahannya sekarang. Jika ada bendera kesalahan, lalu berkedip 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)


Poin paling sulit dalam proyek ini adalah menjaga koneksi ssh terbalik pada setiap tes. Dalam setiap pengujian, gateway default dan server dns dikonfigurasi ulang. Karena tidak ada yang membaca, ketahuilah bahwa kereta tidak berguling di atas rel kayu. Siapa pun yang menemukan telur Paskah akan memiliki gigi yang manis.



Untuk melakukan ini, saya membuat tabel routing 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 membaca lebih lanjut tentang cara kerjanya di artikel ini .



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



network_list = getNetworklist()


Mendapatkan daftar antarmuka jaringan cukup 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


Setelah menerima daftar, saya menetapkan alamat IP untuk semua antarmuka, seperti yang saya tunjukkan dalam 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 hanya melalui 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 antarmuka untuk operabilitas, jika tidak ada jaringan, maka saya menghasilkan kesalahan. Jika ada jaringan, maka sudah saatnya bertindak!



Di sini saya mengatur ssh routing ke antarmuka ini (jika tidak dilakukan), mengirim kesalahan ke server, jika waktunya telah tiba, mengirim log dan akhirnya menjalankan speedtest 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()
#      . 


Kecuali untuk fungsi konfigurasi 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 startup. Untuk melakukan ini, saya membuat file:



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


Dan saya menulis di dalamnya: Saya mengaktifkan autoload dan mulai!



[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








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


Sekarang saya bisa menonton log tentang apa yang terjadi menggunakan perintah:



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


hasil



Nah, sekarang yang paling penting adalah apa yang terjadi sebagai akibatnya? Berikut adalah 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 adalah operator Tele2, yang saya habiskan selama beberapa hari.







Saya menggunakan server pengukuran dinamis di sini. Pengukuran kecepatan bekerja, tetapi mereka mengapung sangat banyak, namun, beberapa nilai rata-rata masih terlihat, dan itu dapat diperoleh dengan memfilter data, misalnya, dengan rata-rata bergerak.



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



















Seperti yang Anda lihat, topiknya sangat luas untuk penelitian dan pemrosesan data ini, dan jelas tidak berlangsung selama beberapa minggu. Tapi…



Hasil kerja



Pekerjaan itu tiba-tiba selesai karena keadaan di luar kendali saya. Salah satu kelemahan dari proyek ini, menurut pendapat subjektif saya, adalah modem, yang tidak benar-benar ingin bekerja secara bersamaan dengan modem lain, dan membuat trik seperti itu pada setiap boot. Untuk keperluan ini, ada sejumlah besar model modem, biasanya mereka sudah memiliki format Mini PCI-e dan dipasang di dalam perangkat dan jauh lebih mudah untuk dikonfigurasi. Tapi itu cerita yang sangat berbeda. Proyek ini menarik dan sangat senang bahwa kami berhasil berpartisipasi di dalamnya.






All Articles