Ҳангоми карантин ба ман пешниҳод карданд, ки дар таҳияи дастгоҳ барои чен кардани суръати модемҳои LTE барои якчанд операторони мобилӣ иштирок кунам.
Муштарӣ мехост, ки суръати операторони гуногуни телекоммуникатсионӣ дар маконҳои гуногуни ҷуғрофӣ баҳо диҳад, то бифаҳмад, ки кадом оператори мобилӣ ҳангоми насби таҷҳизот бо истифода аз пайвасти LTE, масалан, барои пахши видео, барои ӯ беҳтарин аст. Дар баробари ин масъаларо харчи оддй ва арзон, бе тачхизоти гаронбахо хал кардан лозим буд.
Ман дарҳол мегӯям, ки вазифа соддатарин ва доништалаб нест; Ман ба шумо мегӯям, ки ман бо кадом мушкилот дучор шудам ва чӣ гуна онҳоро ҳал кардам. Пас, биёед.
эрод гирифтан
Андозагирии суръати пайвасти LTE як масъалаи хеле мураккаб аст: шумо бояд таҷҳизоти дуруст ва техникаи андозагириро интихоб кунед, инчунин дар бораи топология ва кори шабакаи мобилӣ фаҳмиши хуб дошта бошед. Илова бар ин, суръат метавонад аз ҷониби якчанд омилҳо таъсир расонад: шумораи муштариён дар ҳуҷайра, шароити обу ҳаво, ҳатто аз ҳуҷайра ба ячейка, суръат аз рӯи топологияи шабака метавонад ба таври назаррас фарқ кунад. Умуман, ин мушкилот бо шумораи зиёди номаълум аст ва танҳо як оператори алоқа метавонад онро дуруст ҳал кунад.
Дар аввал, муштарӣ танҳо мехост, ки хаткашонро бо телефонҳои операторҳо идора кунад, мустақиман дар телефон андозагирӣ кунад ва сипас натиҷаҳои андозагирии суръатро дар дафтар сабт кунад. Ҳалли ман барои чен кардани суръати шабакаҳои lte, гарчанде ки идеалӣ нест, мушкилотро ҳал мекунад.
Аз сабаби набудани вақт ман на ба фоидаи роҳат ё амалӣ, балки ба тарафдории суръати рушд қарор қабул кардам. Масалан, ssh баръакс барои дастрасии дурдаст, ба ҷои VPN-и бештар амалӣ, бо мақсади сарфаи вақт дар танзими сервер ва ҳар як муштарии инфиродӣ истифода мешуд.
Вазифаи техникӣ
Чунон ки дар макола гуфта шудааст : Бе нишондодхои техникй кор накунед! Ҳеҷ гоҳ, дар ҳеҷ ҷо!
Вазифаи техникӣ хеле содда буд, ман онро барои фаҳмиши корбари ниҳоӣ каме васеъ хоҳам кард. Интихоби қарорҳои техникӣ ва таҷҳизот аз ҷониби фармоишгар дикта карда шуд. Ҳамин тариқ, худи мушаххасоти техникӣ пас аз ҳама тасдиқҳо:
Дар асоси як компютери тахтаи ягона vim2 як санҷиши суръат барои пайвастҳои lte тавассути модемҳои Huawei e3372h - 153 якчанд операторони алоқа (аз як то n). Инчунин қабул кардани координатҳо аз қабулкунаки GPS, ки тавассути UART пайваст шудааст, зарур аст. Бо истифода аз хидмат андозагирии суръатро анҷом диҳед ва онҳоро дар ҷадвал ҷойгир кунед, ба монанди:
Ҷадвал дар формати csv. Пас ҳар 6 соат ин аломатро тавассути почтаи электронӣ фиристед. Дар сурати хатогиҳо, LED-ро, ки ба GPIO пайваст аст, мижа кунед.
Ман мушаххасоти техникиро дар шакли озод тавсиф кардам, пас аз тасдиқҳои зиёд. Аммо маънои вазифа аллакай намоён аст. Барои ҳама чиз як ҳафта вақт дода шуд. Аммо дар асл он се ҳафта давом кард. Ин бо назардошти он аст, ки ман ин корро танҳо баъди кори асосӣ ва рӯзҳои истироҳат анҷом додам.
Дар ин ҷо ман мехоҳам бори дигар таваҷҷӯҳро ба он ҷалб намоям, ки фармоишгар дар бораи истифодаи хидмати андозагирии суръат ва таҷҳизот, ки имкониятҳои маро хеле маҳдуд мекунад, пешакӣ розӣ шудааст. Буҷа низ маҳдуд буд, бинобар ин ҳеҷ чизи махсус харида нашуд. Аз ин рӯ, мо бояд аз рӯи ин қоидаҳо бозӣ кунем.
Меъморӣ ва рушд
Нақша оддӣ ва возеҳ аст. Аз ин рӯ, ман онро бидуни шарҳи махсус мегузорам.

Ман тасмим гирифтам, ки тамоми лоиҳаро бо забони python амалӣ кунам, гарчанде ки ман таҷрибаи таҳияи ин забонро умуман надоштам. Ман онро интихоб кардам, зеро як қатор мисолҳо ва роҳҳои ҳалли омодашуда мавҷуданд, ки метавонанд рушдро суръат бахшанд. Аз ин рӯ, ман аз ҳама барномасозони касбӣ хоҳиш мекунам, ки таҷрибаи аввалини таҳияи ман дар python-ро сарзаниш накунанд ва ман ҳамеша аз шунидани интиқоди созанда барои такмили маҳорати худ шодам.
Инчунин дар ин раванд ман фаҳмидам, ки python дорои ду версияи 2 ва 3 мебошад, дар натиҷа ман дар сеюм қарор гирифтам.
Гиреҳҳои сахтафзор
Як табақи vim2
Ба ман ҳамчун мошини асосии худ як компютери якбора дода шуд

Як омезиши медиаи аъло ва пуриқтидор барои хонаи интеллектуалӣ ва телевизиони SMART, аммо барои ин вазифа бениҳоят номувофиқ аст ё, бигӯем, ба таври кофӣ мувофиқ нест. Масалан, системаи амалиётии асосии он ин аст Androidва Linux - ин системаи амалиётии ҳамроҳ аст ва аз ин рӯ, ҳеҷ кас кори босифати ҳамаи ҷузъҳо ва драйверҳоро дар зери он кафолат намедиҳад LinuxМан гумон мекунам, ки баъзе аз мушкилот бо драйверҳои USB-и платформа алоқаманд буданд, аз ин рӯ модемҳо дар ин плата тавре ки интизор мерафт, кор накарданд. Он инчунин ҳуҷҷатҳои хеле бад ва пароканда дошт, аз ин рӯ ҳар як амалиёт вақти зиёдеро барои кофтани ҳуҷҷатҳо сарф мекард. Ҳатто коркарди муқаррарии GPIO дарди воқеӣ буд. Масалан, насб кардани LED чанд соат вақтро гирифт. Аммо, ростқавлона гӯям, он ки он чӣ гуна компютери якплатӣ буд, муҳим набуд, ба шарте ки он кор кунад ва портҳои USB дошта бошад.
Аввал ман бояд насб кунам Linux Барои ин тахта. Барои пешгирӣ аз аз назар гузаронидани ҳуҷҷатҳо ва барои онҳое, ки мехоҳанд тарзи истифодаи ин компютери яктахтаро фаҳманд, ман ин бобро менависам.
Ду имконоти насб кардани Linux вуҷуд дорад: дар корти SD беруна ё дар MMC дохилӣ. Ман як шом сарф кардам, то бифаҳмам, ки чӣ тавр онро бо корт кор кардан мумкин аст, бинобар ин ман қарор додам, ки онро дар MMC насб кунам, гарчанде ки бешубҳа кор бо корти беруна хеле осонтар хоҳад буд.
Дар бораи нармафзор . Ман аз бегона ба русӣ тарҷума мекунам. Барои дурахши тахта, ман бояд сахтафзори UART-ро пайваст кунам. Онро пайваст
- Асбоби Pin GND: <—> Pin17 аз GPIO-и VIMs
- Пини асбоб TXD: <—> Пини 18-и GPIO-и VIMs (Linux_Рецепт)
- Пини асбоби RXD: <—> Пини 19-и GPIO-и VIMs (Linux_Tx)
- Асбоби Pin VCC: <—> Pin20 аз GPIO-и VIMs

Пас аз он, ман нармафзори нармафзорро зеркашӣ кардам . Версияи махсуси нармафзор .
Барои бор кардани ин нармафзор, ба ман утилитаҳо лозим аст. Тафсилоти бештар дар бораи ин Дар зери Windows Ман онро дурахшон накардаам, аммо дар бораи дурахшидани он дар зери он Linux Ман бояд чанд сухан гӯям. Аввалан, ман утилитҳоро мувофиқи дастурҳо насб мекунам.
git clone https://github.com/khadas/utils
cd /path/to/utils
sudo ./INSTALLАаанд... Ҳеҷ чиз кор намекунад. Ман якчанд соат скриптҳои насбкуниро таҳрир кардам, то ҳама чиз барои ман дуруст насб карда шавад. Дар ёд надорам, ки дар он ҷо чӣ кор кардам, аммо он ҷо сирк бо аспҳо низ буд. Пас эҳтиёт бошед. Аммо бе ин утилитаҳо барои шиканҷаи минбаъдаи vim2 маъно надорад. Беҳтар аст, ки бо ӯ умуман кор нашавед!
Пас аз ҳафт доираҳои ҷаҳаннам, конфигуратсияи скрипт ва насб, ман як бастаи утилитаҳои корӣ гирифтам. Ман тахтаро тавассути USB ба компютери Linux-и худ пайваст кардам ва инчунин UART-ро мувофиқи диаграммаи боло пайваст кардам.
Ман терминали миникоми дӯстдоштаи худро барои суръати 115200 бидуни назорати хатогиҳои сахтафзор ва нармафзор насб мекунам. Ва биёед оғоз кунем.

Ҳангоми боркунии VIM2 дар терминали UART, ман калидеро, ба монанди панели фосиларо пахш мекунам, то боркунӣ қатъ шавад. Пас аз пайдо шудани сатр
kvim2# Ман фармонро ворид мекунам:
kvim2# run updateДар мизбоне, ки мо аз он бор мекунем, ман иҷро мекунам:
burn-tool -v aml -b VIM2 -i VIM2_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.imgАна тамом, фу. Ман онро дар экран нишон додам, он дар тахта аст. Linux. Логин/парол khadas:khadas.
Пас аз он, баъзе танзимоти ибтидоии хурд. Барои кори минбаъда ман паролро барои sudo хомӯш мекунам (бале, бехатар нест, аммо қулай).
sudo visudoМан сатрро ба форма таҳрир мекунам ва захира мекунам
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) NOPASSWD: ALLОн гоҳ ман маҳалли ҳозираро иваз мекунам, то вақт дар Маскав бошад, вагарна он дар Гринвич бошад.
sudo timedatectl set-timezone Europe/Moscowё
ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtimeАгар ба шумо душвор бошад, пас ин тахтаро истифода набаред; Raspberry Pi беҳтар аст. Рости гап.
Модем Huawei e3372h – 153
Ин модем барои ман манбаи муҳими хун буд ва дар асл, он монеаи тамоми лоиҳа гардид. Умуман, номи «модем» барои ин дастгоххо мохияти корро тамоман инъикос намекунад: ин комбайни пуриктидор аст, ин порчаи аппаратура дорои дастгохи композитие мебошад, ки барои насб кардани драйверхо, худро CD-ROM вонамуд мекунад, ва сипас ба ҳолати корти шабака мегузарад.
Аз нигоҳи меъморӣ, аз нуқтаи назари корбар Linux Баъд аз ҳама танзимот, он чунин ба назар мерасад: пас аз пайваст кардани модем, ман интерфейси шабакавии eth* дорам, ки тавассути DHCP суроғаи IP-и 192.168.8.100-ро мегирад ва дарвозаи пешфарз 192.168.8.1 аст.
Ва муҳимтарин лаҳза! Ин модели модем дар реҷаи модем, ки бо фармонҳои AT идора карда мешавад, кор карда наметавонадЭҷоди пайвастҳои PPP барои ҳар як модем ва сипас кор бо онҳо хеле осонтар мебуд. Аммо дар мавриди ман, "худам" (ё аниқтараш, ғаввос) Linux мувофиқи қоидаҳои udev), интерфейси eth эҷод мекунад ва ба он суроғаи IP-ро тавассути dhcp таъин мекунад.
Барои роҳ надодан ба нофаҳмиҳои минбаъда, ман тавсия медиҳам, ки калимаи "модем" -ро фаромӯш карда, корти шабакавӣ ва шлюзро бигӯям, зеро дар асл, ин ба пайваст кардани корти нави шабакавӣ бо шлюз монанд аст.
Вақте ки як модем мавҷуд аст, ин ягон мушкилоти махсусро ба вуҷуд намеорад, аммо вақте ки зиёда аз як модем вуҷуд дорад, яъне n-порчаҳо, тасвири шабакавии зерин ба вуҷуд меояд.

Яъне, n кортҳои шабакавӣ бо суроғаи IP-и якхела, ҳар яке бо як дарвозаи пешфарз. Аммо дар асл ҳар кадоми онҳо ба оператори худ пайвастанд.
Дар аввал, ман як ҳалли оддӣ доштам: бо истифода аз фармони ifconfig ё ip, ҳама интерфейсҳоро хомӯш кунед ва танҳо дар навбати худ якеро фаъол кунед ва онро санҷед. Ҳалли барои ҳама хуб буд, ба истиснои он ки дар лаҳзаҳои гузариш ман натавонистам ба дастгоҳ пайваст шавам. Ва азбаски гузариш зуд ва зуд аст, ман аслан имкони пайваст шуданро надоштам.
Аз ин рӯ, ман роҳи ба таври дастӣ иваз кардани суроғаҳои IP-и модемҳоро интихоб кардам ва сипас бо истифода аз танзимоти масир ҳаракати трафикро интихоб кардам.

Ин охири мушкилоти ман бо модемҳо набуд: дар сурати мушкилоти нерӯи барқ, онҳо меафтоданд ва таъмини хуби устувори барқ ба маркази USB лозим буд. Ман ин мушкилотро тавассути кафшери сахти барқ ба марказ ҳал кардам. Мушкилоти дигаре, ки ман дучор шудам ва тамоми лоиҳаро хароб кард: пас аз бозоғозӣ ё сардии дастгоҳ, на ҳама модемҳо ошкор карда шуданд ва на ҳамеша, ва ман муайян карда наметавонистам, ки чаро ин рӯй дод ва бо кадом алгоритм. Аммо чизҳои аввал.
Барои дуруст кор кардани модем, ман бастаи usb-modeswitch насб кардам.
sudo apt update
sudo apt install -y usb-modeswitch Пас аз он, пас аз пайвастшавӣ модем аз ҷониби зерсистемаи udev дуруст муайян ва танзим карда мешавад. Ман тавассути пайваст кардани модем ва боварӣ ҳосил кардани он, ки шабака пайдо мешавад, тафтиш мекунам.
Мушкили дигаре, ки ҳал карда натавонистам: чӣ гуна метавонам номи оператореро, ки мо бо он кор мекунем, аз ин модем гирам? Номи оператор дар веб-интерфейси модеми 192.168.8.1 мавҷуд аст. Ин як веб-саҳифаи динамикӣ аст, ки тавассути дархостҳои Ajax маълумот қабул мекунад, аз ин рӯ танҳо гузоштани саҳифа ва таҳлили ном кор намекунад. Ҳамин тавр, ман дар бораи чӣ гуна таҳия кардани веб саҳифа ва ғайра сар кардам ва фаҳмидам, ки ман як навъ сафсата карда истодаам. Дар натиҷа, ӯ туф кард ва оператор бо истифода аз худи Speedtest API ба қабул оғоз кард.
Агар модем тавассути фармонҳои AT дастрасӣ дошта бошад, хеле осонтар мебуд. Онро аз нав танзим кардан, пайвасти ppp эҷод кардан, IP таъин кардан, оператори телекоммуникатсионӣ ва ғайра имконпазир мебуд. Аммо афсӯс, ки ман бо он чизе, ки ба ман дода шудааст, кор мекунам.
GPS
Қабулкунаки GPS, ки ба ман дода шуда буд, интерфейси UART ва қудрат дошт. Ин беҳтарин роҳи ҳалли мушкилот набуд, аммо он ҳанӯз ҳам қобили кор ва оддӣ буд. Приёмник чунин менамуд.

Рости гап, ин бори аввал буд, ки ман бо қабулкунаки GPS кор мекардам, аммо тавре ки ман интизор будам, ҳама чиз барои мо кайҳо омода шуда буд. Аз ин рӯ, мо танҳо ҳалли тайёрро истифода мебарем.
Аввалан, ман uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) -ро барои пайваст кардани GPS фаъол мекунам.
khadas@Khadas:~$ sudo fdtput -t s /dtb.img /serial@c81004e0 status okayПас аз он ман муваффақияти амалиётро тафтиш мекунам.
khadas@Khadas:~$ fdtget /dtb.img /serial@c81004e0 status
okayИн фармон аз афташ devtree-ро дар парвоз таҳрир мекунад, ки ин хеле қулай аст.
Пас аз муваффақияти ин амалиёт, демони GPS-ро аз нав оғоз кунед ва насб кунед.
khadas@Khadas:~$ sudo rebootНасб кардани демони GPS. Ман ҳама чизро насб мекунам ва онро фавран барои конфигуратсияи минбаъда буридам.
sudo apt install gpsd gpsd-clients -y
sudo killall gpsd
/* GPS daemon stop/disable */
sudo systemctl stop gpsd.socket
sudo systemctl disable gpsd.socketТаҳрири файли танзимот.
sudo vim /etc/default/gpsdМан як UART насб мекунам, ки дар он GPS овезон мешавад.
DEVICES="/dev/ttyS4"Ва он гоҳ мо ҳама чизро фурӯзон мекунем ва оғоз мекунем.
/* GPS daemon enable/start */
sudo systemctl enable gpsd.socket
sudo systemctl start gpsd.socketПас аз он ман GPS-ро пайваст мекунам.

Сими GPS дар дасти ман аст, симҳои ислоҳи UART дар зери ангуштони ман намоёнанд.
Ман бо истифода аз барномаи 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.

Ман PIN GPIO-ро ба ҳолати баромад мегузорам.
gpio -g mode 421 outМан сифр менависам.
gpio -g write 421 0Якашро менависам.
gpio -g write 421 1 
Ҳама чиз фурӯзон мешавад, пас аз навиштани "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)
Ҳоло, дар сурати хатогӣ, ман error_blink() занг мезанам ва LED ба таври зебо чашмак мезанад.
Гиреҳҳои нармафзор
API Speedtest
Ин як шодии бузург аст, ки хидмати speedtest.net дорои python-API-и худро дорад, шумо метавонед онро бубинед .
Чизи хуб дар он аст, ки рамзҳои манбаъ мавҷуданд, ки онҳоро низ дидан мумкин аст. Чӣ тавр бо ин 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 = ["dlinyj@trololo.ru", "pupkin@trololo.ru"]
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 ман интихоб кардам . Шумо метавонед сервери соддатаринро гиред. Ва умуман, барои мақсадҳои ман ин кофӣ хоҳад буд. Аммо азбаски ман барои сервер аз ҷайби худ пардохт накардаам, ман қарор додам, ки онро бо захираи хурд гирам, то ки агар мо интерфейси веб, сервери SMTP, VPN ва ғайраро ҷойгир кунем, кофӣ хоҳад буд. Илова бар ин, тавонед боти Telegram-ро насб кунед ва бо баста шудани он мушкилот надоред. Аз ин рӯ, ман Амстердам ва параметрҳои зеринро интихоб кардам.

Ҳамчун усули иртибот бо сахтафзор, vim2 пайвасти баръакси ssh-ро интихоб кард ва тавре ки таҷриба нишон дод, он беҳтарин нест. Агар пайвастшавӣ гум шавад, сервер портро нигоҳ медорад ва барои муддате тавассути он пайваст шудан ғайриимкон аст. Аз ин рӯ, беҳтар аст, ки усулҳои дигари иртиботро истифода баред, масалан VPN. Дар оянда ман мехостам ба VPN гузарам, аммо вақт надоштам.
Ман ба тафсилоти таъсиси девор, маҳдуд кардани ҳуқуқҳо, ғайрифаъол кардани пайвастҳои решаи ssh ва дигар ҳаққонияти таъсиси VPS маълумот намедиҳам. Ман мехостам бовар кунам, ки шумо аллакай ҳама чизро медонед. Барои пайвасти дурдаст ман дар сервер корбари нав эҷод мекунам.
adduser vimsshМан калидҳои пайвасти ssh-ро дар сахтафзори мо тавлид мекунам.
ssh-keygenВа ман онҳоро ба сервери худ нусхабардорӣ мекунам.
ssh-copy-id vimssh@host.comДар сахтафзори мо, ман дар ҳар боркунӣ пайвасти автоматии баръакси ssh эҷод мекунам.
[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 vimssh@host.com
RestartSec=5
Restart=always
[Install]
WantedBy=multi-user.target
Ба порти 8083 диққат диҳед: он муайян мекунад, ки ман кадом портро барои пайвастшавӣ тавассути ssh баръакс истифода хоҳам кард. Онро ба оғозёбӣ илова кунед ва оғоз кунед.
sudo systemctl enable autossh.service
sudo systemctl start autossh.serviceШумо ҳатто метавонед вазъиятро бубинед:
sudo systemctl status autossh.serviceҲоло, дар сервери VPS-и мо, агар мо иҷро кунем:
ssh -p 8083 khadas@localhostОн гоҳ ман ба порчаи озмоишии сахтафзори худ меравам. Ва аз сахтафзор ман инчунин метавонам гузоришҳо ва ҳама гуна маълумотро тавассути ssh ба сервери худ фиристам, ки ин хеле қулай аст.
Ҳама чизро якҷоя кардан

Фурӯзон, биёед таҳия ва ислоҳро оғоз кунем
Оҳ, ин аст, ман ҳама гиреҳҳоро тавсиф кардам. Акнун вақти он расидааст, ки ҳама чизро якҷоя кунем. Шумо метавонед кодро бинед .
Нуктаи муҳим бо рамз: Ин лоиҳа метавонад чунин оғоз нашавад, зеро он барои як вазифаи мушаххас, як меъмории мушаххас таҳия шудааст. Гарчанде ки ман рамзи сарчашмаро медиҳам, ман то ҳол чизҳои арзишмандро дар ин ҷо, дар матн шарҳ медиҳам, вагарна ин комилан нофаҳмо аст.
Дар аввал, ман gps, gpio-ро оғоз мекунам ва як риштаи алоҳидаи ҷадвалро оғоз мекунам.
#запуск потока планировщика
pShedulerThread = threading.Thread(target=ShedulerThread, args=(1,))
pShedulerThread.start()Нақшасоз хеле содда аст: он назар мекунад, ки оё вақти фиристодани паёмҳо фаро расидааст ва ҳолати хатогии ҷорӣ чӣ гуна аст. Агар парчами хато вуҷуд дошта бошад, мо 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")Шумо метавонед дар бораи он ки чӣ тавр кор мекунад, бештар маълумот гиред .
Пас аз он ман ба як ҳалқаи беохир меравам, ки дар он ҳар дафъа мо рӯйхати модемҳои пайвастшударо мегирем (барои фаҳмидани он ки конфигуратсияи шабака ногаҳон тағир ёфтааст).
network_list = getNetworklist()Гирифтани рӯйхати интерфейсҳои шабакавӣ хеле содда аст.
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Пас аз гирифтани рӯйхат, ман суроғаҳои IP-ро ба ҳама интерфейсҳо муқаррар кардам, тавре ки ман дар расм дар боб дар бораи модем нишон додам.
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")Пас ман танҳо аз ҳар як интерфейс дар як ҳалқа мегузарам. Ва ман ҳар як интерфейсро танзим мекунам.
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'")Ман интерфейсро барои коршоямӣ тафтиш мекунам, агар шабака вуҷуд надошта бошад, ман хатогиҳо эҷод мекунам. Агар шабака вуҷуд дошта бошад, пас вақти амал кардан расидааст!
Дар ин ҷо ман масири ssh-ро ба ин интерфейс танзим мекунам (агар он иҷро нашуда бошад), хатогиҳоро ба сервер фиристед, агар вақт фаро расида бошад, гузоришҳоро фиристед ва дар ниҳоят санҷиши суръатро иҷро кунед ва гузоришҳоро ба файли 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()
#и далее тестируем скорость и сохраняем логи. Бояд қайд кард, ки функсияи танзими 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")Ва албатта, шумо бояд ҳамаи ин зебоиро ба оғозёбӣ илова кунед. Барои ин ман файл эҷод мекунам:
sudo vim /etc/systemd/system/modems_speedtest.serviceВа ман дар он менависам:
[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
Ман боркунии автоматиро фаъол мекунам ва оғоз мекунам!
sudo systemctl enable modems_speedtest.service
sudo systemctl start modems_speedtest.serviceҲоло ман метавонам сабтҳои рӯйдодҳоро бо истифода аз фармон бубинам:
journalctl -u modems_speedtest.service --no-pager -fнатиҷаҳои
Хуб, ҳоло аз ҳама муҳим ин аст, ки дар натиҷа чӣ шуд? Инҳоянд чанд графикҳое, ки ман дар ҷараёни таҳия ва ислоҳи хатогиҳо тавонистаам сабт кунам. Графикҳо бо истифода аз 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"
Таҷрибаи аввал бо оператори Tele2 буд, ки ман онро чанд рӯз гузаронидам.

Дар ин ҷо ман сервери ченкунии динамикӣ истифода кардам. Андозагирии суръат кор мекунад, аммо хеле тағйир меёбад, аммо каме арзиши миёна ҳоло ҳам намоён аст ва онро тавассути филтр кардани маълумот, масалан, бо ҳисоби миёнаи ҳаракат ба даст овардан мумкин аст.
Баъдтар ман як қатор графикҳоро барои дигар операторони алоқа сохтам. Дар ин ҳолат, аллакай як сервери санҷишӣ вуҷуд дошт ва натиҷаҳо низ хеле ҷолиб буданд.




Тавре ки шумо мебинед, мавзӯъ барои таҳқиқ ва коркарди ин маълумот хеле васеъ аст ва равшан аст, ки чанд ҳафтаи кор давом намекунад. Аммо…
Натиҷаи кор
Кор бо вазъияте, ки аз ман берун буд, ногаҳон анҷом ёфт. Яке аз нуқсонҳои ин лоиҳа, ба назари субъективии ман, модем буд, ки аслан намехост ҳамзамон бо модемҳои дигар кор кунад ва ҳар боре, ки боргузорӣ мешавад, чунин найрангҳо мекард. Барои ин мақсадҳо шумораи зиёди моделҳои модеми дигар мавҷуданд; одатан онҳо аллакай дар формати Mini PCI-e ҳастанд ва дар дохили дастгоҳ насб карда шудаанд ва танзим кардан хеле осонтар аст. Аммо ин як ҳикояи тамоман дигар аст. Лоиҳа ҷолиб буд ва ман хеле шод будам, ки тавонистам дар он ширкат кунам.
Манбаъ: will.com

