1 # -------------------------------------------------------------------------------
2 # Copyright (c) 2018-2019 AT&T Intellectual Property.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 # -------------------------------------------------------------------------------
19 from binascii import unhexlify
21 # from https://stackoverflow.com/questions/8730927/convert-python-long-int-to-fixed-size-byte-array
22 def long_to_bytes(val, endianness='big'):
25 fmt = '%%0%dx' % (width // 4)
26 s = unhexlify(fmt % val)
27 if endianness == 'little':
33 # ------------------------------------
34 # START generated code
35 import rrctransfer_pb2
36 import x2ap_streaming_pb2
39 #"id_MeNB_UE_X2AP_ID": 1,
40 #"id_SgNB_UE_X2AP_ID": 2,
41 #"MeasResultServMO_data": [
42 # {"servCellID": 3, "physCellId": 4, "rsrq": 5, "rsrp": 6, "sinr": 7},
46 def create_record(dataset, ofl, ts):
47 X2APStreaming = x2ap_streaming_pb2.X2APStreaming() # header message
48 X2APStreaming.header.gNbID.value = dataset["sgnb_id"]
50 # print "sgnb_id="+X2APStreaming.header.gNbID.value+", ts="+str(ts)
52 RRCTransfer = X2APStreaming.rrcTransfer # message RRCTransfer
54 RRCTransferIEs = RRCTransfer.rrcTransfer_IEs # field rrcTransfer_IEs
55 RRCTransferIEs.id_MeNB_UE_X2AP_ID = dataset["id_MeNB_UE_X2AP_ID"] # field id_MeNB_UE_X2AP_ID
56 RRCTransferIEs.id_SgNB_UE_X2AP_ID = dataset["id_SgNB_UE_X2AP_ID"]
57 NRUeReport = RRCTransferIEs.id_UENRMeasurement
58 RRCContainer = NRUeReport.uENRMeasurements
59 ULDCCHMessageType = RRCContainer.UL_DCCH_message
60 MeasurementReport = ULDCCHMessageType.measurementReport
61 MeasurementReportIEs = MeasurementReport.measurementReport
62 MeasResults = MeasurementReportIEs.measResults
63 MeasResultServMOList = MeasResults.measResultServingMOList
64 for d in dataset["MeasResultServMO_data"]:
65 MeasResultServMO = MeasResultServMOList.items.add()
66 MeasResultServMO.servCellID = d["servCellID"]
67 MeasResultNR = MeasResultServMO.measResultServingCell
68 MeasResultNR.physCellId.value = d["physCellId"]
69 MeasResult = MeasResultNR.measResult
70 CellResults = MeasResult.cellResults
71 MeasQuantityResults = CellResults.resultsCSI_RS_Cell
72 MeasQuantityResults.rsrq.value = d["rsrq"]
73 MeasQuantityResults.rsrp.value = d["rsrp"]
74 MeasQuantityResults.sinr.value = d["sinr"]
76 v = X2APStreaming.SerializeToString()
79 ofl.write("{0:7}".format(vlen))
88 # ------------------------------------
94 def triangle_measurements(d):
95 for dd in d["MeasResultServMO_data"]:
96 dd["rsrp"] = int(random.triangular(0,100,50))
97 dd["rsrq"] = int(random.triangular(0,100,50))
98 dd["sinr"] = int(random.triangular(0,100,50))
102 fifo_dir = "/tmp/mcl/fifos"
103 dst_flnm = "MT_000010350"
108 "id_MeNB_UE_X2AP_ID": 1,
109 "id_SgNB_UE_X2AP_ID": 11,
110 "MeasResultServMO_data": [
111 {"servCellID": 0, "physCellId": 10, "rsrq": 20, "rsrp": 40, "sinr": 60},
112 {"servCellID": 1, "physCellId": 20, "rsrq": 60, "rsrp": 40, "sinr": 20}
117 "id_MeNB_UE_X2AP_ID": 2,
118 "id_SgNB_UE_X2AP_ID": 12,
119 "MeasResultServMO_data": [
120 {"servCellID": 0, "physCellId": 10, "rsrq": 25, "rsrp": 45, "sinr": 65},
121 {"servCellID": 1, "physCellId": 20, "rsrq": 65, "rsrp": 45, "sinr": 25}
126 "id_MeNB_UE_X2AP_ID": 3,
127 "id_SgNB_UE_X2AP_ID": 13,
128 "MeasResultServMO_data": [
129 {"servCellID": 0, "physCellId": 10, "rsrq": 25, "rsrp": 45, "sinr": 65},
130 {"servCellID": 1, "physCellId": 20, "rsrq": 65, "rsrp": 45, "sinr": 25}
135 "id_MeNB_UE_X2AP_ID": 4,
136 "id_SgNB_UE_X2AP_ID": 14,
137 "MeasResultServMO_data": [
138 {"servCellID": 0, "physCellId": 15, "rsrq": 25, "rsrp": 45, "sinr": 65},
139 {"servCellID": 1, "physCellId": 25, "rsrq": 65, "rsrp": 45, "sinr": 25}
144 "id_MeNB_UE_X2AP_ID": 5,
145 "id_SgNB_UE_X2AP_ID": 15,
146 "MeasResultServMO_data": [
147 {"servCellID": 0, "physCellId": 15, "rsrq": 25, "rsrp": 45, "sinr": 65},
148 {"servCellID": 1, "physCellId": 25, "rsrq": 65, "rsrp": 45, "sinr": 25}
153 "id_MeNB_UE_X2AP_ID": 6,
154 "id_SgNB_UE_X2AP_ID": 16,
155 "MeasResultServMO_data": [
156 {"servCellID": 0, "physCellId": 15, "rsrq": 25, "rsrp": 45, "sinr": 65},
157 {"servCellID": 1, "physCellId": 25, "rsrq": 65, "rsrp": 45, "sinr": 25}
161 if not os.path.exists(fifo_dir +"/" + dst_flnm):
162 os.mkfifo(fifo_dir +"/" + dst_flnm)
163 ofl = open(fifo_dir +"/" + dst_flnm,"w", 0)
166 curr_time = int(time.time())
167 triangle_measurements(dataset1)
168 create_record(dataset1, ofl, 1000*curr_time + 100)
169 triangle_measurements(dataset2)
170 create_record(dataset2, ofl, 1000*curr_time + 200)
171 triangle_measurements(dataset3)
172 create_record(dataset3, ofl, 1000*curr_time + 300)
173 triangle_measurements(dataset4)
174 create_record(dataset4, ofl, 1000*curr_time + 400)
175 triangle_measurements(dataset5)
176 create_record(dataset5, ofl, 1000*curr_time + 500)
177 triangle_measurements(dataset6)
178 create_record(dataset6, ofl, 1000*curr_time + 600)
179 time.sleep(sleep_interval)