Sajrone karantina, aku ditawani melu pangembangan piranti kanggo ngukur kacepetan modem LTE kanggo sawetara operator seluler.
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 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:
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
Kawat GPS ana ing tanganku, kabel debugger UART katon ing ngisor drijiku.
Aku urip maneh lan mriksa operasi GPS nggunakake program gpsmon.
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.
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.
Asil ngukur kacepetan nalika milih server dinamis.
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.
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.
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
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.
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")
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.
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
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.
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.
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.