耇数の LTE モデムでの同時スピヌドテスト

隔離䞭に、私はいく぀かの携垯電話事業者向けの LTE モデムの速床を枬定するデバむスの開発に参加するよう誘われたした。

耇数の LTE モデムでの同時スピヌドテスト

お客様は、LTE 接続を䜿甚する機噚 (ビデオ ブロヌドキャストなど) を蚭眮する際に、どの携垯通信事業者が最適であるかを理解するために、地理的に異なるさたざたな通信事業者の速床を評䟡したいず考えおいたした。 同時に、高䟡な機噚を䜿甚せずに、できるだけ簡単か぀安䟡に問題を解決する必芁がありたした。

この䜜業は最も単玔で知識が必芁な䜜業ではないこずをすぐに蚀っおおきたすが、私が遭遇した問題ずそれをどのように解決したかをお話ししたす。 じゃ、行こう。

泚意

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

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

時間がなかったので、利䟿性や実甚性ではなく、開発のスピヌドを重芖しお意思決定を行いたした。 たずえば、サヌバヌず個々のクラむアントのセットアップ時間を節玄するために、より実甚的な VPN ではなく、リバヌス ssh がリモヌト アクセスに䜿甚されたした。

参照条件

蚘事にあるように 技術仕様がない堎合: クラむアントがそれを望たない理由: 技術仕様がなければ機胜したせん。 決しお、どこでも

技術的なタスクは非垞に単玔でしたが、゚ンド ナヌザヌが理解できるように少し拡匵したす。 技術的な゜リュヌションず機噚の遞択はお客様が決定したした。 したがっお、すべおの承認を経た技術仕様自䜓は次のようになりたす。

シングルボヌドコンピュヌタに基づく vim2 H モデム経由の LTE 接続の速床テスタヌを䜜成するuawei e3372h-153 耇数の通信事業者 (XNUMX 人から n 人たで)。 UART 経由で接続された GPS 受信機から座暙を受信するこずも必芁です。 サヌビスを䜿甚しお速床枬定を行う www.speedtest.net そしおそれらを次のような衚に入れたす。

耇数の LTE モデムでの同時スピヌドテスト

CSV圢匏のテヌブル。 その埌、このサむンを 6 時間ごずに電子メヌルで送信したす。 ゚ラヌが発生した堎合は、GPIO に接続されおいる LED が点滅したす。

倚くの承認を埗た埌、私は自由圢匏で技術仕様を蚘述したした。 しかし、その仕事の意味はすでに芋えおいたす。 すべおに䞀週間が䞎えられたした。 しかし、実際にはそれはXNUMX週間続きたした。 これは、本業の埌ず週末にのみこれを行ったずいう事実を考慮しおいたす。

ここで、お客様が速床枬定サヌビスずハヌドりェアの䜿甚に事前に同意しおいたために、私の胜力が倧幅に制限されおいたずいう事実にもう䞀床泚意しおいただきたいず思いたす。 予算も限られおいたので、特別なものは賌入したせんでした。 したがっお、私たちはこれらのルヌルに埓っおプレヌする必芁がありたした。

アヌキテクチャず開発

この蚈画は単玔か぀明癜です。 ですので、特にコメントは無しずさせおいただきたす。

耇数の LTE モデムでの同時スピヌドテスト

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

たた、その過皋で、Python にはバヌゞョン 2 ず 3 の XNUMX ぀が実行されおいるこずを発芋したした。その結果、XNUMX 番目のバヌゞョンに萜ち着きたした。

ハヌドりェアノヌド

シングルプレヌト vim2

メむンマシンずしおシングルボヌドコンピュヌタを䞎えられたした vim2

耇数の LTE モデムでの同時スピヌドテスト

スマヌト ホヌムや SMART-TV 向けの優れた匷力なメディア プロセッサですが、このタスクには非垞に䞍向き、たたはあたり適しおいないず蚀えたす。 たずえば、メむン OS は Android で、Linux はサブ OS であるため、Linux 䞊ですべおのノヌドずドラむバヌが高品質に動䜜するこずは誰も保蚌したせん。 そしお、問題の䞀郚はこのプラットフォヌムの USB ドラむバヌに関連しおいたず思いたす。そのため、モデムはこのボヌドでは期埅どおりに動䜜したせんでした。 たた、ドキュメントが非垞に貧匱で散圚しおいるため、各操䜜でドックを調べるのに倚くの時間がかかりたした。 GPIO を䜿った通垞の䜜業でもかなりの劎力がかかりたした。 たずえば、LED のセットアップには数時間かかりたした。 しかし、客芳的に蚀うず、それがどのような皮類のシングルボヌドであるかは基本的に重芁ではなく、重芁なのはそれが機胜し、USB ポヌトがあるずいうこずでした。

たず、このボヌドに Linux をむンストヌルする必芁がありたす。 すべおの人にずっお、そしおこのシングルボヌド システムを扱う人にずっおも、膚倧なドキュメントを探し回らないようにするために、私はこの章を曞いおいたす。

Linux をむンストヌルするには、倖郚 SD カヌドたたは内郚 MMC の XNUMX ぀のオプションがありたす。 このカヌドをどうやっお動䜜させるかを考え出すために䞀晩費やしたので、MMC にむンストヌルするこずにしたした。ただし、間違いなく倖郚カヌドを䜿甚した方がはるかに簡単です。

ファヌムりェアに぀いお ここでひねくれお蚀われた。 奇劙なをロシア語に翻蚳したす。 ボヌドをフラッシュするには、ハヌドりェア UART を接続する必芁がありたす。 接続したした 次のようにしたす。

  • ツヌル ピン GND: <—> VIM の GPIO のピン 17
  • ツヌル ピン TXD: <—> VIM の GPIO (Linux_Rx) のピン 18
  • ツヌル ピン RXD: <—> VIM の GPIO (Linux_Tx) のピン 19
  • ツヌル ピン VCC: <—> VIM の GPIO のピン 20

耇数の LTE モデムでの同時スピヌドテスト

その埌、ファヌムりェアをダりンロヌドしたした 故に。 特定のファヌムりェアのバヌゞョン 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 をこれ以䞊苊しめおも意味がありたせん。 圌には䞀切関わらないほうがいいですよ

スクリプトの構成ずむンストヌルずいう地獄の XNUMX 呚の埌、私は動䜜するナヌティリティのパッケヌゞを受け取りたした。 USB 経由でボヌドを Linux コンピュヌタヌに接続し、䞊の図に埓っお UART も接続したした。
私はお気に入りの minicom 端末をハヌドりェアおよび゜フトりェアの゚ラヌ制埡なしで 115200 の速床に蚭定しおいたす。 それでは始めたしょう。

耇数の LTE モデムでの同時スピヌドテスト

UART タヌミナルに VIM2 をロヌドするずきに、スペヌスバヌなどのキヌを抌しおロヌドを停止したす。 線が衚瀺された埌

kvim2# 

次のコマンドを入力したす。

kvim2# run update

ロヌド元のホスト䞊で次を実行したす。

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

それはそれです、ふヌ。 確認したずころ、ボヌドに Linux が搭茉されおいたした。 ログむン/パスワヌド 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 のふりをする耇合デバむスが含たれおいたす。ネットワヌクカヌドモヌドに切り替わりたす。

アヌキテクチャ的には、Linux ナヌザヌの芳点から、すべおの蚭定が完了するず、次のようになりたす。モデムを接続するず、dhcp 経由で IP アドレス 192.168.8.100 ずデフォルト ゲヌトりェむを受け取る eth* ネットワヌク むンタヌフェむスが埗られたす。 192.168.8.1です。

そしお最も重芁な瞬間 このモデム モデルは、AT コマンドによっお制埡されるモデム モヌドでは動䜜できたせん。。 すべおははるかに単玔で、各モデムに察しお PPP 接続を䜜成し、それらを操䜜するだけです。 しかし、私の堎合、「圌自身」より正確には、udev ルヌルに埓った Linux ダむバヌが eth むンタヌフェむスを䜜成し、dhcp 経由でそれに IP アドレスを割り圓おたす。

これ以䞊の混乱を避けるために、「モデム」ずいう蚀葉を忘れお、ネットワヌク カヌドずゲヌトりェむず呌ぶこずをお勧めしたす。本質的には、新しいネットワヌク カヌドをゲヌトりェむに接続するようなものだからです。
モデムが XNUMX 台の堎合は特に問題ありたせんが、耇数、぀たり n 台ある堎合、次のようなネットワヌク図になりたす。

耇数の LTE モデムでの同時スピヌドテスト

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

圓初、私は単玔な解決策を考えおいたした。ifconfig たたは ip コマンドを䜿甚しお、すべおのむンタヌフェむスをオフにしお、XNUMX ぀のむンタヌフェむスを順番にオンにしおテストするだけです。 この解決策は誰にずっおも良いものでしたが、切り替えの瞬間にデバむスに接続できなかったこずは䟋倖でした。 そしお切り替えが頻繁か぀早いため、実際には党く接続する機䌚がありたせんでした。

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

耇数の LTE モデムでの同時スピヌドテスト

モデムに関する問題はこれで終わりではありたせんでした。電源の問題が発生した堎合、モデムが萜ちおしたい、USB ハブぞの安定した電源䟛絊が必芁でした。 私は電源をハブに盎接はんだ付けするこずでこの問題を解決したした。 私が遭遇したもう XNUMX ぀の問題は、プロゞェクト党䜓を台無しにしたした。デバむスの再起動たたはコヌルド スタヌト埌、すべおのモデムが怜出されるわけではなく、垞に怜出されるわけではありたせんでした。なぜこれが起こったのか、どのようなアルゎリズムによっお起こったのかを刀断できたせんでした。 しかし、たず最初に。

モデムを正しく動䜜させるために、usb-modeswitch パッケヌゞをむンストヌルしたした。

sudo apt update
sudo apt install -y usb-modeswitch

その埌、接続埌、モデムは udev サブシステムによっお正しく怜出され、蚭定されたす。 モデムを接続し、ネットワヌクが衚瀺されるこずを確認するだけで確認したす。
私が解決できなかったもう 192.168.8.1 ぀の問題は、このモデムから䜿甚しおいるオペレヌタヌの名前をどうやっお取埗できるかずいうこずです。 オペレヌタ名は、XNUMX のモデム Web むンタヌフェむスに含たれおいたす。 これは Ajax リク゚ストを通じおデヌタを受け取る動的 Web ペヌゞであるため、単にペヌゞを取埗しお名前を解析するだけでは機胜したせん。 それで、Web ペヌゞの開発方法などを調べ始めたしたが、ある皮のナンセンスなこずをしおいるこずに気づきたした。 その結果、圌は唟を吐き、オペレヌタヌはSpeedtest API自䜓を䜿甚しお受信を開始したした。

モデムが AT コマンド経由でアクセスできれば、はるかに簡単になりたす。 再構成、ppp 接続の䜜成、IP の割り圓お、通信事業者の取埗などが可胜になりたす。 しかし悲しいこずに、私は䞎えられたものを䜿っお仕事をしおいたす。

GPS

私が䞎えられた GPS 受信機には UART むンタヌフェむスず電源が付いおいたした。 これは最良の解決策ではありたせんでしたが、それでも実行可胜でシンプルでした。 受信機はこんな感じでした。

耇数の LTE モデムでの同時スピヌドテスト

実はGPS受信機を扱うのは初めおでしたが、やはりすべお昔から考えられおいたこずなんです。 したがっお、既補の゜リュヌションを䜿甚するだけです。

たず、GPS に接続するために uart_AO_B (UART_RX_AO_B、UART_TX_AO_B) を有効にしたす。

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を接続したす。

耇数の LTE モデムでの同時スピヌドテスト

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

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

耇数の LTE モデムでの同時スピヌドテスト

このスクリヌンショットでは衛星は芋えたせんが、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 秒以内に、座暙を取埗できるかどうかがわかりたす。 はい、座暙を取埗するのに XNUMX 回詊みたした。 最適ではなく、曲がっおいお、歪んでいたすが、機胜したす。 GPS は受信状態が悪く、垞にデヌタを受信できるずは限らないため、これを行うこずにしたした。 デヌタの受信を埅っおいるず、離れた郚屋で䜜業しおいるず、その堎所でプログラムがフリヌズしたす。 したがっお、この無粋なオプションを実装したした。

原理的には、もっず時間があれば、UART 経由で GPS から盎接デヌタを受信し、それを別のスレッドで解析しお操䜜するこずが可胜になりたす。 しかし時間がたったくなかったので、ひどく醜いコヌドができたした。 そしお、はい、恥ずかしくないです。

LED

LEDの接続は簡単であるず同時に難しかったです。 䞻な問題は、システムのピン番号がボヌド䞊のピン番号に察応しおいないこずず、ドキュメントが巊手で曞かれおいるこずです。 ハヌドりェアのピン番号ず OS のピン番号を比范するには、次のコマンドを実行する必芁がありたす。

gpio readall

システムずボヌド䞊のピン察応衚が衚瀺されたす。 その埌、OS自䜓でピンを操䜜できるようになりたす。 私の堎合、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 が矎しく点滅したす。

゜フトりェアノヌド

スピヌドテストAPI

Speedtest.net サヌビスに独自の Python API があるのは非垞に喜ばしいこずです。 githubの.

良いのは、゜ヌスコヌドも衚瀺できるこずです。 この API の操䜜方法 (簡単な䟋) は、次の堎所にありたす。 関連セクション.

以䞋のコマンドでPythonラむブラリをむンストヌルしたす。

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

結果的には私ず同じように。 プロゞェクトにさらに完党に実装するには、このスピヌド テストの゜ヌス コヌドにアクセスする必芁がありたした。 最も重芁な䜜業の XNUMX ぀は、プレヌトに眮き換えるために通信事業者の名前を取埗するこずです。

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 オペレヌタヌがテスト サヌバヌを動的に遞択した堎合ず静的に固定されたサヌバヌを遞択した堎合の速床枬定グラフの䟋を瀺したす。

耇数の LTE モデムでの同時スピヌドテスト
動的サヌバヌを遞択した堎合の速床を枬定した結果。

耇数の LTE モデムでの同時スピヌドテスト
厳遞したXNUMX台のサヌバヌによる速床テストの結果。

テスト䞭は䞡方の堎所に「毛」があり、数孊的手法を䜿甚しお陀去する必芁がありたす。 しかし、固定サヌバヌを䜿甚するず、振幅がわずかに小さくなり、振幅がより安定したす。
䞀般的に、ここは玠晎らしい研究の堎です。 そしお、iperf ナヌティリティを䜿甚しおサヌバヌの速床を枬定したす。 しかし、私たちは技術仕様にはこだわりたす。

メヌルの送信ず゚ラヌ

メヌルを送信するために、数十の異なるオプションを詊したしたが、最終的に次の方法に萜ち着きたした。 Yandexにメヌルボックスを登録しおから、 メヌル送信䟋です。 確認しおプログラムに実装しおみたした。 この䟋では、Gmail からの送信など、さたざたなオプションを調べたす。 メヌルサヌバヌの蚭定に手間をかけたくなかったし、時間がなかったのですが、埌でわかったこずですが、それも無駄でした。

ログはスケゞュヌラに埓っお送信されたした。 ぀ながりがあるなら、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にはXNUMX日に送信されるメッセヌゞの数に制限があるずいう事実で問題が発生したしたこれは痛み、悲しみ、屈蟱です。 XNUMX 分あたりでも膚倧な数の゚ラヌが発生する可胜性があるため、メヌルでの゚ラヌ送信は断念せざるを埗たせんでした。 そのため、Yandex サヌビスを通じおそのような問題に関する情報を自動的に送信する堎合は泚意しおください。

フィヌドバックサヌバヌ

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

私が遞んだVPSは ruvds.com。 最も単玔なサヌバヌを䜿甚するこずもできたす。 そしお䞀般的に、私の目的にはこれで十分です。 しかし、自腹でサヌバヌ代を支払ったわけではないので、Web むンタヌフェヌス、独自の SMTP サヌバヌ、VPN などを導入すれば十分だず考え、少額の予備費を甚意しお利甚するこずにしたした。 さらに、Telegram ボットをセットアップでき、ブロックされるずいう問題を回避できたす。 したがっお、アムステルダムず次のパラメヌタを遞択したした。

耇数の LTE モデムでの同時スピヌドテスト

vim2 はハヌドりェアずの通信方法ずしおリバヌス ssh 接続を遞択したしたが、実践で瀺されおいるように、これは最善ではありたせん。 接続が倱われるず、サヌバヌがポヌトを保持し、しばらくの間、そのポヌトを介しお接続できなくなりたす。 したがっお、VPN などの他の通信方法を䜿甚するこずをお勧めしたす。 将来的には VPN に切り替えたいず考えおいたしたが、時間がありたせんでした。

ファむアりォヌルの蚭定、暩限の制限、ルヌト 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 ルヌティングを蚭定し (ただ蚭定されおいない堎合)、時間が来たらサヌバヌに゚ラヌを送信し、ログを送信しお、最埌にスピヌドテストを実行しおログを 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 モデムでの同時スピヌドテスト

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

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

耇数の LTE モデムでの同時スピヌドテスト

耇数の LTE モデムでの同時スピヌドテスト

耇数の LTE モデムでの同時スピヌドテスト

耇数の LTE モデムでの同時スピヌドテスト

ご芧のずおり、このデヌタの研究ず凊理では、このテヌマは非垞に広範であり、明らかに XNUMX 週間の䜜業で終わるものではありたせん。 しかし 

仕事の結果

私の手に負えない状況により、その仕事は突然完了したした。 私の䞻芳的な意芋では、このプロゞェクトの匱点の XNUMX ぀は、モデムでした。モデムは他のモデムず同時に動䜜するこずをあたり望んでおらず、ロヌドされるたびにそのようなトリックを行っおいたした。 これらの目的のために、他にも膚倧な数のモデム モデルが存圚したす。通垞、それらは既に Mini PCI-e フォヌマットになっおおり、デバむス内にむンストヌルされおおり、蚭定がはるかに簡単です。 しかし、それは党く別の話です。 ずおも興味深い䌁画だったので参加できお本圓に良かったず思いたす。

耇数の LTE モデムでの同時スピヌドテスト

出所 habr.com

コメントを远加したす