Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Хорио цээрийн дэглэмийн үеэр хэд хэдэн үүрэн холбооны операторуудад LTE модемуудын хурдыг хэмжих төхөөрөмж бүтээх ажилд оролцохыг надад санал болгосон.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Үйлчлүүлэгч нь LTE холболтыг ашиглан тоног төхөөрөмж суурилуулах, жишээлбэл, видео нэвтрүүлэг хийх үед аль үүрэн холбооны оператор хамгийн оновчтой болохыг ойлгохын тулд өөр өөр газарзүйн байршил дахь янз бүрийн харилцаа холбооны операторуудын хурдыг үнэлэхийг хүссэн. Үүний зэрэгцээ асуудлыг үнэтэй тоног төхөөрөмжгүйгээр аль болох энгийн бөгөөд хямдхан шийдэх ёстой байв.

Даалгавар бол хамгийн энгийн бөгөөд мэдлэг шаардсан ажил биш гэдгийг би шууд хэлье, би ямар асуудалтай тулгарсан, тэдгээрийг хэрхэн шийдсэнээ хэлэх болно. За, явцгаая.

тайлбар

LTE холболтын хурдыг хэмжих нь маш нарийн төвөгтэй асуудал юм: та зөв төхөөрөмж, хэмжилтийн техникийг сонгохоос гадна үүрэн сүлжээний топологи, үйл ажиллагааны талаар сайн ойлголттой байх хэрэгтэй. Нэмж дурдахад хурд нь хэд хэдэн хүчин зүйлээс шалтгаалж болно: үүрэн дээрх захиалагчдын тоо, цаг агаарын нөхцөл байдал, тэр ч байтугай сүлжээний топологиос шалтгаалж эсээс үүр хүртэл хурд нь эрс өөр байж болно. Ерөнхийдөө энэ бол маш олон тооны үл мэдэгдэх асуудал бөгөөд зөвхөн харилцаа холбооны оператор үүнийг зөв шийдэж чадна.

Эхлээд үйлчлүүлэгч шуудан зөөгчийг операторын утсаар удирдаж, утсаар шууд хэмжилт хийж, дараа нь хурд хэмжилтийн үр дүнг тэмдэглэлийн дэвтэрт бичихийг хүссэн. lte сүлжээний хурдыг хэмжих миний шийдэл нь тийм ч тохиромжтой биш боловч асуудлыг шийдэж байна.

Цаг хугацаа хомс байсан тул би тохь тух, практикийг биш харин хөгжлийн хурдыг дэмжсэн шийдвэр гаргасан. Жишээлбэл, сервер болон үйлчлүүлэгч бүрийг тохируулахад цаг хэмнэхийн тулд илүү практик VPN-ийн оронд алсын зайнаас нэвтрэхэд урвуу ssh ашигласан.

Техникийн даалгавар

Нийтлэлд дурдсанчлан Техникийн үзүүлэлтгүйгээр: яагаад үйлчлүүлэгч үүнийг хүсэхгүй байна вэ?: Техникийн үзүүлэлтгүйгээр бүү ажилла! Хэзээ ч, хаана ч!

Техникийн даалгавар нь маш энгийн байсан тул би үүнийг эцсийн хэрэглэгчдэд ойлгохын тулд бага зэрэг өргөжүүлэх болно. Техникийн шийдэл, тоног төхөөрөмжийг сонгохдоо үйлчлүүлэгч өөрөө шийддэг. Тиймээс, бүх зөвшөөрөл авсны дараа техникийн тодорхойлолт нь өөрөө:

Нэг самбарт компьютер дээр суурилсан vim2 H модемоор дамжуулан lte холболтын хурд шалгагч хийхuawei e3372h - 153 хэд хэдэн харилцаа холбооны операторууд (нэгээс n хүртэл). Мөн UART-ээр холбогдсон GPS хүлээн авагчаас координат хүлээн авах шаардлагатай. Үйлчилгээг ашиглан хурдны хэмжилт хийх www.speedtest.net мөн тэдгээрийг дараах хүснэгтэд оруулаарай:

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

csv форматтай хүснэгт. Дараа нь энэ тэмдгийг 6 цаг тутамд цахим шуудангаар илгээнэ үү. Алдаа гарсан тохиолдолд GPIO-д холбогдсон LED-г анивчих.

Би олон зөвшөөрөл авсны дараа техникийн үзүүлэлтүүдийг үнэгүй хэлбэрээр тайлбарлав. Гэхдээ даалгаврын утга нь аль хэдийн харагдаж байна. Бүх зүйлд долоо хоног өгсөн. Гэвч бодит байдал дээр гурван долоо хоног үргэлжилсэн. Үүнийг үндсэн ажлаасаа хойш, амралтын өдрөөр л хийдэг байсныг харгалзан үзэж байгаа юм.

Үйлчлүүлэгч хурд хэмжилтийн үйлчилгээ, техник хангамжийг ашиглах талаар урьдчилан тохиролцсон нь миний чадварыг ихээхэн хязгаарлаж байсныг энд би дахин сануулмаар байна. Төсөв нь бас хязгаарлагдмал байсан тул онцгой зүйл худалдаж аваагүй. Тиймээс бид эдгээр дүрмийн дагуу тоглох ёстой байсан.

Архитектур ба хөгжил

Энэ схем нь энгийн бөгөөд ойлгомжтой юм. Тиймээс би ямар нэгэн онцгой тайлбаргүйгээр үлдээх болно.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Би энэ хэлийг хөгжүүлэх туршлагагүй байсан ч бүхэл бүтэн төслийг python хэл дээр хэрэгжүүлэхээр шийдсэн. Хөгжлийг хурдасгах бэлэн жишээ, шийдэл олон байсан учраас би үүнийг сонгосон. Тиймээс би мэргэжлийн бүх программистуудаас миний анхны python-г хөгжүүлэх туршлагаа битгий загнахыг хүсч, ур чадвараа сайжруулахын тулд бүтээлч шүүмжлэл сонсохдоо үргэлж баяртай байдаг.

Мөн процессын явцад би python-д 2 ба 3-р ажилладаг хоёр хувилбар байгааг олж мэдсэн бөгөөд үүний үр дүнд би гурав дахь хувилбар дээр тогтсон.

Техник хангамжийн зангилаа

Нэг хавтан vim2

Надад үндсэн машинаараа нэг самбарт компьютер өгсөн vim2

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Ухаалаг гэр болон SMART-TV-д зориулсан маш сайн, хүчирхэг медиа процессор, гэхдээ энэ ажилд туйлын тохиромжгүй, эсвэл тийм ч тохиромжтой биш юм. Жишээлбэл, түүний үндсэн үйлдлийн систем нь Android, Линукс нь хоёрдогч үйлдлийн систем бөгөөд үүний дагуу Линукс дээрх бүх зангилаа болон драйверуудын өндөр чанартай ажиллагааг хэн ч баталгаажуулдаггүй. Зарим асуудал нь энэ платформын USB драйверуудтай холбоотой байсан тул модемууд энэ самбар дээр санаснаар ажиллахгүй байна гэж би бодож байна. Энэ нь бас маш муу, тараагдсан бичиг баримттай тул үйл ажиллагаа бүр нь усан онгоцны зогсоол ухаж их цаг зарцуулдаг. GPIO-тэй энгийн ажил ч гэсэн маш их цус авдаг. Жишээлбэл, LED-ийг тохируулахад хэдэн цаг зарцуулсан. Гэхдээ объектив байхын тулд энэ нь ямар төрлийн нэг самбар байх нь чухал биш байсан бөгөөд гол зүйл нь ажиллаж байсан бөгөөд USB портууд байсан юм.

Эхлээд би энэ самбар дээр Линукс суулгах хэрэгтэй. Хүн бүр, мөн энэхүү нэг самбарт системтэй харьцах хүмүүст зориулсан баримт бичгийн зэрлэг зүйлийг хайхгүйн тулд би энэ бүлгийг бичиж байна.

Линуксыг суулгах хоёр сонголт байдаг: гадаад SD карт эсвэл дотоод MMC дээр. Би үүнийг карттай хэрхэн ажиллуулах талаар бодож нэг үдшийг өнгөрөөсөн тул би үүнийг MMC дээр суулгахаар шийдсэн боловч гадны карттай ажиллахад илүү хялбар байх нь дамжиггүй.

Програм хангамжийн тухай энд мушгин хэлчихлээ. Би хачин хэлнээс орос руу орчуулдаг. Самбарыг гэрэлтүүлэхийн тулд би UART тоног төхөөрөмжийг холбох хэрэгтэй. Холбосон дараах байдлаар.

  • Хэрэгслийн зүү GND: <—> VIM-ийн GPIO-ийн Pin17
  • Хэрэгслийн зүү TXD: <—> VIM-ийн GPIO-ийн Pin18 (Linux_Rx)
  • Хэрэгслийн зүү RXD: <—> VIM-ийн GPIO-ийн Pin19 (Linux_Tx)
  • Хэрэгслийн зүү VCC: <—> VIM-ийн GPIO-ийн Pin20

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Үүний дараа би програм хангамжийг татаж авсан Эндээс. Програм хангамжийн тусгай хувилбар VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Энэ програмыг байршуулахын тулд надад хэрэгслүүд хэрэгтэй байна. Энэ талаар дэлгэрэнгүй мэдээлэл энд. Би үүнийг Windows дээр анивчуулж үзээгүй ч Линукс дээрх програм хангамжийн талаар хэдэн үг хэлэх хэрэгтэй байна. Эхлээд би зааврын дагуу хэрэгслүүдийг суулгана.

git clone https://github.com/khadas/utils
cd /path/to/utils
sudo ./INSTALL

Ааан... Юу ч болохгүй. Суулгацын скриптүүдийг засварлахад би хэдэн цаг зарцуулсан бөгөөд ингэснээр бүх зүйл надад зөв суулгах болно. Би тэнд юу хийснээ санахгүй байна, гэхдээ морьтой цирк бас байсан. Тиймээс болгоомжтой байгаарай. Гэхдээ эдгээр хэрэгслүүдгүйгээр vim2-г цаашид тамлах нь утгагүй юм. Түүнтэй огт хутгалдахгүй байсан нь дээр!

Тамын долоон тойрог, скриптийн тохиргоо, суулгацын дараа би ажлын хэрэгслүүдийн багцыг хүлээн авлаа. Би самбарыг USB-ээр Линукс компьютертээ холбосон, мөн дээрх диаграмын дагуу UART-г холбосон.
Би өөрийн дуртай миником терминалыг техник хангамж, програм хангамжийн алдааны хяналтгүйгээр 115200 хурдтайгаар тохируулж байна. Тэгээд эхэлцгээе.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

UART терминалд VIM2-г ачаалах үед би ачаалахаа зогсоохын тулд зай гэх мэт товчлуурыг дардаг. Мөр гарч ирсний дараа

kvim2# 

Би тушаалыг оруулна:

kvim2# run update

Бидний ачаалж байгаа хост дээр би дараахь зүйлийг гүйцэтгэдэг.

burn-tool -v aml -b VIM2 -i  VIM2_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.img

Ингээд л болоо. Би шалгасан, самбар дээр Линукс байгаа. Нэвтрэх/нууц үг хадас:хадас.

Үүний дараа зарим жижиг анхны тохиргоонууд. Цаашид ажиллахын тулд би 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 мэт дүр эсгэдэг нийлмэл төхөөрөмжтэй. дараа нь сүлжээний картын горимд шилжинэ.

Архитектурын хувьд Линукс хэрэглэгчийн үүднээс бүх тохиргоог хийсний дараа иймэрхүү харагдаж байна: модемийг холбосны дараа би dhcp-ээр дамжуулан 192.168.8.100 IP хаяг, анхдагч гарцыг хүлээн авдаг eth* сүлжээний интерфейстэй болсон. нь 192.168.8.1.

Мөн хамгийн чухал мөч! Энэхүү модемийн загвар нь модемийн горимд ажиллах боломжгүй бөгөөд үүнийг AT командуудаар удирддаг. Бүх зүйл илүү хялбар байх болно, модем бүрт PPP холболт үүсгэж, дараа нь тэдэнтэй ажиллах болно. Гэхдээ миний хувьд "өөрөө" (илүү нарийвчлалтай, udev дүрмийн дагуу Линуксийн шумбагч) eth интерфэйс үүсгэж, dhcp-ээр дамжуулан түүнд IP хаяг өгдөг.

Цаашид төөрөгдөлд орохгүйн тулд би "модем" гэдэг үгийг мартаж, сүлжээний карт, гарц гэж хэлэхийг санал болгож байна, учир нь энэ нь үндсэндээ шинэ сүлжээний картыг гарцтай холбохтой адил юм.
Нэг модем байгаа үед энэ нь ямар ч онцгой асуудал үүсгэдэггүй, гэхдээ нэгээс олон, тухайлбал n-хэсэг байх үед дараах сүлжээний зураг гарч ирнэ.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Өөрөөр хэлбэл, ижил IP хаягтай, тус бүр нь ижил анхдагч гарцтай n сүлжээний карт. Гэвч үнэн хэрэгтээ тус бүр нь өөрийн оператортой холбогдсон байдаг.

Эхлээд надад энгийн шийдэл байсан: ifconfig эсвэл ip командыг ашиглан бүх интерфэйсийг унтрааж, нэгийг нь ээлжлэн асаагаад туршиж үзээрэй. Шийдэл нь хүн бүрт сайн байсан, гэхдээ сэлгэн залгах үед би төхөөрөмжид холбогдох боломжгүй байсан. Мөн сэлгэн залгах нь байнга бөгөөд хурдан байдаг тул би үнэндээ холбогдох боломжгүй байсан.

Тиймээс би модемуудын IP хаягийг гараар өөрчлөх, дараа нь чиглүүлэлтийн тохиргоог ашиглан урсгалыг жолоодох замыг сонгосон.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Энэ бол миний модемуудтай холбоотой асуудлуудын төгсгөл биш байсан: цахилгааны асуудал гарсан тохиолдолд тэдгээр нь унтарч, 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 интерфейстэй, цахилгаантай байсан. Энэ нь хамгийн сайн шийдэл биш байсан ч ажиллах боломжтой, энгийн хэвээр байв. Хүлээн авагч нь иймэрхүү харагдаж байв.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Үнэнийг хэлэхэд, энэ бол миний анх удаа 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 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

Би GPS өлгөх UART суулгаж байна.

DEVICES="/dev/ttyS4"

Тэгээд бид бүх зүйлийг асаагаад эхэлнэ.

/* GPS daemon enable/start */
sudo systemctl enable gpsd.socket
sudo systemctl start gpsd.socket

Үүний дараа би GPS-г холбодог.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

GPS утас миний гарт байгаа, UART дибаг хийх утаснууд хурууны доор харагдаж байна.

Би gpsmon програмыг ашиглан дахин ачаалж, GPS-ийн ажиллагааг шалгана.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Та энэ дэлгэцийн агшинд хиймэл дагуулуудыг харах боломжгүй, гэхдээ та 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 хүлээн авах чадвар муутай, мэдээлэл хүлээн авдаггүй тул би үүнийг хийхээр шийдсэн. Хэрэв та мэдээлэл хүлээн авахыг хүлээж байгаа бол алслагдсан өрөөнд ажиллаж байгаа бол програм энэ газарт хөлдөх болно. Тиймээс би энэ зохисгүй хувилбарыг хэрэгжүүлсэн.

Зарчмын хувьд хэрэв илүү их цаг байсан бол UART-ээр GPS-ээс шууд мэдээлэл хүлээн авч, тусдаа хэлхээнд задлан шинжилж, түүнтэй ажиллах боломжтой байсан. Гэвч цаг хугацаа огт байгаагүй тул харгис хэрцгий код гарч ирэв. Тийм ээ, би ичдэггүй.

Гэрэл ялгаруулах диод

LED-ийг холбох нь нэгэн зэрэг энгийн бөгөөд хэцүү байсан. Гол хүндрэл нь систем дэх пин дугаар нь самбар дээрх зүү дугаартай тохирохгүй байгаа бөгөөд баримт бичгийг зүүн гараараа бичсэн байдаг. Тоног төхөөрөмжийн пин дугаар болон үйлдлийн систем дэх пин дугаарыг харьцуулахын тулд та дараах тушаалыг ажиллуулах хэрэгтэй.

gpio readall

Систем болон самбар дээрх зүү захидал харилцааны хүснэгтийг харуулах болно. Үүний дараа би үйлдлийн систем дээрээ зүүг ажиллуулж болно. Миний хувьд LED нь холбогдсон байна GPIOH_5.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Би GPIO зүүг гаралтын горимд шилжүүлдэг.

gpio -g mode 421 out

Би тэг гэж бичдэг.

gpio -g write 421 0

Би нэгийг нь бичдэг.

gpio -g write 421 1

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах
"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-тэй болсон нь үнэхээр баяртай байна. Github.

Сайн зүйл бол үзэх боломжтой эх кодууд байдаг. Энэ API-тай хэрхэн ажиллах талаар (энгийн жишээнүүд) эндээс олж болно холбогдох хэсэг.

Би дараах тушаалаар python номын санг суулгадаг.

sudo -H pip3 install speedtest-cli

Жишээлбэл, та Ubuntu дээр хурд шалгагчийг програмаас шууд суулгаж болно. Энэ бол ижил питон програм бөгөөд дараа нь консолоос шууд ажиллуулж болно.

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 операторын туршилтын сервер болон статикаар тогтсон серверийг динамикаар сонгохдоо хурд хэмжих графикуудын жишээ энд байна.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах
Динамик сервер сонгохдоо хурдыг хэмжих үр дүн.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах
Нэг хатуу сонгосон нэг сервер бүхий хурдны туршилтын үр дүн.

Туршилтын явцад хоёуланд нь "үслэг" байдаг бөгөөд үүнийг математикийн аргаар арилгах шаардлагатай. Гэхдээ суурин серверийн хувьд энэ нь арай бага бөгөөд далайц нь илүү тогтвортой байдаг.
Ерөнхийдөө энэ бол маш сайн судалгаа шинжилгээний газар юм. Мөн би iperf хэрэгслийг ашиглан серверийнхээ хурдыг хэмжих болно. Гэхдээ бид техникийн үзүүлэлтүүдийг баримталдаг.

Имэйл илгээх болон алдаа

Захиа илгээхийн тулд би хэдэн арван өөр сонголтыг туршиж үзсэн боловч эцэст нь би дараахь зүйлийг шийдсэн. Би Yandex дээр шуудангийн хайрцгийг бүртгүүлээд дараа нь авсан Энэ бол шуудан илгээх жишээ юм. Би үүнийг шалгаад хөтөлбөрт хэрэгжүүлсэн. Энэ жишээ нь 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 нь өдөрт илгээсэн мессежийн тоог хязгаарладаг (энэ нь өвдөлт, уйтгар гуниг, доромжлол) гэсэн асуудал гарч ирэв. Нэг минутанд маш олон тооны алдаа гарч болзошгүй тул бид шуудангаар алдаа илгээхээс татгалзах хэрэгтэй болсон. Тиймээс Yandex үйлчилгээгээр дамжуулан ийм асуудлын талаарх мэдээллийг автоматаар илгээхдээ санаарай.

Санал хүсэлтийн сервер

Алсын техник хангамжид хандах, түүнийг өөрчлөх, дахин тохируулах боломжтой байхын тулд надад гадаад сервер хэрэгтэй байсан. Ерөнхийдөө шударга байхын тулд бүх өгөгдлийг сервер рүү илгээж, вэб интерфэйс дэх бүх сайхан графикуудыг бүтээх нь зөв байх болно. Гэхдээ нэг дор биш.

VPS-ийн хувьд би сонгосон ruvds.com. Та хамгийн энгийн серверийг авч болно. Ерөнхийдөө миний хувьд энэ нь хангалттай байх болно. Гэхдээ би серверийн төлбөрийг халааснаасаа төлөөгүй тул вэб интерфэйс, өөрийн SMTP сервер, VPN гэх мэтийг ашиглахад хангалттай байхын тулд бага хэмжээний нөөцтэй байхаар шийдсэн. Нэмж хэлэхэд Telegram ботыг тохируулах боломжтой бөгөөд үүнийг хаах асуудал гарахгүй. Тиймээс би Амстердам болон дараах параметрүүдийг сонгосон.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Техник хангамжтай харилцах аргын хувьд vim2 нь урвуу ssh холболтыг сонгосон бөгөөд практикээс харахад энэ нь хамгийн сайн биш юм. Хэрэв холболт тасарсан бол сервер портыг барьж байгаа бөгөөд хэсэг хугацаанд холбогдох боломжгүй болно. Тиймээс бусад харилцааны аргууд, жишээлбэл VPN ашиглах нь дээр. Ирээдүйд би VPN руу шилжихийг хүсч байсан ч цаг байсангүй.

Би галт хана суурилуулах, эрхийг хязгаарлах, root ssh холболтыг идэвхгүй болгох болон VPS-г тохируулах бусад үнэн зөв байдлын талаар дэлгэрэнгүй ярихгүй. Та бүхнийг аль хэдийн мэддэг гэдэгт итгэхийг хүсч байна. Алсын холболтын хувьд би сервер дээр шинэ хэрэглэгч үүсгэдэг.

adduser vimssh

Би техник хангамж дээрээ ssh холболтын түлхүүрүүдийг үүсгэдэг.

ssh-keygen

Тэгээд би тэдгээрийг манай сервер рүү хуулдаг.

ssh-copy-id [email protected]

Манай техник хангамж дээр би ачаалах бүрт автомат урвуу 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 [email protected]
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-ээр сервер рүүгээ илгээх боломжтой бөгөөд энэ нь маш тохиромжтой.

Бүгдийг нь нийлүүлж байна

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах
Асаагаад хөгжүүлэлт, дибаг хийж эхэлцгээе

Өө, ингээд л би бүх зангилааг дүрсэлсэн. Одоо энэ бүгдийг нэгтгэх цаг болжээ. Та кодыг харж болно энд байна.

Кодтой холбоотой чухал зүйл: Энэ төсөл нь тодорхой ажил, тодорхой архитектурт зориулагдсан тул ингэж эхлэхгүй байж магадгүй юм. Би эх кодыг өгч байгаа ч гэсэн хамгийн үнэ цэнэтэй зүйлсийг энд, яг текст дотор нь тайлбарлах болно, эс тэгвээс энэ нь бүрэн ойлгомжгүй болно.

Эхэндээ би 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 серверийг дахин тохируулах явдал юм. Хэн ч уншдаггүй тул галт тэрэг модон төмөр зам дээр явдаггүй гэдгийг мэдэж аваарай. Улаан өндөгний баярын өндөг олсон хүн чихэр авна.

Үүнийг хийхийн тулд би тусдаа чиглүүлэлтийн хүснэгт үүсгэдэг - 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 оператортой байсан бөгөөд би үүнийг хэд хоногийн турш явуулсан.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Энд би динамик хэмжих сервер ашигласан. Хурдны хэмжилтүүд ажилладаг, гэхдээ маш их хэлбэлздэг боловч зарим дундаж утга нь харагдахуйц хэвээр байгаа бөгөөд үүнийг өгөгдлийг, жишээлбэл, хөдөлж буй дундажаар шүүж авах боломжтой.

Дараа нь би бусад харилцаа холбооны операторуудад зориулж хэд хэдэн график бүтээсэн. Энэ тохиолдолд аль хэдийн нэг туршилтын сервер байсан бөгөөд үр дүн нь бас маш сонирхолтой байв.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Таны харж байгаагаар энэ сэдэв нь энэхүү өгөгдлийг судлах, боловсруулахад маш өргөн хүрээтэй бөгөөд ажлын хоёр долоо хоног үргэлжлэхгүй нь тодорхой юм. Гэхдээ…

Ажлын үр дүн

Надаас үл хамаарах нөхцөл байдлын улмаас ажил гэнэт дууссан. Энэ төслийн нэг сул тал бол миний субьектив бодлоор модем нь бусад модемуудтай зэрэгцэн ажиллахыг үнэхээр хүсдэггүй, ачаалах болгондоо ийм заль мэх хийдэг байсан. Эдгээр зорилгын үүднээс маш олон тооны модемийн загварууд байдаг бөгөөд тэдгээр нь ихэвчлэн Mini PCI-e форматтай байдаг бөгөөд төхөөрөмж дотор суулгасан бөгөөд тохируулахад илүү хялбар байдаг. Гэхдээ энэ бол огт өөр түүх юм. Төсөл сонирхолтой байсан бөгөөд би үүнд оролцох боломжтой болсондоо маш их баяртай байсан.

Хэд хэдэн LTE модем дээр нэгэн зэрэг хурд шалгах

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх