تست سرعت همزمان روی چندین مودم LTE

در طول قرنطینه، به من پیشنهاد شد در توسعه دستگاهی برای اندازه گیری سرعت مودم های LTE برای چندین اپراتور تلفن همراه شرکت کنم.

تست سرعت همزمان روی چندین مودم LTE

مشتری می‌خواست سرعت اپراتورهای مخابراتی مختلف را در مکان‌های جغرافیایی مختلف ارزیابی کند تا بتواند بفهمد کدام اپراتور تلفن همراه هنگام نصب تجهیزات با استفاده از اتصال LTE، به عنوان مثال، برای پخش ویدئویی، برای او بهینه‌تر است. در عین حال، مشکل باید تا حد امکان ساده و ارزان و بدون تجهیزات گران قیمت حل می شد.

من فوراً می گویم که این کار ساده ترین و دانش فشرده ترین نیست؛ من به شما خواهم گفت که با چه مشکلاتی روبرو شدم و چگونه آنها را حل کردم. پس بزن بریم.

یادداشت

اندازه گیری سرعت اتصال LTE یک موضوع بسیار پیچیده است: شما باید تجهیزات و تکنیک اندازه گیری مناسب را انتخاب کنید و همچنین درک خوبی از توپولوژی و عملکرد شبکه سلولی داشته باشید. به علاوه، سرعت را می توان تحت تأثیر عوامل متعددی قرار داد: تعداد مشترکین در یک سلول، شرایط آب و هوایی، حتی از سلولی به سلول دیگر سرعت می تواند به طور چشمگیری به دلیل توپولوژی شبکه متفاوت باشد. به طور کلی، این یک مشکل با تعداد زیادی ناشناخته است و فقط یک اپراتور مخابراتی می تواند آن را به درستی حل کند.

در ابتدا، مشتری فقط می خواست با تلفن اپراتورها پیک را رانندگی کند، مستقیماً روی تلفن اندازه گیری کند و سپس نتایج اندازه گیری سرعت را در یک دفترچه یادداشت کند. راه حل من برای اندازه گیری سرعت شبکه های lte اگرچه ایده آل نیست اما مشکل را حل می کند.

به دلیل کمبود وقت، تصمیماتی را نه به نفع راحتی یا عملی بودن، بلکه به نفع سرعت توسعه گرفتم. به عنوان مثال، ssh معکوس برای دسترسی از راه دور، به جای VPN کاربردی تر، به منظور صرفه جویی در زمان در راه اندازی سرور و هر مشتری جداگانه استفاده شد.

وظیفه فنی

همانطور که در مقاله آمده است بدون مشخصات فنی: چرا مشتری آن را نمی خواهد: بدون مشخصات فنی کار نکنید! هرگز، هیچ جا!

کار فنی بسیار ساده بود، من آن را برای درک کاربر نهایی کمی گسترش می دهم. انتخاب راه حل های فنی و تجهیزات توسط مشتری دیکته شده است. بنابراین، خود مشخصات فنی، پس از همه تأییدیه ها:

بر اساس یک کامپیوتر تک برد vim2 یک تستر سرعت برای اتصالات lte از طریق مودم H بسازیدuawei e3372h - 153 چندین اپراتور مخابراتی (از یک تا n). همچنین دریافت مختصات از گیرنده GPS متصل از طریق UART ضروری است. اندازه گیری سرعت را با استفاده از سرویس انجام دهید www.speedtest.net و آنها را در جدولی مانند زیر قرار دهید:

تست سرعت همزمان روی چندین مودم LTE

جدول با فرمت csv. سپس این علامت را هر 6 ساعت یکبار از طریق ایمیل ارسال کنید. در صورت بروز خطا، LED متصل به GPIO را چشمک بزنید.

مشخصات فنی را به صورت رایگان پس از تاییدیه های فراوان شرح دادم. اما معنای کار از قبل قابل مشاهده است. برای همه چیز یک هفته فرصت داده شد. اما در واقع سه هفته طول کشید. این با در نظر گرفتن این واقعیت است که من این کار را فقط بعد از کار اصلی و در تعطیلات آخر هفته انجام دادم.

در اینجا می خواهم یک بار دیگر توجه را به این واقعیت جلب کنم که مشتری از قبل در مورد استفاده از خدمات اندازه گیری سرعت و سخت افزار توافق کرده است که توانایی های من را بسیار محدود کرده است. بودجه نیز محدود بود، بنابراین چیز خاصی خریداری نشد. بنابراین باید با این قوانین بازی می کردیم.

معماری و توسعه

طرح ساده و واضح است. بنابراین بدون هیچ نظر خاصی آن را می گذارم.

تست سرعت همزمان روی چندین مودم LTE

من تصمیم گرفتم کل پروژه را در پایتون پیاده کنم، علیرغم اینکه اصلاً تجربه توسعه در این زبان را نداشتم. من آن را انتخاب کردم زیرا یکسری نمونه ها و راه حل های آماده وجود داشت که می توانست سرعت توسعه را افزایش دهد. بنابراین، از همه برنامه نویسان حرفه ای می خواهم که اولین تجربه توسعه من در پایتون را سرزنش نکنند و همیشه از شنیدن انتقادات سازنده برای بهبود مهارت هایم خوشحالم.

همچنین در این فرآیند متوجه شدم که پایتون دارای دو نسخه در حال اجرا 2 و 3 است، در نتیجه من روی نسخه سوم مستقر شدم.

گره های سخت افزاری

تک صفحه vim2

یک کامپیوتر تک بردی به عنوان ماشین اصلی به من داده شد vim2

تست سرعت همزمان روی چندین مودم LTE

یک پردازشگر رسانه ای عالی و قدرتمند برای یک خانه هوشمند و تلویزیون هوشمند، اما برای این کار بسیار نامناسب، یا، مثلاً، ضعیف است. به عنوان مثال، سیستم عامل اصلی آن اندروید است و لینوکس یک سیستم عامل ثانویه است و بر این اساس هیچ کس عملکرد باکیفیت تمام گره ها و درایورهای تحت لینوکس را تضمین نمی کند. و من فرض می کنم که برخی از مشکلات مربوط به درایورهای USB این پلتفرم بود، بنابراین مودم ها آن طور که انتظار می رفت روی این برد کار نمی کردند. همچنین اسناد بسیار ضعیف و پراکنده ای دارد، بنابراین هر عملیات زمان زیادی را برای حفاری در اسکله ها می برد. حتی کار معمولی با GPIO هم خون زیادی گرفت. برای مثال، چندین ساعت طول کشید تا LED را تنظیم کنم. اما، برای عینی بودن، اساساً مهم نبود که چه نوع تک بردی است، نکته اصلی این بود که کار می کرد و پورت های USB وجود داشت.

ابتدا باید لینوکس را روی این برد نصب کنم. برای اینکه همه اسناد و مدارک را برای همه و همچنین برای کسانی که با این سیستم تک تخته سروکار دارند جستجو نکنم، این فصل را می نویسم.

دو گزینه برای نصب لینوکس وجود دارد: روی کارت SD خارجی یا MMC داخلی. من یک شب را صرف تلاش کردم تا بفهمم چگونه می توانم آن را با کارت کار کنم، بنابراین تصمیم گرفتم آن را روی MMC نصب کنم، اگرچه بدون شک کار با کارت خارجی بسیار آسان تر است.

در مورد فریمور اینجا کج گفته. من از عجیب به روسی ترجمه می کنم. برای فلش کردن برد باید UART سخت افزاری را وصل کنم. وصلش کرد به شرح زیر است.

  • پین ابزار GND: <—> Pin17 از GPIO VIMs
  • Tool Pin TXD: <—> Pin18 GPIO VIMs (Linux_Rx)
  • Tool Pin RXD: <—> Pin19 GPIO VIMs (Linux_Tx)
  • پین ابزار VCC: <—> Pin20 از GPIO VIMs

تست سرعت همزمان روی چندین مودم LTE

بعدش فریمور رو دانلود کردم از این رو. نسخه سیستم عامل خاص VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

برای آپلود این سیستم عامل، به ابزارهای کمکی نیاز دارم. جزئیات بیشتر در این مورد اینجا. من سعی نکردم آن را تحت ویندوز فلش کنم، اما باید چند کلمه در مورد سیستم عامل تحت لینوکس به شما بگویم. ابتدا، من برنامه های کاربردی را طبق دستورالعمل نصب می کنم.

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

Aaand... هیچ چیز کار نمی کند. من چند ساعتی را صرف ویرایش اسکریپت های نصب کردم تا همه چیز به درستی برای من نصب شود. یادم نیست آنجا چه کار کردم، اما آن سیرک با اسب ها نیز وجود داشت. خیلی مراقب باش. اما بدون این ابزارها هیچ فایده ای برای شکنجه بیشتر vim2 وجود ندارد. بهتره اصلا باهاش ​​قاطی نکنی!

پس از هفت حلقه جهنم، پیکربندی و نصب اسکریپت، بسته ای از ابزارهای کاربردی دریافت کردم. برد را از طریق USB به کامپیوتر لینوکس وصل کردم و UART را نیز طبق نمودار بالا وصل کردم.
من ترمینال minicom مورد علاقه خود را با سرعت 115200 بدون کنترل خطای سخت افزاری و نرم افزاری تنظیم می کنم. و بیایید شروع کنیم.

تست سرعت همزمان روی چندین مودم LTE

هنگام بارگیری VIM2 در ترمینال UART، کلیدی مانند فاصله را فشار می‌دهم تا بارگیری متوقف شود. بعد از ظاهر شدن خط

kvim2# 

دستور را وارد می کنم:

kvim2# run update

در میزبانی که از آن بارگیری می کنیم، اجرا می کنم:

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

همین است، فخ چک کردم، لینوکس روی برد هست. ورود به سیستم/رمز عبور 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 است. و سپس به حالت کارت شبکه سوئیچ می کند.

از نظر معماری، از دید یک کاربر لینوکس، بعد از تمام تنظیمات، به این صورت است: پس از اتصال مودم، یک رابط شبکه eth* دارم که از طریق dhcp آدرس IP 192.168.8.100 و دروازه پیش فرض را دریافت می کند. 192.168.8.1 است.

و مهمترین لحظه! این مدل مودم در حالت مودم که با دستورات AT کنترل می شود نمی تواند کار کند. همه چیز بسیار ساده تر خواهد بود، برای هر مودم اتصالات PPP ایجاد کنید و سپس با آنها کار کنید. اما در مورد من، "خود" (به طور دقیق تر، یک غواص لینوکس طبق قوانین udev)، یک رابط eth ایجاد می کند و یک آدرس IP از طریق dhcp به آن اختصاص می دهد.

برای جلوگیری از سردرگمی بیشتر، پیشنهاد می کنم کلمه "modem" را فراموش کنید و بگویید کارت شبکه و دروازه، زیرا در اصل، مانند اتصال یک کارت شبکه جدید به یک دروازه است.
هنگامی که یک مودم وجود دارد، این مشکل خاصی ایجاد نمی کند، اما زمانی که بیش از یک مودم وجود دارد، یعنی n-piece، تصویر شبکه زیر ظاهر می شود.

تست سرعت همزمان روی چندین مودم LTE

یعنی n کارت شبکه، با آدرس IP یکسان، هر کدام با یک دروازه پیش فرض. اما در واقع هر کدام از آنها به اپراتور خود متصل هستند.

در ابتدا، من یک راه حل ساده داشتم: با استفاده از دستور ifconfig یا ip، تمام رابط ها را خاموش کنید و به سادگی یکی را به نوبه خود روشن کنید و آن را تست کنید. راه حل برای همه خوب بود، با این تفاوت که در لحظه های سوئیچ نمی توانستم به دستگاه وصل شوم. و از آنجایی که سوئیچینگ مکرر و سریع است، من در واقع هیچ فرصتی برای اتصال نداشتم.

بنابراین مسیر تغییر دستی آدرس IP مودم ها و سپس هدایت ترافیک با استفاده از تنظیمات مسیریابی را انتخاب کردم.

تست سرعت همزمان روی چندین مودم LTE

این پایان مشکلات من با مودم ها نبود: در صورت بروز مشکل در برق، آنها از بین می رفتند و به یک منبع تغذیه پایدار خوب به هاب USB نیاز بود. من این مشکل را با لحیم کردن سخت برق مستقیماً به هاب حل کردم. مشکل دیگری که من با آن مواجه شدم و کل پروژه را خراب کرد: پس از راه اندازی مجدد یا شروع سرد دستگاه، همه مودم ها و نه همیشه شناسایی شدند و من نتوانستم تشخیص دهم که چرا این اتفاق افتاده است و با چه الگوریتمی. اما اول از همه.

برای اینکه مودم درست کار کنه پکیج usb-modeswitch رو نصب کردم.

sudo apt update
sudo apt install -y usb-modeswitch

پس از آن، پس از اتصال، مودم به درستی توسط زیرسیستم udev شناسایی و پیکربندی می شود. من فقط با اتصال مودم و اطمینان از ظاهر شدن شبکه بررسی می کنم.
مشکل دیگری که نتوانستم حل کنم این است که چگونه می توانم نام اپراتوری که با آن کار می کنیم را از این مودم دریافت کنم؟ نام اپراتور در رابط وب مودم در 192.168.8.1 موجود است. این یک صفحه وب پویا است که داده ها را از طریق درخواست های Ajax دریافت می کند، بنابراین به سادگی wget کردن صفحه و تجزیه نام کار نخواهد کرد. بنابراین شروع به بررسی نحوه توسعه یک صفحه وب و غیره کردم و متوجه شدم که دارم نوعی مزخرف انجام می دهم. در نتیجه، تف انداخت و اپراتور با استفاده از خود Speedtest API شروع به دریافت کرد.

اگر مودم از طریق دستورات AT دسترسی داشته باشد، خیلی راحت تر خواهد بود. امکان پیکربندی مجدد آن، ایجاد یک اتصال ppp، اختصاص IP، دریافت اپراتور مخابراتی و غیره وجود دارد. اما افسوس، من با آنچه به من داده شده کار می کنم.

GPS

گیرنده GPS که به من داده شد دارای رابط UART و قدرت بود. این بهترین راه حل نبود، اما همچنان قابل اجرا و ساده بود. گیرنده چیزی شبیه این بود.

تست سرعت همزمان روی چندین مودم LTE

صادقانه بگویم، این اولین بار بود که با گیرنده 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

بعدش جی پی اس رو وصل میکنم.

تست سرعت همزمان روی چندین مودم LTE

سیم GPS در دستان من است، سیم های دیباگر UART زیر انگشتانم قابل مشاهده است.

با استفاده از برنامه gpsmon ریبوت می کنم و عملکرد GPS را بررسی می کنم.

تست سرعت همزمان روی چندین مودم LTE

در این اسکرین شات نمی‌توانید ماهواره‌ها را ببینید، اما می‌توانید ارتباط با گیرنده GPS را ببینید، و این به این معنی است که همه چیز خوب است.

در پایتون، من گزینه های زیادی را برای کار با این دیمون امتحان کردم، اما روی گزینه ای که به درستی با پایتون 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 مخصوص به خود را دارد، می توانید به آن نگاه کنید. گیتهاب.

نکته خوب این است که کدهای منبع وجود دارد که می توان آنها را نیز مشاهده کرد. نحوه کار با این API (نمونه های ساده) را می توان در اینجا یافت بخش مربوطه.

با دستور زیر کتابخانه پایتون را نصب می کنم.

sudo -H pip3 install speedtest-cli

به عنوان مثال، حتی می توانید یک تستر سرعت در اوبونتو را مستقیماً از نرم افزار نصب کنید. این همان برنامه پایتون است که می تواند مستقیماً از کنسول راه اندازی شود.

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 ثبت کردم و سپس گرفتم این نمونه ای از ارسال نامه است. من آن را بررسی کردم و در برنامه پیاده سازی کردم. این مثال گزینه های مختلفی از جمله ارسال از جیمیل و غیره را بررسی می کند. من نمی‌خواستم با راه‌اندازی سرور ایمیلم زحمت بکشم و زمانی برای آن نداشتم، اما همانطور که بعداً مشخص شد، این کار نیز بیهوده بود.

گزارش‌ها طبق زمان‌بندی ارسال شدند، اگر ارتباطی وجود دارد، هر 6 ساعت: 00:06، 12:18، XNUMX:XNUMX و XNUMX:XNUMX. به شرح زیر ارسال کرد.

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 و غیره را مستقر کنیم کافی باشد. بعلاوه، بتوانید یک ربات تلگرام راه اندازی کنید و مشکلی با مسدود شدن آن نداشته باشید. بنابراین، آمستردام و پارامترهای زیر را انتخاب کردم.

تست سرعت همزمان روی چندین مودم 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 است. از آنجایی که به هر حال کسی نمی خواند، بدانید که قطار روی ریل های چوبی سوار نمی شود. هر کس تخم مرغ عید پاک را پیدا کند مقداری آب نبات می گیرد.

برای انجام این کار، من یک جدول مسیریابی جداگانه ایجاد می کنم -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 را به این اینترفیس پیکربندی می کنم (اگر انجام نشده باشد)، اگر زمانش رسیده باشد، خطاها را به سرور ارسال می کنم، گزارش ها را ارسال می کنم و در نهایت یک speedtest اجرا می کنم و لاگ ها را در یک فایل 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

اضافه کردن نظر