sever_manager_py.py 5.08 KB
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()