Šis nedidelis praktinis darbas padės atsakyti į šiuos klausimus ir paskatins giliau pasidomėti šiuolaikinių ryšio tinklų subtilybėmis. Čia pateikiami algoritmai, leidžiantys nuskaityti mobiliųjų programėlių surinktus duomenis apie ryšio tinklo kokybės parametrus ir juos analizuoti. Šie algoritmai gali atsakyti į klausimus, kokio stiprumo mobiliojo ryšio siganalas yra mano buvimo vietoje, kaip jis keičiasi judant, iš kokių bazinių stotelių atsklinda radijo signalai ir kaip juos veikia gretimų stočių trukdžiai. Tokiu būdu galima matyti signalo parametrų kitimą laikui bėgant ir pavaizduoti juos žemėlapyje.
Telekomunikacijų mokslo centras
Vilniaus universiteto Fizikos fakultetas
Saulėtekio al. 9, III-ieji rūmai, 10222 Vilnius
El. paštas: rimvydas.aleksiejunas@ff.vu.lt
Toliau seka paaiškinimai, kaip šiuos žingsnius įgyvendinti.
Mobiliosios programėlės bus reikalingos radijo ryšio tinklo duomenų rinkimui. Jų yra sukurta nemažai, tačiau čia naudosime dvi iš jų, pritaikytas Android operacinei sistemai: G-MoN ir Network Cell Info Lite. Jas galite susirasti ir įsidiegti per Google Play platformą.
Panašias programėles galite susirasti ir kitoms operacinėms sistemoms. Jos skirsis surinktų duomenų pateikimo formatais, todėl žemiau pateikiamus pavyzdžius teks adaptuoti kitokio formato įvesties duomenims.
Įsidiegę G-MoN arba Network Cell Info Lite turėsite programėles, kurių pagalba galėsite registruoti radijo ryšio signalo parametrus. Kaip naudoti programėlėmis, paskaitykite jų instrukcijose.
Belieka atlikti pačius matavimus. Atsidarę G-MoN
ar Network Cell Info Lite
programėlę palikite ją veikimo režimu (turėkite omenyje, kad jos naudos baterijos resursus). Programėlė matuos priimamo ryšio signalo parametrus ir kaups juos atminties kortelėje, kol tos programos nesustabdysite. Tokiu būdu galėsite turėti informaciją apie signalo pokyčius tose vietose, kur eisite ar važiuosite.
Android kortelės srityje, skirtoje naudotojo duomenims, šios programėlės sukuria direktorijas gmon
ir Network Cell Info Lite
, kurioje ir talpina duomenų bylas su matavimais. G-MoN
sukuria *.kml
ir *.txt
tipo bylas, o Network Cell Info Lite
programėlė -- *.csv
tekstines bylas. Visas šias bylas galima persikelti į kompiuterį, kad jas būtų galima panaudoti duomenų analizei debesų kompiuterijos platformoje.
Jupyter Notebook
programavimo aplinkaAlgoritmams vykdyti jums reikės Python programavimo aplinkos Jupyter Notebook su pagrindinėmis šios kalbos bibliotekomis. Susidiegę šią aplinką jūs galėsite įsikelti tinklamatis.ipynb
dokumentą su algoritmais ir juos paleisti vykdymui.
Verta susipažinti ir kas tai yra Python
. Tai viena iš populiaresnių programavimo kalbų, skirta mokslinių rezultatų skaitmeniniam apdorojimui. Egzistuoja nemažai elektroninės literatūros, kursų, vaizdo pamokėlių ir pavyzdžių Python programavimo kalba, pvz. Python tutorial anglų kalba arba Python pradžiamokslis lietuviškai. Toliau pateikiami jau galutiniai algoritmai, todėl juos galima paleidinėti su testiniais duomenimis arba pritaikyti savo išmatuotiems duomenims ir tuo pačiu susipažinti ir su Python programavimo kalba.
In [1]:
from __future__ import print_function
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import folium
from folium import Map
import branca.colormap as cm
import seaborn as sns
import csv
%matplotlib inline
In [2]:
gmon_file = '/home/data/measurements/gmon/gmon_gsm_rxl_2017_09_15_13_35_06.txt'
lines=list(csv.reader(open(gmon_file)))
print(lines[0])
df_gmon = pd.read_csv(gmon_file, sep=';', names=lines[0][0].split(';')).iloc[1:]
df_gmon.head()
Out[2]:
In [3]:
df_gmon['LAT'] = df_gmon['LAT'].astype(float)
df_gmon['LON'] = df_gmon['LON'].astype(float)
df_gmon['RSRP'] = df_gmon['RSRP'].astype(float)
df_gmon['RXL'] = df_gmon['RXL'].astype(float)
df_gmon['QUAL'] = df_gmon['QUAL'].astype(float)
df_gmon[['LAT', 'LON', 'RSRP', 'RXL', 'QUAL']].describe()
Out[3]:
In [4]:
def val2rgb(value, minval=0, maxval=100):
"""
Funkcija matavimo taškų nuspalvinimui
"""
green_max, red_max = 180, 255
red, green, blue = 0, 0, 64
value -= minval
maxval -= minval
if value < maxval/2:
green = green_max;
red = int(np.round((np.float(value)/(maxval/2))*red_max))
else:
red = red_max
green = int(np.round((1-((np.float(value)-(maxval/2))/(maxval/2)))*green_max))
return '#{:02x}{:02x}{:02x}'.format(red, green, blue)
In [5]:
minval, maxval = df_gmon['RSRP'].min(), df_gmon['RSRP'].max()
map_1 = folium.Map(location=[df_gmon['LAT'].mean(), df_gmon['LON'].mean()], zoom_start=17, width='90%', height=u'80%')
for ii in range(1, len(df_gmon)+1):
val = val2rgb(df_gmon['RSRP'][ii], minval, maxval)
folium.CircleMarker(location=[df_gmon['LAT'][ii], df_gmon['LON'][ii]], radius=1, color=val,
fill_color=val).add_to(map_1)
values = np.linspace(minval, maxval, 10)
colors = map(lambda x: val2rgb(x, minval, maxval), values)
colormap = cm.StepColormap(colors, vmin=minval, vmax=maxval, index=values, caption='RSRP (dBm)')
map_1.add_child(colormap)
map_1
Out[5]:
In [6]:
df_nwcell = pd.read_csv('/home/data/measurements/nwcell/CMWFpro_20170915_141406_meas_ainf_d0_n772.csv')
print('Data size: ', df_nwcell.shape)
df_nwcell.columns
Out[6]:
In [8]:
df_nwcell = df_nwcell[['radio', 'cellid', 'enbrnc', 'xarfcn', 'unit', 'fc', 'sigl', 'asu', 'signal',
u'lat', u'lon', u'acc', u'time', u'speed', u'bearing', u'alt', u'api', u'rsrq',
u'rssnr', u'ss', u'cqi', u'ta']]
df_nwcell.head()
Out[8]:
In [9]:
minval, maxval = df_nwcell['signal'].min(), df_nwcell['signal'].max()
map_2 = folium.Map(location=[df_nwcell['lat'].mean(), df_nwcell['lon'].mean()], zoom_start=13, width='90%', height='80%')
for ii in range(len(df_nwcell)):
val = val2rgb(df_nwcell['signal'][ii], minval, maxval)
folium.CircleMarker(location=[df_nwcell['lat'][ii], df_nwcell['lon'][ii]], radius=1, color=val,
fill_color=val).add_to(map_2)
values = np.linspace(minval, maxval, 10)
colors = map(lambda x: val2rgb(x, minval, maxval), values)
colormap = cm.StepColormap(colors, vmin=minval, vmax=maxval, index=values, caption='signal (dBm)')
map_2.add_child(colormap)
map_2
Out[9]:
In [10]:
df_nwcell.plot(x=pd.to_datetime(df_nwcell['time']*10**6).map(lambda t: t.strftime('%H:%M:%S')),
y=['asu', 'ss', 'rssnr', 'signal', 'rsrq'], style=['k-', 'r-', 'g-', 'b-', 'm-'], ylim=(-120, 80),
figsize=(12, 6)).legend(loc='center left', bbox_to_anchor=(1, 0.5));
In [11]:
df_nwcell[['asu', 'ss', 'rssnr', 'signal', 'rsrq']].describe()
Out[11]:
In [12]:
# Koreliacijos koeficientas:
print('signal ~ rssnr: {:.1f} %'.format(df_nwcell['signal'].corr(df_nwcell['rssnr']) * 100))
print('signal ~ ss: {:.1f} %'.format(df_nwcell['signal'].corr(df_nwcell['ss']) * 100))
Kaip koreliacija atrodo grafiškai?
In [13]:
df1 = df_nwcell[['signal', 'rssnr']]
df1.insert(2, 'ydata', 'rssnr')
df1.columns = ['signal', 'yval', 'ydata']
df2 = df_nwcell[['signal', 'ss']]
df2.insert(2, 'ydata', 'ss')
df2.columns = ['signal', 'yval', 'ydata']
corr_res = pd.concat([df1[['signal', 'yval', 'ydata']], df2[['signal', 'yval', 'ydata']]])
In [14]:
sns.lmplot(x='signal', y='yval', data=corr_res, col='ydata', sharey=False);
In [15]:
sns.jointplot(x = 'signal', y = 'rssnr', data = df_nwcell, kind='kde');
In [17]:
df_nwstats = df_nwcell[['asu', 'ss', 'rssnr', 'signal', 'rsrq']]
corr = df_nwstats.corr().mul(100).astype(int)
sns.clustermap(data=corr, annot=True, fmt='d', cmap='Blues', row_cluster=False, col_cluster=False, figsize=(5, 5));
In [19]:
pd.plotting.scatter_matrix(df_nwstats, diagonal='kde', figsize=(10, 6))
plt.tight_layout()