Карантин учурунда мага бир нече уюлдук операторлор үчүн LTE модемдердин ылдамдыгын өлчөөчү аппаратты иштеп чыгууга катышууну сунушташты.
Кардар LTE байланышын колдонуу менен жабдууларды орнотууда, мисалы, видеоберүүлөрдү орнотууда кайсы уюлдук оператор ал үчүн эң оптималдуу экенин түшүнүү үчүн ар кайсы географиялык аймактардагы ар кандай байланыш операторлорунун ылдамдыгына баа бергиси келген. Ошол эле учурда маселени кымбат баалуу жабдууларсыз, мүмкүн болушунча жөнөкөй жана арзан чечиш керек болчу.
Мен дароо айтам, бул тапшырма эң жөнөкөй жана эң көп билимди талап кылган нерсе эмес, мен сизге кандай көйгөйлөргө туш болгонун жана аларды кантип чечкенимди айтып берем. Ошентип, кетели.
пикир
LTE туташуу ылдамдыгын өлчөө өтө татаал маселе: туура жабдууларды жана өлчөө техникасын тандоо керек, ошондой эле уюлдук тармактын топологиясын жана иштешин жакшы түшүнүү керек. Мындан тышкары, ылдамдыкка бир нече факторлор таасир этиши мүмкүн: уячадагы абоненттердин саны, аба ырайынын шарттары, жада калса уячадан клеткага ылдамдык тармактын топологиясына байланыштуу кескин өзгөрүшү мүмкүн. Жалпысынан алганда, бул көп сандагы белгисиз көйгөй жана аны бир гана байланыш оператору туура чече алат.
Башында кардар жөн гана операторлордун телефондору менен курьерди айдап, түздөн-түз телефондон өлчөөлөрдү алып, анан ылдамдыкты өлчөө натыйжаларын блокнотко жазгысы келген. Lte тармактарынын ылдамдыгын өлчөө боюнча менин чечимим идеалдуу болбосо да, маселени чечет.
Убакыттын жетишсиздигинен улам ыңгайлуулук же практикалык жактан эмес, өнүгүү ылдамдыгын жактаган чечимдерди кабыл алдым. Мисалы, серверди жана ар бир жеке кардарды орнотууда убакытты үнөмдөө үчүн практикалык VPNдин ордуна алыстан кирүү үчүн тескери ssh колдонулган.
Техникалык тапшырма
Макалада айтылгандай : Техникалык шарттарсыз иштебегиле! Эч качан, эч жерде!
Техникалык тапшырма абдан жөнөкөй, мен аны акыркы колдонуучуга түшүнүү үчүн бир аз кеңейтем. Техникалык чечимдерди жана жабдууларды тандоо кардар тарабынан жазылган. Ошентип, техникалык спецификациянын өзү, бардык бекитүүлөрдөн кийин:
Бир такталуу компьютерге негизделген vim2 H модемдери аркылуу lte байланыштары үчүн ылдамдыкты текшергичти жасаңызuawei e3372h - 153 бир нече байланыш операторлору (бирден n чейин). Ошондой эле UART аркылуу туташтырылган GPS кабыл алгычтан координаттарды алуу зарыл. Кызматтын жардамы менен ылдамдыкты өлчөө жана аларды төмөнкүдөй үстөлгө кой:
Csv форматындагы таблица. Андан кийин бул белгини ар 6 саат сайын электрондук почта аркылуу жөнөтүңүз. Ката болгон учурда, GPIO туташкан LEDди күйгүзүңүз.
Мен көптөгөн жактыруулардан кийин техникалык мүнөздөмөлөрдү эркин түрдө сүрөттөп бердим. Бирок тапшырманын мааниси мурдатан эле көрүнүп турат. Баарына бир жума убакыт берилди. Бирок чындыгында ал үч жумага созулду. Бул менин негизги жумушумдан кийин жана дем алыш күндөрү гана жасаганымды эске алуу.
Бул жерде мен дагы бир жолу кардар ылдамдыкты өлчөө кызматын жана аппараттык каражаттарды колдонуу боюнча алдын ала макул болгондугуна көңүл бургум келет, бул менин мүмкүнчүлүктөрүмдү абдан чектеген. Бюджет да чектелген, ошондуктан өзгөчө эч нерсе сатылып алынган эмес. Ошондуктан биз ушул эрежелер менен ойношубуз керек болчу.
Архитектура жана өнүктүрүү
Схема жөнөкөй жана түшүнүктүү. Ошондуктан, мен аны эч кандай өзгөчө комментарийсиз калтырам.

Мен бул тилди иштеп чыгуу боюнча такыр тажрыйбам жок болгонуна карабастан, долбоордун баарын питондо ишке ашырууну чечтим. Мен аны тандап алдым, анткени өнүгүүнү тездете турган көптөгөн даяр мисалдар жана чечимдер бар болчу. Ошондуктан, мен бардык профессионал программисттерден менин питондо иштеп чыгуудагы биринчи тажрыйбамды урушпоону суранам жана өзүмдүн чеберчилигимди өркүндөтүү үчүн конструктивдүү сындарды укканыма ар дайым кубанычтамын.
Ошондой эле процессте мен питондун эки иштеп жаткан 2 жана 3 версиясы бар экенин билдим, натыйжада мен үчүнчүгө орноштум.
Аппараттык түйүндөр
Бир табак vim2
Мага негизги машина катары бир такталуу компьютер берилди

Отличный, мощный медиакомбайн для умного дома и SMART-TV, но на редкость неподходящий для данной задачи, или скажем так, слабо подходящий. Например, его главная ОС — это Androidжана Linux — это попутная ОС, и соответственно никто не гарантирует качественной работы всех узлов и драйверов под Linux. И я предполагаю, что часть проблем была связана с драйверами USB данной платформы, поэтому модемы работали на данной плате не так как ожидал. Так же у него очень плохая и разрозненная документация, поэтому каждая операция занимала много времени копания в доках. Даже рядовая работа с GPIO попила много крови. Например, чтобы настроить работу со светодиодом, мне понадобилось несколько часов. Но, если быть объективным, то принципиально не было важно, что за одноплатник, главное, чтобы работал и были USB-порты.
Для начала мне нужно установить Linux на данную плату. Чтобы не рыскать всем по дебрям документации, а также для тех, кто будет разбираться с этим одноплатником, пишу данную главу.
Linux орнотуунун эки варианты бар: тышкы SD картада же ички MMCде. Кечке чейин аны карта менен кантип иштөөгө болорун түшүнүүгө аракет кылдым, ошондуктан аны MMCге орнотууну чечтим, бирок тышкы карта менен иштөө бир топ жеңил болору шексиз.
Микропрограмма жөнүндө . Мен чоочун тилден орусчага которомун. Тактаны жаркыратуу үчүн, мен UART аппараттык жабдыгын туташтырышым керек. Аны туташтырды
- GND куралы: <—> VIMдердин GPIO пин17
- Tool Pin TXD: <—> Pin18 of VIMs’s GPIO (Linux_Rx)
- Tool Pin RXD: <—> Pin19 of VIMs’s GPIO (Linux_Tx)
- Tool Pin VCC: <—> VIMдердин GPIO пин20

Андан кийин, мен микропрограмманы жүктөп алдым . Өзгөчө микропрограмма версиясы .
Бул микропрограмманы жүктөө үчүн мага коммуналдык программалар керек. Бул тууралуу кененирээк маалымат . Under Windows не пробовал прошивать, а вот о прошивке под Linux надо пару слов рассказать. Для начала установлю утилиты, согласно инструкции.
git clone https://github.com/khadas/utils
cd /path/to/utils
sudo ./INSTALLАаан... Эч нерсе иштебейт. Баардыгы мен үчүн туура орнотулушу үчүн орнотуу скрипттерин оңдоого бир нече саат сарптадым. Ал жерде эмне кылганым эсимде жок, бирок жылкылар менен цирк бар эле. Андыктан сак болуңуз. Бирок бул утилиталарсыз vim2ди мындан ары кыйнагандын кереги жок. Аны менен такыр аралашпаганың жакшы!
Тозоктун жети чөйрөсүнөн кийин, скрипт конфигурациялоо жана орнотуу, мен жумушчу утилиталардын пакетин алдым. Мен тактаны USB аркылуу Linux компьютериме туташтырдым, ошондой эле жогорудагы диаграммага ылайык UART туташтырдым.
Мен өзүмдүн сүйүктүү миником терминалымды 115200 ылдамдыкка орнотуп жатам, аппараттык жана программалык камсыздоо катасын көзөмөлдөөсүз. Анан баштайлы.

UART терминалына VIM2 жүктөөдө, жүктөөнү токтотуу үчүн боштук тилкеси сыяктуу баскычты басам. сызык пайда болгондон кийин
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-интерфейс и по dhcp назначают ему ip-адрес.
Мындан ары башаламандыкка жол бербөө үчүн, мен "модем" деген сөздү унутуп, тармактык карта жана шлюз деп айтууну сунуштайм, анткени түпкүлүгүндө бул жаңы тармактык картаны шлюз менен туташтыруу сыяктуу.
Бир модем болгондо, бул эч кандай өзгөчө көйгөйлөрдү жаратпайт, бирок бирден көп, тактап айтканда, 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 кабылдагыч менен биринчи жолу иштешим болчу, бирок мен күткөндөй, баары биз үчүн көптөн бери ойлонулган. Ошентип, биз жөн гана даяр чечимдерди колдонобуз.
Биринчиден, мен GPS туташтыруу үчүн uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) иштетем.
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 rebootGPS демону орнотулууда. Мен баарын орнотуп, андан ары конфигурациялоо үчүн дароо кесип салдым.
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Мен GPS илинип турган UART орнотуп жатам.
DEVICES="/dev/ttyS4"Анан баарын күйгүзүп, баштайбыз.
/* GPS daemon enable/start */
sudo systemctl enable gpsd.socket
sudo systemctl start gpsd.socketАндан кийин мен GPSти туташтырам.

GPS зымы менин колумда, UART мүчүлүштүктөрдү оңдоочу зымдар манжаларымдын астында көрүнүп турат.
Мен кайра жүктөйм жана gpsmon программасын колдонуп, GPS ишин текшерем.

Бул скриншотто спутниктерди көрө албайсыз, бирок сиз GPS кабыл алгычы менен байланышты көрө аласыз жана бул баары жакшы дегенди билдирет.
Питондо мен бул демон менен иштөөнүн көптөгөн варианттарын сынап көрдүм, бирок мен 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 туташтыруу бир эле учурда жөнөкөй жана кыйын болгон. Негизги кыйынчылык системадагы пин номери доскадагы пин номуруна дал келбейт жана документация сол кол менен жазылгандыктан. Аппараттык пин номерин жана OS ичиндеги пин номерин салыштыруу үчүн сиз буйрукту аткарышыңыз керек:
gpio readallСистемада жана тактада пин кат алышуу таблицасы көрсөтүлөт. Андан кийин мен ОСтун өзүндө пинди иштете алам. Менин учурда LED туташтырылган GPIOH_5.

Мен 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 жакшы жыпылықтайт.
Программа түйүндөрү
Speedtest API
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
Каталар да башында жөнөтүлгөн. Баштоо үчүн, алар тизмеге топтолуп, андан кийин байланыш бар болсо, пландоочу аркылуу да жөнөтүлгөн. Бирок, андан кийин көйгөйлөр Яндекс күнүнө жөнөтүлгөн билдирүүлөрдүн санына чектөө бар экендиги менен пайда болгон (бул оору, кайгы жана басынтуу). Мүнөтүнө да көп сандагы каталар болушу мүмкүн болгондуктан, каталарды почта аркылуу жөнөтүүдөн баш тартууга туура келди. Андыктан Яндекс кызматтары аркылуу мындай көйгөй тууралуу маалыматты автоматтык түрдө жөнөтүүдө эстен чыгарбаңыз.
Пикир сервер
Алыскы жабдыкка жетүү жана аны ыңгайлаштыруу жана кайра конфигурациялоо үчүн мага тышкы сервер керек болчу. Жалпысынан алганда, калыстык үчүн, бардык маалыматтарды серверге жөнөтүү жана веб-интерфейстеги бардык кооз графиктерди куруу туура болмок. Бирок баары бир убакта эмес.
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 оператору менен болду, мен аны бир нече күн өткөрдүм.

Бул жерде мен динамикалык өлчөө серверин колдондум. Ылдамдык өлчөөлөр иштейт, бирок абдан өзгөрүп турат, бирок кээ бир орточо маани дагы эле көрүнүп турат жана бул маалыматтарды чыпкалоо аркылуу, мисалы, кыймылдуу орточо менен алууга болот.
Кийинчерээк башка байланыш операторлору үчүн бир катар графиктерди курдум. Бул учурда, буга чейин бир тестирлөө сервери бар болчу, натыйжалары да абдан кызыктуу болду.




Көрүнүп тургандай, тема бул маалыматтарды изилдөө жана иштетүү үчүн абдан кенен жана ачык-айкын иш бир нече жумага созулбайт. Бирок…
Иштин натыйжасы
Иш менден көз каранды болбогон жагдайлардан улам күтүүсүз аяктады. Бул долбоордун алсыз жактарынын бири, менин субъективдүү оюмча, чындап эле башка модемдер менен бир убакта иштегиси келбеген жана жүктөлгөн сайын ушундай трюктарды жасаган модем болду. Бул максаттар үчүн көптөгөн башка модем моделдери бар. Бирок бул таптакыр башка окуя. Долбоор кызыктуу болду жана ага катышканыма абдан кубандым.
Source: www.habr.com

