قرنطینہ کے دوران، مجھے کئی سیلولر آپریٹرز کے لیے LTE موڈیم کی رفتار کی پیمائش کے لیے ایک ڈیوائس کی تیاری میں حصہ لینے کی پیشکش کی گئی۔
صارف مختلف جغرافیائی مقامات پر مختلف ٹیلی کام آپریٹرز کی رفتار کا اندازہ لگانا چاہتا تھا تاکہ یہ سمجھ سکے کہ LTE کنکشن کا استعمال کرتے ہوئے آلات نصب کرتے وقت کون سا سیلولر آپریٹر اس کے لیے سب سے زیادہ موزوں ہے، مثال کے طور پر، ویڈیو براڈکاسٹ کے لیے۔ ایک ہی وقت میں، اس مسئلے کو مہنگے آلات کے بغیر، جتنا آسان اور سستا ممکن ہو حل کرنا تھا۔
میں فوراً کہوں گا کہ یہ کام سب سے آسان اور علم پر مبنی نہیں ہے؛ میں آپ کو بتاؤں گا کہ مجھے کن مسائل کا سامنا کرنا پڑا اور میں نے انہیں کیسے حل کیا۔ تو چلو چلتے ہیں.
نوٹ
LTE کنکشن کی رفتار کی پیمائش کرنا ایک بہت ہی پیچیدہ معاملہ ہے: آپ کو صحیح آلات اور پیمائش کی تکنیک کا انتخاب کرنے کی ضرورت ہے، اور آپ کو سیلولر نیٹ ورک کی ٹوپولوجی اور آپریشن کے بارے میں بھی اچھی طرح سے سمجھنا ہوگا۔ اس کے علاوہ، رفتار کئی عوامل سے متاثر ہو سکتی ہے: سیل پر سبسکرائبرز کی تعداد، موسمی حالات، یہاں تک کہ سیل سے سیل تک نیٹ ورک ٹوپولوجی کی وجہ سے رفتار ڈرامائی طور پر مختلف ہو سکتی ہے۔ عام طور پر، یہ ایک بڑی تعداد میں نامعلوم افراد کا مسئلہ ہے، اور صرف ایک ٹیلی کام آپریٹر ہی اسے صحیح طریقے سے حل کر سکتا ہے۔
ابتدائی طور پر، صارف صرف آپریٹرز کے فون کے ساتھ کورئیر چلانا چاہتا تھا، براہ راست فون پر پیمائش کرتا تھا اور پھر رفتار کی پیمائش کے نتائج کو ایک نوٹ بک میں لکھتا تھا۔ lte نیٹ ورکس کی رفتار کی پیمائش کے لیے میرا حل، اگرچہ مثالی نہیں، مسئلہ کو حل کرتا ہے۔
وقت کی کمی کی وجہ سے میں نے سہولت یا عملییت کے حق میں نہیں بلکہ ترقی کی رفتار کے حق میں فیصلے کئے۔ مثال کے طور پر، ریورس ssh کو زیادہ عملی VPN کے بجائے ریموٹ رسائی کے لیے استعمال کیا گیا تھا، تاکہ سرور اور ہر ایک کلائنٹ کو ترتیب دینے میں وقت بچایا جا سکے۔
تکنیکی کام کافی آسان تھا، میں اسے آخری صارف کی سمجھ کے لیے تھوڑا بڑھا دوں گا۔ تکنیکی حل اور آلات کا انتخاب گاہک کے ذریعہ طے کیا گیا تھا۔ لہذا، تکنیکی تفصیلات خود، تمام منظوریوں کے بعد:
سنگل بورڈ کمپیوٹر پر مبنی vim2 H موڈیم کے ذریعے lte کنکشن کے لیے اسپیڈ ٹیسٹر بنائیںuawei e3372h - 153 متعدد ٹیلی کام آپریٹرز (ایک سے این تک)۔ UART کے ذریعے جڑے ہوئے GPS ریسیور سے نقاط وصول کرنا بھی ضروری ہے۔ سروس کا استعمال کرتے ہوئے رفتار کی پیمائش کریں۔ www.speedtest.net اور انہیں ایک میز میں رکھیں جیسے:
csv فارمیٹ میں ٹیبل۔ پھر یہ نشان ہر 6 گھنٹے بعد ای میل کے ذریعے بھیجیں۔ غلطیوں کی صورت میں، GPIO سے منسلک LED کو جھپکائیں۔
میں نے بہت سی منظوریوں کے بعد تکنیکی خصوصیات کو مفت شکل میں بیان کیا۔ لیکن کام کا مطلب پہلے ہی نظر آتا ہے۔ ہر چیز کے لیے ایک ہفتہ دیا گیا۔ لیکن حقیقت میں یہ تین ہفتے تک جاری رہا۔ اس میں اس حقیقت کو مدنظر رکھا جا رہا ہے کہ میں نے یہ کام اپنے مرکزی کام کے بعد اور ویک اینڈ پر کیا۔
یہاں میں ایک بار پھر اس حقیقت کی طرف توجہ مبذول کرانا چاہتا ہوں کہ صارف نے رفتار کی پیمائش کی سروس اور ہارڈ ویئر کے استعمال پر پیشگی اتفاق کیا تھا، جس نے میری صلاحیتوں کو کافی حد تک محدود کر دیا تھا۔ بجٹ بھی محدود تھا اس لیے کچھ خاص نہیں خریدا گیا۔ لہذا ہمیں ان اصولوں کے مطابق کھیلنا پڑا۔
فن تعمیر اور ترقی
اسکیم سادہ اور واضح ہے۔ لہذا، میں اسے بغیر کسی خاص تبصرے کے چھوڑ دوں گا۔
میں نے پورا پروجیکٹ python میں نافذ کرنے کا فیصلہ کیا، اس حقیقت کے باوجود کہ مجھے اس زبان میں ترقی کرنے کا کوئی تجربہ نہیں تھا۔ میں نے اس کا انتخاب اس لیے کیا کیونکہ بہت ساری تیار شدہ مثالیں اور حل موجود ہیں جو ترقی کو تیز کر سکتے ہیں۔ اس لیے، میں تمام پیشہ ور پروگرامرز سے کہتا ہوں کہ وہ ازگر میں ترقی کرنے کے میرے پہلے تجربے کو طعنہ نہ دیں، اور میں اپنی صلاحیتوں کو بہتر بنانے کے لیے تعمیری تنقید سن کر ہمیشہ خوش ہوتا ہوں۔
نیز اس عمل میں میں نے دریافت کیا کہ ازگر کے دو چلنے والے ورژن 2 اور 3 ہیں، نتیجے کے طور پر میں تیسرے نمبر پر آ گیا۔
ہارڈ ویئر نوڈس
سنگل پلیٹ vim2
مجھے میری مین مشین کے طور پر ایک سنگل بورڈ کمپیوٹر دیا گیا تھا۔ vim2
سمارٹ ہوم اور SMART-TV کے لیے ایک بہترین، طاقتور میڈیا پروسیسر، لیکن اس کام کے لیے انتہائی نامناسب، یا یوں کہہ لیں، ناقص موزوں ہے۔ مثال کے طور پر، اس کا مرکزی OS اینڈرائیڈ ہے، اور لینکس ایک ثانوی OS ہے، اور اس کے مطابق کوئی بھی لینکس کے تحت تمام نوڈس اور ڈرائیورز کے اعلیٰ معیار کے آپریشن کی ضمانت نہیں دیتا ہے۔ اور میں فرض کرتا ہوں کہ کچھ مسائل اس پلیٹ فارم کے USB ڈرائیوروں سے متعلق تھے، اس لیے موڈیم اس بورڈ پر توقع کے مطابق کام نہیں کر سکے۔ اس میں بہت ناقص اور بکھرے ہوئے دستاویزات بھی ہیں، اس لیے ہر آپریشن میں گودیوں کو کھودنے میں کافی وقت لگتا ہے۔ یہاں تک کہ GPIO کے ساتھ عام کام میں بہت زیادہ خون لگتا ہے۔ مثال کے طور پر، مجھے ایل ای ڈی لگانے میں کئی گھنٹے لگے۔ لیکن، مقصد کے لیے، یہ بنیادی طور پر اہم نہیں تھا کہ یہ کس قسم کا سنگل بورڈ ہے، اہم بات یہ تھی کہ اس نے کام کیا اور USB پورٹس موجود تھے۔
سب سے پہلے، مجھے اس بورڈ پر لینکس انسٹال کرنے کی ضرورت ہے۔ ہر ایک کے لیے دستاویزات کے جنگل کو نہ چھپانے کے لیے، اور ان لوگوں کے لیے بھی جو اس سنگل بورڈ سسٹم سے نمٹیں گے، میں یہ باب لکھ رہا ہوں۔
لینکس کو انسٹال کرنے کے دو اختیارات ہیں: ایک بیرونی SD کارڈ پر یا اندرونی MMC پر۔ میں نے ایک شام یہ جاننے کی کوشش میں گزاری کہ اسے کارڈ کے ساتھ کیسے کام کرنا ہے، اس لیے میں نے اسے MMC پر انسٹال کرنے کا فیصلہ کیا، حالانکہ اس میں کوئی شک نہیں کہ بیرونی کارڈ کے ساتھ کام کرنا بہت آسان ہوگا۔
فرم ویئر کے بارے میں ٹیڑھی سے یہاں بتایا. میں عجیب سے روسی میں ترجمہ کرتا ہوں۔ بورڈ کو چمکانے کے لیے، مجھے ہارڈ ویئر UART کو جوڑنے کی ضرورت ہے۔ اسے جوڑ دیا۔ مندرجہ ذیل طریقے سے
اس فرم ویئر کو اپ لوڈ کرنے کے لیے، مجھے یوٹیلیٹیز کی ضرورت ہے۔ اس بارے میں مزید تفصیلات یہاں. میں نے اسے ونڈوز کے تحت چمکانے کی کوشش نہیں کی ہے، لیکن مجھے آپ کو لینکس کے تحت فرم ویئر کے بارے میں کچھ الفاظ بتانے کی ضرورت ہے۔ سب سے پہلے، میں ہدایات کے مطابق یوٹیلیٹیز انسٹال کروں گا۔
git clone https://github.com/khadas/utils
cd /path/to/utils
sudo ./INSTALL
Aaand... کچھ کام نہیں کرتا۔ میں نے انسٹالیشن اسکرپٹس میں ترمیم کرنے میں چند گھنٹے گزارے تاکہ سب کچھ میرے لیے صحیح طریقے سے انسٹال ہو جائے۔ مجھے یاد نہیں کہ میں نے وہاں کیا کیا، لیکن گھوڑوں کے ساتھ وہ سرکس بھی تھا۔ لہذا احتیاط کرو. لیکن ان افادیت کے بغیر vim2 کو مزید اذیت دینے کا کوئی فائدہ نہیں ہے۔ اس کے ساتھ بالکل بھی گڑبڑ نہ کرنا بہتر ہے!
جہنم کے سات حلقوں، اسکرپٹ کنفیگریشن اور انسٹالیشن کے بعد، مجھے ورکنگ یوٹیلیٹیز کا ایک پیکج ملا۔ میں نے بورڈ کو USB کے ذریعے اپنے لینکس کمپیوٹر سے منسلک کیا، اور اوپر دیے گئے خاکے کے مطابق 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
یہ ہے، افف. میں نے چیک کیا، بورڈ پر لینکس موجود ہے۔ لاگ ان/پاس ورڈ khadas:khadas.
اس کے بعد، کچھ معمولی ابتدائی ترتیبات. مزید کام کے لیے، میں sudo کے لیے پاس ورڈ کو غیر فعال کرتا ہوں (ہاں، محفوظ نہیں، لیکن آسان)۔
sudo visudo
میں فارم میں لائن میں ترمیم کرتا ہوں اور محفوظ کرتا ہوں۔
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) NOPASSWD: ALL
پھر میں موجودہ مقام کو تبدیل کرتا ہوں تاکہ وقت ماسکو میں ہو، ورنہ یہ گرین وچ میں ہوگا۔
اگر آپ کو یہ مشکل لگتا ہے، تو اس بورڈ کا استعمال نہ کریں؛ Raspberry Pi بہتر ہے۔ ایمانداری سے۔
موڈیم Huawei e3372h – 153
یہ موڈیم میرے لیے خون کا ایک اہم ذریعہ تھا، اور درحقیقت یہ پورے منصوبے کی رکاوٹ بن گیا۔ عام طور پر، ان آلات کا نام "موڈیم" بالکل بھی کام کے جوہر کی عکاسی نہیں کرتا: یہ ایک طاقتور کمبائن ہے، ہارڈ ویئر کے اس ٹکڑے میں ایک جامع ڈیوائس ہے جو ڈرائیوروں کو انسٹال کرنے کے لیے CD-ROM ہونے کا بہانہ کرتی ہے، اور پھر نیٹ ورک کارڈ موڈ پر سوئچ کرتا ہے۔
آرکیٹیکچرل طور پر، لینکس صارف کے نقطہ نظر سے، تمام ترتیبات کے بعد، یہ اس طرح لگتا ہے: موڈیم کو جوڑنے کے بعد، میرے پاس ایک ایتھ* نیٹ ورک انٹرفیس ہے، جو ڈی ایچ سی پی کے ذریعے آئی پی ایڈریس 192.168.8.100، اور ڈیفالٹ گیٹ وے حاصل کرتا ہے۔ 192.168.8.1 ہے۔
اور سب سے اہم لمحہ! یہ موڈیم ماڈل موڈیم موڈ میں کام نہیں کر سکتا، جسے اے ٹی کمانڈز کے ذریعے کنٹرول کیا جاتا ہے۔. سب کچھ بہت آسان ہوگا، ہر موڈیم کے لیے پی پی پی کنکشن بنائیں اور پھر ان کے ساتھ کام کریں۔ لیکن میرے معاملے میں، "خود" (زیادہ واضح طور پر، یو ڈی وی قواعد کے مطابق ایک لینکس غوطہ خور)، ایک ایتھ انٹرفیس بناتا ہے اور اسے dhcp کے ذریعے ایک IP ایڈریس تفویض کرتا ہے۔
مزید الجھنوں سے بچنے کے لیے، میرا مشورہ ہے کہ لفظ "موڈیم" کو بھول جائیں اور نیٹ ورک کارڈ اور گیٹ وے بولیں، کیونکہ اصل میں یہ ایک نئے نیٹ ورک کارڈ کو گیٹ وے سے جوڑنے جیسا ہے۔
جب ایک موڈیم ہوتا ہے تو اس سے کوئی خاص مسئلہ نہیں ہوتا، لیکن جب ایک سے زیادہ یعنی n-pieces ہوتے ہیں، تو مندرجہ ذیل نیٹ ورک کی تصویر پیدا ہوتی ہے۔
یعنی، n نیٹ ورک کارڈز، ایک ہی IP ایڈریس کے ساتھ، ہر ایک ایک ہی ڈیفالٹ گیٹ وے کے ساتھ۔ لیکن درحقیقت ان میں سے ہر ایک اپنے آپریٹر سے جڑا ہوا ہے۔
ابتدائی طور پر، میرے پاس ایک آسان حل تھا: ifconfig یا ip کمانڈ کا استعمال کرتے ہوئے، تمام انٹرفیس کو بند کریں اور صرف ایک کو باری باری آن کریں اور اس کی جانچ کریں۔ حل سب کے لیے اچھا تھا، سوائے اس کے کہ سوئچنگ کے لمحات کے دوران میں ڈیوائس سے رابطہ قائم کرنے کے قابل نہیں تھا۔ اور چونکہ سوئچنگ بار بار اور تیز ہوتی ہے، اس لیے مجھے اصل میں جڑنے کا کوئی موقع نہیں ملا۔
لہذا، میں نے موڈیم کے آئی پی ایڈریس کو دستی طور پر تبدیل کرنے اور پھر روٹنگ سیٹنگز کا استعمال کرتے ہوئے ٹریفک چلانے کا راستہ منتخب کیا۔
یہ موڈیم کے ساتھ میری پریشانیوں کا خاتمہ نہیں تھا: بجلی کے مسائل کی صورت میں، وہ گر گئے، اور USB حب کو اچھی مستحکم بجلی کی فراہمی کی ضرورت تھی۔ میں نے اس مسئلے کو طاقت کو براہ راست حب تک سخت سولڈرنگ کرکے حل کیا۔ ایک اور مسئلہ جس کا مجھے سامنا کرنا پڑا اور جس نے پورے پروجیکٹ کو برباد کر دیا: ڈیوائس کے ریبوٹ یا کولڈ سٹارٹ کے بعد، تمام موڈیمز کا پتہ نہیں چل سکا اور ہمیشہ نہیں، اور میں اس بات کا تعین نہیں کر سکا کہ ایسا کیوں ہوا اور کس الگورتھم سے ہوا۔ لیکن سب سے پہلے چیزیں.
موڈیم کے صحیح طریقے سے کام کرنے کے لیے، میں نے USB-modeswitch پیکیج انسٹال کیا۔
جس کے بعد، کنیکٹ ہونے کے بعد، موڈیم کا صحیح طریقے سے پتہ لگایا جائے گا اور udev سب سسٹم کے ذریعے ترتیب دیا جائے گا۔ میں صرف موڈیم کو جوڑ کر چیک کرتا ہوں اور یہ یقینی بناتا ہوں کہ نیٹ ورک ظاہر ہو رہا ہے۔
ایک اور مسئلہ جو میں حل نہیں کر سکا: میں اس موڈیم سے جس آپریٹر کے ساتھ ہم کام کر رہے ہیں اس کا نام کیسے حاصل کر سکتا ہوں؟ آپریٹر کا نام موڈیم ویب انٹرفیس میں 192.168.8.1 پر موجود ہے۔ یہ ایک متحرک ویب صفحہ ہے جو Ajax کی درخواستوں کے ذریعے ڈیٹا حاصل کرتا ہے، اس لیے صرف صفحہ کو ویجیٹ کرنا اور نام کو پارس کرنا کام نہیں کرے گا۔ تو میں نے یہ دیکھنا شروع کیا کہ ویب پیج کیسے تیار کیا جائے، وغیرہ، اور مجھے احساس ہوا کہ میں کسی قسم کی بکواس کر رہا ہوں۔ نتیجے کے طور پر، اس نے تھوک دیا، اور آپریٹر نے خود اسپیڈٹیسٹ API کا استعمال کرتے ہوئے وصول کرنا شروع کیا۔
اگر موڈیم کو اے ٹی کمانڈز کے ذریعے رسائی حاصل ہوتی تو بہت آسان ہوتا۔ اسے دوبارہ ترتیب دینا، پی پی پی کنکشن بنانا، آئی پی تفویض کرنا، ٹیلی کام آپریٹر حاصل کرنا، وغیرہ ممکن ہوگا۔ لیکن افسوس، میں اس کے ساتھ کام کر رہا ہوں جو مجھے دیا گیا ہے۔
GPS
مجھے جو GPS ریسیور دیا گیا تھا اس میں UART انٹرفیس اور طاقت تھی۔ یہ بہترین حل نہیں تھا، لیکن یہ اب بھی قابل عمل اور آسان تھا۔ ریسیور کچھ اس طرح نظر آرہا تھا۔
سچ پوچھیں تو، یہ میرا پہلا جی پی ایس ریسیور کے ساتھ کام کرنے کا موقع تھا، لیکن جیسا کہ میں نے توقع کی تھی، ہمارے لیے سب کچھ بہت پہلے سوچا گیا تھا۔ لہذا ہم صرف تیار حل استعمال کرتے ہیں۔
سب سے پہلے، میں 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 on the fly میں ترمیم کرتی ہے، جو کہ بہت آسان ہے۔
اس آپریشن کی کامیابی کے بعد، ریبوٹ کریں اور GPS ڈیمون انسٹال کریں۔
khadas@Khadas:~$ sudo reboot
GPS ڈیمون انسٹال کرنا۔ میں سب کچھ انسٹال کرتا ہوں اور مزید کنفیگریشن کے لیے اسے فوراً کاٹ دیتا ہوں۔
GPS کی تار میرے ہاتھ میں ہے، UART ڈیبگر تاریں میری انگلیوں کے نیچے نظر آ رہی ہیں۔
میں ریبوٹ کرتا ہوں اور gpsmon پروگرام کا استعمال کرتے ہوئے GPS آپریشن چیک کرتا ہوں۔
آپ اس اسکرین شاٹ میں سیٹلائٹ نہیں دیکھ سکتے، لیکن آپ 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 سے ڈیٹا حاصل کرنا، اسے الگ تھریڈ میں پارس کرنا اور اس کے ساتھ کام کرنا ممکن ہو گا۔ لیکن بالکل وقت نہیں تھا، اس لیے بے دردی سے بدصورت کوڈ۔ اور ہاں مجھے شرم نہیں آتی۔
روشنی خارج کرنے والا دو برقیرہ
ایل ای ڈی کو جوڑنا ایک ہی وقت میں آسان اور مشکل تھا۔ سب سے بڑی مشکل یہ ہے کہ سسٹم میں پن نمبر بورڈ پر موجود پن نمبر سے مطابقت نہیں رکھتا اور کیونکہ دستاویزات بائیں ہاتھ سے لکھی جاتی ہیں۔ OS میں ہارڈویئر پن نمبر اور پن نمبر کا موازنہ کرنے کے لیے، آپ کو کمانڈ چلانے کی ضرورت ہے:
gpio readall
سسٹم میں اور بورڈ پر پن خط و کتابت کا ایک ٹیبل دکھایا جائے گا۔ جس کے بعد میں OS میں ہی پن کو پہلے ہی چلا سکتا ہوں۔ میرے معاملے میں ایل ای ڈی منسلک ہے۔ GPIOH_5.
اب، غلطیوں کی صورت میں، میں error_blink() کو کال کرتا ہوں اور ایل ای ڈی خوبصورتی سے جھپک جائے گی۔
سافٹ ویئر نوڈس
سپیڈٹیسٹ API
یہ بہت خوشی کی بات ہے کہ speedtest.net سروس کا اپنا python-API ہے، آپ اسے دیکھ سکتے ہیں Github کے.
اچھی بات یہ ہے کہ سورس کوڈز ہیں جو بھی دیکھے جا سکتے ہیں۔ اس 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 آپریٹر کے لیے رفتار کی پیمائش کے گراف کی ایک مثال ہے جب متحرک طور پر ٹیسٹ سرور اور ایک مستحکم طور پر طے شدہ کو منتخب کیا جاتا ہے۔
متحرک سرور کا انتخاب کرتے وقت رفتار کی پیمائش کا نتیجہ۔
رفتار کی جانچ کا نتیجہ، سختی سے منتخب کردہ ایک سرور کے ساتھ۔
جانچ کے دوران، دونوں جگہوں پر "فر" ہے، اور اسے ریاضی کے طریقوں سے ہٹانے کی ضرورت ہے۔ لیکن ایک مقررہ سرور کے ساتھ یہ قدرے کم ہے اور طول و عرض زیادہ مستحکم ہے۔
عام طور پر، یہ ایک عظیم تحقیق کی جگہ ہے. اور میں iperf یوٹیلیٹی کا استعمال کرتے ہوئے اپنے سرور کی رفتار کی پیمائش کروں گا۔ لیکن ہم تکنیکی وضاحتوں پر قائم ہیں۔
میل بھیجنا اور غلطیاں
میل بھیجنے کے لیے، میں نے کئی درجن مختلف آپشنز آزمائے، لیکن آخر میں میں نے درج ذیل پر طے کیا۔ میں نے Yandex پر ایک میل باکس رجسٹر کیا اور پھر لے لیا۔ یہ میل بھیجنے کی ایک مثال ہے۔. میں نے اسے چیک کیا اور اسے پروگرام میں لاگو کیا۔ یہ مثال مختلف اختیارات کا جائزہ لیتی ہے، بشمول جی میل سے بھیجنا وغیرہ۔ میں اپنے میل سرور کو ترتیب دینے کے ساتھ پریشان نہیں ہونا چاہتا تھا اور اس کے لئے وقت نہیں تھا، لیکن جیسا کہ بعد میں پتہ چلا، یہ بھی بیکار تھا۔
نوشتہ جات شیڈولر کے مطابق بھیجے گئے تھے، اگر کوئی تعلق ہے، ہر 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 وغیرہ لگانا چاہیں تو یہ کافی ہوگا۔ اس کے علاوہ، ٹیلیگرام بوٹ سیٹ اپ کرنے کے قابل ہو جائیں اور اس کے بلاک ہونے میں پریشانی نہ ہو۔ لہذا، میں نے ایمسٹرڈیم اور مندرجہ ذیل پیرامیٹرز کا انتخاب کیا۔
ہارڈ ویئر کے ساتھ مواصلت کے طریقہ کار کے طور پر، vim2 نے ایک ریورس ssh کنکشن کا انتخاب کیا اور جیسا کہ پریکٹس نے دکھایا ہے، یہ بہترین نہیں ہے۔ اگر کنکشن منقطع ہو جائے تو سرور پورٹ رکھتا ہے اور کچھ وقت کے لیے اس کے ذریعے رابطہ قائم کرنا ناممکن ہے۔ لہذا، مواصلات کے دیگر طریقے استعمال کرنا اب بھی بہتر ہے، مثال کے طور پر VPN۔ مستقبل میں میں VPN پر جانا چاہتا تھا، لیکن میرے پاس وقت نہیں تھا۔
میں فائر وال کو ترتیب دینے، حقوق کو محدود کرنے، روٹ ssh کنکشنز کو غیر فعال کرنے اور VPS کو ترتیب دینے کے دیگر معاملات کی تفصیلات میں نہیں جاؤں گا۔ میں یقین کرنا چاہوں گا کہ آپ پہلے ہی سب کچھ جانتے ہیں۔ ریموٹ کنکشن کے لیے، میں سرور پر ایک نیا صارف بناتا ہوں۔
adduser vimssh
میں اپنے ہارڈ ویئر پر ssh کنکشن کیز تیار کرتا ہوں۔
پورٹ 8083 پر توجہ دیں: یہ طے کرتا ہے کہ میں ریورس ایس ایس ایچ کے ذریعے کنیکٹ ہونے کے لیے کون سا پورٹ استعمال کروں گا۔ اسے شروع میں شامل کریں اور شروع کریں۔
پھر میں ہارڈ ویئر کے اپنے ٹیسٹ ٹکڑے پر جاتا ہوں۔ اور ہارڈ ویئر سے میں اپنے سرور پر ssh کے ذریعے لاگ اور کوئی ڈیٹا بھی بھیج سکتا ہوں، جو کہ بہت آسان ہے۔
یہ سب ایک ساتھ ڈالنا
سوئچ آن، آئیے ڈیولپمنٹ اور ڈیبگنگ شروع کریں۔
افف، ٹھیک ہے، یہ ہے، میں نے تمام نوڈس کو بیان کیا. اب یہ سب ایک ساتھ ڈالنے کا وقت ہے۔ آپ کوڈ دیکھ سکتے ہیں۔ یہاں.
کوڈ کے ساتھ ایک اہم نکتہ: یہ پروجیکٹ اس طرح شروع نہیں ہوسکتا ہے، کیونکہ یہ ایک مخصوص کام، ایک مخصوص فن تعمیر کے لیے تیار کیا گیا تھا۔ اگرچہ میں سورس کوڈ دے رہا ہوں، پھر بھی میں یہاں سب سے قیمتی چیزوں کی وضاحت متن میں ہی کروں گا، ورنہ یہ مکمل طور پر سمجھ سے باہر ہے۔
شروع میں، میں gps، gpio کو شروع کرتا ہوں اور ایک الگ شیڈولر تھریڈ لانچ کرتا ہوں۔
شیڈولر کافی آسان ہے: یہ دیکھنا لگتا ہے کہ آیا پیغامات بھیجنے کا وقت آگیا ہے اور موجودہ خرابی کی صورتحال کیا ہے۔ اگر کوئی غلطی کا جھنڈا ہے، تو ہم ایل ای ڈی کو جھپکتے ہیں۔
#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)
اس پروجیکٹ کا سب سے مشکل حصہ ہر ٹیسٹ کے لیے ریورس ایس ایس ایس کنکشن کو برقرار رکھنا ہے۔ ہر ٹیسٹ میں ڈیفالٹ گیٹ وے اور 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
فہرست حاصل کرنے کے بعد، میں نے تمام انٹرفیس پر آئی پی ایڈریسز سیٹ کیے، جیسا کہ میں نے موڈیم کے باب میں تصویر میں دکھایا ہے۔
پھر میں صرف ایک لوپ میں ہر انٹرفیس کے ذریعے جاتا ہوں. اور میں ہر انٹرفیس کو ترتیب دیتا ہوں۔
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 روٹنگ کو ترتیب دیتا ہوں (اگر ایسا نہیں کیا گیا ہے)، وقت آنے پر سرور کو غلطیاں بھیجیں، لاگ بھیجیں اور آخر میں اسپیڈ ٹیسٹ چلائیں اور لاگز کو سی ایس وی فائل میں محفوظ کریں۔
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()
#и далее тестируем скорость и сохраняем логи.
ریورس ایس ایس ایس کو ترتیب دینے کے فنکشن کا ذکر کرنا ضروری ہے۔
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
خیر، اب سب سے اہم بات یہ ہے کہ اس کے نتیجے میں کیا ہوا؟ یہاں کچھ گرافس ہیں جو میں نے ترقی اور ڈیبگنگ کے عمل کے دوران حاصل کرنے میں کامیاب کیا۔ گراف مندرجہ ذیل اسکرپٹ کے ساتھ 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 فارمیٹ میں ہوتے ہیں اور ڈیوائس کے اندر انسٹال ہوتے ہیں اور کنفیگر کرنا بہت آسان ہوتا ہے۔ لیکن یہ بالکل مختلف کہانی ہے۔ پروجیکٹ دلچسپ تھا اور مجھے بہت خوشی ہوئی کہ میں اس میں حصہ لینے کے قابل تھا۔