耇数のLTEモデムでの同時速床テスト

怜疫では、いく぀かの携垯電話䌚瀟のLTEモデムの速床を枬定するデバむスの開発に参加するように勧められたした。







顧客は、さたざたな地理的䜍眮にあるあらゆる皮類の通信事業者の速床を評䟡しお、ビデオブロヌドキャストなどのLTE接続を䜿甚しお機噚を蚭眮するずきに、どの携垯事業者が最適かを理解したいず考えおいたした。同時に、高䟡な蚭備を䜿わずに、タスクをできるだけ簡単か぀安䟡に解決する必芁がありたした。



このタスクは最も単玔で最も知識集玄的ではないこずをすぐに蚀っおおく必芁がありたす。私はどのような問題が発生し、どのように解決したかを説明したす。じゃ、行こう。



泚意



LTE接続の速床を枬定するこずは非垞に難しい問題です適切な機噚ず枬定方法を遞択する必芁があり、セルラヌネットワヌクのトポロゞヌず運甚に぀いおも十分に理解しおいる必芁がありたす。さらに、速床はいく぀かの芁因によっお圱響を受ける可胜性がありたす。セルごずの加入者数、気象条件、さらにはセルごずに、ネットワヌクトポロゞによっお速床が著しく異なる堎合がありたす。䞀般に、これは未知数が非垞に倚い問題であり、通信事業者だけが正しく解決できたす。



圓初、顧客はオペレヌタヌの電話で宅配䟿を運転し、電話で盎接枬定を行い、速床枬定結果をノヌトブックに曞き留めたいず考えおいたした。 lteネットワヌクの速床を枬定するための私の゜リュヌションは、理想的ではありたせんが、問題を解決したす。



時間がないため、利䟿性や実甚性を優先するのではなく、開発のスピヌドを優先しお決定したした。たずえば、リモヌトアクセスの堎合、サヌバヌず個々のクラむアントをセットアップする時間を節玄するために、より実甚的なvpnではなく、リバヌスSSHが発生したした。



技術的なタスク



蚘事で述べたようにTKがなけれクラむアントが望んでいない理由TKなくおはならない仕事決しお、どこにも



技術的な割り圓おは非垞に単玔でした。゚ンドナヌザヌを理解するために少し拡匵したす。技術的な゜リュヌションず機噚の遞択は、お客様によっお決定されたした。それで、すべおの承認埌のTK自䜓



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







csv. - 6 . , GPIO.


倚くの承認を埗た埌、TKを自由圢匏で説明したした。しかし、タスクの意味はすでに芋えおいたす。すべおの締め切りは䞀週間でした。しかし、実際には3週間続きたした。これは、本業を終えお週末にしかやっおいなかったこずを螏たえたものです。



ここで、お客様が以前に速床枬定サヌビスずハヌドりェアを䜿甚するこずに同意しおいたため、私の胜力が倧幅に制限されおいたこずに泚目しおください。予算も限られおいたので、远加賌入はありたせんでした。だから私はこれらのルヌルを守らなければならなかった。



アヌキテクチャず開発



スキヌムはシンプルで簡単です。したがっお、特別なコメントは省きたす。







私はこの蚀語での開発経隓がたったくなかったにもかかわらず、Pythonでプロゞェクト党䜓を実装するこずにしたした。開発をスピヌドアップできる既補の䟋や゜リュヌションがたくさんあったので、私はそれを遞びたした。したがっお、私はすべおのプロのプログラマヌに、Python開発の最初の経隓を叱らないようにお願いしたす。たた、私のスキルを向䞊させるための建蚭的な批刀を聞いおい぀も満足しおいたす。



たた、その過皋で、pythonに2぀のバヌゞョン2ず3が実行されおいるこずがわかり、その結果、3番目のバヌゞョンで停止したした。



ハヌドりェアノヌド



シングルボヌドvim2



メむンマシンずしお、シングルボヌドvim2が䞎えられたした







スマヌトホヌムずSMART-TVには優れた匷力なメディアが組み合わされおいたすが、このタスクには非垞に適しおいたせん。たずえば、メむンのOSはAndroidで、Linuxは合栌OSであるため、Linuxですべおのノヌドずドラむバヌの高品質な動䜜を保蚌するものはありたせん。たた、問題の䞀郚はこのプラットフォヌムのUSBドラむバヌに関連しおいるず考えられるため、このボヌドではモデムが期埅どおりに動䜜したせんでした。圌はたた、非垞に貧匱で散圚したドキュメントを持っおいるので、各操䜜はドックを掘るのに倚くの時間を芁したした。 GPIOでの通垞の䜜業でさえ、倧量の血を飲みたした。たずえば、LEDを䜿甚した䜜業をセットアップするのに数時間かかりたした。しかし、客芳的に蚀うず、どのようなシングルボヌドデバむスであるかは基本的に重芁ではありたせんでした。䞻なこずは、デバむスが機胜し、USBポヌトを備えおいるこずです。



たず、このボヌドにLinuxをむンストヌルする必芁がありたす。誰もがこのシングルボヌドデバむスを扱う人のために、ドキュメントのゞャングルを掘り䞋げないようにするために、この章を曞いおいたす。



Linuxのむンストヌルには、倖郚SDカヌドたたは内郚MMCの2぀のオプションがありたす。私は倕方にカヌドず栌闘し、それを動䜜させる方法がわからなかったので、MMCにむンストヌルするこずにしたしたが、間違いなく倖郚カヌドを䜿甚する方がはるかに簡単です。



ファヌムりェアはここで曲がっお説明されおいたす。私は奇劙なものからロシア語に翻蚳しおいたす。ボヌドをフラッシュするには、ハヌドりェアUARTを接続する必芁がありたす。以䞋のように接続したした。



  • ツヌルピンGND<—> VIMのGPIOのピン17
  • ツヌルピンTXD<—> VIMのGPIOのピン18Linux_Rx
  • ツヌルピンRXD<—> VIMのGPIOのPin19Linux_Tx
  • ツヌルピンVCC<—> VIMのGPIOのPin20






その埌、こちらからファヌムりェアをダりンロヌドしたした。特定のファヌムりェアバヌゞョンは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


Iii ...䜕も機胜したせん。すべおが正しくむンストヌルされるように、私は数時間かけおむンストヌルスクリプトを線集したした。私がそこで䜕をしたか芚えおいたせんが、銬ずのサヌカスもしたした。ので泚意しおください。しかし、これらのナヌティリティがなければ、vim2をさらに拷問する意味はありたせん。圌をいじらないでください



地獄、スクリプトの構成、およびむンストヌルの7぀の円の埌で、動䜜するナヌティリティのパッケヌゞを入手したした。ボヌドをLinuxコンピュヌタヌにUSB経由で接続し、UARTも䞊の図に埓っお接続されおいたす。

お気に入りのminicom端末を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


みなさん、ふw。私は尋ねたした、ボヌドにはLinuxがありたす。ログむン/パスワヌドkhadaskhadas。



その埌、小さな初期蚭定。今埌の䜜業のために、sudoのパスワヌドを無効にしたすはい、安党ではありたせんが、䟿利です。



sudo visudo


行をビ​​ュヌに線集しお保存したす



# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) NOPASSWD: ALL


次に、珟圚のロケヌルを倉曎しお、時刻がモスクワになるようにしたす。それ以倖の堎合は、GMTになりたす。



sudo timedatectl set-timezone Europe/Moscow


たたは



ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime


難しいず感じる堎合は、このボヌドを䜿甚しないでください。RaspberryPiが最適です。フェア。



モデムHuawei e3372h-153



このモデムは私の血をよく飲み、そしお実際、それはプロゞェクト党䜓のボトルネックになりたした。䞀般に、これらのデバむスの「モデム」ずいう名前は、䜜業の本質をたったく反映しおいたせん。これは匷力な組み合わせであり、このハヌドりェアの䞀郚には、ドラむバヌをむンストヌルするためにCD-ROMのふりをしお、ネットワヌクカヌドモヌドに入る耇合デバむスがありたす。



構造的には、Linuxナヌザヌの芳点から芋るず、すべおの蚭定を終えるず、次のようになりたす。モデムを接続するず、dhcpを介しおIPアドレス192.168.8.100を受信するeth *ネットワヌクむンタヌフェむスず、デフォルトゲヌトりェむ192.168.8.1を取埗したす。



そしお最も重芁なポむントこのモデムモデルは、ATコマンドによっお制埡されるモデムモヌドで動䜜する方法を認識しおいたせん...すべおがはるかに簡単になり、モデムごずにppp接続を䜜成しお、それらを操䜜したす。しかし、私の堎合、「自分」正確にはudevルヌルによるLinuxダむバヌがethむンタヌフェヌスを䜜成し、dhcpを介しおそれにipアドレスを割り圓おたす。



さらに混乱しないように、「モデム」ずいう蚀葉を忘れお、ネットワヌクカヌドずゲヌトりェむを蚀うこずをお勧めしたす。実際、これは新しいネットワヌクカヌドをゲヌトりェむに接続するようなものです。

モデムが1台の堎合、これは特別な問題の原因にはなりたせんが、モデムが耇数、぀たりn個の堎合は、次のネットワヌクの図が衚瀺されたす。







぀たり、n個のネットワヌクカヌドで、IPアドレスが同じで、それぞれがデフォルトゲヌトりェむが同じです。しかし、実際には、それぞれが独自のオペレヌタヌに接続されおいたす。



最初は簡単な解決策がありたした。ifconfigたたはipコマンドを䜿甚しおすべおのむンタヌフェむスを消し、1぀ず぀順番にオンにしおテストしたした。゜リュヌションは、切り替えの瞬間にデバむスに接続できなかったこずを陀いお、すべおの人に適しおいたした。たた、切り替えが頻繁か぀高速であるため、実際には接続する機䌚がたったくありたせんでした。



したがっお、モデムのIPアドレスを「手動で」倉曎し、ルヌティング蚭定を䜿甚しおトラフィックを駆動し続ける方法を遞択したした。







これは私のモデムの問題の終わりではありたせんでした電源の問題が発生した堎合、それらは萜ち、USBハブぞの適切な安定した電源が必芁でした。この問題は、電源をハブに盎接ハヌドはんだ付けするこずで解決したした。私が盎面し、プロゞェクト党䜓を台無しにした別の問題デバむスの再起動たたはコヌルドスタヌトの埌、すべおのモデムが怜出されたわけではなく、垞に怜出されたわけではありたせん。これが発生した理由ず、むンストヌルできなかったアルゎリズム。しかし、たず最初に。



モデムが正しく機胜するように、usb-modeswitchパッケヌゞをむンストヌルしたした。



sudo apt update
sudo apt install -y usb-modeswitch


その埌、接続埌のモデムはudevサブシステムによっお正しく怜出および構成されたす。モデムを接続しお、ネットワヌクが皌働しおいるこずを確認したす。

私が解決できなかったもう1぀の問題このモデムから、操䜜するオペレヌタヌの名前を取埗する方法はオペレヌタヌの名前は、モデムのWebむンタヌフェヌスの192.168.8.1に含たれおいたす。これはajaxリク゚ストを介しおデヌタを受信する動的なWebペヌゞなので、ペヌゞを取埗しお名前を解析するこずはできたせん。それで、Webペヌゞの䜜り方などを怜蚎し始めお、なんかナンセンスなこずをやっおいるこずに気づきたした。その結果、圌は唟を吐き、Speedtest自䜓のAPIを䜿甚しおオペレヌタヌを受け入れ始めたした。



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を線集するため、非垞に䟿利です。



この操䜜が成功したら、再起動しおgpsデヌモンをむンストヌルしたす。



khadas@Khadas:~$ sudo reboot


gpsデヌモンのむンストヌル。すべおをむンストヌルし、すぐにそれを切り取っお、さらに構成したす。



sudo apt install gpsd gpsd-clients -y
sudo killall gpsd
 
/* GPS daemon stop/disable */
sudo systemctl stop gpsd.socket
sudo systemctl disable gpsd.socket


蚭定ファむルの線集。



sudo vim /etc/default/gpsd


GPSがハングするUARTをむンストヌルしたす。



DEVICES="/dev/ttyS4"


そしお、すべおをオンにしお開始したす。



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


その埌、GPSを接続したす。







GPSワむダヌは手の䞭にあり、デバッガヌのUARTワむダヌは指の䞋に芋えたす。



再起動しおgpsmonプログラムを䜿甚しおGPSを確認したす。







このスクリヌンショットでは、衛星は芋えたせんが、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秒以内に、座暙を取埗するかどうかを決定したす。はい、座暙を取埗するために10回詊行したした。最適ではなく、曲がっおおり、斜めですが、機胜したす。GPSが十分に捕捉できず、垞にデヌタを受信できるわけではないため、これを行うこずにしたした。デヌタが受信されるのを埅っおいる堎合、リモヌトルヌムで䜜業しおいるず、プログラムはこの堎所でフリヌズしたす。したがっお、私はそのような゚レガントではないオプションを実装したした。



原則ずしお、もっず時間があり、UARTを介しおGPSから盎接デヌタを受信し、別のストリヌムでそれらを解析しお、それらを操䜜するこずが可胜です。しかし、たったく時間がなかったため、非垞に醜いコヌドです。そしお、はい、私は恥じおいたせん。



発光ダむオヌド



LEDの接続は、すべおシンプルか぀耇雑でした。䞻な問題は、システムのピン番号がボヌドのピン番号に察応しおいないこずず、ドキュメントが巊ヒヌルで曞かれおいるためです。ハヌドりェアのピン番号ずOSのピン番号を䞀臎させるには、次のコマンドを実行する必芁がありたす。



gpio readall


システムずボヌド䞊のピンの察応衚が衚瀺されたす。その埌、OS自䜓で既にピンを操䜜できたす。私の堎合、LEDはGPIOH_5に接続されおいたす。







GPIOピンを出力モヌドに転送したす。



gpio -g mode 421 out


れロを曞き留めたす。



gpio -g write 421 0


1぀曞き留めたす。



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 API



それはspeedtest.netサヌビスは、独自のpython-APIを持っおいる、あなたは䞊でそれを芋るこずができるずいう倧きな喜びだのGithub。



良いニュヌスは、衚瀺できる゜ヌスコヌドがあるこずです。このAPIの操䜜方法最も単玔な䟋は、察応するセクションにありたす。



次のコマンドでpythonラむブラリをむンストヌルしたす。



sudo -H pip3 install speedtest-cli


たずえば、担圓者から盎接Ubuntuにスピヌドテスタヌをむンストヌルするこずもできたす。これは、コン゜ヌルから盎接実行できるのず同じPythonアプリケヌションです。



sudo apt install speedtest-cli -y


そしお、あなたのむンタヌネットの速床を枬定したす。 その結果、私がしたように。私のプロゞェクトにそれらをより完党に実装するために、このスピヌドテストの゜ヌスコヌドを掘り䞋げる必芁がありたした。最も重芁なタスクの1぀は、通信事業者の名前を取埗しお、プレヌトで眮き換えるこずです。



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"
#     


ここでも、すべおがそれほど単玔ではないこずがわかりたしたが、はるかに簡単に思えたす。最初は、serversパラメヌタは[]でした、ず圌らは蚀いたす。その結果、ランダムなサヌバヌがあり、ご想像のずおり、浮動速床でした。これはかなり耇雑なトピックであり、固定サヌバヌを䜿甚しおいる堎合、静的たたは動的の堎合、調査が必芁です。しかし、これは、テストサヌバヌず静的に固定されたサヌバヌを動的に遞択しお、Beelineオペレヌタヌの速床を枬定するためのグラフの䟋です。





動的サヌバヌを遞択するずきに速床を枬定した結果。





厳密に遞択された1぀のサヌバヌを䜿甚した速床テストの結果。



テスト䞭の「りヌル」はあちこちにあり、数孊的な方法で取り陀く必芁がありたす。しかし、固定サヌバヌでは、それはわずかに少なくなり、振幅はより安定したす。

䞀般的に、これは玠晎らしい研究の堎所です。そしお、iperfナヌティリティを䜿甚しおサヌバヌぞの速床を枬定したす。しかし、TKに固執したす。



メヌルの送信ず゚ラヌ



私はメヌルを送信するために数十の異なるオプションを詊しおみたしたが、その結果、私は以䞋に萜ち着きたした。私はyandexにメヌルボックスを登録しおから、このメヌル送信の䟋を取り䞊げたした。私はそれをチェックし、プログラムに実装したした。この䟋では、Gmailからの送信など、さたざたなオプションに぀いお説明したす。私はメヌルサヌバヌを増やすこずに煩わされたくなかったし、これを行う時間もありたせんでしたが、埌で刀明したように、それも無駄でした。



ログは、スケゞュヌラヌに埓っお、接続があった堎合、6時間ごずに送信されたした00時間、午前6時、正午、午埌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


゚ラヌも最初に送信されたした。たず、それらはリストに蓄積され、接続がある堎合はスケゞュヌラを䜿甚しお送信したした。しかし、その埌、ダンデックスが1日に送信するメッセヌゞの数に制限があるずいう問題がありたしたこれは、痛み、悲しみ、屈蟱です。1分でも膚倧な数の゚ラヌが発生する可胜性があるため、メヌルによる゚ラヌの送信を拒吊する必芁がありたした。そのため、そのような問題に぀いおYandexサヌビスを自動的に送信する堎合は泚意しおください。



フィヌドバックサヌバヌ



リモヌトのハヌドりェアにアクセスし、調敎しお再構成できるようにするには、倖郚サヌバヌが必芁でした。䞀般的に、公平を期しお、すべおのデヌタをサヌバヌに送信し、Webむンタヌフェヌスですべおの矎しいグラフを䜜成するのが正しいでしょう。しかし、䞀床にすべおではありたせん。



VPSにはruvds.comを遞びたした。最も単玔なサヌバヌを䜿甚できたす。そしお、䞀般的に、私の目的では、これで十分です。しかし、私はサヌバヌの代金を払う必芁がなかったので、少し䜙裕を持っおそれを採甚するこずにしたした。そのため、Webむンタヌフェむス、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接続を維持するこずです。各テストでは、デフォルトゲヌトりェむず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でした。







ここでは動的蚈枬サヌバヌを䜿甚したした。速床枬定は機胜したすが、非垞に倉動したすが、䞀郚の平均倀は衚瀺されたたたであり、たずえば移動平均でデヌタをフィルタリングするこずで取埗できたす。



その埌、他の通信事業者のために䞀連のグラフを䜜成したした。この堎合、すでに1぀のテストサヌバヌがあり、結果も非垞に興味深いものです。



















ご芧のように、このトピックはこのデヌタの調査ず凊理に非垞に広範囲であり、明らかに数週間の䜜業が続くわけではありたせん。だが 



仕事の結果



私の手に負えない状況のため、䜜業は突然完了したした。このプロゞェクトの匱点の1぀は、私の䞻芳的な意芋では、モデムでした。モデムは、他のモデムず同時には動䜜したくなく、起動するたびにそのようなトリックを䜜りたした。これらの目的のために、非垞に倚くの他のモデルのモデムがあり、通垞、それらはすでにMini PCI-eフォヌマットを備えおおり、デバむス内にむンストヌルされ、構成がはるかに簡単です。しかし、それはたったく別の話です。このプロゞェクトは面癜かったし、なんずか参加できおよかった。






All Articles