Tes kacepetan simultan ing sawetara modem LTE

Sajrone karantina, aku ditawani melu pangembangan piranti kanggo ngukur kacepetan modem LTE kanggo sawetara operator seluler.

Tes kacepetan simultan ing sawetara modem LTE

Pelanggan pengin ngevaluasi kacepetan macem-macem operator telekomunikasi ing macem-macem lokasi geografis supaya bisa ngerti operator seluler sing paling optimal kanggo dheweke nalika nginstal peralatan nggunakake sambungan LTE, contone, kanggo siaran video. Ing wektu sing padha, masalah kasebut kudu dirampungake kanthi gampang lan murah, tanpa peralatan sing larang.

Aku bakal langsung ujar manawa tugas kasebut dudu sing paling gampang lan paling intensif kawruh; Aku bakal ngandhani masalah apa sing daktemoni lan kepiye cara ngatasi. Dadi, ayo padha lunga.

komentar

Ngukur kacepetan sambungan LTE minangka prakara sing rumit banget: sampeyan kudu milih peralatan lan teknik pangukuran sing tepat, lan uga duwe pangerten sing apik babagan topologi lan operasi jaringan seluler. Kajaba iku, kacepetan bisa dipengaruhi dening sawetara faktor: jumlah pelanggan ing sel, kondisi cuaca, malah saka sel menyang sel kacepetan bisa beda-beda sacara dramatis amarga topologi jaringan. Umumé, iki minangka masalah karo akeh sing ora dingerteni, lan mung operator telekomunikasi sing bisa ngatasi kanthi bener.

Kaping pisanan, pelanggan mung pengin nyopir kurir nganggo telpon operator, njupuk pangukuran langsung ing telpon lan banjur nulis asil pangukuran kacepetan ing notebook. Solusiku kanggo ngukur kacepetan jaringan lte, sanajan ora becik, ngatasi masalah kasebut.

Amarga kekurangan wektu, aku nggawe keputusan ora kanggo kepenak utawa kepraktisan, nanging kanggo kacepetan pangembangan. Contone, ssh mbalikke digunakake kanggo akses remot, tinimbang VPN sing luwih praktis, supaya bisa ngirit wektu kanggo nyetel server lan saben klien individu.

Tugas teknis

Kaya sing kasebut ing artikel kasebut Tanpa spesifikasi teknis: kenapa klien ora pengin: Aja bisa tanpa spesifikasi teknis! Ora tau, ing endi wae!

Tugas teknis cukup prasaja, aku bakal nggedhekake sethithik kanggo pangerten pangguna pungkasan. Pilihan saka solusi teknis lan peralatan dictated dening customer. Dadi, spesifikasi teknis dhewe, sawise kabeh disetujoni:

Adhedhasar komputer papan siji vim2 nggawe tester kacepetan kanggo sambungan lte liwat modem Huawei e3372h - 153 sawetara operator telekomunikasi (saka siji kanggo n). Sampeyan uga kudu nampa koordinat saka panrima GPS sing disambungake liwat UART. Gawe pangukuran kacepetan nggunakake layanan kasebut www.speedtest.net lan sijine menyang meja kaya:

Tes kacepetan simultan ing sawetara modem LTE

Tabel ing format csv. Banjur ngirim tandha iki liwat e-mail saben 6 jam. Yen ana kesalahan, kedhip LED sing disambungake menyang GPIO.

Aku diterangake specifications technical ing free wangun, sawise akeh persetujuan. Nanging makna tugas wis katon. Seminggu diwenehake kanggo kabeh. Nanging nyatane suwene telung minggu. Iki njupuk menyang akun kasunyatan sing aku nindakake iki mung sawise proyek utama lan ing akhir minggu.

Ing kene aku pengin menehi perhatian maneh babagan kasunyatan manawa pelanggan wis setuju sadurunge nggunakake layanan pangukuran kacepetan lan hardware, sing mbatesi kemampuanku. Anggaran uga diwatesi, mula ora ana sing tuku khusus. Dadi kita kudu muter aturan kasebut.

Arsitektur lan pangembangan

Skema kasebut prasaja lan jelas. Mulane, aku bakal ninggalake tanpa komentar khusus.

Tes kacepetan simultan ing sawetara modem LTE

Aku mutusake kanggo ngleksanakake kabeh proyek ing python, sanajan aku ora duwe pengalaman ngembangake basa iki. Aku milih amarga ana akeh conto lan solusi sing bisa nyepetake pembangunan. Mulane, aku takon kabeh programer profesional ora kanggo scold pengalaman pisanan ngembangaken ing python, lan aku tansah seneng krungu kritik mbangun kanggo nambah skills.

Uga ing proses aku katutup sing python wis loro mlaku versi 2 lan 3, minangka asil aku dienggoni ing katelu.

Node hardware

Piring tunggal vim2

Aku diwenehi komputer papan siji minangka mesin utama vim2

Tes kacepetan simultan ing sawetara modem LTE

Prosesor media sing apik lan kuat kanggo omah sing cerdas lan SMART-TV, nanging ora cocog kanggo tugas iki, utawa, ayo ngomong, ora cocog. Contone, OS utama yaiku Android, lan Linux minangka OS sekunder, lan mulane ora ana sing njamin operasi sing apik kanggo kabeh simpul lan driver ing Linux. Lan aku nganggep manawa sawetara masalah ana gandhengane karo driver USB ing platform iki, mula modem ora bisa digunakake kaya sing dikarepake ing papan iki. Uga duwe dokumentasi sing ora apik lan kasebar, mula saben operasi butuh wektu akeh kanggo ngeduk dermaga. Malah karya biasa karo GPIO njupuk akeh getih. Contone, butuh sawetara jam kanggo nyetel LED. Nanging, kanthi objektif, dhasar ora penting apa jenis papan siji, sing utama yaiku kerjane lan ana port USB.

Pisanan, aku kudu nginstal Linux ing papan iki. Supaya ora scour ing wilds dokumentasi kanggo kabeh wong, lan uga kanggo wong-wong sing bakal menehi hasil karo sistem siji-papan iki, Aku nulis bab iki.

Ana rong pilihan kanggo nginstal Linux: ing kertu SD eksternal utawa ing MMC internal. Aku ngginakaken ing wayah sore kanggo nyoba kanggo mangerteni carane nggawe iku bisa karo kertu, aku mutusaké kanggo nginstal ing MMC, sanajan tanpa mangu iku bakal luwih gampang kanggo bisa karo kertu external.

Babagan perangkat kukuh curhat ing kene. Aku nerjemahake saka aneh menyang Rusian. Kanggo kerlip Papan, aku kudu nyambungake UART hardware. Disambungake kanthi cara ing ngisor iki.

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

Tes kacepetan simultan ing sawetara modem LTE

Sawise iku, aku ndownload firmware saka kene. Versi firmware tartamtu VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Kanggo ngunggah perangkat kukuh iki, aku butuh utilitas. Rincian liyane babagan iki kene. Aku durung nyoba sumunar ing Windows, nanging aku kudu ngandhani sawetara tembung babagan perangkat kukuh ing Linux. Pisanan, aku bakal nginstal utilitas miturut pandhuane.

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

Aaand... Ora ana sing bisa. Aku ngenteni sawetara jam kanggo nyunting skrip instalasi supaya kabeh bisa diinstal kanthi bener kanggo aku. Aku ora ngelingi apa aku ana, nanging ana uga sing Circus karo jaran. Dadi sing ati-ati. Nanging tanpa utilitas kasebut ora ana gunane nyiksa vim2 luwih lanjut. Luwih becik ora kekacoan karo dheweke!

Sawise pitung bunderan neraka, konfigurasi script lan instalasi, Aku nampa paket keperluan apa. Aku nyambungake papan liwat USB menyang komputer Linux, lan uga nyambungake UART miturut diagram ing ndhuwur.
Aku nyetel terminal minicom favorit kanggo kacepetan 115200, tanpa hardware lan piranti lunak kontrol kesalahan. Lan ayo miwiti.

Tes kacepetan simultan ing sawetara modem LTE

Nalika ngemot VIM2 ing terminal UART, aku mencet tombol, kayata spasi, kanggo mungkasi loading. Sawise baris katon

kvim2# 

Aku ngetik perintah:

kvim2# run update

Ing host sing kita muat, aku nglakokake:

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

Wis ngono wae. Aku mriksa, ana Linux ing Papan. Login/sandi khadas:khadas.

Sawisé iku, sawetara setelan awal cilik. Kanggo karya luwih lanjut, aku mateni sandhi kanggo sudo (ya, ora aman, nanging trep).

sudo visudo

Aku ngowahi baris kanggo wangun lan nyimpen

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

Banjur aku ngganti lokal saiki supaya wektu ing Moskow, yen ora bakal ana ing Greenwich.

sudo timedatectl set-timezone Europe/Moscow

utawa

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

Yen sampeyan nemokake angel, aja nganggo papan iki; Raspberry Pi luwih apik. Jujur.

Modem Huawei e3372h – 153

Modem iki minangka sumber getih sing penting kanggo aku, lan, nyatane, dadi kemacetan kabeh proyek. Umumé, jeneng "modem" kanggo piranti kasebut ora nggambarake inti saka karya kasebut: iki minangka gabungan sing kuat, piranti keras iki nduweni piranti komposit sing nyamar dadi CD-ROM kanggo nginstal driver. banjur pindhah menyang mode kertu jaringan.

Secara arsitektur, saka sudut pandang pangguna Linux, sawise kabeh setelan, katon kaya iki: sawise nyambungake modem, aku duwe antarmuka jaringan eth *, sing liwat dhcp nampa alamat IP 192.168.8.100, lan gateway standar. yaiku 192.168.8.1.

Lan wayahe sing paling penting! Model modem iki ora bisa digunakake ing mode modem, sing dikontrol dening perintah AT. Kabeh bakal luwih prasaja, nggawe sambungan PPP kanggo saben modem banjur operate karo wong-wong mau. Nanging ing kasusku, "dheweke" (luwih tepat, panyilem Linux miturut aturan udev), nggawe antarmuka eth lan menehi alamat IP liwat dhcp.

Kanggo ngindhari kebingungan luwih lanjut, aku saranake nglalekake tembung "modem" lan ngucapake kertu jaringan lan gateway, amarga ing intine, kaya nyambungake kertu jaringan anyar karo gateway.
Nalika ana siji modem, iki ora nyebabake masalah khusus, nanging yen ana luwih saka siji, yaiku n-potongan, gambar jaringan ing ngisor iki muncul.

Tes kacepetan simultan ing sawetara modem LTE

Yaiku, n kertu jaringan, kanthi alamat IP sing padha, saben gateway standar sing padha. Nanging nyatane, saben wong disambungake menyang operator dhewe.

Kaping pisanan, aku duwe solusi sing gampang: nggunakake perintah ifconfig utawa ip, mateni kabeh antarmuka lan mung nguripake siji lan nyoba. Solusi iki apik kanggo kabeh wong, kajaba nalika ngoper aku ora bisa nyambung menyang piranti. Lan wiwit ngoper punika Kerep lan cepet, Aku bener ora duwe kesempatan kanggo nyambung ing kabeh.

Mulane, aku milih dalan ngganti alamat IP modem kanthi manual lan banjur nyopir lalu lintas nggunakake setelan routing.

Tes kacepetan simultan ing sawetara modem LTE

Iki dudu pungkasane masalahku karo modem: yen ana masalah daya, padha ambruk, lan sumber daya stabil sing apik kanggo hub USB dibutuhake. Aku ditanggulangi masalah iki dening hard soldering daya langsung menyang hub. Masalah liyane sing aku nemoni lan ngrusak kabeh proyek: sawise urip maneh utawa wiwitan kadhemen piranti, ora kabeh modem dideteksi lan ora mesthi, lan aku ora bisa nemtokake kenapa kedadeyan kasebut lan algoritma apa. Nanging dhisik dhisik.

Supaya modem bisa mlaku kanthi bener, aku nginstal paket usb-modeswitch.

sudo apt update
sudo apt install -y usb-modeswitch

Sawise iku, sawise nyambungake, modem bakal dideteksi kanthi bener lan dikonfigurasi dening subsistem udev. Aku mriksa kanthi mung nyambungake modem lan priksa manawa jaringan katon.
Masalah liyane sing ora bisa diatasi: kepiye carane njaluk jeneng operator sing digunakake saka modem iki? Jeneng operator ana ing antarmuka web modem ing 192.168.8.1. Iki minangka kaca web dinamis sing nampa data liwat panjalukan Ajax, dadi mung wgetting kaca lan parsing jeneng ora bakal bisa. Dadi aku wiwit ndeleng carane ngembangake kaca web, lan liya-liyane, lan ngerti yen aku nindakake sawetara omong kosong. Akibaté, dheweke ngidoni, lan operator wiwit nampa nggunakake API Speedtest dhewe.

Luwih gampang yen modem nduweni akses liwat perintah AT. Sampeyan bisa ngatur maneh, nggawe sambungan ppp, nemtokake IP, njaluk operator telekomunikasi, lsp. Nanging sayange, aku nggarap apa sing wis diwenehake.

GPS

Panrima GPS aku diwenehi antarmuka UART lan daya. Iki dudu solusi sing paling apik, nanging isih bisa digunakake lan gampang. Panrima katon kaya iki.

Tes kacepetan simultan ing sawetara modem LTE

Jujur, iki pisanan aku nggarap panrima GPS, nanging kaya sing dakkarepake, kabeh wis dipikirake kanggo kita biyen. Dadi kita mung nggunakake solusi sing wis siap.

Kaping pisanan, aku ngaktifake uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) kanggo nyambungake GPS.

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

Sakwise aku mriksa sukses operasi.

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

Printah iki ketoke nyunting devtree kanthi cepet, sing trep banget.

Sawise sukses operasi iki, urip maneh lan nginstal daemon GPS.

khadas@Khadas:~$ sudo reboot

Nginstal daemon GPS. Aku instal kabeh lan Cut mati langsung kanggo konfigurasi luwih.

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

Ngowahi file setelan.

sudo vim /etc/default/gpsd

Aku nginstal UART sing GPS bakal digantung.

DEVICES="/dev/ttyS4"

Banjur kita nguripake kabeh lan miwiti.

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

Sawise iku, aku nyambungake GPS.

Tes kacepetan simultan ing sawetara modem LTE

Kawat GPS ana ing tanganku, kabel debugger UART katon ing ngisor drijiku.

Aku urip maneh lan mriksa operasi GPS nggunakake program gpsmon.

Tes kacepetan simultan ing sawetara modem LTE

Sampeyan ora bisa ndeleng satelit ing gambar iki, nanging sampeyan bisa ndeleng komunikasi karo panrima GPS, lan iki tegese kabeh iku nggoleki.

Ing python, aku nyoba akeh opsi kanggo nggarap daemon iki, nanging aku milih sing bisa digunakake kanthi bener karo python 3.

Aku nginstal perpustakaan perlu.

sudo -H pip3 install gps3 

Lan aku sculpt kode karya.

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

Yen aku kudu njaluk koordinat, iki rampung kanthi telpon ing ngisor iki:

longitude, latitude = getPositionData(agps_thread)

Lan ing 1-10 detik aku bakal entuk koordinat utawa ora. Ya, aku duwe sepuluh upaya kanggo entuk koordinat. Ora optimal, bengkong lan miring, nanging kerjane. Aku mutusaké kanggo nindakake iki amarga GPS bisa duwe reception miskin lan ora tansah nampa data. Yen sampeyan ngenteni nampa data, banjur yen sampeyan kerja ing kamar remot, program bakal beku ing panggonan iki. Mulane, aku ngleksanakake pilihan inelegant iki.

Ing asas, yen ana wektu liyane, iku bakal bisa kanggo nampa data saka GPS langsung liwat UART, parse ing thread kapisah lan bisa karo. Nanging ora ana wektu, mula kode sing ala banget. Lan ya, aku ora isin.

Diode pemancar cahya

Nyambungake LED gampang lan angel ing wektu sing padha. Kesulitan utama yaiku nomer pin ing sistem ora cocog karo nomer pin ing papan lan amarga dokumentasi ditulis nganggo tangan kiwa. Kanggo mbandhingake nomer pin hardware lan nomer pin ing OS, sampeyan kudu mbukak printah:

gpio readall

Tabel korespondensi pin ing sistem lan ing papan bakal ditampilake. Sawise aku wis bisa operate pin ing OS dhewe. Ing kasusku, LED disambungake GPIOH_5.

Tes kacepetan simultan ing sawetara modem LTE

Aku ngalih pin GPIO kanggo mode output.

gpio -g mode 421 out

Aku nulis mudhun nol.

gpio -g write 421 0

Aku nulis siji.

gpio -g write 421 1

Tes kacepetan simultan ing sawetara modem LTE
Kabeh padhang, sawise nulis "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)

Saiki, yen ana kesalahan, aku nelpon error_blink () lan LED bakal kedhip apik.

Node piranti lunak

Speedtest API

Iku bungah banget sing layanan speedtest.net wis python-API dhewe, sampeyan bisa ndeleng ing GitHub.

Sing apik yaiku ana kode sumber sing uga bisa dideleng. Cara nggarap API iki (conto prasaja) bisa ditemokake ing bagean cocog.

Aku nginstal perpustakaan python kanthi printah ing ngisor iki.

sudo -H pip3 install speedtest-cli

Contone, sampeyan malah bisa nginstal tester kacepetan ing Ubuntu langsung saka piranti lunak. Iki minangka aplikasi python sing padha, sing banjur bisa diluncurake langsung saka konsol.

sudo apt install speedtest-cli -y

Lan ngukur kacepetan Internet sampeyan.

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

Akibaté, kaya aku. Aku kudu mlebu kode sumber tes kacepetan iki supaya bisa ngetrapake kanthi lengkap ing proyekku. Salah sawijining tugas sing paling penting yaiku entuk jeneng operator telekomunikasi kanggo ngganti menyang piring kasebut.

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

Ing kene, kabeh dadi ora gampang, sanajan katon luwih gampang. Kaping pisanan, parameter server padha karo [], padha ngomong, milih server paling apik. Akibaté, aku duwe server acak, lan, sing bisa sampeyan duga, kacepetan variabel. Iki minangka topik sing cukup rumit, nggunakake server tetep, yen ya, statis utawa dinamis, mbutuhake riset. Nanging ing ngisor iki minangka conto grafik pangukuran kacepetan kanggo operator Beeline nalika milih server tes kanthi dinamis lan sing tetep statis.

Tes kacepetan simultan ing sawetara modem LTE
Asil ngukur kacepetan nalika milih server dinamis.

Tes kacepetan simultan ing sawetara modem LTE
Asil testing kacepetan, karo siji strictly milih siji server.

Sajrone testing, ana "wulu" ing loro panggonan, lan kudu dibusak nggunakake cara matematika. Nanging kanthi server tetep rada kurang lan amplitudo luwih stabil.
Umumé, iki minangka papan riset sing apik. Lan aku bakal ngukur kacepetan serverku nggunakake sarana iperf. Nanging kita tetep ing spesifikasi teknis.

Ngirim mail lan kasalahan

Kanggo ngirim mail, Aku nyoba sawetara rolas opsi beda, nanging ing pungkasan aku dienggoni ing ngisor iki. Aku ndhaptar kothak layang ing Yandex lan banjur njupuk Iki minangka conto ngirim surat. Aku mriksa lan dileksanakake ing program. Conto iki nliti macem-macem opsi, kalebu ngirim saka gmail, lsp. Aku ora pengin keganggu karo nyetel server mail lan ora duwe wektu kanggo iku, nanging dadi metu mengko, iku uga muspra.

Log dikirim miturut jadwal, yen ana sambungan, saben 6 jam: jam 00, 06, 12 lan 18. Dikirim kaya ing ngisor iki.

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

Kasalahan uga dikirim ing wiwitan. Kanggo miwiti, padha diklumpukake ing dhaptar, banjur dikirim uga nggunakake panjadwal, yen ana sambungan. Nanging, banjur ana masalah karo kasunyatan sing Yandex duwe watesan ing jumlah pesen sing dikirim saben dina (iki pain, sedhih lan asor). Amarga bisa uga ana akeh kesalahan sanajan saben menit, kita kudu nglirwakake kesalahan ngirim liwat surat. Dadi elinga nalika ngirim informasi kanthi otomatis babagan masalah kasebut liwat layanan Yandex.

Server umpan balik

Supaya duwe akses menyang Piece remot saka hardware lan bisa kanggo ngatur lan reconfigure iku, Aku needed server external. Umumé, supaya adil, bakal bener ngirim kabeh data menyang server lan mbangun kabeh grafik sing apik ing antarmuka web. Nanging ora kabeh bebarengan.

Kanggo VPS aku milih ruvds.com. Sampeyan bisa njupuk server sing paling gampang. Lan umume, kanggo tujuanku iki bakal cukup. Nanging wiwit aku ora mbayar kanggo server metu saka kanthong dhewe, Aku mutusaké kanggo njupuk karo cadangan cilik supaya iku cukup yen kita masang antarmuka web, server SMTP dhewe, VPN, etc. Kajaba iku, bisa nyiyapake bot Telegram lan ora duwe masalah nalika diblokir. Mulane, aku milih Amsterdam lan paramèter ing ngisor iki.

Tes kacepetan simultan ing sawetara modem LTE

Minangka cara komunikasi karo hardware, vim2 milih sambungan ssh mbalikke lan, minangka laku wis ditampilake, iku dudu sing paling apik. Yen sambungan ilang, server nyekeli port lan ora bisa nyambung liwat kanggo sawetara wektu. Mula, luwih becik nggunakake cara komunikasi liyane, contone VPN. Ing mangsa aku pengin ngalih menyang VPN, nanging ora duwe wektu.

Aku ora bakal nerangake rincian nyetel firewall, matesi hak, mateni sambungan root ssh lan truisms liyane saka nyetel VPS. Aku seneng percaya yen sampeyan wis ngerti kabeh. Kanggo sambungan remot, aku nggawe pangguna anyar ing server.

adduser vimssh

Aku generate tombol sambungan ssh ing hardware kita.

ssh-keygen

Lan aku nyalin menyang server kita.

ssh-copy-id [email protected]

Ing hardware kita, aku nggawe sambungan ssh mbalikke otomatis ing saben 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

Pay manungsa waé menyang port 8083: iku nemtokake port aku bakal digunakake kanggo nyambung liwat mbalikke ssh. Tambah menyang wiwitan lan miwiti.

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

Sampeyan malah bisa ndeleng status:

sudo systemctl status autossh.service

Saiki, ing server VPS kita, yen kita mbukak:

ssh -p 8083 khadas@localhost

Banjur aku njaluk menyang test Piece saka hardware. Lan saka hardware, aku uga bisa ngirim log lan data liwat ssh menyang serverku, sing trep banget.

Sijine kabeh bebarengan

Tes kacepetan simultan ing sawetara modem LTE
Ngalih, ayo miwiti pembangunan lan debugging

Phew, nggih, punika, kula njlentrehaken sedaya simpul. Saiki wayahe ngumpulake kabeh. Sampeyan bisa ndeleng kode tengen kene.

Titik penting karo kode: Proyek iki bisa uga ora diwiwiti kaya iki, amarga dirancang kanggo tugas tartamtu, arsitektur tartamtu. Sanajan aku menehi kode sumber, aku isih bakal nerangake bab sing paling berharga ing kene, ing teks kasebut, yen ora bisa dingerteni.

Ing wiwitan, aku miwiti gps, gpio lan miwiti thread panjadwal sing kapisah.

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

Panjadwal cukup prasaja: katon kanggo ndeleng apa wektu wis teka kanggo ngirim pesen lan apa status kesalahan saiki. Yen ana kesalahan gendera, banjur kita kedhip 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)

Sisih paling angel ing proyek iki yaiku njaga sambungan ssh mbalikke kanggo saben tes. Saben tes mbutuhake konfigurasi maneh gateway standar lan server DNS. Amarga ora ana sing maca, ngerti yen sepur ora numpak rel kayu. Sapa sing nemokake endhog Paskah entuk permen.

Kanggo nindakake iki, aku nggawe tabel routing kapisah -set-mark 0x2 lan aturan kanggo ngarahake 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")

Sampeyan bisa sinau luwih lengkap babagan cara kerjane maca ing artikel iki.

Sawisé iku aku pindhah menyang daur ulang telas, ngendi saben-saben kita njaluk dhaptar modem disambungake (kanggo mangerteni yen konfigurasi jaringan wis dumadakan diganti).

network_list = getNetworklist()

Njupuk dhaptar antarmuka jaringan cukup prasaja.

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

Sawise nampa dhaptar, aku nyetel alamat IP kanggo kabeh antarmuka, kaya sing dituduhake ing gambar ing bab babagan 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")

Banjur aku mung mbukak saben antarmuka ing daur ulang. Lan aku ngatur saben 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'")

Aku mriksa antarmuka kanggo fungsi, yen ora ana jaringan, banjur aku generate kasalahan. Yen ana jaringan, banjur wektune kanggo tumindak!

Kene aku ngatur ssh nuntun kanggo antarmuka iki (yen durung rampung), ngirim kasalahan kanggo server yen wektu wis teka, ngirim log lan pungkasanipun mbukak speedtest lan nyimpen log menyang 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()
#и далее тестируем скорость и сохраняем логи. 

Iku worth nyebutke fungsi nyetel reverse ssh.

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

Lan mesthi, sampeyan kudu nambah kabeh kaendahan iki kanggo wiwitan. Kanggo nindakake iki, aku nggawe file:

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

Lan aku nulis ing kono:

[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

Aku nguripake autoloading lan miwiti!

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

Saiki aku bisa ndeleng log apa sing kedadeyan nggunakake printah:

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

Результаты

Nah, saiki sing paling penting yaiku, apa sing kedadeyan? Ing ngisor iki sawetara grafik sing bisa dijupuk sajrone proses pangembangan lan debugging. Grafik kasebut digawe nggunakake gnuplot kanthi skrip ing ngisor iki.

#! /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 pisanan yaiku karo operator Tele2, sing ditindakake sawetara dina.

Tes kacepetan simultan ing sawetara modem LTE

Ing kene aku nggunakake server pangukuran dinamis. Pangukuran kacepetan bisa digunakake, nanging fluktuasi banget, nanging sawetara nilai rata-rata isih katon, lan iki bisa dipikolehi kanthi nyaring data, contone, kanthi rata-rata obah.

Mengko aku nggawe sawetara grafik kanggo operator telekomunikasi liyane. Ing kasus iki, wis ana siji server testing, lan asil uga menarik banget.

Tes kacepetan simultan ing sawetara modem LTE

Tes kacepetan simultan ing sawetara modem LTE

Tes kacepetan simultan ing sawetara modem LTE

Tes kacepetan simultan ing sawetara modem LTE

Nalika sampeyan bisa ndeleng, topik banget ekstensif kanggo riset lan pangolahan data iki, lan cetha ora tahan kanggo sawetara minggu karya. Nanging…

Asil saka karya

Pegaweyane tiba-tiba rampung amarga kahanan sing ora bisa dikontrol. Salah sawijining kelemahane proyek iki, miturut pendapat subyektif, yaiku modem, sing ora pengin kerja bareng karo modem liyane, lan nggawe trik kasebut saben-saben dimuat. Kanggo tujuan kasebut, ana akeh model modem liyane, biasane wis ana ing format Mini PCI-e lan dipasang ing piranti lan luwih gampang diatur. Nanging kuwi crita sing beda. Proyek kasebut menarik lan aku seneng banget yen bisa melu.

Tes kacepetan simultan ing sawetara modem LTE

Source: www.habr.com

Add a comment