1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import struct
import socket
import collections
# from flask import jsonify
SERVER_IP = "0.0.0.0"
SERVER_PORT = 7789
BUFFER_SIZE = 20000
SYMBOL_PER_SLOT = 14
DEBUG_PRINT = 0
rrc_UE_to_gNB = [
"SetupRequest",
"ReestablishmentRequest",
"ReconfigurationComplete",
"SetupComplete",
"MeasurementReport",
"ReestablishmentComplete",
"ulInformationTransfer",
"securityModeComplete",
"securityModeFailure",
"ueCapabilityInformation"
]
rrc_gNB_to_UE = [
"Reject",
"SETUP",
"Reestablishment",
"REESTABLISH_COMPLETE",
"DEFAULT_RECONF",
"DEDICATED_RECONF",
"PDUSESSION_ESTABLISH",
"PDUSESSION_MODIFY",
"PDUSESSION_RELEASE",
"UECapabilityEnquiry"
]
schedule_data = collections.OrderedDict()
# 0 is first tag
schedule_data["ssb"] = []
schedule_data["sib1"] = []
schedule_data["msg1"] = []
schedule_data["msg2"] = []
schedule_data["msg3"] = []
schedule_data["msg4"] = []
schedule_data["pdcch"] = []
schedule_data["pdsch"] = []
schedule_data["csirs"] = []
schedule_data["prach"] = []
schedule_data["pusch"] = []
schedule_data["acknack"] = []
schedule_data["csi_report"] = []
schedule_data["sr_report"] = []
schedule_data["srs"] = []
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind((SERVER_IP, SERVER_PORT))
dl_recv_bytes_last = 0
ul_recv_bytes_last = 0
frame_last = 0
while True:
data, client_address = server_socket.recvfrom(BUFFER_SIZE)
if DEBUG_PRINT:
print(client_address)
data_len, message= struct.unpack("2H", data[:4])
if DEBUG_PRINT:
print("data_len %d message %d"%(data_len,message))
if (message == 2):
CC_id,frame,slot,measurement_flag,pbch_sched_flag,random_access_sched_flag,dl_sched_flag,ul_sched_flag = struct.unpack("8H", data[4:20])
print("%d.%d measurement_flag %x pbch_sched_flag %x random_access_sched_flag %x dl_sched_flag %x ul_sched_flag %x"%(frame,slot,measurement_flag,pbch_sched_flag,random_access_sched_flag,dl_sched_flag,ul_sched_flag))
schedule_timing = struct.unpack("30H", data[20:80])
if DEBUG_PRINT:
i = 0
for map_type in schedule_data.keys():
print("%s %d.%d" % (map_type, schedule_timing[i*2], schedule_timing[i*2+1]))
i = i + 1
print("")
if (measurement_flag & 0x01) and (dl_sched_flag or ul_sched_flag or (random_access_sched_flag&0x0e)):
if DEBUG_PRINT:
print("update measurement data")
dl_recv_bytes_high16,dl_recv_bytes_low16,ul_recv_bytes_high16,ul_recv_bytes_low16,\
dl_mcs,ul_mcs,dl_bler,ul_bler,pucch_snr,pusch_snr,rsrp = struct.unpack("8H3h", data[80:80+22])
dl_recv_bytes = (dl_recv_bytes_high16<<16) + dl_recv_bytes_low16
ul_recv_bytes = (ul_recv_bytes_high16<<16) + ul_recv_bytes_low16
dl_velocity = (dl_recv_bytes - dl_recv_bytes_last)*8.0/1e6
ul_velocity = (ul_recv_bytes - ul_recv_bytes_last)*8.0/1e6
dl_bler = dl_bler*1.0/10000
ul_bler = ul_bler*1.0/10000
if DEBUG_PRINT:
print("%d.%d: dl_recv_bytes %ldbytes(%fMpbs), ul_recv_bytes %ldbytes(%fMpbs), dl_mcs %d, ul_mcs \
%d, dl_bler %f, ul_bler %f, pucch_snr %ddB, pusch_snr %ddB rsrp %ddBm"%(
frame, slot, dl_recv_bytes - dl_recv_bytes_last,dl_velocity, ul_recv_bytes - ul_recv_bytes_last, ul_velocity,\
dl_mcs, ul_mcs, dl_bler,ul_bler, pucch_snr, pusch_snr, rsrp))
dl_recv_bytes_last = dl_recv_bytes
ul_recv_bytes_last = ul_recv_bytes
count = 0
for map_type in schedule_data:
if frame != frame_last :
schedule_data[map_type] = []
receive_map = struct.unpack("275H", data[80+22+550*count:80+22+550*(count+1)])
if DEBUG_PRINT:
print("Schedule for %s:"%(map_type))
print("RB\tslbitmap")
for i in range(275):
if (receive_map[i]):
for bitnum in range(14):
if (receive_map[i]>>bitnum) & 1:
schedule_data[map_type].append([schedule_timing[count*2+1]*14+bitnum, i, count])
if DEBUG_PRINT:
print("%d\t%d"%(i, receive_map[i]))
if DEBUG_PRINT:
print (schedule_data[map_type])
count = count + 1
frame_last = frame
print(schedule_data)
elif (message == 1):
rnti,recv_send_flag,rrc_signaling_type,rrc_signaling_request_type = struct.unpack("4H", data[4:12])
if DEBUG_PRINT:
print("rrc_signaling_type %d rrc_signaling_request_type %d"%(rrc_signaling_type,rrc_signaling_request_type))
if (recv_send_flag == 0):
print("Send:UE(rnti:%x), Receive:gNB, RRC signaling:%s"%(rnti, rrc_UE_to_gNB[rrc_signaling_request_type]))
elif (recv_send_flag == 1):
print("Send:gNB, Receive:UE(rnti:%x), RRC signaling:%s"%(rnti, rrc_gNB_to_UE[rrc_signaling_type]))
server_socket.close()