د واحد بورډ کمپیوټر پر بنسټ vim2 د H موډیمونو له لارې د lte اړیکو لپاره د سرعت ټیسټر جوړ کړئuawei e3372h - 153 څو مخابراتي آپریټرونه (له یو څخه تر n). دا هم اړینه ده چې د UART له لارې د GPS اخیستونکي څخه همغږي ترلاسه کړئ. د خدمت په کارولو سره د سرعت اندازه کول www.speedtest.net او په میز کې یې داسې واچوئ:
جدول په csv بڼه. بیا دا نښه په هر 6 ساعتونو کې د بریښنالیک له لارې واستوئ. د غلطیو په صورت کې، LED ړنګ کړئ چې د GPIO سره وصل دی.
ما تخنیکي مشخصات په وړیا بڼه کې تشریح کړل، د ډیرو تصویبونو وروسته. مګر د کار معنی لا دمخه ښکاره ده. د هر څه لپاره یوه اونۍ ورکړل شوه. مګر په حقیقت کې دا درې اونۍ دوام وکړ. دا حقیقت په پام کې نیسي چې ما دا یوازې زما د اصلي دندې وروسته او د اونۍ په پای کې ترسره کړ.
دلته زه غواړم یو ځل بیا دې حقیقت ته متوجه شم چې پیرودونکي د سرعت اندازه کولو خدمت او هارډویر کارولو دمخه موافقه کړې ، کوم چې زما وړتیاوې خورا محدودې کړې. بودیجه هم محدوده وه، نو کوم ځانګړی نه و. نو موږ باید د دې قواعدو سره لوبې وکړو.
معماري او پراختیا
سکیم ساده او څرګند دی. له همدې امله، زه به دا پرته له کوم ځانګړي تبصرې پریږدم.
ما پریکړه وکړه چې ټوله پروژه په python کې پلي کړم، سره له دې چې ما په دې ژبه کې د ودې تجربه نه درلوده. ما دا غوره کړه ځکه چې دلته یو شمیر چمتو شوي مثالونه او حلونه شتون لري چې کولی شي پرمختګ ګړندی کړي. له همدې امله، زه له ټولو مسلکي پروګرام کونکو څخه غوښتنه کوم چې په python کې د پراختیا زما لومړۍ تجربه و نه وهي، او زه تل خوشحاله یم چې زما د مهارتونو د ښه کولو لپاره رغنده نیوکې واورم.
ما ته زما د اصلي ماشین په توګه یو واحد بورډ کمپیوټر راکړل شو vim2
د سمارټ کور او SMART-TV لپاره یو عالي ، ځواکمن میډیا پروسیسر ، مګر د دې دندې لپاره خورا مناسب نه دی ، یا راځئ چې ووایو ، ضعیف مناسب. د مثال په توګه، د دې اصلي OS Android دی، او لینکس یو ثانوي OS دی، او په دې اساس هیڅوک د لینکس لاندې د ټولو نوډونو او چلوونکو د لوړ کیفیت عملیات تضمین نه کوي. او زه ګومان کوم چې ځینې ستونزې د دې پلیټ فارم USB ډرایورانو پورې اړوند وې ، نو موډیمونه لکه څنګه چې تمه کیده پدې بورډ کې کار نه کوي. دا خورا ضعیف او ویشل شوي اسناد هم لري، نو هر عملیات د ډاکونو په کیندلو کې ډیر وخت نیولی. حتی د GPIO سره عادي کار ډیره وینه واخیستله. د مثال په توګه، ما د LED تنظیم کولو لپاره څو ساعته وخت واخیست. مګر، د هدف لپاره، دا اساسا مهمه نده چې دا کوم ډول واحد بورډ دی، اصلي خبره دا وه چې دا کار کاوه او د USB بندرونه شتون درلود.
د لینکس نصبولو لپاره دوه اختیارونه شتون لري: په بهرني SD کارت کې یا په داخلي MMC کې. ما یو ماښام تیر کړ ترڅو معلومه کړم چې دا څنګه د کارت سره کار کوي، نو ما پریکړه وکړه چې دا په MMC کې نصب کړم، که څه هم له شک پرته دا به د بهرني کارت سره کار کول خورا اسانه وي.
د فرم ویئر په اړه دلته په کرکه سره وویل. زه له عجیب څخه روسی ته ژباړم. د بورډ فلش کولو لپاره، زه اړتیا لرم چې هارډویر UART وصل کړم. وصل کړه په لاندې ډول.
git clone https://github.com/khadas/utils
cd /path/to/utils
sudo ./INSTALL
Aaand... هیڅ کار نه کوي. ما د نصب کولو سکریپټونو په سمولو کې څو ساعته تیر کړل ترڅو هرڅه زما لپاره په سمه توګه نصب شي. زه په یاد نه یم چې ما هلته څه وکړل، مګر د آسونو سره سرکس هم شتون درلود. نو محتاط اوسئ. مګر د دې اسانتیاو پرته د vim2 نور شکنجه کولو کې هیڅ معنی نشته. دا به ښه وي چې له هغه سره هیڅ ډول ګډوډي مه کوئ!
د دوزخ له اوو حلقو وروسته، د سکریپټ ترتیب او نصب کول، ما د کاري اسانتیاوو کڅوړه ترلاسه کړه. ما بورډ د USB له لارې زما د لینکس کمپیوټر سره وصل کړ، او د پورته ډیاګرام سره سم UART هم وصل کړ.
زه د هارډویر او سافټویر غلطی کنټرول پرته د 115200 سرعت لپاره زما د خوښې مینیکوم ټرمینل تنظیم کوم. او راځئ چې پیل وکړو.
که تاسو دا ستونزمن ومومئ، نو دا بورډ مه کاروئ؛ Raspberry Pi غوره ده. په صادقانه توګه.
موډیم Huawei e3372h – 153
دا موډیم زما لپاره د وینې یوه مهمه سرچینه وه، او په حقیقت کې، دا د ټولې پروژې خنډ شو. په عموم کې ، د دې وسیلو لپاره د "موډیم" نوم په بشپړ ډول د کار جوهر نه منعکس کوي: دا یو پیاوړی ترکیب دی ، د هارډویر دا ټوټه یو جامع وسیله لري چې د ډرایورانو نصبولو لپاره د CD-ROM ښکارندوی کوي ، او بیا د شبکې کارت حالت ته ځي.
په معمارۍ کې ، د لینکس کارونکي له نظره ، د ټولو تنظیماتو وروسته ، دا داسې ښکاري: د موډیم سره وصل کولو وروسته ، زه د eth * شبکې انٹرفیس لرم ، کوم چې د dhcp له لارې IP پته 192.168.8.100 ترلاسه کوي ، او ډیفالټ ګیټس 192.168.8.1 دی.
او ترټولو مهمه شیبه! دا موډیم ماډل نشي کولی په موډیم حالت کې کار وکړي، کوم چې د AT کمانډونو لخوا کنټرول کیږي. هر څه به ډیر ساده وي، د هر موډیم لپاره د PPP اتصالونه رامینځته کړئ او بیا د دوی سره کار وکړئ. مګر زما په قضیه کې، "ځان" (په دقیق ډول، د یوډیف قواعدو سره سم د لینکس ډیور)، د eth انٹرفیس رامینځته کوي او د dhcp له لارې ورته IP پته ورکوي.
د نور ګډوډۍ مخنیوي لپاره ، زه وړاندیز کوم چې د "موډیم" کلمه هیر کړئ او د شبکې کارت او ګیټ وے ووایاست ، ځکه چې په حقیقت کې دا د دروازې سره د نوي شبکې کارت وصل کولو په څیر دی.
کله چې یو موډیم وي، دا کومه ځانګړې ستونزه نه رامنځته کوي، مګر کله چې له یو څخه زیات وي، یعنې n-pieces، د شبکې لاندې انځور رامنځته کیږي.
دا دی، د شبکې کارتونه، د ورته IP پتې سره، هر یو د ورته ډیفالټ دروازې سره. مګر په حقیقت کې، هر یو یې د خپل آپریټر سره تړلی دی.
په پیل کې ، ما یو ساده حل درلود: د ifconfig یا ip کمانډ په کارولو سره ، ټول انٹرفیسونه بند کړئ او په ساده ډول یو په بدل کې وګرځئ او ازموینه یې کړئ. حل د هرچا لپاره ښه و ، پرته لدې چې د سویچ کولو شیبو په جریان کې زه نشم کولی د وسیلې سره وصل شم. او له هغه ځایه چې سویچ کول مکرر او ګړندي دي ، ما واقعیا هیڅ فرصت نه درلود چې وصل شم.
له همدې امله ، ما په لاسي ډول د موډیمونو IP پتې بدلولو او بیا د روټینګ ترتیباتو په کارولو سره د ترافیک چلولو لاره غوره کړه.
دا د موډیمونو سره زما د ستونزو پای نه و: د بریښنا د ستونزو په صورت کې، دوی راوتلي، او د USB مرکز ته د بریښنا ښه ثبات ته اړتیا وه. ما دا ستونزه په مستقیم ډول مرکز ته د بریښنا سخت سولډر کولو سره حل کړه. بله ستونزه چې زه ورسره مخ شوم او ټوله پروژه یې ویجاړه کړه: د وسیلې له ریبوټ یا سړه پیل وروسته ، نه ټول موډیمونه کشف شوي او نه تل ، او زه نشم کولی دا معلومه کړم چې دا ولې پیښ شوي او د کوم الګوریتم لخوا. مګر لومړی شیان لومړی.
د دې لپاره چې موډیم په سمه توګه کار وکړي، ما د USB-modeswitch کڅوړه نصب کړه.
له هغې وروسته، د نښلولو وروسته، موډیم به په سمه توګه د udev فرعي سیسټم لخوا کشف او تنظیم شي. زه په ساده ډول د موډیم سره وصل کولو او ډاډ ترلاسه کولو سره ګورم چې شبکه ښکاري.
بله ستونزه چې زه یې حل نشم کولی: څنګه کولی شم د هغه آپریټر نوم ترلاسه کړم چې موږ یې له دې موډیم سره کار کوو؟ د آپریټر نوم په موډیم ویب انٹرفیس کې په 192.168.8.1 کې شتون لري. دا یو متحرک ویب پاڼه ده چې د Ajax غوښتنو له لارې ډاټا ترلاسه کوي، نو په ساده ډول د پاڼې ویجیټ کول او د نوم تمثیل به کار ونکړي. نو ما په دې لټه کې پیل وکړ چې څنګه د ویب پاڼې پراختیا، او داسې نور، او پوه شوم چې زه یو ډول بې ځایه کار کوم. د پایلې په توګه، هغه سپک کړ، او آپریټر پخپله د سپیډ ټیسټ API په کارولو سره ترلاسه کول پیل کړل.
ډیر به اسانه وي که موډیم د AT کمانډونو له لارې لاسرسی ولري. دا به ممکنه وي چې دا بیا تنظیم کړئ، د پی پی پی اتصال رامینځته کړئ، IP وټاکئ، د مخابراتو آپریټر ترلاسه کړئ، او داسې نور. مګر افسوس، زه د هغه څه سره کار کوم چې ماته راکړل شوي دي.
جي پي ايس
د GPS ریسیور چې ما ته ورکړل شوی و د UART انٹرفیس او ځواک درلود. دا غوره حل نه و، مګر دا لاهم د کار وړ او ساده و. رسیور یو څه داسې ښکاري.
د ریښتیني کیدو لپاره ، دا زما لومړی ځل و چې د GPS ریسیور سره کار کول ، مګر لکه څنګه چې ما تمه درلوده ، هرڅه دمخه زموږ لپاره فکر شوی و. نو موږ یوازې چمتو شوي حلونه کاروو.
په پایتون کې، ما د دې ډیمون سره کار کولو لپاره ډیری اختیارونه هڅه وکړه، مګر ما په هغه یو باندې بسیا وکړه چې د python 3 سره سم کار کوي.
زه اړین کتابتون نصبوم.
sudo -H pip3 install gps3
او زه د کار کوډ مجسم کړم.
from gps3.agps3threaded import AGPS3mechanism
...
def getPositionData(agps_thread):
counter = 0;
while True:
longitude = agps_thread.data_stream.lon
latitude = agps_thread.data_stream.lat
if latitude != 'n/a' and longitude != 'n/a':
return '{}' .format(longitude), '{}' .format(latitude)
counter = counter + 1
print ("Wait gps counter = %d" % counter)
if counter == 10:
ErrorMessage("Ошибка GPS приемника!!!")
return "NA", "NA"
time.sleep(1.0)
...
f __name__ == '__main__':
...
#gps
agps_thread = AGPS3mechanism() # Instantiate AGPS3 Mechanisms
agps_thread.stream_data() # From localhost (), or other hosts, by example, (host='gps.ddns.net')
agps_thread.run_thread() # Throttle time to sleep after an empty lookup, default '()' 0.2 two tenths of a second
که زه همغږي ترلاسه کولو ته اړتیا لرم، دا د لاندې تلیفون سره ترسره کیږي:
longitude, latitude = getPositionData(agps_thread)
او په 1-10 ثانیو کې به زه هم همغږي ترلاسه کړم یا نه. هو، ما د همغږۍ ترلاسه کولو لپاره لس هڅې درلودې. مطلوب نه دی، کرغیړن او پیچلي، مګر دا کار کوي. ما پریکړه وکړه چې دا کار وکړم ځکه چې GPS کولی شي ضعیف استقبال ولري او تل معلومات نه ترلاسه کوي. که تاسو د معلوماتو ترلاسه کولو انتظار کوئ، نو که تاسو په لیرې پرتو خونه کې کار کوئ، برنامه به پدې ځای کې کنګل شي. له همدې امله ، ما دا غیر مناسب اختیار پلي کړ.
په اصولو کې، که چیرې ډیر وخت شتون ولري، نو دا به ممکن وي چې د GPS څخه مستقیم د UART له لارې ډاټا ترلاسه کړئ، دا په جلا تار کې تحلیل کړئ او د هغې سره کار وکړئ. مګر هیڅ وخت نه و، له همدې امله د وحشیانه بدمرغه کوډ. او هو، زه نه شرمیږم.
د ر Lightا ایټمیټ ډایډونه
د LED نښلول په ورته وخت کې ساده او ستونزمن وو. اصلي مشکل دا دی چې په سیسټم کې د پن نمبر په تخته کې د پن نمبر سره مطابقت نلري او ځکه چې اسناد په کیڼ لاس لیکل کیږي. په OS کې د هارډویر پن نمبر او پن نمبر پرتله کولو لپاره ، تاسو اړتیا لرئ کمانډ چل کړئ:
gpio readall
په سیسټم او تخته کې د پن لیکونو جدول به ښودل شي. له هغې وروسته زه کولی شم پخپله په OS کې پن چلولی شم. زما په قضیه کې LED سره وصل دی GPIOH_5.
اوس، د تېروتنې په صورت کې، زه error_blink() ته زنګ ووهلم او LED به په ښکلي ډول روښانه شي.
د سافټویر نوډونه
د چټکتیا API
دا د خوښۍ ځای دی چې د speedtest.net خدمت خپل python-API لري، تاسو کولی شئ وګورئ Github.
ښه خبره دا ده چې د سرچینې کوډونه شتون لري چې هم لیدل کیدی شي. د دې API سره څنګه کار کول (ساده مثالونه) په کې موندل کیدی شي اړونده برخه.
زه د لاندې کمانډ سره د python کتابتون نصب کړم.
sudo -H pip3 install speedtest-cli
د مثال په توګه ، تاسو حتی کولی شئ د سافټویر څخه مستقیم په اوبنټو کې د سرعت ټیسټر نصب کړئ. دا ورته 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"
#тут идет запись в файл логов
دلته هم، هر څه دومره ساده نه دي، که څه هم دا به ډیر ساده ښکاري. په پیل کې، د سرور پیرامیټر مساوي و []، دوی وايي، غوره سرور غوره کړئ. د پایلې په توګه، ما تصادفي سرورونه درلودل، او لکه څنګه چې تاسو اټکل کولی شئ، متغیر سرعت. دا خورا پیچلې موضوع ده، د ثابت سرور په کارولو سره، که داسې وي، جامد یا متحرک، څیړنې ته اړتیا لري. مګر دلته د بیلین آپریټر لپاره د سرعت اندازه کولو ګرافونو مثال دی کله چې په متحرک ډول د ټیسټ سرور غوره کول او په ثابت ډول ثابت شوی.
مهالویش خورا ساده دی: دا ګوري چې ایا د پیغامونو لیږلو وخت راغلی او د اوسني خطا وضعیت څه دی. که چیرې د غلطۍ بیرغ شتون ولري ، نو موږ 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)
د دې پروژې ترټولو ستونزمنه برخه د هرې ازموینې لپاره د ریورس ایس ایس ایس پیوستون ساتل دي. په هره ازموینه کې د ډیفالټ دروازې او DNS سرور بیا تنظیم کول شامل دي. ځکه چې هیڅوک هم نه لوستل کیږي، پوه شئ چې اورګاډي د لرګیو په ریلونو نه تیریږي. څوک چې د ایسټر هګۍ ومومي یو څه شیدې ترلاسه کوي.
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 پتې تنظیم کړې ، لکه څنګه چې ما د موډیم په اړه فصل کې عکس کې ښودلی.
بیا زه په ساده ډول د هر انٹرفیس له لارې په لوپ کې ځم. او زه هر انٹرفیس تنظیموم.
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()
#и далее тестируем скорость и сохраняем логи.
دا د ریورس ایس ایس ایس ترتیب کولو فعالیت د یادولو وړ دی.
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")
ښه، اوس ترټولو مهمه خبره دا ده چې په پایله کې څه پیښ شوي؟ دلته یو څو ګرافونه دي چې ما د پراختیا او ډیبګ کولو پروسې په جریان کې نیولی. ګرافونه د لاندې سکریپټ سره د 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"