在多个 LTE 调制解调器上同时进行速度测试

在隔离期间,我受邀参与为多家蜂窝运营商开发一款用于测量 LTE 调制解调器速度的设备。

在多个 LTE 调制解调器上同时进行速度测试

该客户希望评估不同地理位置的各个电信运营商的速度,以便能够了解在使用 LTE 连接安装设备(例如用于视频广播)时哪个蜂窝运营商最适合他。 同时,必须尽可能简单且廉价地解决该问题,而无需使用昂贵的设备。

我马上就说这个任务不是最简单、知识最密集的;我会告诉你我遇到了什么问题以及我是如何解决的。 那么,我们走吧。

注意

测量 LTE 连接的速度是一件非常复杂的事情:您需要选择正确的设备和测量技术,并且还需要充分了解蜂窝网络的拓扑和操作。 另外,速度可能会受到多种因素的影响:小区上的用户数量、天气条件,甚至小区之间的速度也会因网络拓扑而发生巨大变化。 总的来说,这是一个存在大量未知数的问题,只有电信运营商才能正确解决。

最初,客户只是想用运营商的手机驱动快递员,直接在手机上进行测量,然后将速度测量结果记在笔记本上。 我的测量 lte 网络速度的解决方案虽然不理想,但解决了问题。

由于时间不够,我做出的决定不是为了方便或实用,而是为了开发速度。 例如,使用反向 ssh 进行远程访问,而不是更实用的 VPN,以节省设置服务器和每个客户端的时间。

职权范围

正如文章中所说 没有技术规范:为什么客户不想要它: 没有技术规范就不要工作! 从来没有,任何地方!

技术任务非常简单,为了最终用户的理解,我将对其进行一些扩展。 技术解决方案和设备的选择由客户决定。 因此,在获得所有批准后,技术规范本身:

基于单板计算机 vim2 通过 H 调制解调器制作 lte 连接速度测试仪华为 E3372H - 153 多家电信运营商(从 XNUMX 到 n)。 还需要从通过 UART 连接的 GPS 接收器接收坐标。 使用该服务进行速度测量 www.speedtest.net 并将它们放入表格中,例如:

在多个 LTE 调制解调器上同时进行速度测试

csv 格式的表。 然后每 6 小时通过电子邮件发送此标志。 如果出现错误,请使连接到 GPIO 的 LED 闪烁。

经过多次批准后,我以自由形式描述了技术规范。 但任务的意义已经可见。 所有事情都给了一周的时间。 但实际上它持续了三个星期。 这是考虑到我只在主要工作结束后和周末才这样做的事实。

这里我想再次提请注意的是,客户事先同意了测速服务和硬件的使用,这极大地限制了我的能力。 预算也有限,所以没有购买什么特别的东西。 所以我们必须遵守这些规则。

架构与开发

该方案简单明了。 因此,我将不做任何特别评论。

在多个 LTE 调制解调器上同时进行速度测试

我决定用 python 实现整个项目,尽管我根本没有用这种语言进行开发的经验。 我选择它是因为有很多现成的示例和解决方案可以加快开发速度。 因此,我请求所有专业程序员不要责骂我第一次使用Python开发的经历,我总是很高兴听到建设性的批评来提高我的技能。

同样在这个过程中我发现python有两个运行版本2和3,因此我选择了第三个。

硬件节点

单板vim2

我得到了一台单板计算机作为我的主机 vim2

在多个 LTE 调制解调器上同时进行速度测试

一款适用于智能家居和智能电视的优秀而强大的媒体处理器,但非常不适合这项任务,或者可以说,很不适合。 例如,其主要操作系统是Android,Linux是次要操作系统,因此无法保证Linux下所有节点和驱动程序的高质量运行。 我认为一些问题与该平台的 USB 驱动程序有关,因此调制解调器在该板上无法按预期工作。 它还拥有非常糟糕且分散的文档,因此每次操作都需要花费大量时间在码头上进行挖掘。 即使是普通的 GPIO 工作也要耗费大量的血。 例如,我花了几个小时来设置 LED。 但客观来说,是什么单板根本不重要,重要的是能用,有USB接口。

首先,我需要在这块板上安装Linux。 为了不为每个人以及那些将要处理这个单板系统的人搜寻大量的文档,我正在编写本章。

安装 Linux 有两种选择:安装在外部 SD 卡上或安装在内部 MMC 上。 我花了一个晚上试图弄清楚如何让它与卡一起工作,所以我决定将它安装在 MMC 上,尽管毫无疑问与外部卡一起工作会容易得多。

关于固件 这里歪曲地告诉。 我把奇怪的翻译成俄语。 为了刷新开发板,我需要连接硬件 UART。 连接了 如下。

  • 工具引脚 GND:<—> VIM GPIO 的 Pin17
  • 工具引脚 TXD:<—> VIM GPIO 的 Pin18 (Linux_Rx)
  • 工具引脚 RXD:<—> VIM GPIO 的 Pin19 (Linux_Tx)
  • 工具引脚 VCC:<—> VIM GPIO 的 Pin20

在多个 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

Aaand...没有任何作用。 我花了几个小时编辑安装脚本,以便一切都能正确安装。 我不记得我在那里做了什么,但那里还有马戏团。 所以要小心。 但如果没有这些实用程序,就没有必要进一步折磨 vim2。 最好还是别去招惹他!

经过七圈地狱、脚本配置和安装,我收到了一个工作实用程序包。 我通过 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 更好。 诚实地。

调制解调器华为 e3372h – 153

这个调制解调器对我来说是一个重要的血液来源,事实上,它成为了整个项目的瓶颈。 一般来说,这些设备的“调制解调器”名称根本不能反映工作的本质:这是一个功能强大的组合,这个硬件有一个复合设备,它伪装成 CD-ROM 以安装驱动程序,然后切换到网卡模式。

从架构上来说,从 Linux 用户的角度来看,完成所有设置后,它看起来像这样:连接调制解调器后,我有一个 eth* 网络接口,它通过 dhcp 接收 IP 地址 192.168.8.100 和默认网关是 192.168.8.1。

还有最重要的时刻! 该调制解调器型号无法工作在调制解调器模式下,该模式由 AT 命令控制。 一切都会变得更加简单,为每个调制解调器创建 PPP 连接,然后使用它们进行操作。 但就我而言,“他自己”(更准确地说,是根据 udev 规则的 Linux 驱动程序)创建一个 eth 接口并通过 dhcp 为其分配一个 IP 地址。

为了避免进一步混淆,我建议忘记“调制解调器”这个词,而说网卡和网关,因为本质上,这就像将新网卡与网关连接一样。
当有一个调制解调器时,这不会引起任何特殊问题,但当有多个调制解调器(即n个)时,就会出现以下网络图片。

在多个 LTE 调制解调器上同时进行速度测试

即,n 个网卡,具有相同的 IP 地址,每个网卡具有相同的默认网关。 但事实上,它们每个都连接到自己的运营商。

最初,我有一个简单的解决方案:使用 ifconfig 或 ip 命令,关闭所有接口,然后依次打开一个并进行测试。 该解决方案对每个人都有好处,只是在切换期间我无法连接到设备。 而且由于切换频繁且速度快,我实际上根本没有机会联系。

因此,我选择了手动更改调制解调器的 IP 地址,然后使用路由设置驱动流量的路径。

在多个 LTE 调制解调器上同时进行速度测试

这并不是我的调制解调器问题的结束:如果出现电源问题,它们就会脱落,并且需要为 USB 集线器提供良好稳定的电源。 我通过将电源直接硬焊接到集线器上解决了这个问题。 我遇到的另一个问题破坏了整个项目:设备重新启动或冷启动后,并非所有调制解调器都被检测到,而且并非总是如此,我无法确定为什么会发生这种情况以及通过什么算法进行。 但首先要说的是。

为了使调制解调器正常工作,我安装了 usb-modeswitch 软件包。

sudo apt update
sudo apt install -y usb-modeswitch

之后,连接后,udev 子系统将正确检测并配置调制解调器。 我只需连接调制解调器并确保网络出现即可进行检查。
我无法解决的另一个问题:如何从该调制解调器获取我们正在使用的操作员的名称? 操作员名称包含在调制解调器 Web 界面 192.168.8.1 中。 这是一个动态网页,通过Ajax请求接收数据,所以简单地获取页面并解析名称是行不通的。 于是我开始研究如何开发网页等,并意识到我在做一些无意义的事情。 结果,他吐了口水,运营商开始使用 Speedtest API 本身进行接收。

如果调制解调器可以通过 AT 命令进行访问,那就容易多了。 可以重新配置它、创建 ppp 连接、分配 IP、联系电信运营商等。 但可惜的是,我正在按照我所得到的去做。

全球定位系统

我得到的 GPS 接收器有一个 UART 接口和电源。 这不是最好的解决方案,但它仍然可行且简单。 接收器看起来像这样。

在多个 LTE 调制解调器上同时进行速度测试

说实话,这是我第一次使用 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

我正在安装一个 UART,GPS 将挂在其上。

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 秒内我要么得到坐标,要么得不到坐标。 是的,我尝试了十次来获取坐标。 不是最佳的,歪斜的,但它有效。 我决定这样做是因为 GPS 的接收效果可能很差,并且并不总是能接收到数据。 如果你等待接收数据,那么如果你在远程房间工作,程序就会冻结在这个地方。 因此,我实现了这个不优雅的选项。

原则上,如果有更多时间,可以通过 UART 直接从 GPS 接收数据,在单独的线程中解析它并使用它。 但根本没有时间,因此代码极其丑陋。 是的,我并不感到羞耻。

发光二极管

连接 LED 既简单又困难。 主要困难是系统中的引脚号与板上的引脚号不对应,并且因为文档是用左手写的。 要比较硬件引脚号和操作系统中的引脚号,需要运行以下命令:

gpio readall

将显示系统中和电路板上的引脚对应表。 之后我就可以在操作系统本身中操作该引脚了。 在我的例子中,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

结果,就像我一样。 我必须了解此速度测试的源代码,以便更全面地将它们实施到我的项目中。 最重要的任务之一是获取电信运营商的名称,以便将其替换到车牌中。

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 操作员在动态选择测试服务器和静态固定服务器时的速度测量图示例。

在多个 LTE 调制解调器上同时进行速度测试
选择动态服务器时测量速度的结果。

在多个 LTE 调制解调器上同时进行速度测试
速度测试的结果,严格挑选一台服务器。

测试时,两个地方都有“毛皮”,需要用数学方法去除。 但对于固定服务器来说,幅度会稍微小一些,而且幅度更稳定。
总的来说,这是一个进行大量研究的地方。 我会使用 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 对每天发送的消息数量有限制(这是痛苦、悲伤和羞辱)。 由于即使每分钟也可能出现大量错误,因此我们不得不放弃通过邮件发送错误。 因此,在通过 Yandex 服务自动发送有关此类问题的信息时请记住。

反馈服务器

为了访问远程硬件并能够对其进行自定义和重新配置,我需要一台外部服务器。 一般来说,公平地说,将所有数据发送到服务器并在 Web 界面中构建所有漂亮的图表是正确的。 但不是一下子全部完成。

对于VPS我选择 ruvds.com。 您可以采用最简单的服务器。 一般来说,对于我的目的来说,这已经足够了。 但由于我没有自掏腰包购买服务器费用,所以我决定保留少量资金,以便我们部署 Web 界面、我们自己的 SMTP 服务器、VPN 等时就足够了。 另外,能够设置 Telegram 机器人并且不会遇到被阻止的问题。 因此,我选择了阿姆斯特丹和以下参数。

在多个 LTE 调制解调器上同时进行速度测试

作为与硬件通信的方法,vim2 选择了反向 ssh 连接,实践表明,这并不是最好的。 如果连接丢失,服务器会保留该端口,并且在一段时间内无法通过该端口进行连接。 因此,最好还是使用其他通信方式,例如VPN。 以后我想改用VPN,但没有时间。

我不会详细介绍设置防火墙、限制权限、禁用 root 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 调制解调器上同时进行速度测试

这里我使用了动态测量服务器。 速度测量有效,但波动很大,但仍然可见一些平均值,这可以通过过滤数据来获得,例如使用移动平均值。

后来我为其他电信运营商构建了一些图表。 在这种情况下,已经有一台测试服务器,结果也很有趣。

在多个 LTE 调制解调器上同时进行速度测试

在多个 LTE 调制解调器上同时进行速度测试

在多个 LTE 调制解调器上同时进行速度测试

在多个 LTE 调制解调器上同时进行速度测试

正如您所看到的,该主题对于这些数据的研究和处理非常广泛,并且显然不会持续几周的工作。 但…

工作成果

由于我无法控制的情况,这项工作突然完成了。 在我主观看来,这个项目的弱点之一是调制解调器,它并不真正希望与其他调制解调器同时工作,并且每次加载时都会做出这样的伎俩。 出于这些目的,还有大量其他调制解调器型号;通常它们已经采用 Mini PCI-e 格式并安装在设备内部,并且更容易配置。 但这是一个完全不同的故事。 这个项目很有趣,我很高兴能够参与其中。

在多个 LTE 调制解调器上同时进行速度测试

来源: habr.com

添加评论