اختبار سرعة متزامن على أجهزة مودم LTE متعددة

في الحجر الصحي ، عرضت علي المشاركة في تطوير جهاز لقياس سرعة أجهزة مودم LTE للعديد من مشغلي شبكات الهاتف النقال.







أراد العميل تقييم سرعة جميع أنواع مشغلي الاتصالات في مواقع جغرافية مختلفة ، من أجل فهم مشغل الهاتف المحمول الأفضل بالنسبة له عند تركيب المعدات باستخدام اتصال LTE ، على سبيل المثال ، لبث الفيديو. في الوقت نفسه ، كان لا بد من حل المهمة ببساطة ورخيصة قدر الإمكان ، من دون معدات باهظة الثمن.



يجب أن أقول على الفور أن المهمة ليست أبسط وأكثر كثافة في المعرفة ، سأخبرك بالمشكلات التي واجهتها وكيف قمت بحلها. إذا هيا بنا.



ملحوظة



يعد قياس سرعة اتصال LTE أمرًا صعبًا للغاية: تحتاج إلى اختيار المعدات وطريقة القياس المناسبة ، ولديك أيضًا فكرة جيدة عن طوبولوجيا وتشغيل الشبكة الخلوية. بالإضافة إلى ذلك ، يمكن أن تتأثر السرعة بعدة عوامل: عدد المشتركين لكل خلية ، والظروف الجوية ، حتى من خلية إلى أخرى ، يمكن أن تختلف السرعة بشكل لافت للنظر بسبب طوبولوجيا الشبكة. بشكل عام ، هذه مشكلة مع عدد كبير من المجهولين ، ولا يمكن إلا لمشغل الاتصالات حلها بشكل صحيح.



في البداية ، أراد العميل فقط قيادة شركة النقل باستخدام هواتف المشغلين ، وأخذ القياسات مباشرة على الهاتف ثم تدوين نتائج قياس السرعة في جهاز كمبيوتر محمول. الحل الخاص بي لقياس سرعة شبكات LTE ، على الرغم من أنه ليس مثاليًا ، يحل المشكلة.



نظرًا لضيق الوقت ، اتخذت قرارات ليس لصالح الراحة أو التطبيق العملي ، ولكن لصالح سرعة التطور. على سبيل المثال ، بالنسبة للوصول عن بعد ، تم رفع ssh العكسي ، بدلاً من VPN الأكثر عملية ، لتوفير الوقت عند إعداد الخادم وكل عميل فردي.



مهمة فنية



كما جاء في المقال بدون المعارف التقليدية: لماذا لا يريد العميل ذلك : لا تعمل بدون المعارف التقليدية! أبدا ، في أي مكان!



كانت المهمة الفنية بسيطة للغاية ، وسأوسعها قليلاً لفهم المستخدم النهائي. تم اختيار الحلول التقنية والمعدات من قبل العميل. لذا ، فإن المعارف التقليدية نفسها ، بعد كل الموافقات:



vim2 lte- Huawei e3372h — 153 ( n). GPS-, UART. www.speedtest.net :







csv. - 6 . , GPIO.


لقد وصفت المعارف التقليدية بشكل حر ، بعد العديد من الموافقات. لكن معنى المهمة واضح بالفعل. تم تحديد الموعد النهائي لكل شيء لمدة أسبوع. ولكن في الواقع استمر لمدة ثلاثة أسابيع. هذا في ضوء حقيقة أنني فعلت ذلك فقط بعد العمل الرئيسي وفي عطلات نهاية الأسبوع.



هنا أود أن ألفت انتباهك إلى حقيقة أن العميل قد وافق مسبقًا على استخدام خدمة وأجهزة قياس السرعة ، مما حد من قدراتي إلى حد كبير. كانت الميزانية محدودة أيضًا ، لذلك لم يتم شراء أي شيء بالإضافة. لذلك كان علي أن ألعب بهذه القواعد.



العمارة والتطوير



المخطط بسيط ومباشر. لذلك ، سأتركها دون أي تعليقات خاصة.







قررت تنفيذ المشروع بأكمله في بايثون ، على الرغم من أنني لم يكن لدي خبرة في تطوير هذه اللغة على الإطلاق. لقد اخترت ذلك لأنه كانت هناك مجموعة من الأمثلة والحلول الجاهزة التي يمكن أن تسرع بالتنمية. لذلك ، أطلب من جميع المبرمجين المحترفين عدم تأنيب تجربتي الأولى في تطوير الثعبان ، ويسعدني دائمًا سماع النقد البناء لتحسين مهارتي.



أيضا في العملية اكتشفت أن الثعبان لديه نسختان قيد التشغيل 2 و 3 ، ونتيجة لذلك ، توقفت عند الإصدار الثالث.



عقد الأجهزة



لوحة واحدة vim2



كآلة رئيسية ، أعطيت لي لوحة واحدة vim2







تتحد الوسائط الممتازة والقوية من أجل المنزل الذكي و SMART-TV ، ولكنها غير مناسبة للغاية لهذه المهمة ، أو ، كما نقول ، غير مناسبة. على سبيل المثال ، نظام التشغيل الرئيسي هو Android ، و Linux هو نظام تشغيل عابر ، وبالتالي لا أحد يضمن التشغيل عالي الجودة لجميع العقد وبرامج التشغيل في Linux. وأفترض أن بعض المشاكل كانت مرتبطة بمحركات USB لهذا النظام الأساسي ، لذلك لم تعمل أجهزة المودم كما هو متوقع في هذه اللوحة. لديه أيضًا وثائق ضعيفة ومتفرقة للغاية ، لذلك استغرقت كل عملية وقتًا طويلاً في الحفر في الأحواض. حتى العمل العادي مع GPIO يشرب الكثير من الدم. على سبيل المثال ، استغرق الأمر مني عدة ساعات لإعداد العمل مع LED. ولكن ، لكي نكون موضوعيين ، لم يكن من المهم بشكل أساسي أي نوع من الأجهزة أحادية اللوحة ، الشيء الرئيسي هو أنه يجب أن يعمل ولديه منافذ USB.



أولاً ، أحتاج إلى تثبيت Linux على هذا المنتدى. لكي لا تجوب غابة التوثيق للجميع ، وكذلك لأولئك الذين سيتعاملون مع هذا الجهاز بلوحة واحدة ، أكتب هذا الفصل.



هناك خياران لتثبيت Linux: على بطاقة SD خارجية أو على MMC داخلية. لقد واجهت صعوبة في التعامل مع البطاقة في المساء ، ولم أكن أعرف كيف أجعلها تعمل ، لذلك قررت تثبيتها على MMC ، على الرغم من أنه من دون شك سيكون من الأسهل بكثير العمل مع بطاقة خارجية.



يتم وصف البرامج الثابتة بشكل منحرف هنا . أنا أترجم من لغة غريبة إلى اللغة الروسية. من أجل وميض اللوحة ، أحتاج إلى توصيل الجهاز UART. لقد ربطته على النحو التالي.



  • رقم التعريف الشخصي للأداة GND: <—> Pin17 من GPIM الخاص بـ VIMs
  • TXD الخاص برقم الأداة: <—> Pin18 الخاص بـ VIMs GPIO (Linux_Rx)
  • دبوس الأداة RXD: <—> Pin19 من VIMs's GPIO (Linux_Tx)
  • دبوس أداة VCC: <—> Pin20 من VIMs الخاص بـ GPIO






بعد ذلك ، قمت بتنزيل البرامج الثابتة من هنا . إصدار البرنامج الثابت المحدد هو VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231 .



من أجل تحميل هذه البرامج الثابتة ، أحتاج إلى بعض المرافق. اقرأ المزيد عن هذا هنا . لم أحاول تشغيله في نظام التشغيل Windows ، لكنني بحاجة إلى إخبارك ببضع كلمات حول البرامج الثابتة لنظام التشغيل Linux. أولاً ، سأقوم بتثبيت الأدوات المساعدة وفقًا للتعليمات.



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


ثالثا ... لا شيء يعمل. قضيت بضع ساعات في تحرير البرامج النصية للتثبيت بحيث يتم تثبيت كل شيء بشكل صحيح بالنسبة لي. لا أتذكر ما فعلته هناك ، ولكن أيضًا السيرك مع الخيول. لذا كن حذرا. ولكن بدون هذه المرافق لا فائدة من تعذيب vim2 أكثر. من الأفضل عدم العبث معه على الإطلاق!



بعد سبع دوائر من الجحيم ، وتكوين البرنامج النصي وتركيبه ، حصلت على حزمة من أدوات العمل. لقد قمت بتوصيل اللوحة عبر USB بجهاز كمبيوتر Linux الخاص بي ، كما تم توصيل UART وفقًا للرسم التخطيطي أعلاه.

أقوم بتعيين جهاز minicom المفضل لدي على 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


الجميع ، يا أخي. سألت ، هناك لينكس على السبورة. تسجيل الدخول / كلمة المرور 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



شرب هذا المودم دمي جيدًا ، وفي الواقع ، أصبح عنق الزجاجة للمشروع بأكمله. بشكل عام ، لا يعكس اسم "المودم" لهذه الأجهزة على الإطلاق جوهر العمل: هذا مزيج قوي ، هذه القطعة من الأجهزة تحتوي على جهاز مركب يتظاهر بأنه قرص مضغوط لتثبيت برامج التشغيل ، ثم ينتقل إلى وضع بطاقة الشبكة.



من الناحية المعمارية ، من وجهة نظر مستخدم Linux ، بعد كل الإعدادات ، يبدو كما يلي: بعد توصيل المودم ، لدي واجهة الشبكة eth * ، التي تتلقى عنوان IP 192.168.8.100 عبر dhcp ، والبوابة الافتراضية 192.168.8.1.



وأهم نقطة! لا يعرف طراز المودم هذا كيفية العمل في وضع المودم ، الذي يتم التحكم فيه بواسطة أوامر AT... سيكون كل شيء أسهل بكثير ، وإنشاء اتصالات ppp لكل مودم ثم العمل معه. لكن في حالتي ، "نفسي" (بتعبير أدق غواص لينكس وفقًا لقواعد udev) ، ينشئ واجهة eth ويخصص عنوان IP لها عبر dhcp.



من أجل عدم الخلط أكثر ، أقترح أن ننسى كلمة "مودم" وأن أقول بطاقة شبكة وبوابة ، لأنه في الواقع يشبه توصيل بطاقة شبكة جديدة مع بوابة.

عندما يكون هناك مودم واحد ، فإن هذا لا يسبب أي مشاكل خاصة ، ولكن عندما يكون هناك أكثر من مودم واحد ، أي القطع n ، تظهر الصورة التالية للشبكة.







بمعنى ، n بطاقات الشبكة ، بنفس عنوان IP ، لكل منها نفس العبّارة الافتراضية. لكن في الواقع ، كل واحد منهم متصل بمشغله الخاص.



في البداية ، كان لدي حل بسيط: استخدام الأمر ifconfig أو ip لإطفاء جميع الواجهات وتشغيل واحدة فقط واختبارها. كان الحل جيدًا للجميع ، باستثناء أنه خلال لحظات التبديل ، لم أتمكن من الاتصال بالجهاز. وبما أن التبديل متكرر وسريع ، في الحقيقة لم تتح لي الفرصة للاتصال على الإطلاق.



لذلك ، اخترت طريقة تغيير عناوين IP لأجهزة المودم "يدويًا" واستمر في توجيه حركة المرور باستخدام إعدادات التوجيه.







لم تكن هذه نهاية مشاكلي مع أجهزة المودم: في حالة حدوث مشكلات في الطاقة ، فقد توقفت ، وكان يلزم توفير مصدر طاقة ثابت جيد لمحور USB. تم حل هذه المشكلة عن طريق اللحام الصلب لإمدادات الطاقة مباشرة إلى لوحة الوصل. مشكلة أخرى واجهتها وأفسدت المشروع بأكمله: بعد إعادة تشغيل الجهاز أو بدء تشغيل بارد ، لم يتم اكتشاف جميع أجهزة المودم وليس دائمًا ، ولماذا حدث ذلك وبأي خوارزمية لم أتمكن من تثبيتها. لكن أول الأشياء أولاً.



لكي يعمل المودم بشكل صحيح ، قمت بتثبيت حزمة وضع وسائط USB.



sudo apt update
sudo apt install -y usb-modeswitch


بعد ذلك ، سيتم الكشف عن المودم بعد الاتصال بشكل صحيح وتكوينه بواسطة النظام الفرعي udev. أتحقق بمجرد توصيل المودم والتأكد من تشغيل الشبكة.

مشكلة أخرى لم أستطع حلها: كيفية الحصول على اسم المشغل الذي نعمل معه من هذا المودم؟ اسم المشغل موجود في واجهة الويب الخاصة بالمودم على 192.168.8.1. هذه صفحة ويب ديناميكية تستقبل البيانات من خلال طلبات ajax ، لذلك لا يمكنك فقط مضايقة الصفحة وتحليل الاسم. لذلك بدأت في النظر في كيفية العمل على صفحة ويب ، وما إلى ذلك ، وأدركت أنني أقوم ببعض أنواع الهراء. ونتيجة لذلك ، بصق ، وبدأ في استقبال عامل التشغيل باستخدام واجهة برمجة التطبيقات الخاصة بـ Speedtest نفسه.



ستكون العديد من الأشياء أسهل إذا كان يمكن الوصول إلى المودم عبر أوامر 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 على الطاير ، وهو أمر مريح للغاية.



بعد نجاح هذه العملية ، أعد تشغيل وتثبيت البرنامج الخفي لنظام تحديد المواقع العالمي.



khadas@Khadas:~$ sudo reboot


تثبيت البرنامج الخفي لتحديد المواقع. أقوم بتثبيت كل شيء وأقطعه على الفور لمزيد من التكوين.



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 من المصحح مرئية تحت الأصابع.



أقوم بإعادة التشغيل والتحقق من GPS باستخدام برنامج gpsmon.







في لقطة الشاشة هذه ، لا يمكنك رؤية الأقمار الصناعية ، ولكن يمكنك رؤية الاتصال بجهاز استقبال 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 .







أقوم بنقل دبوس 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



إنه لفرح كبير أن خدمة speedtest.net لديها python-API الخاص بها ، يمكنك رؤيتها على Github .



الخبر السار هو أن هناك رموز مصدر يمكن عرضها أيضًا. يمكن العثور على كيفية العمل مع واجهة برمجة التطبيقات (أبسط الأمثلة) في القسم المقابل .



قم بتثبيت مكتبة بايثون باستخدام الأمر التالي.



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. لكننا نتمسك بالمعارف التقليدية.



إرسال بريد وأخطاء



لقد جربت عدة عشرات من الخيارات المختلفة لإرسال البريد ، ولكن نتيجة لذلك استقرت على ما يلي. لقد سجلت صندوق بريد على yandex ثم أخذت هذا المثال في إرسال البريد . لقد راجعتها ونفذتها في البرنامج. يستكشف هذا المثال الخيارات المختلفة ، بما في ذلك الإرسال من 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 تلقائيًا حول هذه المشكلة.



خادم الملاحظات



من أجل الوصول إلى قطعة بعيدة من الأجهزة والقدرة على تعديلها وإعادة تكوينها ، كنت بحاجة إلى خادم خارجي. بشكل عام ، بكل عدالة ، سيكون من الصحيح إرسال جميع البيانات إلى الخادم وبناء جميع الرسوم البيانية الجميلة في واجهة الويب. لكن ليس كلها دفعة واحدة.



اخترت ruvds.com مثل VPS . يمكن اتخاذ أبسط خادم. وبشكل عام ، لأغراضي ، سيكون هذا كافيا للعيون. ولكن نظرًا لأنني لم أكن أدفع مقابل الخادم من الجيب ، فقد قررت أن آخذه بهامش صغير ، بحيث يكون كافياً إذا نشرنا واجهة ويب ، خادم SMTP الخاص بنا ، VPN ، إلخ. بالإضافة إلى ذلك ، لتتمكن من إعداد روبوت Telegram وليس لديك مشاكل في حظره. لذلك ، اخترت أمستردام والمعلمات التالية.







كطريقة للتواصل مع قطعة من الأجهزة ، اختار vim2 اتصال ssh عكسي ، وكما أظهرت الممارسة ، فهو ليس الأفضل. إذا انقطع الاتصال ، يحتفظ الخادم بالمنفذ ويستحيل الاتصال عبره لبعض الوقت. لذلك ، لا يزال من الأفضل استخدام طرق اتصال أخرى ، على سبيل المثال vpn. في المستقبل ، أردت التبديل إلى vpn ، ولكن لم يكن لدي الوقت.



لن أخوض في تفاصيل إعداد جدار حماية ، وتقييد الحقوق ، وتعطيل اتصالات جذر ssh والحقائق الشائعة الأخرى لإعدادات VPS. أود أن أصدق أنك تعرف كل شيء بالفعل. للاتصال عن بعد ، أقوم بإنشاء مستخدم جديد على الخادم.



adduser vimssh


على قطعة الأجهزة الخاصة بنا ، أقوم بإنشاء مفاتيح اتصال ssh.



ssh-keygen


وانسخها إلى خادمنا.



ssh-copy-id vimssh@host.com


على قطعة الأجهزة الخاصة بنا ، أقوم بإنشاء اتصال تلقائي لـ ssh العكسي في كل تمهيد. انتبه إلى المنفذ 8083: فهو يحدد أي منفذ سأقوم بالاتصال به عبر 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








sudo systemctl enable autossh.service
sudo systemctl start autossh.service


يمكنك حتى رؤية الحالة:



sudo systemctl status autossh.service


الآن ، على خادم VPS ، إذا قمت بتشغيل:



ssh -p 8083 khadas@localhost


ثم أصل إلى قطعة الاختبار الخاصة بي. ومن قطعة الحديد ، يمكنني أيضًا إرسال السجلات وأي بيانات عبر ssh إلى الخادم الخاص بي ، وهو أمر مريح للغاية.



ضع كل شيء معا





تشغيل ، نبدأ في تطوير وتصحيح



Fuh ، حسنًا ، يبدو أن كل شيء قد وصف جميع العقد. حان الوقت الآن لتجميع كل شيء. يمكن الاطلاع على الرمز هنا .



نقطة مهمة في الشفرة: قد لا يبدأ هذا المشروع مثل هذا "vlob" ، حيث تم شحذه في مهمة محددة لهندسة معينة. على الرغم من أنني أعطيت شفرة المصدر ، ما زلت سأحلل القيمة الأكثر قيمة هنا ، مباشرة في النص ، وإلا فهو غير مفهوم تمامًا.



في البداية ، لدي تهيئة لنظام تحديد المواقع العالمي (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 العكسي في كل اختبار. في كل اختبار ، تتم إعادة تكوين البوابة الافتراضية وخادم نظام أسماء النطاقات. بما أنه لا أحد يقرأ على أي حال ، كن على علم بأن القطار لا يتدحرج على القضبان الخشبية. من يجد بيضة عيد الفصح سيكون له أسنان حلوة.



للقيام بذلك ، أقوم بإنشاء جدول توجيه منفصل - مجموعة علامة 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 ويتم تثبيتها داخل الجهاز وهي أسهل بكثير في التهيئة. لكن هذه قصة مختلفة تمامًا. كان المشروع مثيرًا للاهتمام وسعدنا جدًا لأننا تمكنا من المشاركة فيه.






All Articles