Semasa kuarantin, saya telah ditawarkan untuk mengambil bahagian dalam pembangunan peranti untuk mengukur kelajuan modem LTE untuk beberapa pengendali selular.
Pelanggan ingin menilai kelajuan pelbagai pengendali telekomunikasi di lokasi geografi yang berbeza supaya dapat memahami pengendali selular mana yang paling optimum untuknya apabila memasang peralatan menggunakan sambungan LTE, contohnya, untuk siaran video. Pada masa yang sama, masalah itu perlu diselesaikan semudah dan semurah mungkin, tanpa peralatan mahal.
Saya akan katakan dengan segera bahawa tugas itu bukanlah yang paling mudah dan paling intensif pengetahuan; Saya akan memberitahu anda masalah yang saya hadapi dan bagaimana saya menyelesaikannya. Jadi, mari pergi.
Nota
Mengukur kelajuan sambungan LTE adalah perkara yang sangat kompleks: anda perlu memilih peralatan dan teknik pengukuran yang betul, dan juga mempunyai pemahaman yang baik tentang topologi dan operasi rangkaian selular. Selain itu, kelajuan boleh dipengaruhi oleh beberapa faktor: bilangan pelanggan pada sel, keadaan cuaca, malah dari sel ke sel kelajuan boleh berbeza secara mendadak disebabkan topologi rangkaian. Secara umum, ini adalah masalah dengan sejumlah besar yang tidak diketahui, dan hanya pengendali telekomunikasi boleh menyelesaikannya dengan betul.
Pada mulanya, pelanggan hanya mahu memandu kurier dengan telefon pengendali, mengambil ukuran terus pada telefon dan kemudian menulis hasil pengukuran kelajuan dalam buku nota. Penyelesaian saya untuk mengukur kelajuan rangkaian lte, walaupun tidak ideal, menyelesaikan masalah.
Oleh kerana kekurangan masa, saya membuat keputusan bukan memihak kepada kemudahan atau kepraktisan, tetapi memihak kepada kepantasan pembangunan. Sebagai contoh, ssh terbalik digunakan untuk akses jauh, bukannya VPN yang lebih praktikal, untuk menjimatkan masa untuk menyediakan pelayan dan setiap pelanggan individu.
Tugas teknikalnya agak mudah, saya akan mengembangkannya sedikit untuk pemahaman pengguna akhir. Pilihan penyelesaian teknikal dan peralatan ditentukan oleh pelanggan. Jadi, spesifikasi teknikal itu sendiri, selepas semua kelulusan:
Berdasarkan komputer papan tunggal vim2 buat penguji kelajuan untuk sambungan lte melalui modem Huawei e3372h - 153 beberapa operator telekom (daripada satu hingga n). Ia juga perlu untuk menerima koordinat daripada penerima GPS yang disambungkan melalui UART. Buat ukuran kelajuan menggunakan perkhidmatan www.speedtest.net dan letakkannya ke dalam jadual seperti ini:
Jadual dalam format csv. Kemudian hantar tanda ini melalui e-mel setiap 6 jam. Sekiranya berlaku ralat, kelipkan LED yang disambungkan ke GPIO.
Saya menerangkan spesifikasi teknikal dalam bentuk percuma, selepas banyak kelulusan. Tetapi makna tugas itu sudah kelihatan. Seminggu diberi untuk semuanya. Tetapi pada hakikatnya ia berlangsung selama tiga minggu. Ini mengambil kira hakikat bahawa saya melakukan ini hanya selepas kerja utama saya dan pada hujung minggu.
Di sini saya ingin sekali lagi menarik perhatian kepada fakta bahawa pelanggan bersetuju terlebih dahulu mengenai penggunaan perkhidmatan pengukuran kelajuan dan perkakasan, yang sangat mengehadkan keupayaan saya. Bajet juga terhad, jadi tiada apa yang istimewa dibeli. Jadi kami terpaksa bermain mengikut peraturan ini.
Seni bina dan pembangunan
Skim ini mudah dan jelas. Oleh itu, saya akan meninggalkannya tanpa sebarang komen khas.
Saya memutuskan untuk melaksanakan keseluruhan projek dalam python, walaupun pada hakikatnya saya tidak mempunyai pengalaman membangunkan dalam bahasa ini sama sekali. Saya memilihnya kerana terdapat banyak contoh dan penyelesaian siap sedia yang boleh mempercepatkan pembangunan. Oleh itu, saya meminta semua pengaturcara profesional untuk tidak memarahi pengalaman pertama saya mengembangkan ular sawa, dan saya sentiasa gembira mendengar kritikan membina untuk meningkatkan kemahiran saya.
Juga dalam proses itu saya dapati bahawa python mempunyai dua versi berjalan 2 dan 3, hasilnya saya menyelesaikan pada yang ketiga.
Nod perkakasan
Vim2 plat tunggal
Saya diberi komputer papan tunggal sebagai mesin utama saya vim2
Pemproses media yang sangat baik dan berkuasa untuk rumah pintar dan SMART-TV, tetapi sangat tidak sesuai untuk tugas ini, atau, katakan, kurang sesuai. Sebagai contoh, OS utamanya ialah Android, dan Linux ialah OS sekunder, dan oleh itu tiada siapa yang menjamin operasi berkualiti tinggi semua nod dan pemacu di bawah Linux. Dan saya menganggap bahawa beberapa masalah berkaitan dengan pemacu USB platform ini, jadi modem tidak berfungsi seperti yang diharapkan pada papan ini. Ia juga mempunyai dokumentasi yang sangat lemah dan berselerak, jadi setiap operasi mengambil banyak masa untuk menggali dok. Malah kerja biasa dengan GPIO mengambil banyak darah. Sebagai contoh, saya mengambil masa beberapa jam untuk menyediakan LED. Tetapi, untuk menjadi objektif, pada asasnya tidak penting jenis papan tunggal itu, perkara utama ialah ia berfungsi dan terdapat port USB.
Pertama, saya perlu memasang Linux pada papan ini. Untuk tidak meninjau hutan dokumentasi untuk semua orang, dan juga bagi mereka yang akan berurusan dengan sistem papan tunggal ini, saya menulis bab ini.
Terdapat dua pilihan untuk memasang Linux: pada kad SD luaran atau pada MMC dalaman. Saya menghabiskan satu malam cuba memikirkan cara menjadikannya berfungsi dengan kad, jadi saya memutuskan untuk memasangnya pada MMC, walaupun tanpa ragu-ragu ia akan menjadi lebih mudah untuk bekerja dengan kad luaran.
Mengenai perisian tegar bengkok di sini. Saya menterjemah dari pelik ke bahasa Rusia. Untuk memancarkan papan, saya perlu menyambungkan UART perkakasan. Menyambungnya dengan cara berikut.
Untuk memuat naik perisian tegar ini, saya memerlukan utiliti. Butiran lanjut tentang ini di sini. Saya belum cuba menyalakannya di bawah Windows, tetapi saya perlu memberitahu anda beberapa perkataan tentang perisian tegar di bawah Linux. Pertama, saya akan memasang utiliti mengikut arahan.
git clone https://github.com/khadas/utils
cd /path/to/utils
sudo ./INSTALL
Aaand... Tiada apa-apa yang berkesan. Saya menghabiskan beberapa jam mengedit skrip pemasangan supaya semuanya akan dipasang dengan betul untuk saya. Saya tidak ingat apa yang saya lakukan di sana, tetapi terdapat juga sarkas dengan kuda. Jadi berhati-hati. Tetapi tanpa utiliti ini tidak ada gunanya menyeksa vim2 lebih jauh. Lebih baik jangan kacau dia langsung!
Selepas tujuh bulatan neraka, konfigurasi skrip dan pemasangan, saya menerima pakej utiliti yang berfungsi. Saya menyambungkan papan melalui USB ke komputer Linux saya, dan juga menyambungkan UART mengikut rajah di atas.
Saya sedang menyediakan terminal minikom kegemaran saya untuk kelajuan 115200, tanpa kawalan ralat perkakasan dan perisian. Dan mari kita mulakan.
Apabila memuatkan VIM2 dalam terminal UART, saya menekan kekunci, seperti bar ruang, untuk berhenti memuatkan. Selepas baris muncul
kvim2#
Saya masukkan arahan:
kvim2# run update
Pada hos yang kami muatkan, saya laksanakan:
burn-tool -v aml -b VIM2 -i VIM2_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.img
Itu sahaja, phew. Saya menyemak, terdapat Linux di papan. Log masuk/kata laluan khadas:khadas.
Selepas itu, beberapa tetapan awal kecil. Untuk kerja selanjutnya, saya melumpuhkan kata laluan untuk sudo (ya, tidak selamat, tetapi mudah).
sudo visudo
Saya mengedit baris ke borang dan menyimpan
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) NOPASSWD: ALL
Kemudian saya menukar tempat semasa supaya masa di Moscow, jika tidak, ia akan berada di Greenwich.
Jika anda merasa sukar, maka jangan gunakan papan ini; Raspberry Pi adalah lebih baik. Sejujurnya.
Modem Huawei e3372h β 153
Modem ini merupakan sumber darah yang penting bagi saya, dan, sebenarnya, ia menjadi hambatan bagi keseluruhan projek. Secara umum, nama "modem" untuk peranti ini sama sekali tidak mencerminkan intipati kerja: ini adalah gabungan yang kuat, perkakasan ini mempunyai peranti komposit yang berpura-pura menjadi CD-ROM untuk memasang pemacu, dan kemudian beralih kepada mod kad rangkaian.
Dari segi seni bina, dari sudut pandangan pengguna Linux, selepas semua tetapan, ia kelihatan seperti ini: selepas menyambungkan modem, saya mempunyai antara muka rangkaian eth*, yang melalui dhcp menerima alamat IP 192.168.8.100, dan get laluan lalai ialah 192.168.8.1.
Dan momen yang paling penting! Model modem ini tidak boleh berfungsi dalam mod modem, yang dikawal oleh arahan AT. Segala-galanya akan menjadi lebih mudah, buat sambungan PPP untuk setiap modem dan kemudian beroperasi dengannya. Tetapi dalam kes saya, "dirinya" (lebih tepat, penyelam Linux mengikut peraturan udev), mencipta antara muka eth dan memberikan alamat IP kepadanya melalui dhcp.
Untuk mengelakkan kekeliruan lanjut, saya cadangkan untuk melupakan perkataan "modem" dan menyebut kad rangkaian dan gerbang, kerana pada dasarnya, ia seperti menyambungkan kad rangkaian baharu dengan pintu masuk.
Apabila terdapat satu modem, ini tidak menyebabkan sebarang masalah khas, tetapi apabila terdapat lebih daripada satu, iaitu n-pieces, gambar rangkaian berikut timbul.
Iaitu, n kad rangkaian, dengan alamat IP yang sama, setiap satu dengan get laluan lalai yang sama. Tetapi sebenarnya, setiap daripada mereka disambungkan kepada pengendalinya sendiri.
Pada mulanya, saya mempunyai penyelesaian mudah: menggunakan arahan ifconfig atau ip, matikan semua antara muka dan hanya hidupkan satu pada gilirannya dan mengujinya. Penyelesaiannya adalah baik untuk semua orang, kecuali semasa detik bertukar saya tidak dapat menyambung ke peranti. Dan kerana pensuisan adalah kerap dan pantas, saya sebenarnya tidak mempunyai peluang untuk menyambung sama sekali.
Oleh itu, saya memilih laluan menukar alamat IP modem secara manual dan kemudian memandu trafik menggunakan tetapan penghalaan.
Ini bukan penamat masalah saya dengan modem: sekiranya berlaku masalah kuasa, ia terputus, dan bekalan kuasa stabil yang baik ke hab USB diperlukan. Saya menyelesaikan masalah ini dengan memateri keras kuasa terus ke hab. Satu lagi masalah yang saya hadapi dan yang merosakkan keseluruhan projek: selepas but semula atau permulaan sejuk peranti, tidak semua modem dikesan dan tidak selalu, dan saya tidak dapat menentukan mengapa ini berlaku dan dengan algoritma apa. Tetapi perkara pertama dahulu.
Untuk modem berfungsi dengan betul, saya memasang pakej usb-modeswitch.
Selepas itu, selepas menyambung, modem akan dikesan dan dikonfigurasikan dengan betul oleh subsistem udev. Saya menyemak dengan hanya menyambungkan modem dan memastikan rangkaian muncul.
Satu lagi masalah yang tidak dapat saya selesaikan: bagaimana saya boleh mendapatkan nama operator yang kami bekerjasama daripada modem ini? Nama operator terkandung dalam antara muka web modem di 192.168.8.1. Ini adalah halaman web dinamik yang menerima data melalui permintaan Ajax, jadi hanya wget halaman dan menghuraikan nama tidak akan berfungsi. Jadi saya mula melihat cara untuk membangunkan halaman web, dsb., dan menyedari bahawa saya melakukan sesuatu yang tidak masuk akal. Akibatnya, dia meludah, dan pengendali mula menerima menggunakan API Speedtest itu sendiri.
Lebih mudah jika modem mempunyai akses melalui arahan AT. Ia mungkin untuk mengkonfigurasi semula, membuat sambungan ppp, menetapkan IP, mendapatkan operator telekomunikasi, dsb. Tetapi malangnya, saya bekerja dengan apa yang telah diberikan kepada saya.
GPS
Penerima GPS yang saya berikan mempunyai antara muka dan kuasa UART. Ia bukan penyelesaian terbaik, tetapi ia masih boleh dilaksanakan dan mudah. Penerima kelihatan seperti ini.
Sejujurnya, ini adalah kali pertama saya bekerja dengan penerima GPS, tetapi seperti yang saya jangkakan, segala-galanya telah lama difikirkan untuk kami. Jadi kami hanya menggunakan penyelesaian siap sedia.
Pertama, saya dayakan uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) untuk menyambungkan GPS.
khadas@Khadas:~$ sudo fdtput -t s /dtb.img /serial@c81004e0 status okay
Selepas itu saya menyemak kejayaan operasi.
khadas@Khadas:~$ fdtget /dtb.img /serial@c81004e0 status
okay
Perintah ini nampaknya mengedit devtree dengan cepat, yang sangat mudah.
Selepas kejayaan operasi ini, but semula dan pasang daemon GPS.
khadas@Khadas:~$ sudo reboot
Memasang daemon GPS. Saya memasang semuanya dan memotongnya serta-merta untuk konfigurasi selanjutnya.
Wayar GPS berada di tangan saya, wayar debugger UART kelihatan di bawah jari saya.
Saya but semula dan menyemak operasi GPS menggunakan program gpsmon.
Anda tidak dapat melihat satelit dalam tangkapan skrin ini, tetapi anda boleh melihat komunikasi dengan penerima GPS, dan ini bermakna semuanya baik-baik saja.
Dalam python, saya mencuba banyak pilihan untuk bekerja dengan daemon ini, tetapi saya menetapkan pilihan yang berfungsi dengan betul dengan python 3.
Saya memasang perpustakaan yang diperlukan.
sudo -H pip3 install gps3
Dan saya mengukir kod kerja.
from gps3.agps3threaded import AGPS3mechanism
...
def getPositionData(agps_thread):
counter = 0;
while True:
longitude = agps_thread.data_stream.lon
latitude = agps_thread.data_stream.lat
if latitude != 'n/a' and longitude != 'n/a':
return '{}' .format(longitude), '{}' .format(latitude)
counter = counter + 1
print ("Wait gps counter = %d" % counter)
if counter == 10:
ErrorMessage("ΠΡΠΈΠ±ΠΊΠ° GPS ΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°!!!")
return "NA", "NA"
time.sleep(1.0)
...
f __name__ == '__main__':
...
#gps
agps_thread = AGPS3mechanism() # Instantiate AGPS3 Mechanisms
agps_thread.stream_data() # From localhost (), or other hosts, by example, (host='gps.ddns.net')
agps_thread.run_thread() # Throttle time to sleep after an empty lookup, default '()' 0.2 two tenths of a second
Jika saya perlu mendapatkan koordinat, ini dilakukan dengan panggilan berikut:
longitude, latitude = getPositionData(agps_thread)
Dan dalam masa 1-10 saat saya sama ada akan mendapat koordinat atau tidak. Ya, saya mempunyai sepuluh percubaan untuk mendapatkan koordinat. Tidak optimum, bengkok dan serong, tetapi ia berfungsi. Saya memutuskan untuk melakukan ini kerana GPS boleh mempunyai penerimaan yang lemah dan tidak selalu menerima data. Jika anda menunggu untuk menerima data, maka jika anda bekerja di bilik terpencil, program akan membeku di tempat ini. Oleh itu, saya melaksanakan pilihan tidak elegan ini.
Pada dasarnya, jika terdapat lebih banyak masa, adalah mungkin untuk menerima data dari GPS secara langsung melalui UART, menghuraikannya dalam benang yang berasingan dan bekerja dengannya. Tetapi tidak ada masa sama sekali, oleh itu kod hodoh yang kejam. Dan ya, saya tidak malu.
Diod pemancar cahaya
Menyambungkan LED adalah mudah dan sukar pada masa yang sama. Kesukaran utama ialah nombor pin dalam sistem tidak sepadan dengan nombor pin pada papan dan kerana dokumentasi ditulis di sebelah kiri. Untuk membandingkan nombor pin perkakasan dan nombor pin dalam OS, anda perlu menjalankan arahan:
gpio readall
Jadual surat-menyurat pin dalam sistem dan pada papan akan dipaparkan. Selepas itu saya sudah boleh mengendalikan pin dalam OS itu sendiri. Dalam kes saya, LED disambungkan ke GPIOH_5.
Sekarang, sekiranya berlaku ralat, saya memanggil error_blink() dan LED akan berkelip dengan indah.
Nod perisian
API Speedtest
Sungguh menggembirakan kerana perkhidmatan speedtest.net mempunyai python-API sendiri, anda boleh lihat Github.
Perkara yang baik ialah terdapat kod sumber yang juga boleh dilihat. Cara bekerja dengan API ini (contoh mudah) boleh didapati dalam bahagian yang berkaitan.
Saya memasang perpustakaan python dengan arahan berikut.
sudo -H pip3 install speedtest-cli
Sebagai contoh, anda juga boleh memasang penguji kelajuan di Ubuntu terus daripada perisian. Ini adalah aplikasi python yang sama, yang kemudiannya boleh dilancarkan terus dari konsol.
sudo apt install speedtest-cli -y
Dan ukur kelajuan Internet anda.
speedtest-cli
Retrieving speedtest.net configuration...
Testing from B***** (*.*.*.*)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by MTS (Moscow) [0.12 km]: 11.8 ms
Testing download speed................................................................................
Download: 7.10 Mbit/s
Testing upload speed......................................................................................................
Upload: 3.86 Mbit/s
Akibatnya, seperti yang saya lakukan. Saya terpaksa masuk ke dalam kod sumber ujian kelajuan ini untuk melaksanakannya dengan lebih lengkap ke dalam projek saya. Salah satu tugas yang paling penting ialah mendapatkan nama pengendali telekomunikasi untuk menggantikannya ke dalam plat.
Di sini juga, semuanya ternyata tidak begitu mudah, walaupun ia kelihatan lebih mudah. Pada mulanya, parameter pelayan adalah sama dengan [], mereka berkata, pilih pelayan terbaik. Akibatnya, saya mempunyai pelayan rawak, dan, seperti yang anda rasa, kelajuan berubah-ubah. Ini adalah topik yang agak kompleks, menggunakan pelayan tetap, jika ya, statik atau dinamik, memerlukan penyelidikan. Tetapi berikut ialah contoh graf ukuran kelajuan untuk pengendali Beeline apabila memilih pelayan ujian dan pelayan tetap secara statik secara dinamik.
Hasil daripada mengukur kelajuan apabila memilih pelayan dinamik.
Hasil ujian kelajuan, dengan satu pelayan yang dipilih dengan ketat.
Semasa ujian, terdapat "bulu" di kedua-dua tempat, dan ia perlu dikeluarkan menggunakan kaedah matematik. Tetapi dengan pelayan tetap ia kurang sedikit dan amplitudnya lebih stabil.
Secara umum, ini adalah tempat penyelidikan yang hebat. Dan saya akan mengukur kelajuan pelayan saya menggunakan utiliti iperf. Tetapi kami berpegang pada spesifikasi teknikal.
Menghantar mel dan ralat
Untuk menghantar mel, saya mencuba beberapa dozen pilihan yang berbeza, tetapi akhirnya saya menyelesaikan perkara berikut. Saya mendaftarkan peti mel di Yandex dan kemudian mengambil Ini adalah contoh menghantar mel. Saya menyemaknya dan melaksanakannya ke dalam program. Contoh ini mengkaji pelbagai pilihan, termasuk menghantar dari gmail, dsb. Saya tidak mahu bersusah payah menyediakan pelayan mel saya dan tidak mempunyai masa untuk itu, tetapi ternyata kemudian, ia juga sia-sia.
Log dihantar mengikut penjadual, jika ada kaitan, setiap 6 jam: pada pukul 00, 06 pagi, 12 tengah hari dan 18 malam. Dihantar seperti berikut.
from send_email import *
...
message_log = "ΠΠΎΠ³ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ»Π°ΡΡ β1"
EmailForSend = ["[email protected]", "[email protected]"]
files = ["/home/khadas/modems_speedtest/csv"]
...
def sendLogs():
global EmailForSend
curdata = datetime.now().strftime('%d.%m.%Y')
Ρurtime = datetime.now().strftime('%H:%M:%S')
try:
for addr_to in EmailForSend:
send_email(addr_to, message_log, "ΠΠΎΠ³ΠΈ Π·Π° " + curdata + " " + Ρurtime, files)
except:
print("Network problem for send mail")
return False
return True
Ralat juga telah dihantar pada mulanya. Sebagai permulaan, mereka terkumpul dalam senarai, dan kemudian dihantar juga menggunakan penjadual, jika terdapat sambungan. Walau bagaimanapun, masalah timbul dengan fakta bahawa Yandex mempunyai had pada bilangan mesej yang dihantar setiap hari (ini adalah kesakitan, kesedihan dan penghinaan). Oleh kerana mungkin terdapat sejumlah besar ralat walaupun seminit, kami terpaksa meninggalkan ralat menghantar melalui mel. Oleh itu, perlu diingat apabila secara automatik menghantar maklumat tentang masalah sedemikian melalui perkhidmatan Yandex.
Pelayan maklum balas
Untuk mempunyai akses kepada perkakasan jauh dan dapat menyesuaikan dan mengkonfigurasi semulanya, saya memerlukan pelayan luaran. Secara umum, untuk bersikap adil, adalah betul untuk menghantar semua data ke pelayan dan membina semua graf yang indah dalam antara muka web. Tetapi tidak sekaligus.
Untuk VPS saya pilih ruvds.com. Anda boleh menggunakan pelayan yang paling mudah. Dan secara umum, untuk tujuan saya ini sudah cukup. Tetapi kerana saya tidak membayar untuk pelayan daripada poket saya sendiri, saya memutuskan untuk mengambilnya dengan rizab yang kecil supaya cukup jika kami menggunakan antara muka web, pelayan SMTP kami sendiri, VPN, dll. Selain itu, dapat menyediakan bot Telegram dan tidak menghadapi masalah dengan ia disekat. Oleh itu, saya memilih Amsterdam dan parameter berikut.
Sebagai kaedah komunikasi dengan perkakasan, vim2 memilih sambungan ssh terbalik dan, seperti yang ditunjukkan oleh amalan, ia bukanlah yang terbaik. Jika sambungan terputus, pelayan memegang port dan mustahil untuk menyambung melaluinya untuk beberapa waktu. Oleh itu, adalah lebih baik untuk menggunakan kaedah komunikasi lain, contohnya VPN. Pada masa hadapan saya mahu beralih kepada VPN, tetapi tidak mempunyai masa.
Saya tidak akan pergi ke butiran menyediakan tembok api, menyekat hak, melumpuhkan sambungan root ssh dan truisme lain untuk menubuhkan VPS. Saya ingin percaya bahawa anda sudah mengetahui segala-galanya. Untuk sambungan jauh, saya mencipta pengguna baharu pada pelayan.
adduser vimssh
Saya menjana kunci sambungan ssh pada perkakasan kami.
Beri perhatian kepada port 8083: ia menentukan port mana yang akan saya gunakan untuk menyambung melalui ssh terbalik. Tambahkannya pada permulaan dan mulakan.
Sekarang, pada pelayan VPS kami, jika kami menjalankan:
ssh -p 8083 khadas@localhost
Kemudian saya sampai ke bahagian ujian perkakasan saya. Dan dari perkakasan saya juga boleh menghantar log dan sebarang data melalui ssh ke pelayan saya, yang sangat mudah.
Meletakkannya bersama-sama
Menghidupkan, mari mulakan pembangunan dan nyahpepijat
Fuh, itu sahaja, saya menerangkan semua nod. Kini tiba masanya untuk mengumpulkan semuanya. Anda boleh melihat kod tersebut di sini.
Perkara penting dengan kod: Projek ini mungkin tidak bermula seperti ini, kerana ia telah disesuaikan untuk tugas tertentu, seni bina tertentu. Walaupun saya memberikan kod sumber, saya masih akan menerangkan perkara yang paling berharga di sini, betul-betul dalam teks, jika tidak, ia benar-benar tidak dapat difahami.
Pada mulanya, saya memulakan gps, gpio dan melancarkan benang penjadual yang berasingan.
Penjadual agak mudah: ia kelihatan untuk melihat sama ada masanya telah tiba untuk menghantar mesej dan status ralat semasa. Jika terdapat bendera ralat, maka kita kelipkan 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)
Bahagian yang paling sukar dalam projek ini ialah mengekalkan sambungan ssh terbalik untuk setiap ujian. Setiap ujian melibatkan konfigurasi semula get laluan lalai dan pelayan DNS. Oleh kerana tiada siapa yang membaca, ketahuilah bahawa kereta api itu tidak menaiki rel kayu. Sesiapa yang menjumpai telur Paskah mendapat gula-gula.
Untuk melakukan ini, saya mencipta jadual penghalaan yang berasingan -set-mark 0x2 dan peraturan untuk mengubah hala 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")
Selepas itu saya pergi ke gelung yang tidak berkesudahan, di mana setiap kali kita mendapat senarai modem yang disambungkan (untuk mengetahui sama ada konfigurasi rangkaian telah berubah secara tiba-tiba).
network_list = getNetworklist()
Mendapatkan senarai antara muka rangkaian agak 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
Selepas menerima senarai, saya menetapkan alamat IP kepada semua antara muka, seperti yang saya tunjukkan dalam gambar dalam bab tentang modem.
Saya menyemak antara muka untuk kefungsian, jika tiada rangkaian, maka saya menjana ralat. Jika ada rangkaian, maka sudah tiba masanya untuk bertindak!
Di sini saya mengkonfigurasi penghalaan ssh ke antara muka ini (jika ia belum dilakukan), hantar ralat ke pelayan jika masanya telah tiba, hantar log dan akhirnya jalankan ujian laju dan simpan log ke fail csv.
if not NetworkAvalible():
....
#ΠΠ΄Π΅ΡΡ ΠΌΡ ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΠΎΡΠΈΠ±ΠΊΠΈ
....
else: #ΠΡΡΡ ΡΠ΅ΡΡ, ΡΡΠ°, ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ!
#ΠΡΠ»ΠΈ Ρ Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ssh, ΡΠΎ ΠΌΠ΅Π½ΡΠ΅ΠΌ Π΅Π³ΠΎ
if (sshint == lastbanint or sshint =="free"):
print("********** Setup SSH ********************")
if sshint !="free":
Ρmd_run("sudo ip route del default via 192.168.8.1 dev " + sshint +" table 102")
SetupReverseSSH(iface)
sshint = iface
#ΡΠ°Π· ΡΠ΅ΡΠΊΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠΎ Π΄Π°Π²Π°ΠΉ ΡΡΠΎΡΠ½ΠΎ Π²ΡΠ΅ ΠΎΡΠΏΡΠ°Π²ΠΈΠΌ!!!
if ready_to_send:
print ("**** Ready to send!!!")
if sendLogs():
ready_to_send = False
if error_status:
SendErrors()
#ΠΈ Π΄Π°Π»Π΅Π΅ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌ ΡΠΊΠΎΡΠΎΡΡΡ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π»ΠΎΠ³ΠΈ.
Perlu disebutkan fungsi menyediakan 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 sudah tentu, anda perlu menambah semua keindahan ini untuk permulaan. Untuk melakukan ini saya membuat fail:
sudo vim /etc/systemd/system/modems_speedtest.service
Nah, sekarang perkara yang paling penting ialah, apa yang berlaku akibatnya? Berikut adalah beberapa graf yang saya berjaya tangkap semasa proses pembangunan dan penyahpepijatan. Graf telah dibina 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 dengan pengendali Tele2, yang saya kendalikan selama beberapa hari.
Di sini saya menggunakan pelayan pengukur dinamik. Pengukuran kelajuan berfungsi, tetapi sangat turun naik, tetapi beberapa nilai purata masih kelihatan, dan ini boleh diperolehi dengan menapis data, contohnya, dengan purata bergerak.
Kemudian saya membina beberapa graf untuk pengendali telekomunikasi lain. Dalam kes ini, sudah ada satu pelayan ujian, dan hasilnya juga sangat menarik.
Seperti yang anda lihat, topik ini sangat luas untuk penyelidikan dan pemprosesan data ini, dan jelas tidak bertahan selama beberapa minggu bekerja. Tetapiβ¦
Hasil kerja
Kerja itu tiba-tiba siap kerana keadaan di luar kawalan saya. Salah satu kelemahan projek ini, pada pendapat subjektif saya, adalah modem, yang tidak benar-benar mahu berfungsi serentak dengan modem lain, dan membuat helah sedemikian setiap kali ia dimuatkan. Untuk tujuan ini, terdapat sejumlah besar model modem lain; biasanya mereka sudah dalam format Mini PCI-e dan dipasang di dalam peranti dan lebih mudah untuk dikonfigurasikan. Tetapi itu cerita yang sama sekali berbeza. Projek itu menarik dan saya sangat gembira kerana saya dapat mengambil bahagian di dalamnya.