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

在隔离区,我被邀请参与为多个移动运营商开发用于测量LTE调制解调器速度的设备的开发。







客户想评估不同地理位置的各种电信运营商的速度,以便了解在使用LTE连接安装设备(例如,视频广播)时,哪个移动运营商对他最合适。同时,必须在没有昂贵设备的情况下尽可能简单,廉价地解决任务。



我必须马上说任务不是最简单,最密集的知识,我将告诉您我遇到了什么问题以及如何解决它们。所以走吧



注意



测量LTE连接的速度是一件非常困难的事情:您需要选择正确的设备和测量方法,并且还对蜂窝网络的拓扑和操作有一个很好的了解。此外,速度可能受到以下几个因素的影响:每个小区的订户数量,天气状况,甚至每个小区之间的速度,由于网络拓扑结构的不同,其速度也可能会显着不同。通常,这是一个未知数众多的问题,只有电信运营商才能正确解决。



最初,客户只是想用运营商的电话来开快递,直接在电话上进行测量,然后将速度测量结果记录在笔记本中。我的用于测量LTE网络速度的解决方案虽然不理想,但解决了该问题。



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



技术任务



如文章“ 没有传统知识:客户为什么不想要它没有传统知识不要工作!”中所述。从不,无处!



技术任务非常简单,我将对其进行扩展以了解最终用户。技术解决方案和设备的选择由客户决定。因此,经过所有批准,TK本身:



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







csv. - 6 . , GPIO.


经过许多批准,我以自由形式描述了传统知识。但是任务的含义已经可见。一切的截止日期是一周。但实际上它持续了三个星期。有鉴于此,我只在主要工作之后和周末才这样做。



在此,我想提请您注意以下事实:客户之前已经同意使用速度测量服务和硬件,这极大地限制了我的能力。预算也很有限,因此什么也没买。所以我必须遵守这些规则。



建筑与发展



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







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



同样在此过程中,我发现python有两个正在运行的版本2和3,因此,我在第三个版本停止了运行。



硬件节点



单板vim2



作为主机,我得到了单板vim2







出色,功能强大的媒体可用于智能家居和SMART-TV,但极其不适合此任务,或者,我们说它不太适合。例如,它的主要操作系统是Android,而Linux是一个经过的操作系统,因此没有人可以保证Linux下所有节点和驱动程序的高质量运行。而且我认为某些问题与该平台的USB驱动程序有关,因此调制解调器无法在此板上正常工作。他的文档也很差很零散,因此每次操作都要花很多时间在码头上进行挖掘。即使是使用GPIO的普通工作也消耗了很多血。例如,我花了几个小时来设置LED的工作。但是,客观地说,哪种单板设备根本不重要,主要是它应该可以工作并具有USB端口。



首先,我需要在此板上安装Linux。为了避免为所有人以及将要使用此单板设备的人员打乱所有文档,我正在撰写本章。



有两种安装Linux的选项:在外部SD卡或内部MMC上。我在晚上用卡苦苦挣扎,不知道如何使它工作,所以我决定将它安装在MMC上,尽管毫无疑问,使用外部卡会容易得多。



固件在此处歪斜描述我正在从陌生翻译成俄语。为了使开发板刷新,我需要连接硬件UART。我将其连接如下。



  • 工具引脚GND:<—> VIM的GPIO的引脚17
  • 工具引脚TXD:<—> VIM的GPIO的引脚18(Linux_Rx)
  • 工具引脚RXD:<—> VIM的GPIO的引脚19(Linux_Tx)
  • 工具引脚VCC:VIM的GPIO的<—>引脚20






之后,我从这里下载固件特定固件版本为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。最好不要惹他!



经过七周的苦难,脚本配置和安装,我得到了一个可以使用的实用程序包。我通过USB将开发板连接到我的Linux计算机,并且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


大家 我问,主板上有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连接,然后对其进行操作。但是在我的情况下,“ myself”(更确切地说是根据udev规则的Linux潜水员)创建了一个eth-interface,并通过dhcp为其分配了ip-address。



为了不引起进一步的混淆,我建议忘记使用“调制解调器”一词,而是说网卡和网关,因为实际上这就像将新的网卡与网关相连。

当有一个调制解调器时,这不会引起任何特殊问题,但是当有多个调制解调器(即n个)时,将出现以下网络图。







即,n个网卡具有相同的IP地址,每个网卡具有相同的默认网关。但实际上,它们每个都连接到其自己的操作员。



最初,我有一个简单的解决方案:使用ifconfig或ip命令消除所有接口,然后依次打开一个接口并对其进行测试。该解决方案对每个人都很好,除了在切换的那一刻,我无法连接到设备。而且由于切换频繁且快速,因此实际上我根本没有机会进行连接。



因此,我选择了“手动”更改调制解调器IP地址并继续使用路由设置来驱动流量的方法。







这不是我的调制解调器问题的终点:万一电源出现问题,它们掉线了,则需要为USB集线器提供稳定的电源。通过将电源直接硬焊接到集线器可以解决此问题。我面临的另一个问题是整个项目的失败:重新启动设备或冷启动设备后,并非所有调制解调器都被检测到并且并非总是被检测到,以及为什么会发生这种情况以及无法通过哪种算法安装。但是首先是第一件事。



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



sudo apt update
sudo apt install -y usb-modeswitch


之后,udev子系统将正确检测和配置连接后的调制解调器。我只需插入调制解调器并确保网络正常就可以进行检查。

我无法解决的另一个问题:如何从此调制解调器获取与我们合作的运营商的名称?运营商的名称包含在调制解调器的Web界面中,地址为192.168.8.1。这是一个动态网页,它通过ajax请求接收数据,因此您不能仅仅获取页面并解析名称。因此,我开始研究如何制作网页等,并意识到自己在做些废话。结果,他吐口水,并开始使用Speedtest本身的API来接收操作员。



如果可以通过AT命令访问调制解调器,那么许多事情将变得更加容易。可以重新配置它,创建ppp连接,分配IP,获取运营商等。但是,a,我会尽我所能。



全球定位系统



给我的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秒钟之内,我是否会得到坐标。是的,我有十次尝试获取坐标。不是最佳的,弯曲的和歪斜的,但是可以工作。我之所以决定这样做,是因为GPS的捕捉能力很差,而且并不总是接收数据。如果您等待接收数据,那么如果您在偏远的房间工作,程序将在此位置冻结。因此,我实现了这样一个不太好的选择。



原则上,将有更多时间,有可能直接通过UART从GPS接收数据,将其解析为单独的流并与它们一起使用。但是根本没有时间,因此凶悍的丑陋代码。是的,我不感到羞耻。



发光二极管



同时连接LED既简单又复杂。主要困难在于系统中的针脚编号与板上的针脚编号不对应,并且因为文档使用左脚跟书写。要匹配硬件引脚号和操作系统中的引脚号,您需要运行以下命令:



gpio readall


将显示系统中和板上的引脚对应表。之后,我已经可以在OS本身中操作该引脚了。在我的情况下,LED连接到GPIOH_5







我将GPIO引脚转换为输出模式。



gpio -g mode 421 out


我写下零。



gpio -g write 421 0


我写下一个。



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会为我们很好地闪烁。



软件节点



速度测试API



speedtest.net服务拥有自己的python-API非常高兴,您可以在Github上看到它



好消息是,有些源代码也可以查看。相应的部分中可以找到如何使用此API(最简单的示例)



使用以下命令安装python库。



sudo -H pip3 install speedtest-cli


例如,您甚至可以直接从rep在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运算符的速度。





选择动态服务器时测量速度的结果。





速度测试结果,一台严格选择一台服务器。



在测试过程中,“羊毛”无处不在,必须通过数学方法将其除去。但是,使用固定服务器时,它要少一些,并且振幅更稳定。

总的来说,这是一个值得研究的地方。然后,我将使用iperf实用程序测量服务器的速度。但是我们坚持传统知识。



发送邮件和错误



我尝试了数十种不同的选项来发送邮件,但结果我选择了以下几种方法。我在yandex上注册了一个邮箱,然后以发送邮件为例。我检查了它并将其实现到程序中。本示例探讨了各种选项,包括从gmail发送等。我不想打扰我的邮件服务器,也没有时间这样做,但是后来发现,它也没有用。如果有连接



则按调度程序发送日志,如果有连接,则每6小时发送一次:00小时,上午6点,中午12点和下午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


最初也提交了错误。首先,它们会累积在列表中,然后在存在连接的情况下也使用调度程序发送它们。但是,然后存在一个问题,即yandex对每天发送的消息数量有限制(这是痛苦,悲伤和屈辱)。由于即使在一分钟内也会出现大量错误,因此有必要拒绝通过邮件发送错误。因此,在通过Yandex服务自动发送有关此问题时,请记住。



反馈服务器



为了能够访问远程硬件并进行调整和重新配置,我需要一台外部服务器。通常,公平地说,将所有数据发送到服务器并在Web界面中构建所有精美的图形是正确的。但不是一次全部。



我选择ruvds.com作为VPS 。可以采用最简单的服务器。通常,就我的目的而言,这对于眼睛来说就足够了。但是由于我没有为服务器付费,所以我决定花一点钱,如果我们部署Web界面,我们自己的SMTP服务器,VPN等就足够了。另外,为了能够设置Telegram机器人,并且在阻止它方面没有问题。因此,我选择了Amsterdam和以下参数。







作为与硬件进行通信的一种方式,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,我花了几天时间。







我在这里使用了动态计量服务器。速度测量有效,但它们浮动很大,但是仍然可以看到一些平均值,并且可以通过过滤数据(例如,使用移动平均值)获得该平均值。



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



















如您所见,该主题涉及这些数据的研究和处理,涉及面很广,显然不会持续数周的工作。但…



工作成果



由于我无法控制的情况,这项工作突然完成了。在我的主观意见中,该项目的弱点之一是调制解调器,它实际上并不想与其他调制解调器同时工作,并且每次启动时都会犯下这些诡计。出于这些目的,还有大量其他型号的调制解调器,通常它们已经具有Mini PCI-e格式,并已安装在设备内部并且易于配置。但这是一个完全不同的故事。该项目很有趣,并且很高兴我们能够参与其中。






All Articles