در حال حاضر خالی است: ریال0
ابتدا باید در مورد پایلوتپلوشن توضیح بدهم و در واقع اگر همه چیز را عمیقاً توضیح بدهم این مقاله را تا آخر نمی خوانید. پیش فرض من این است، اطلاعات اولیه در مورد شبکه های تلفن همراه، به ویژه شبکه های WCDMA را می دانید. اما من باید چند کلمه کلیدی را توضیح دهم. پس از آن، ما در مورد پایلوتپلوشن و تجزیه و تحلیل این پدیده خواهیم دانست.
همانطور که گفتم، من پشفرض را بر این قرار می دهم که در مورد KPIهای اصلی WCDMA مانند RSCP که قدرت سیگنال شبکه را نشان می دهد و Ec/Io که کیفیت شبکه را نشان می دهد، می دانید و باید KPI های زیر را توضیح بدهم
سافت هندور(Soft Handover)
بر اساس دانش ما در مورد شبکه های تلفن همراه، در هر نوع شبکه تلفن همراه یک ویژگی وجود دارد که نام آن Handover است، اما در WCDMA، بر اساس ماهیت شبکه 3G، نوع دیگری از دست به دست کردن سرویس یا Handover وجود دارد که نام آن Soft-handover است. این ویژگی به شما امکان می دهد از سرویسی مانند WCDMA (صدا یا داده) هنگام حرکت استفاده کنید. این ویژگی سرویس شما را پایدار می کند و می توانید از 2 تا 3 سل(بر اساس تنظیمات شبکه می تواند 4 باشد، اما معمولاً آن را روی 3 سل تنظیم می کنند) به طور همزمان استفاده کنید تا منطقه را ترک کنید و شما را وصل کند به سل دیگر. و همچنین قانونی برای امتیاز دهی سلول ها (1، 2، 3) وجود دارد که شبکه آنها را بر اساس Ec/Io رتبه بندی می کند، بنابراین اگر 3 سل برای استفاده وجود داشته باشد، سلهایی که بیشترین EcNo را دشته باشند به مشترک سرویس میدهند که از آنها تحت عنوان Activeset نام میبریم و تجهیزات کاربران از اولین Activeset استفاده می کنند و در صورت ضعیف شدن ست های فعال دیگر از شما حمایت می کنند.
مانیتورست(Monitoset) و دیتکتدست(Detectedset)
بر اساس روال شبکه WCDMA، Monitorset در مبحث همسایگی جای میگیرد و هدف از وجود همسایه این است که دستگاه شما بتواند در حین استفاده از یک سرویس، Soft-handover داشته باشد. وقتی پیکربندی بهینه همسایهها را برای سلها تنظیم نکنند، تلفن همراه شما نمیتواند به سل دیگر منتقل شود و سرویس شما قطع میشود. سلهایی را که بصورت بالقوه میتوانند به عنوان همسایه استفاده شوند ولی همسایه تعریف نشدهاند Detectedset مینامیم . همچنین، می توانیم شش همسایه را همزمان ببینیم.
خب ما با برخی از توضیحات اولیه شبکه WCDMA مانند Activeset و همسایگی آشنا شدیم. برای محاسبه پایلوتپلوشن(Pilot-Pollution)، باید اختلاف بین قویترین همسایه و ضعیفترین Activeste را محاسبه کنیم و باید فاصله معقولی بین آنها باشد که بر اساس تجربه باید 5 دسی بل یا بیشتر از آن باشد. اگر اختلاف بین آنها کمتر از 5 دسیبل باشد و Ec/Io همسایه در محدوده خوبی باشد، برای مثال بزرگترمساوی 14-، این همسایه بر دامنه سل تأثیر میگذارد و در نتیجه میتوانیم تعداد زیادی soft-handover ناموفق در آن محدوده پیدا کنیم و همچنین باعث پایین آمدن شاخص Ec/Io میشود که از شاخصهای نشان دهنده سرویس دهی بد در شبکه میباشد.
چگونه این کار را در پایگاه داده SWISSQUAL انجام دادم؟
برای بررسی وضعیت شبکه های تلفن همراه از دید کاربران، باید درایوتست در مناطقی که نیاز داریم انجام دهیم و ابزارهای زیادی برای انجام این تست وجود دارد. ابزاری وجود دارد که نام آن SWISSQUAL است و این ابزارها اطلاعات زیادی در مورد شبکه های تلفن همراه به ما می دهد. توجه: برای محاسبه Pilot-Pollution، دستگاه اسکن شبکه بهتر جواب میدهد چون تمام اطلاعات را از تمام کریرهای موجود در شبکه جمعآوری میکند، اما به دلیل محدودیتهایم، آزمایشی را با سناریوی زیر انجام دادم:
بر اساس مکانیسم SWISSQUAL، در مرحله بعد لاگفایل ها را در یک سرور SQL بارگذاری کردم. من یک query روی پایگاه داده آماده کردم و نتیجه query همچین ساختاری دارد:
من از جداول زیر برای خروجی فیلدهای ضروری استفاده کردم: «Sessions»، «Position»، «FileList»، «WCDMANeighborSet»، «WCDMAActiveSet»، «NetworkInfo» و جداول مهم «WCDMAActiveSet» و «WCDMANeighborSet» بودند. همانطور که در جدول بالا می بینید، ما نمی توانیم برخی از KPI ها مانند RSCP یا Ec/Io هر Activesetو Monitorset را جداگانه ببینیم، بنابراین برای جدا کردن آنها، یک تابع در پایتون برای جداسازی آن نوشتم. که در این تابع، من از Ec/Io برای مرتب سازی Activesetها و همسایگان استفاده کردم و همچنین PSC هر Activeset و همسایه را متمایز کردم. در نهایت اختلاف سیگنال را محاسبه کردم و نقاط بحرانی را مشخص کردم. در زیر می توانید کد پایتون و نتیجه محاسبه من را مشاهده کنید.
def PilotPollution():
querypath = os.getcwd() + '\PilotPollution'
server_ip = input("please input server IP: ")
dbname = input("please input Database name: ")
conn_01 = connecttodb(server_ip, dbname)
_query_3G_Voice = readtextfile(querypath + '\pp_query.sql')
df_query_3G_Voice = pd.read_sql(_query_3G_Voice, conn_01)
df_3G_Voice_Activesets_merged = pd.DataFrame(
columns=['posid', 'latitude', 'longitude', 'UARFCN', 'Band', 'LAC', 'CId', 'Served_RSCP',
'Served_EcNo', 'RSCP_A1', 'RSCP_A2', 'RSCP_A3', 'EcNo_A1', 'EcNo_A2', 'EcNo_A3'
, 'PSC_A1', 'PSC_A2', 'PSC_A3', 'RSCP_N1', 'RSCP_N2', 'RSCP_N3', 'RSCP_N4', 'RSCP_N5', 'RSCP_N6',
'EcNo_N1', 'EcNo_N2', 'EcNo_N3'
, 'EcNo_N4', 'EcNo_N5', 'EcNo_N6', 'PSC_N1', 'PSC_N2', 'PSC_N3', 'PSC_N4', 'PSC_N5', 'PSC_N6',
'Diff_RSCP', 'Status'])
_RSCP_avg = None
_EcNo_avg = None
_RSCP_A1 = None
_RSCP_A2 = None
_RSCP_A3 = None
_EcNo_A1 = None
_EcNo_A2 = None
_EcNo_A3 = None
_PSC_A1 = None
_PSC_A2 = None
_PSC_A3 = None
_RSCP_N1 = None
_RSCP_N2 = None
_RSCP_N3 = None
_RSCP_N4 = None
_RSCP_N5 = None
_RSCP_N6 = None
_EcNo_N1 = None
_EcNo_N2 = None
_EcNo_N3 = None
_EcNo_N4 = None
_EcNo_N5 = None
_EcNo_N6 = None
_PSC_N1 = None
_PSC_N2 = None
_PSC_N3 = None
_PSC_N4 = None
_PSC_N5 = None
_PSC_N6 = None
_PosId = None
_Latitude = None
_Longitude = None
_UARFCN = None
_Band = None
_LAC = None
_CID = None
status_pp = "Normal"
Diff_RSCP_best_neighbor_first_activeset = None
min_active_rscp = None
WCDMA_posid = df_query_3G_Voice.groupby("PosId")
for key, item in WCDMA_posid:
RSCP_posid_RSCP = item.groupby("AvgEcIo")
activesetnum = 0
for key_rscp, item_rscp in RSCP_posid_RSCP:
Activesets_RSCP = item_rscp.groupby("AggrEcIo_PSC")
neighborstnum = 0
for active_key_rscp, active_item_rscp in Activesets_RSCP:
activesetnum += 1
if activesetnum == 1:
_RSCP_avg = active_item_rscp.iloc[0]['AvgRSCP']
_EcNo_avg = active_item_rscp.iloc[0]['AvgEcIo']
_PosId = active_item_rscp.iloc[0]['PosId']
_Latitude = active_item_rscp.iloc[0]['Latitude']
_Longitude = active_item_rscp.iloc[0]['Longitude']
_UARFCN = active_item_rscp.iloc[0]['FreqDL']
_Band = active_item_rscp.iloc[0]['Technology']
_LAC = active_item_rscp.iloc[0]['LAC']
_CID = active_item_rscp.iloc[0]['CID']
_RSCP_A1 = active_item_rscp.iloc[0]['RSCP_PSC']
_EcNo_A1 = active_item_rscp.iloc[0]['AggrEcIo_PSC']
_PSC_A1 = active_item_rscp.iloc[0]['PSCCode']
elif activesetnum == 2:
_RSCP_A2 = active_item_rscp.iloc[0]['RSCP_PSC']
_EcNo_A2 = active_item_rscp.iloc[0]['AggrEcIo_PSC']
_PSC_A2 = active_item_rscp.iloc[0]['PSCCode']
elif activesetnum == 3:
_RSCP_A3 = active_item_rscp.iloc[0]['RSCP_PSC']
_EcNo_A3 = active_item_rscp.iloc[0]['AggrEcIo_PSC']
_PSC_A3 = active_item_rscp.iloc[0]['PSCCode']
Neighbor_RSCP = active_item_rscp.groupby('neighbor_SC')
for Neighbor_key_rscp, Neighbor_item_rscp in Neighbor_RSCP:
neighborstnum += 1
if neighborstnum == 1:
_RSCP_N1 = Neighbor_item_rscp['neighbor_RSCP'].mean()
_EcNo_N1 = Neighbor_item_rscp['neighbor_EcNo'].mean()
_PSC_N1 = Neighbor_item_rscp.iloc[0]['neighbor_SC']
elif neighborstnum == 2:
_RSCP_N2 = Neighbor_item_rscp['neighbor_RSCP'].mean()
_EcNo_N2 = Neighbor_item_rscp['neighbor_EcNo'].mean()
_PSC_N2 = Neighbor_item_rscp.iloc[0]['neighbor_SC']
elif neighborstnum == 3:
_RSCP_N3 = Neighbor_item_rscp['neighbor_RSCP'].mean()
_EcNo_N3 = Neighbor_item_rscp['neighbor_EcNo'].mean()
_PSC_N3 = Neighbor_item_rscp.iloc[0]['neighbor_SC']
elif neighborstnum == 4:
_RSCP_N4 = Neighbor_item_rscp['neighbor_RSCP'].mean()
_EcNo_N4 = Neighbor_item_rscp['neighbor_EcNo'].mean()
_PSC_N4 = Neighbor_item_rscp.iloc[0]['neighbor_SC']
elif neighborstnum == 5:
_RSCP_N5 = Neighbor_item_rscp['neighbor_RSCP'].mean()
_EcNo_N5 = Neighbor_item_rscp['neighbor_EcNo'].mean()
_PSC_N5 = Neighbor_item_rscp.iloc[0]['neighbor_SC']
elif neighborstnum == 6:
_RSCP_N6 = Neighbor_item_rscp['neighbor_RSCP'].mean()
_EcNo_N6 = Neighbor_item_rscp['neighbor_EcNo'].mean()
_PSC_N6 = Neighbor_item_rscp.iloc[0]['neighbor_SC']
if _RSCP_A1 != None and _RSCP_A2 != None and _RSCP_A3 != None:
min_active_rscp = min(_RSCP_A1, _RSCP_A2, _RSCP_A3)
elif _RSCP_A1 != None and _RSCP_A2 != None:
min_active_rscp = min(_RSCP_A1, _RSCP_A2)
elif _RSCP_A1 != None:
min_active_rscp = _RSCP_A1
if _RSCP_N1 != None and _RSCP_N2 != None and _RSCP_N3 != None and _RSCP_N4 != None and _RSCP_N5 != None and _RSCP_N6 != None:
Diff_RSCP_best_neighbor_first_activeset = max(_RSCP_N1, _RSCP_N2, _RSCP_N3, _RSCP_N4, _RSCP_N5,
_RSCP_N6) - min_active_rscp
if Diff_RSCP_best_neighbor_first_activeset >= 5:
status_pp = "Pilot Pollution"
elif _RSCP_N1 != None and _RSCP_N2 != None and _RSCP_N3 != None and _RSCP_N4 != None and _RSCP_N5 != None:
Diff_RSCP_best_neighbor_first_activeset = max(_RSCP_N1, _RSCP_N2, _RSCP_N3, _RSCP_N4,
_RSCP_N5) - min_active_rscp
if Diff_RSCP_best_neighbor_first_activeset >= 5:
status_pp = "Pilot Pollution"
elif _RSCP_N1 != None and _RSCP_N2 != None and _RSCP_N3 != None and _RSCP_N4 != None:
Diff_RSCP_best_neighbor_first_activeset = max(_RSCP_N1, _RSCP_N2, _RSCP_N3, _RSCP_N4) - min_active_rscp
if Diff_RSCP_best_neighbor_first_activeset >= 5:
status_pp = "Pilot Pollution"
elif _RSCP_N1 != None and _RSCP_N2 != None and _RSCP_N3 != None:
Diff_RSCP_best_neighbor_first_activeset = max(_RSCP_N1, _RSCP_N2, _RSCP_N3) - min_active_rscp
if Diff_RSCP_best_neighbor_first_activeset >= 5:
status_pp = "Pilot Pollution"
elif _RSCP_N1 != None:
Diff_RSCP_best_neighbor_first_activeset = _RSCP_N1 - min_active_rscp
if Diff_RSCP_best_neighbor_first_activeset >= 5:
status_pp = "Pilot Pollution"
df_new_row = {'posid': _PosId,
'latitude': _Latitude,
'longitude': _Longitude,
'UARFCN': _UARFCN,
'Band': _Band, 'LAC': _LAC,
'CId': _CID,
'Served_RSCP': _RSCP_avg,
'Served_EcNo': _EcNo_avg,
'RSCP_A1': _RSCP_A1,
'RSCP_A2': _RSCP_A2,
'RSCP_A3': _RSCP_A3,
'EcNo_A1': _EcNo_A1,
'EcNo_A2': _EcNo_A2,
'EcNo_A3': _EcNo_A3,
'PSC_A1': _PSC_A1,
'PSC_A2': _PSC_A2,
'PSC_A3': _PSC_A3,
'RSCP_N1': _RSCP_N1,
'RSCP_N2': _RSCP_N2,
'RSCP_N3': _RSCP_N3,
'RSCP_N4': _RSCP_N4,
'RSCP_N5': _RSCP_N5,
'RSCP_N6': _RSCP_N6,
'EcNo_N1': _EcNo_N1,
'EcNo_N2': _EcNo_N2,
'EcNo_N3': _EcNo_N3,
'EcNo_N4': _EcNo_N4,
'EcNo_N5': _EcNo_N5,
'EcNo_N6': _EcNo_N6,
'PSC_N1': _PSC_N1,
'PSC_N2': _PSC_N2,
'PSC_N3': _PSC_N3,
'PSC_N4': _PSC_N1,
'PSC_N5': _PSC_N2,
'PSC_N6': _PSC_N3,
'Diff_RSCP_best_neighbor_first_activeset': Diff_RSCP_best_neighbor_first_activeset,
'Status': status_pp}
df_3G_Voice_Activesets_merged = df_3G_Voice_Activesets_merged.append(df_new_row, ignore_index=True)
_RSCP_avg = None
_EcNo_avg = None
_RSCP_A1 = None
_RSCP_A2 = None
_RSCP_A3 = None
_EcNo_A1 = None
_EcNo_A2 = None
_EcNo_A3 = None
_PSC_A1 = None
_PSC_A2 = None
_PSC_A3 = None
_RSCP_N1 = None
_RSCP_N2 = None
_RSCP_N3 = None
_RSCP_N4 = None
_RSCP_N5 = None
_RSCP_N6 = None
_EcNo_N1 = None
_EcNo_N2 = None
_EcNo_N3 = None
_EcNo_N4 = None
_EcNo_N5 = None
_EcNo_N6 = None
_PSC_N1 = None
_PSC_N2 = None
_PSC_N3 = None
_PSC_N4 = None
_PSC_N5 = None
_PSC_N6 = None
_PosId = None
_Latitude = None
_Longitude = None
_UARFCN = None
_Band = None
_LAC = None
_CID = None
status_pp = "Normal"
min_active_rscp = None
Diff_RSCP_best_neighbor_first_activeset = None
df_3G_Voice_Activesets_merged.to_csv(dbname + '_df_3G_PilotPollution_merged.csv', index=False)
پیمان هوشمند
سلام امیدوارم حال همگی شما خوب باشه.من پیمان هوشمند هستم. مدرس برنامه نویسی و نرم افزارهای تحلیلی در حوزه مخابرات. خود من همیشه به عنوان یه دانش آموزش و دانش پژوه عاشق برنامه نویسی و کارهای آماری بودم و نقطه قوتم حتی در زمان تحصیل خودم هم مباحث برنامه نویسی بخصوص طراحی الگوریتم بوده. بنابراین این درس را خیلی مفهومی و عمیق یاد گرفتم. تفاوت عمیق من با دانشجویان در زمان تحصیلم این بود که در حوزه ای که تحصیل میکردم مشغول به کار بودم و این دلیل بر عمیق تر شدن در حوزه نرم افزار و مخابرات بود و از دانشگاه برای فهم بیشتر مبانی های کارم استفاده کردم. تا به امروز در اکثر سازمانهایی که کار کرده ام در کنار سمت اصلیم ، به عنوان سوپروایزر آموزشی هم فعالیت میکردم و متخصصینی در این حوزه آموزش داده ام و در بازار کار مشغول به کار هستند و در مدتی که کرونا باعث تعطیلی بسیاری از مراکز آموزش بود ، به صورت رایگان در خدمت دانشجویان نرم افزار از دانشگاه های مختلف بودم. همیشه در روش های آموزشیم بدنبال ابتکار و نوآوری هایی از قبیل گیمیفیکیشن و تکنیک های شناختی به جهت بهبود یادگیری بوده ام.




