Аз сабаби набудани вақт ман на ба фоидаи роҳат ё амалӣ, балки ба тарафдории суръати рушд қарор қабул кардам. Масалан, ssh баръакс барои дастрасии дурдаст, ба ҷои VPN-и бештар амалӣ, бо мақсади сарфаи вақт дар танзими сервер ва ҳар як муштарии инфиродӣ истифода мешуд.
Протсессори олӣ ва пурқудрати медиавӣ барои хонаи интеллектуалӣ ва SMART-TV, аммо барои ин вазифа бениҳоят номувофиқ аст ё, бигӯем, хеле мувофиқ аст. Масалан, ОС-и асосии он Android аст ва Linux OS-и дуюмдараҷа аст ва мувофиқан ҳеҷ кас кори босифати ҳама гиреҳҳо ва драйверҳоро дар зери Linux кафолат намедиҳад. Ва ман фикр мекунам, ки баъзе мушкилот бо драйверҳои USB-и ин платформа алоқаманд буданд, аз ин рӯ модемҳо дар ин тахта тавре ки интизор буданд, кор намекарданд. Он инчунин ҳуҷҷатҳои хеле камбизоат ва пароканда дорад, бинобар ин ҳар як амалиёт кофтани докҳо вақти зиёдро талаб мекард. Ҳатто кори муқаррарӣ бо GPIO хуни зиёдеро гирифт. Масалан, барои насб кардани LED чанд соат лозим шуд. Аммо, барои объективӣ будан, аслан муҳим набуд, ки он чӣ гуна як тахта аст, чизи асосӣ ин буд, ки он кор мекард ва портҳои USB мавҷуданд.
Аввалан, ман бояд Linux-ро дар ин тахта насб кунам. Барои он ки ваҳшӣ аз ҳуҷҷатҳо барои ҳама ва инчунин барои онҳое, ки бо ин системаи ягона сарукор доранд, ман ин бобро менависам.
Ду имконоти насб кардани Linux вуҷуд дорад: дар корти SD беруна ё дар MMC дохилӣ. Ман як шом сарф кардам, то бифаҳмам, ки чӣ тавр онро бо корт кор кардан мумкин аст, бинобар ин ман қарор додам, ки онро дар MMC насб кунам, гарчанде ки бешубҳа кор бо корти беруна хеле осонтар хоҳад буд.
Аз ҷиҳати меъморӣ, аз нуқтаи назари корбари Linux, пас аз ҳама танзимот, чунин ба назар мерасад: пас аз пайваст кардани модем, ман интерфейси шабакавии eth* дорам, ки тавассути dhcp суроғаи IP 192.168.8.100 ва шлюзи пешфарзро мегирад. 192.168.8.1 аст.
Ва муҳимтарин лаҳза! Ин модели модем дар реҷаи модем, ки бо фармонҳои AT идора карда мешавад, кор карда наметавонад. Ҳама чиз хеле соддатар мебуд, барои ҳар як модем пайвастҳои PPP эҷод кунед ва сипас бо онҳо кор кунед. Аммо дар ҳолати ман, "худ" (аниқтараш, ғаввоси Linux мувофиқи қоидаҳои udev) интерфейси eth эҷод мекунад ва тавассути dhcp ба он суроғаи IP таъин мекунад.
Ман бо истифода аз барномаи gpsmon амалиёти GPS-ро аз нав оғоз мекунам ва тафтиш мекунам.
Дар ин скриншот шумо моҳвораҳоро дида наметавонед, аммо шумо метавонед алоқаро бо қабулкунаки GPS бубинед ва ин маънои онро дорад, ки ҳама чиз хуб аст.
Дар python, ман вариантҳои зиёдеро барои кор бо ин демон санҷидаам, аммо ман ба он интихоб кардам, ки бо python 3 дуруст кор мекард.
Ман китобхонаи заруриро насб мекунам.
sudo -H pip3 install gps3
Ва ман рамзи корро муҷассама кардам.
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
Агар ба ман лозим ояд, ки координатҳоро гирам, ин бо занги зерин анҷом дода мешавад:
longitude, latitude = getPositionData(agps_thread)
Ва дар давоми 1-10 сония ман ё координатаро мегирам ё не. Бале, ман даҳ кӯшиш кардам, ки координатҳоро гирам. На оптималӣ, каҷ ва каҷ, аммо он кор мекунад. Ман тасмим гирифтам, ки ин корро кунам, зеро GPS метавонад қабули суст дошта бошад ва на ҳамеша маълумот қабул кунад. Агар шумо барои гирифтани маълумот интизор шавед, пас агар шумо дар як ҳуҷраи дурдаст кор кунед, барнома дар ин ҷой ях мекунад. Аз ин рӯ, ман ин варианти номатлубро амалӣ кардам.
Аслан, агар вақти бештар мебуд, метавон аз GPS мустақиман тавассути UART маълумот гирифта, онро дар риштаи алоҳида таҳлил ва бо он кор кунем. Аммо умуман вақт набуд, аз ин рӯ коди бераҳмона зишт. Ва ҳа, ман шарм намекунам.
Диоди рӯшноӣ
Пайваст кардани LED ҳамзамон оддӣ ва мушкил буд. Мушкилии асосӣ дар он аст, ки рақами пин дар система ба рақами пин дар тахта мувофиқат намекунад ва азбаски ҳуҷҷатгузорӣ бо дасти чап навишта мешавад. Барои муқоисаи рақами пинҳои сахтафзор ва рақами пин дар ОС, шумо бояд фармонро иҷро кунед:
gpio readall
Ҷадвали мукотибаи пинҳо дар система ва дар тахта нишон дода мешавад. Пас аз он ман аллакай метавонам пинро дар худи ОС кор кунам. Дар ҳолати ман LED ба он пайваст аст GPIOH_5.
Чизи хуб дар он аст, ки рамзҳои манбаъ мавҷуданд, ки онҳоро низ дидан мумкин аст. Чӣ тавр бо ин API кор кардан мумкин аст (намунаҳои оддӣ) дар фасли дахлдор.
Ман китобхонаи python-ро бо фармони зерин насб мекунам.
sudo -H pip3 install speedtest-cli
Масалан, шумо ҳатто метавонед як санҷиши суръатро дар Ubuntu мустақиман аз нармафзор насб кунед. Ин ҳамон замимаи python аст, ки баъдан онро мустақиман аз консол оғоз кардан мумкин аст.
sudo apt install speedtest-cli -y
Ва суръати интернети худро чен кунед.
speedtest-cli
Retrieving speedtest.net configuration...
Testing from B***** (*.*.*.*)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by MTS (Moscow) [0.12 km]: 11.8 ms
Testing download speed................................................................................
Download: 7.10 Mbit/s
Testing upload speed......................................................................................................
Upload: 3.86 Mbit/s
Дар натиҷа, ҳамон тавре ки ман кардам. Ман бояд ба рамзҳои сарчашмаи ин санҷиши суръат ворид шавам, то онҳоро дар лоиҳаи худ пурратар татбиқ кунам. Яке аз вазифаҳои муҳимтарин гирифтани номи оператори телекоммуникатсионӣ барои иваз кардани он ба лавҳа мебошад.
import speedtest
from datetime import datetime
...
#Указываем конкретный сервер для теста
#6053) MaximaTelecom (Moscow, Russian Federation)
servers = ["6053"]
# If you want to use a single threaded test
threads = None
s = speedtest.Speedtest()
#получаем имя оператора сотовой связи
opos = '%(isp)s' % s.config['client']
s.get_servers(servers)
#получаем текстовую строку с параметрами сервера
testserver = '%(sponsor)s (%(name)s) [%(d)0.2f km]: %(latency)s ms' % s.results.server
#тест загрузки
s.download(threads=threads)
#тест выгрузки
s.upload(threads=threads)
#получаем результаты
s.results.share()
#После чего формируется строка для записи в csv-файл.
#получаем позицию GPS
longitude, latitude = getPositionData(agps_thread)
#время и дата
curdata = datetime.now().strftime('%d.%m.%Y')
curtime = datetime.now().strftime('%H:%M:%S')
delimiter = ';'
result_string = opos + delimiter + str(curpos) + delimiter +
curdata + delimiter + curtime + delimiter + longitude + ', ' + latitude + delimiter +
str(s.results.download/1000.0/1000.0) + delimiter + str(s.results.upload / 1000.0 / 1000.0) +
delimiter + str(s.results.ping) + delimiter + testserver + "n"
#тут идет запись в файл логов
Дар ин ҷо ҳам ҳама чиз он қадар оддӣ набуд, гарчанде ки он хеле соддатар ба назар мерасид. Дар аввал, параметри серверҳо баробар буд [], мегӯянд, беҳтарин серверро интихоб кунед. Дар натиҷа, ман серверҳои тасодуфӣ доштам ва тавре ки шумо тахмин карда метавонед, суръати тағирёбанда. Ин як мавзӯи хеле мураккаб аст, бо истифода аз сервери собит, агар ин тавр бошад, статикӣ ё динамикӣ таҳқиқотро талаб мекунад. Аммо ин ҷо як мисоли графикҳои андозагирии суръат барои оператори Beeline ҳангоми интихоби динамикӣ сервери санҷишӣ ва сервери статикӣ мебошад.
Натиҷаи санҷиши суръат, бо як сервер ба таври қатъӣ интихобшуда.
Дар вакти санчиш дар хар ду чой «курку» мавчуд аст ва онро бо усулхои математики тоза кардан лозим аст. Аммо бо сервери собит он каме камтар аст ва амплитуда устувортар аст.
Умуман, ин макони тадкикоти калон аст. Ва ман суръати сервери худро бо истифода аз утилитаи iperf чен мекардам. Аммо мо ба нишондодҳои техникӣ риоя мекунем.
Ирсоли почта ва хатогиҳо
Барои фиристодани почта, ман даҳҳо вариантҳои гуногунро санҷидам, аммо дар ниҳоят ман дар бораи зерин қарор гирифтам. Ман як қуттии почтаро дар Яндекс сабт кардам ва сипас гирифтам Ин як мисоли фиристодани почта аст. Ман онро санҷида, онро дар барнома татбиқ кардам. Ин мисол вариантҳои гуногунро, аз ҷумла ирсол аз gmail ва ғайраро баррасӣ мекунад. Ман намехостам, ки бо таъсиси сервери почтаи худ машғул шавам ва барои он вақт надорам, аммо тавре ки баъдтар маълум шуд, он ҳам беҳуда буд.
Гузоришҳо мувофиқи нақша фиристода шуданд, агар алокае бошад, хар 6 соат: соати 00, 06, 12 ва 18 бегохй. Онро ба таври зерин фиристод.
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
Хатогиҳо низ дар аввал фиристода шуданд. Барои оғоз, онҳо дар рӯйхат ҷамъ карда шуданд ва сипас бо истифода аз нақшакаш низ фиристода шуданд, агар пайвастшавӣ вуҷуд дошта бошад. Аммо, пас аз он мушкилот ба миён омаданд, ки Яндекс дорои маҳдудияти шумораи паёмҳои фиристодашуда дар як рӯз аст (ин дард, андӯҳ ва таҳқир аст). Азбаски ҳатто дар як дақиқа метавонад шумораи зиёди хатогиҳо вуҷуд дошта бошад, мо маҷбур шудем, ки аз фиристодани хатоҳо тавассути почта даст кашем. Пас, ҳангоми ба таври худкор фиристодани маълумот дар бораи чунин мушкилот тавассути хидматҳои Yandex дар хотир доред.
Сервери бозгашт
Барои дастрасӣ ба як пораи сахтафзори дурдаст ва тавони танзим ва аз нав танзим кардани он, ба ман сервери беруна лозим буд. Умуман, аз рӯи адолат, дуруст мебуд, ки ҳама маълумотро ба сервер фиристед ва ҳама графикҳои зеборо дар интерфейси веб созед. Аммо на ҳама якбора.
Барои VPS ман интихоб кардам ruvds.com. Шумо метавонед сервери соддатаринро гиред. Ва умуман, барои мақсадҳои ман ин кофӣ хоҳад буд. Аммо азбаски ман барои сервер аз ҷайби худ пардохт накардаам, ман қарор додам, ки онро бо захираи хурд гирам, то ки агар мо интерфейси веб, сервери SMTP, VPN ва ғайраро ҷойгир кунем, кофӣ хоҳад буд. Илова бар ин, тавонед боти Telegram-ро насб кунед ва бо баста шудани он мушкилот надоред. Аз ин рӯ, ман Амстердам ва параметрҳои зеринро интихоб кардам.
Ҳамчун усули иртибот бо сахтафзор, vim2 пайвасти баръакси ssh-ро интихоб кард ва тавре ки таҷриба нишон дод, он беҳтарин нест. Агар пайвастшавӣ гум шавад, сервер портро нигоҳ медорад ва барои муддате тавассути он пайваст шудан ғайриимкон аст. Аз ин рӯ, беҳтар аст, ки усулҳои дигари иртиботро истифода баред, масалан VPN. Дар оянда ман мехостам ба VPN гузарам, аммо вақт надоштам.
Нақшасоз хеле содда аст: он назар мекунад, ки оё вақти фиристодани паёмҳо фаро расидааст ва ҳолати хатогии ҷорӣ чӣ гуна аст. Агар парчами хато вуҷуд дошта бошад, мо 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)
Қисми душвортарини ин лоиҳа нигоҳ доштани пайвасти баръакси ssh барои ҳар як санҷиш мебошад. Ҳар як санҷиш аз нав танзим кардани шлюзи пешфарз ва сервери DNS-ро дар бар мегирад. Азбаски ба ҳар ҳол касе намехонад, бидонед, ки қатора дар рельсҳои чӯбӣ намеравад. Ҳар кӣ тухми Пасхаро меёбад, қанд мегирад.
Барои ин, ман ҷадвали масирҳои алоҳида эҷод мекунам -set-mark 0x2 ва қоида барои масири интиқоли трафик.
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")
Пас аз он ман ба як ҳалқаи беохир меравам, ки дар он ҳар дафъа мо рӯйхати модемҳои пайвастшударо мегирем (барои фаҳмидани он ки конфигуратсияи шабака ногаҳон тағир ёфтааст).
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
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()
#и далее тестируем скорость и сохраняем логи.
Бояд қайд кард, ки функсияи танзими 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")
Хуб, ҳоло аз ҳама муҳим ин аст, ки дар натиҷа чӣ шуд? Инҳоянд чанд графикҳое, ки ман дар ҷараёни таҳия ва ислоҳи хатогиҳо тавонистаам сабт кунам. Графикҳо бо истифода аз gnuplot бо скрипти зерин сохта шудаанд.
#! /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"
Дар ин ҷо ман сервери ченкунии динамикӣ истифода кардам. Андозагирии суръат кор мекунад, аммо хеле тағйир меёбад, аммо каме арзиши миёна ҳоло ҳам намоён аст ва онро тавассути филтр кардани маълумот, масалан, бо ҳисоби миёнаи ҳаракат ба даст овардан мумкин аст.
Баъдтар ман як қатор графикҳоро барои дигар операторони алоқа сохтам. Дар ин ҳолат, аллакай як сервери санҷишӣ вуҷуд дошт ва натиҷаҳо низ хеле ҷолиб буданд.