Speedtest sakaligus dina sababaraha modem LTE

Salila karantina, kuring ditawaran pikeun ilubiung dina pamekaran alat pikeun ngukur laju modem LTE pikeun sababaraha operator sélulér.

Speedtest sakaligus dina sababaraha modem LTE

Palanggan hoyong ngevaluasi laju operator telekomunikasi di lokasi geografis anu béda pikeun ngartos operator sélulér mana anu paling optimal pikeun anjeunna nalika masang alat nganggo sambungan LTE, contona, pikeun siaran pidéo. Dina waktos anu sami, masalahna kedah direngsekeun sasederhana sareng murah-gancang, tanpa alat anu mahal.

Kuring bakal langsung nyarios yén tugas éta sanés anu pangbasajanna sareng paling intensif pangaweruh; Kuring bakal nyarioskeun ka anjeun naon masalah anu kuring hadapi sareng kumaha kuring ngarengsekeunana. Ku kituna, hayu urang balik.

nyarios

Ngukur laju sambungan LTE mangrupikeun masalah anu kompleks: anjeun kedah milih alat anu leres sareng téknik pangukuran, sareng ogé gaduh pamahaman anu hadé ngeunaan topologi sareng operasi jaringan sélulér. Tambih Deui, lajuna tiasa dipangaruhan ku sababaraha faktor: jumlah palanggan dina sél, kaayaan cuaca, bahkan ti sél ka sél lajuna tiasa béda-béda sacara dramatis kusabab topologi jaringan. Sacara umum, ieu masalah sareng sajumlah ageung kanyahoan, sareng ngan ukur operator telekomunikasi anu tiasa ngabéréskeunana kalayan leres.

Mimitina, palanggan ngan ukur hoyong nyetir kurir nganggo telepon operator, nyandak pangukuran langsung dina telepon teras nyerat hasil pangukuran kacepetan dina notebook. solusi kuring keur ngukur laju jaringan lte, sanajan teu idéal, solves masalah.

Kusabab kurangna waktos, kuring nyandak kaputusan sanés pikeun genah atanapi kapraktisan, tapi pikeun laju pangwangunan. Contona, sabalikna ssh ieu dipaké pikeun aksés jauh, tinimbang VPN leuwih praktis, guna ngahemat waktos on nyetel server na unggal klien individu.

Tugas teknis

Salaku nyatakeun dina artikel Tanpa spésifikasi teknis: naha klien teu hayang eta: Ulah dianggo tanpa spésifikasi teknis! Pernah, di mana waé!

Tugas teknis éta cukup basajan, abdi bakal dilegakeun eta saeutik pikeun pamahaman pamaké tungtung. Pilihan solusi téknis sareng alat didikte ku palanggan. Janten, spésifikasi téknis sorangan, saatos sadaya persetujuan:

Dumasar kana komputer papan tunggal vim2 nyieun speed tester pikeun sambungan lte via modem Huawei e3372h - 153 sababaraha operator telekomunikasi (ti hiji nepi ka n). Éta ogé perlu pikeun nampa koordinat ti panarima GPS disambungkeun via UART. Jieun pangukuran laju nganggo jasa éta www.speedtest.net sareng nempatkeun kana méja sapertos:

Speedtest sakaligus dina sababaraha modem LTE

Méja dina format csv. Lajeng ngirim tanda ieu ku e-mail unggal 6 jam. Dina hal kasalahan, kedip-kedip LED nu disambungkeun ka GPIO.

Kuring ngajelaskeun spésifikasi téknis dina bentuk gratis, saatos seueur persetujuan. Tapi hartina tugas téh geus katempo. Saminggu dibéré pikeun sagalana. Tapi dina kanyataanana lumangsung salila tilu minggu. Ieu nganggap kanyataan yén kuring ngalakukeun ieu ngan ukur saatos padamelan utama sareng akhir minggu.

Di dieu abdi hoyong sakali deui ngagambar perhatian kanyataan yén nasabah sapuk sateuacanna dina pamakéan jasa pangukuran speed jeung hardware, nu greatly ngawatesan kamampuhan kuring. Anggaranna ogé diwatesan, janten teu aya anu mésér khusus. Janten urang kedah maén ku aturan ieu.

Arsitéktur sarta ngembangkeun

Skéma ieu basajan tur atra. Ku alatan éta, kuring bakal ninggalkeun eta tanpa komentar husus.

Speedtest sakaligus dina sababaraha modem LTE

Kuring mutuskeun pikeun nerapkeun sakabéh proyék di python, sanajan kanyataan yén kuring teu boga pangalaman ngembangkeun dina basa ieu pisan. Kuring milih éta kusabab aya seueur conto siap-siap sareng solusi anu tiasa nyepetkeun pangwangunan. Ku alatan éta, kuring nanya ka sadaya programer profésional teu scold pangalaman munggaran kuring ngembang di python, sarta Kami salawasna senang ngadangu kritik konstruktif pikeun ngaronjatkeun kaahlian abdi.

Ogé dina prosés kuring manggihan yén python boga dua versi ngajalankeun 2 jeung 3, salaku hasilna kuring netep dina katilu.

titik hardware

Hiji-piring vim2

Kuring dibéré komputer single-board salaku mesin utama kuring vim2

Speedtest sakaligus dina sababaraha modem LTE

Prosesor média anu saé sareng kuat pikeun bumi pinter sareng SMART-TV, tapi henteu cocog pisan pikeun tugas ieu, atanapi, sebutkeun, kirang cocog. Salaku conto, OS utamina nyaéta Android, sareng Linux mangrupikeun OS sekundér, sareng sasuai teu aya anu ngajamin operasi kualitas luhur sadaya titik sareng supir dina Linux. Sareng kuring nganggap yén sababaraha masalah aya hubunganana sareng panggerak USB tina platform ieu, ku kituna modem henteu jalan sapertos anu diharapkeun dina papan ieu. Éta ogé ngagaduhan dokuméntasi anu miskin sareng paburencay, ku kituna unggal operasi nyandak seueur waktos ngagali darmaga. Malahan karya biasa sareng GPIO nyandak seueur getih. Contona, kuring butuh sababaraha jam pikeun nyetél LED. Tapi, janten obyektif, dasarna henteu penting naon jinis papan tunggal éta, anu utama nyaéta yén éta tiasa dianggo sareng aya palabuhan USB.

Mimiti, kuring kedah masang Linux dina papan ieu. Dina raraga teu scour nu wilds dokuméntasi for everyone, sarta ogé pikeun maranéhanana anu bakal nungkulan sistem single-dewan ieu, Kuring nulis bab ieu.

Aya dua pilihan pikeun masang Linux: dina kartu SD éksternal atanapi dina MMC internal. Kuring spent malem nyoba angka kaluar kumaha carana sangkan eta dianggo kalayan kartu, jadi kuring mutuskeun pikeun masang eta dina MMC, sanajan tanpa ragu eta bakal leuwih gampang pikeun digawe sareng hiji kartu éksternal.

Ngeunaan firmware bengkung ka dieu. Kuring narjamahkeun tina aneh kana Rusia. Dina raraga flash dewan, abdi kedah nyambungkeun hardware UART. Nyambung deui ku cara kieu.

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

Speedtest sakaligus dina sababaraha modem LTE

Saatos éta, kuring ngaunduh firmware di dieu. Vérsi firmware husus VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Pikeun unggah firmware ieu, Abdi peryogi utiliti. Leuwih jéntré ngeunaan ieu di dieu. Kuring henteu acan nyobian kedip-kedip dina Windows, tapi kuring kedah nyarioskeun sababaraha kecap ngeunaan firmware dina Linux. Mimiti, kuring bakal masang utilitas numutkeun petunjuk.

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

Aaand... Euweuh jalan. Kuring nyéépkeun sababaraha jam pikeun ngédit skrip pamasangan supados sadayana dipasang leres pikeun kuring. Kuring teu apal naon atuh naon aya, tapi aya ogé nu sirkus jeung kuda. Jadi ati-ati. Tapi tanpa utilitas ieu henteu aya gunana pikeun nyiksa vim2 langkung jauh. Hadé pisan mun teu ngaco ka manéhna!

Saatos tujuh bunderan naraka, konfigurasi Aksara jeung instalasi, Kuring narima paket Utiliti digawé. Kuring disambungkeun dewan via USB ka komputer Linux Ubuntu kuring, sarta ogé disambungkeun UART nurutkeun diagram di luhur.
Kuring nyetel terminal minicom favorit kuring pikeun speed 115200, tanpa hardware jeung software kontrol kasalahan. Jeung hayu urang ngamimitian.

Speedtest sakaligus dina sababaraha modem LTE

Nalika ngamuat VIM2 di terminal UART, kuring pencét konci, sapertos spacebar, pikeun ngeureunkeun ngamuat. Saatos garis muncul

kvim2# 

Kuring asupkeun paréntah:

kvim2# run update

Dina host anu kami muatkeun, kuring ngalaksanakeun:

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

Éta éta, phew. Kuring pariksa, aya Linux dina dewan. Login/sandi khadas:khadas.

Sanggeus éta, sababaraha setélan awal minor. Pikeun karya salajengna, abdi nganonaktipkeun sandi pikeun sudo (enya, teu aman, tapi merenah).

sudo visudo

Kuring ngédit garis kana formulir tur nyimpen

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

Teras kuring ngarobih lokal ayeuna supados waktosna di Moskow, upami henteu bakal di Greenwich.

sudo timedatectl set-timezone Europe/Moscow

atawa

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

Upami anjeun sesah, maka ulah nganggo papan ieu; Raspberry Pi langkung saé. Jujur.

Modem Huawei e3372h - 153

Modem ieu mangrupikeun sumber getih anu penting pikeun kuring, sareng, kanyataanna, éta janten bottleneck tina sadaya proyék. Sacara umum, nami "modem" kanggo alat-alat ieu henteu ngagambarkeun hakekat padamelan: ieu mangrupikeun gabungan anu kuat, sapotong hardware ieu ngagaduhan alat komposit anu nyamar janten CD-ROM pikeun masang supir. lajeng pindah ka modeu kartu jaringan.

Sacara arsitéktur, tina sudut pandang pangguna Linux, saatos sadaya setélan, sigana kieu: saatos nyambungkeun modem, kuring gaduh antarmuka jaringan eth *, anu ngalangkungan dhcp nampi alamat IP 192.168.8.100, sareng gateway standar. nyaeta 192.168.8.1.

Jeung momen pangpentingna! Modél modem ieu teu tiasa dianggo dina modem modem, nu dikawasa ku paréntah AT. Sagalana bakal leuwih basajan, nyieun sambungan PPP pikeun tiap modem lajeng beroperasi sareng maranehna. Tapi dina hal kuring, "dirina" (leuwih tepatna, palika Linux dumasar kana aturan udev), nyiptakeun antarbeungeut eth sareng masihan alamat IP ka dinya via dhcp.

Pikeun ngahindarkeun kabingungan salajengna, kuring nyarankeun hilap kecap "modem" sareng nyarios kartu jaringan sareng gateway, sabab dina dasarna, éta sapertos nyambungkeun kartu jaringan énggal sareng gateway.
Lamun aya hiji modem, ieu teu ngabalukarkeun masalah husus, tapi lamun aya leuwih ti hiji, nyaéta n-potongan, gambar jaringan di handap ieu timbul.

Speedtest sakaligus dina sababaraha modem LTE

Nyaéta, n kartu jaringan, sareng alamat IP anu sami, masing-masing gaduh gateway standar anu sami. Tapi dina kanyataanana, unggal sahijina disambungkeun ka operator sorangan.

Mimitina, kuring ngagaduhan solusi anu saderhana: nganggo paréntah ifconfig atanapi ip, mareuman sadaya antarmuka sareng ngan saukur hurungkeun hiji-hiji sareng uji. Leyuran éta alus for everyone, iwal dina mangsa switching kuring teu bisa nyambung ka alat. Sarta saprak switching téh sering tur gancang, Kuring sabenerna teu boga kasempetan pikeun nyambungkeun pisan.

Ku alatan éta, kuring milih jalur ngarobah sacara manual alamat IP tina modem lajeng ngajalankeun lalulintas ngagunakeun setélan routing.

Speedtest sakaligus dina sababaraha modem LTE

Ieu sanés tungtung masalah kuring sareng modem: upami aya masalah kakuatan, aranjeunna murag, sareng catu daya stabil anu saé pikeun hub USB diperyogikeun. Kuring direngsekeun masalah ieu ku teuas soldering kakuatan langsung ka hub. Masalah anu sanés anu kuring tepang sareng anu ngarusak sadayana proyék: saatos reboot atanapi mimiti tiis alat, henteu sadayana modem dideteksi sareng henteu salawasna, sareng kuring henteu tiasa nangtoskeun naha ieu kajantenan sareng ku algoritma naon. Tapi hal kahiji kahiji.

Pikeun modem jalan leres, abdi dipasang pakét usb-modeswitch.

sudo apt update
sudo apt install -y usb-modeswitch

Saatos éta, saatos nyambungkeun, modem bakal leres dideteksi sareng dikonpigurasi ku subsistem udev. Kuring pariksa ku saukur nyambungkeun modem jeung mastikeun yén jaringan nembongan.
Masalah anu sanés anu kuring henteu tiasa ngabéréskeun: kumaha kuring kéngingkeun nami operator anu kami damel tina modem ieu? Ngaran operator dikandung dina panganteur web modem di 192.168.8.1. Ieu kaca web dinamis nu narima data ngaliwatan requests AJAX, jadi saukur wgeting kaca jeung parsing ngaran moal jalan. Janten kuring mimiti ningali kumaha carana ngembangkeun halaman wéb, jsb., sareng sadar yén kuring ngalakukeun sababaraha jinis omong kosong. Hasilna, anjeunna spat, sarta operator mimiti narima maké Speedtest API sorangan.

Loba bakal leuwih gampang lamun modem miboga aksés via paréntah AT. Ieu bakal mungkin pikeun ngonpigurasikeun deui, nyiptakeun sambungan ppp, napelkeun IP, kéngingkeun operator telekomunikasi, jsb. Tapi sayangna, kuring damel sareng anu parantos dipasihkeun.

GPS

Panarima GPS anu dipasihkeun ku kuring ngagaduhan antarmuka sareng kakuatan UART. Éta sanés solusi anu pangsaéna, tapi éta tiasa dianggo sareng saderhana. Panarima katingali sapertos kieu.

Speedtest sakaligus dina sababaraha modem LTE

Jujur, ieu mangrupikeun waktos munggaran kuring damel sareng panampi GPS, tapi sakumaha anu kuring ngarepkeun, sadayana parantos dipikiran pikeun urang parantos lami. Janten urang ngan ukur nganggo solusi anu siap-siap.

Mimiti, kuring ngaktipkeun uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) pikeun nyambungkeun GPS.

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

Afterwards kuring pariksa kasuksésan operasi.

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

Paréntah ieu tétéla ngédit devtree on laleur, nu pohara merenah.

Saatos kasuksésan operasi ieu, reboot tur masang daemon GPS.

khadas@Khadas:~$ sudo reboot

Masang daemon GPS. Kuring install sagalana sarta motong kaluar geuwat pikeun konfigurasi salajengna.

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

Ngédit file setélan.

sudo vim /etc/default/gpsd

Kuring masang UART dimana GPS bakal ngagantung.

DEVICES="/dev/ttyS4"

Teras we ngahurungkeun sagalana tur mimitian.

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

Saatos éta, kuring nyambungkeun GPS.

Speedtest sakaligus dina sababaraha modem LTE

Kawat GPS aya dina panangan kuring, kabel debugger UART katingali dina ramo kuring.

Kuring reboot jeung pariksa operasi GPS ngagunakeun program gpsmon.

Speedtest sakaligus dina sababaraha modem LTE

Anjeun teu bisa ningali satelit dina screenshot ieu, Tapi anjeun bisa nempo komunikasi jeung panarima GPS, sarta ieu ngandung harti yén sagalana geus rupa.

Dina python, kuring nyobian seueur pilihan pikeun damel sareng daemon ieu, tapi kuring netepkeun anu leres-leres damel sareng python 3.

Kuring masang perpustakaan perlu.

sudo -H pip3 install gps3 

Na kuring sculpt kodeu 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

Upami kuring kedah kéngingkeun koordinat, ieu dilakukeun ku telepon di handap ieu:

longitude, latitude = getPositionData(agps_thread)

Sareng dina 1-10 detik kuring bakal nampi koordinat atanapi henteu. Leres, kuring ngagaduhan sapuluh usaha pikeun kéngingkeun koordinat. Henteu optimal, bengkok sareng miring, tapi tiasa dianggo. Kuring mutuskeun pikeun ngalakukeun ieu kusabab GPS tiasa nampi anu goréng sareng henteu salawasna nampi data. Upami anjeun ngantosan nampi data, maka upami anjeun damel di kamar jauh, program bakal beku di tempat ieu. Ku alatan éta, kuring dilaksanakeun pilihan inelegant ieu.

Sacara prinsip, lamun aya leuwih waktos, éta bakal mungkin pikeun nampa data tina GPS langsung via UART, parse eta dina thread misah tur dianggo kalayan eta. Tapi teu aya waktos pisan, ku kituna kode brutally awon. Jeung enya, kuring teu isin.

Dioda pemancar cahaya

Nyambungkeun LED éta basajan tur hésé dina waktos anu sareng. Kasusah utama nyaéta yén jumlah pin dina sistem teu pakait jeung angka pin on dewan jeung sabab dokuméntasi ditulis ku leungeun kénca. Pikeun ngabandingkeun nomer pin hardware sareng nomer pin dina OS, anjeun kedah ngajalankeun paréntah:

gpio readall

A tabel susuratan pin dina sistem jeung dina dewan bakal dipintonkeun. Sanggeus éta kuring geus bisa beroperasi pin dina OS sorangan. Bisi kuring LED disambungkeun ka GPIOH_5.

Speedtest sakaligus dina sababaraha modem LTE

Kuring pindah pin GPIO ka modeu kaluaran.

gpio -g mode 421 out

Kuring nulis handap nol.

gpio -g write 421 0

Kuring nulis handap hiji.

gpio -g write 421 1

Speedtest sakaligus dina sababaraha modem LTE
Sadayana hurung, saatos nyerat "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)

Ayeuna, bisi kasalahan, kuring nelepon error_blink () jeung LED bakal blink beautifully.

titik software

Speedtest API

Ieu kabagjaan hébat yén layanan speedtest.net boga python-API sorangan, anjeun tiasa ningali Github.

Hal anu saé nyaéta aya kode sumber anu ogé tiasa ditingali. Kumaha cara damel sareng API ieu (conto saderhana) tiasa dipendakan dina bagian relevan.

Kuring masang perpustakaan python kalayan paréntah di handap ieu.

sudo -H pip3 install speedtest-cli

Contona, anjeun malah bisa masang speed tester di Ubuntu langsung ti software nu. Ieu mangrupikeun aplikasi python anu sami, anu teras tiasa diluncurkeun langsung tina konsol.

sudo apt install speedtest-cli -y

Jeung ngukur speed Internet Anjeun.

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

Hasilna, kawas kuring. Kuring kungsi meunang kana Konci sumber test speed ieu guna leuwih pinuh nerapkeun kana proyék kuring. Salah sahiji tugas anu paling penting nyaéta kéngingkeun nami operator telekomunikasi pikeun ngagentos kana piring.

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 dieu, teuing, sagalana tétéla teu jadi basajan, sanajan bakal sigana leuwih basajan. Mimitina, parameter server sami sareng [], maranehna nyebutkeun, milih server pangalusna. Hasilna, kuring kungsi server acak, sarta, anjeun bisa nebak, speed variabel. Ieu cukup topik kompléks, ngagunakeun server tetep, lamun kitu, statik atawa dinamis, merlukeun panalungtikan. Tapi ieu mangrupikeun conto grafik pangukuran laju pikeun operator Beeline nalika dinamis milih server uji sareng anu tetep statis.

Speedtest sakaligus dina sababaraha modem LTE
Hasil tina ngukur laju nalika milih server dinamis.

Speedtest sakaligus dina sababaraha modem LTE
Hasil tina nguji speed, kalawan hiji ketat dipilih hiji server.

Salila tés, aya "bulu" dina dua tempat, sareng éta kedah dipiceun nganggo metode matematika. Tapi ku server tetep rada kirang na amplitudo leuwih stabil.
Sacara umum, ieu téh tempat panalungtikan hébat. Sareng kuring bakal ngukur laju server kuring nganggo utilitas iperf. Tapi kami tetep kana spésifikasi téknis.

Ngirim surat sareng kasalahan

Pikeun ngirim surat, abdi diusahakeun sababaraha belasan pilihan béda, tapi tungtungna kuring netep di handap. Kuring ngadaptar kotak surat dina Yandex lajeng nyandak Ieu conto ngirim surat. Kuring dipariksa deui sarta dilaksanakeun kana program. conto ieu examines rupa pilihan, kaasup ngirim ti Gmail, jsb. Kuring teu hayang repot jeung nyetél server mail kuring jeung teu boga waktu pikeun eta, tapi tétéla engké, éta ogé sia.

Log dikirim nurutkeun jadwal, lamun aya sambungan, unggal 6 jam: tabuh 00, 06, 12 jeung 18. Dikintunkeun sapertos kieu.

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 ogé dikirim mimitina. Pikeun mimitian ku, maranéhanana akumulasi dina daptar, lajeng dikirim ogé ngagunakeun scheduler, lamun aya sambungan. Nanging, teras timbul masalah sareng kanyataan yén Yandex ngagaduhan wates jumlah pesen anu dikirim per dinten (ieu nyeri, sedih sareng hina). Kusabab tiasa aya sajumlah ageung kasalahan sanajan per menit, urang kedah ngantunkeun kasalahan ngirim ku mail. Janten émut nalika otomatis ngirim inpormasi ngeunaan masalah sapertos kitu ngalangkungan jasa Yandex.

server eupan balik

Dina raraga miboga aksés ka sapotong jauh tina hardware jeung bisa ngaluyukeun jeung reconfigure eta, Kuring diperlukeun hiji server éksternal. Sacara umum, janten adil, éta leres pikeun ngirim sadaya data ka server sareng ngawangun sadaya grafik anu saé dina antarmuka wéb. Tapi henteu sakaligus.

Pikeun VPS kuring milih ruvds.com. Anjeun tiasa nyandak server pangbasajanna. Sareng sacara umum, pikeun tujuan kuring ieu bakal cekap. Tapi saprak kuring teu mayar server kaluar tina saku kuring sorangan, Kuring mutuskeun nyandak eta kalawan cadangan leutik meh bakal cukup lamun urang nyebarkeun hiji panganteur web, server SMTP sorangan, VPN, jsb. Tambih Deui, tiasa nyetél bot Telegram sareng teu aya masalah sareng diblokir. Ku alatan éta, kuring milih Amsterdam jeung parameter handap.

Speedtest sakaligus dina sababaraha modem LTE

Salaku metode komunikasi sareng hardware, vim2 milih sambungan ssh ngabalikkeun sareng, sakumaha anu dipidangkeun prakték, éta sanés anu pangsaéna. Lamun sambungan leungit, server nahan port jeung teu mungkin pikeun nyambungkeun ngaliwatan eta pikeun sawatara waktu. Ku alatan éta, éta kénéh hadé ngagunakeun métode komunikasi séjén, contona VPN. Dina mangsa nu bakal datang kuring hayang pindah ka VPN, tapi teu boga waktu.

Kuring moal balik kana detil ngeunaan nyetel firewall a, restricting hak, nganonaktipkeun sambungan root ssh na truisms sejenna nyetel VPS a. Abdi hoyong percanten yén anjeun parantos terang sadayana. Pikeun sambungan jauh, Kuring nyieun hiji pamaké anyar dina server.

adduser vimssh

Kuring ngahasilkeun konci sambungan ssh dina hardware urang.

ssh-keygen

Sareng kuring nyalin aranjeunna ka server kami.

ssh-copy-id [email protected]

Dina hardware urang, kuring nyieun sambungan ssh sabalikna otomatis dina unggal 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

Nengetan port 8083: eta nangtukeun mana port kuring baris ngagunakeun pikeun nyambungkeun via ssh sabalikna. Tambahkeun ka ngamimitian tur mimitian.

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

Anjeun malah tiasa ningali status:

sudo systemctl status autossh.service

Ayeuna, dina server VPS urang, upami urang ngajalankeun:

ssh -p 8083 khadas@localhost

Lajeng abdi meunang ka sapotong test abdi hardware. Sareng tina hardware kuring ogé tiasa ngirim log sareng data naon waé via ssh ka server kuring, anu saé pisan.

Putting eta sadayana babarengan

Speedtest sakaligus dina sababaraha modem LTE
Hurungkeun, hayu urang ngamimitian pamekaran sareng debugging

Phew, nya, éta, kuring ngajelaskeun sadaya titik. Ayeuna waktuna pikeun ngumpulkeun sadayana. Anjeun tiasa ningali kode di dieu.

Hiji titik penting kalayan kode: proyék ieu bisa jadi teu dimimitian kawas kieu, sabab ieu tailored pikeun tugas husus, arsitéktur husus. Sanaos kuring masihan kodeu sumber, kuring masih bakal ngajelaskeun hal-hal anu paling berharga di dieu, leres dina téks, upami henteu éta teu kaharti.

Dina awalna, abdi initialize gps, gpio sarta ngajalankeun thread scheduler misah.

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

Jadwalna cukup saderhana: éta ningali naha waktosna parantos ngirim pesen sareng naon status kasalahan ayeuna. Upami aya bandéra kasalahan, teras urang kedip-kedip 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)

Bagian anu paling hese dina proyék ieu nyaéta ngajaga sambungan ssh sabalikna pikeun unggal tés. Unggal tés ngalibatkeun ngonpigurasikeun deui gateway standar sareng server DNS. Kusabab euweuh nu maca atoh, nyaho yen karéta teu numpak dina rel kai. Anu manggihan endog Easter meunang sababaraha permen.

Jang ngalampahkeun ieu, kuring nyieun tabel routing misah -set-mark 0x2 jeung aturan pikeun alihan lalulintas.

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

Anjeun tiasa leuwih jéntré ngeunaan cara gawéna baca dina tulisan ieu.

Sanggeus éta kuring balik kana loop sajajalan, dimana unggal waktos urang meunang daptar modem disambungkeun (pikeun manggihan lamun konfigurasi jaringan geus dumadakan robah).

network_list = getNetworklist()

Meunang daptar interfaces jaringan cukup basajan.

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

Saatos nampi daptar, kuring nyetél alamat IP ka sadaya antarmuka, sakumaha anu ditingalikeun dina gambar dina bab ngeunaan 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")

Teras kuring ngan saukur ngaliwat unggal antarmuka dina gelung. Na kuring ngonpigurasikeun unggal panganteur.

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

Kuring pariksa antarmuka pikeun fungsionalitas, upami teu aya jaringan, teras kuring ngahasilkeun kasalahan. Upami aya jaringan, maka éta waktuna pikeun meta!

Di dieu kuring ngonpigurasikeun ssh routing ka panganteur ieu (lamun teu acan rengse), ngirim kasalahan ka server lamun waktuna geus datangna, ngirim log sarta tungtungna ngajalankeun speedtest sarta simpen log kana 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 disebatkeun fungsi nyetél ssh ngabalikkeun.

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

Sareng tangtosna, anjeun kedah nambihan sadayana kaéndahan ieu pikeun ngamimitian. Jang ngalampahkeun ieu kuring nyieun file:

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

Sareng kuring nyerat di dinya:

[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

Kuring ngahurungkeun autoloading tur mimitian!

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

Ayeuna kuring tiasa ningali log naon anu kajantenan nganggo paréntah:

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

Hasil

Nya, ayeuna anu paling penting nyaéta, naon anu kajantenan salaku hasilna? Ieu sababaraha grafik anu kuring junun néwak nalika prosés pamekaran sareng debugging. Grafikna diwangun nganggo gnuplot sareng skrip di handap ieu.

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

Pangalaman munggaran nyaéta sareng operator Tele2, anu kuring lakukeun sababaraha dinten.

Speedtest sakaligus dina sababaraha modem LTE

Di dieu kuring ngagunakeun server ukur dinamis. Pangukuran laju tiasa dianggo, tapi turun naek pisan, tapi sababaraha nilai rata-rata masih katingali, sareng ieu tiasa didapet ku nyaring data, contona, kalayan rata-rata gerak.

Engké kuring ngawangun sababaraha grafik pikeun operator telekomunikasi séjén. Dina hal ieu, geus aya hiji server nguji, sarta hasilna oge pisan metot.

Speedtest sakaligus dina sababaraha modem LTE

Speedtest sakaligus dina sababaraha modem LTE

Speedtest sakaligus dina sababaraha modem LTE

Speedtest sakaligus dina sababaraha modem LTE

Sakumaha anjeun tiasa tingali, topik pisan éksténsif pikeun panalungtikan sarta ngolah data ieu, sarta jelas teu lepas pikeun sababaraha minggu gawé. Tapi…

Hasil pagawéan

Pagawean ieu ngadadak réngsé alatan kaayaan di luar kontrol kuring. Salah sahiji kalemahan proyék ieu, dina pamadegan subjektif abdi, éta modem, nu teu hayang pisan dianggo sakaligus kalawan modem sejen, sarta nyieun trik misalna unggal waktos eta dimuat. Pikeun tujuan ieu, aya sajumlah ageung model modem anu sanés, biasana aranjeunna parantos aya dina format Mini PCI-e sareng dipasang di jero alat sareng langkung gampang dikonpigurasikeun. Tapi éta carita lengkep béda. Proyék éta pikaresepeun sareng kuring bungah pisan yén kuring tiasa ilubiung dina éta.

Speedtest sakaligus dina sababaraha modem LTE

sumber: www.habr.com

Tambahkeun komentar