def __init__(self, burst_file, timeslot, subchannel, mode, fnr_start): gr.top_block.__init__(self, "Top Block") self.burst_file_source = grgsm.burst_file_source(burst_file) self.timeslot_filter = grgsm.burst_timeslot_filter(timeslot) self.fnr_filter_start = grgsm.burst_fnr_filter(grgsm.FILTER_GREATER_OR_EQUAL, fnr_start) # we only listen for a timespan of 12 SDCCH messages for the CMC self.fnr_filter_end = grgsm.burst_fnr_filter(grgsm.FILTER_LESS_OR_EQUAL, fnr_start + 51 * 10000) if mode == "BCCH_SDCCH4": self.subchannel_filter = grgsm.burst_sdcch_subslot_filter(grgsm.SS_FILTER_SDCCH4, subchannel) self.demapper = grgsm.gsm_bcch_ccch_sdcch4_demapper(timeslot_nr=timeslot, ) else: self.subchannel_filter = grgsm.burst_sdcch_subslot_filter(grgsm.SS_FILTER_SDCCH8, subchannel) self.demapper = grgsm.gsm_sdcch8_demapper(timeslot_nr=timeslot, ) self.demapper = grgsm.gsm_sdcch8_demapper(timeslot_nr=timeslot, ) self.decoder = grgsm.control_channels_decoder() self.extract_cmc = grgsm.extract_cmc() self.msg_connect((self.burst_file_source, 'out'), (self.timeslot_filter, 'in')) self.msg_connect((self.timeslot_filter, 'out'), (self.subchannel_filter, 'in')) self.msg_connect((self.subchannel_filter, 'out'), (self.fnr_filter_start, 'in')) self.msg_connect((self.fnr_filter_start, 'out'), (self.fnr_filter_end, 'in')) self.msg_connect((self.fnr_filter_end, 'out'), (self.demapper, 'bursts')) self.msg_connect((self.demapper, 'bursts'), (self.decoder, 'bursts')) self.msg_connect((self.decoder, 'msgs'), (self.extract_cmc, 'msgs'))
def __init__(self, timeslot, burst_file, mode, show_gprs): gr.top_block.__init__(self, "Top Block") self.gsm_burst_file_source = grgsm.burst_file_source(burst_file) self.gsm_burst_timeslot_filter = grgsm.burst_timeslot_filter(timeslot) if mode == 'BCCH_SDCCH4': self.demapper = grgsm.gsm_bcch_ccch_sdcch4_demapper( timeslot_nr=timeslot, ) else: self.demapper = grgsm.gsm_sdcch8_demapper(timeslot_nr=timeslot, ) self.gsm_control_channels_decoder = grgsm.control_channels_decoder() self.gsm_extract_cmc = grgsm.extract_cmc() self.gsm_extract_immediate_assignment = grgsm.extract_immediate_assignment( False, not show_gprs, True) self.gsm_extract_system_info = grgsm.extract_system_info() self.msg_connect((self.gsm_burst_file_source, 'out'), (self.gsm_burst_timeslot_filter, 'in')) self.msg_connect((self.gsm_burst_timeslot_filter, 'out'), (self.demapper, 'bursts')) self.msg_connect((self.demapper, 'bursts'), (self.gsm_control_channels_decoder, 'bursts')) self.msg_connect((self.gsm_control_channels_decoder, 'msgs'), (self.gsm_extract_cmc, 'msgs')) self.msg_connect((self.gsm_control_channels_decoder, 'msgs'), (self.gsm_extract_immediate_assignment, 'msgs')) self.msg_connect((self.gsm_control_channels_decoder, 'msgs'), (self.gsm_extract_system_info, 'msgs'))
def __init__(self, burst_file, timeslot, mode, framenumber): gr.top_block.__init__(self, "Top Block") self.burst_file_source = grgsm.burst_file_source(burst_file) self.timeslot_filter = grgsm.burst_timeslot_filter(timeslot) self.fnr_filter_start = grgsm.burst_fnr_filter( grgsm.FILTER_GREATER_OR_EQUAL, framenumber) if mode == 'BCCH_SDCCH4': self.demapper = grgsm.gsm_bcch_ccch_sdcch4_demapper( timeslot_nr=timeslot, ) else: self.demapper = grgsm.gsm_sdcch8_demapper(timeslot_nr=timeslot, ) self.decoder = grgsm.control_channels_decoder() self.extract_immediate_assignment = grgsm.extract_immediate_assignment( ) self.msg_connect((self.burst_file_source, 'out'), (self.timeslot_filter, 'in')) self.msg_connect((self.timeslot_filter, 'out'), (self.fnr_filter_start, 'in')) self.msg_connect((self.fnr_filter_start, 'out'), (self.demapper, 'bursts')) self.msg_connect((self.demapper, 'bursts'), (self.decoder, 'bursts')) self.msg_connect((self.decoder, 'msgs'), (self.extract_immediate_assignment, 'msgs'))
def __init__(self, timeslot, burst_file, mode, fnr_start, fnr_end): gr.top_block.__init__(self, "Top Block") self.burst_file_source = grgsm.burst_file_source(burst_file) self.timeslot_filter = grgsm.burst_timeslot_filter(timeslot) self.fnr_filter_start = grgsm.burst_fnr_filter(grgsm.FILTER_GREATER_OR_EQUAL, fnr_start) self.fnr_filter_end = grgsm.burst_fnr_filter(grgsm.FILTER_LESS_OR_EQUAL, fnr_end) if mode == 'BCCH_SDCCH4': self.subslot_splitter = grgsm.burst_sdcch_subslot_splitter(grgsm.SPLITTER_SDCCH4) self.subslot_analyzers = [CMCAnalyzerArm() for x in range(4)] self.demapper = grgsm.gsm_bcch_ccch_sdcch4_demapper(timeslot_nr=timeslot, ) else: self.subslot_splitter = grgsm.burst_sdcch_subslot_splitter(grgsm.SPLITTER_SDCCH8) self.subslot_analyzers = [CMCAnalyzerArm() for x in range(8)] self.demapper = grgsm.gsm_sdcch8_demapper(timeslot_nr=timeslot, ) self.control_channels_decoder = grgsm.control_channels_decoder() self.burst_sink = grgsm.burst_sink() self.msg_connect((self.burst_file_source, 'out'), (self.timeslot_filter, 'in')) self.msg_connect((self.timeslot_filter, 'out'), (self.fnr_filter_start, 'in')) self.msg_connect((self.fnr_filter_start, 'out'), (self.fnr_filter_end, 'in')) self.msg_connect((self.fnr_filter_end, 'out'), (self.demapper, 'bursts')) self.msg_connect((self.demapper, 'bursts'), (self.burst_sink, 'in')) self.msg_connect((self.demapper, 'bursts'), (self.subslot_splitter, 'in')) for i in range(4 if mode == 'BCCH_SDCCH4' else 8): self.msg_connect((self.subslot_splitter, 'out' + str(i)), (self.subslot_analyzers[i], 'in')) self.bursts = None self.cmcs = None
def __init__(self): gr.top_block.__init__(self, "Uplink decoding demo") ################################################## # Variables ################################################## self.samp_rate = samp_rate = 1e6 ################################################## # Blocks ################################################## self.gsm_sdcch8_demapper_0 = grgsm.gsm_sdcch8_demapper(timeslot_nr=1) self.gsm_receiver_with_uplink_0 = grgsm.receiver(4, ([0]), ([2]), True) self.gsm_message_printer_0_0 = grgsm.message_printer(pmt.intern(""), False, False, False) self.gsm_input_0_0 = grgsm.gsm_input(ppm=0, osr=4, fc=947.8e6 - 45e6, samp_rate_in=samp_rate) self.gsm_input_0 = grgsm.gsm_input(ppm=0, osr=4, fc=947.8e6, samp_rate_in=samp_rate) self.gsm_decryption_0_3 = grgsm.decryption(([0x46, 0x77, 0x2D, 0x54, 0xA3, 0xA3, 0xC3, 0x1C]), 1) self.gsm_control_channels_decoder_0_1_0 = grgsm.control_channels_decoder() self.gsm_control_channels_decoder_0_1 = grgsm.control_channels_decoder() self.gsm_clock_offset_control_0 = grgsm.clock_offset_control(947.8e6) self.blocks_socket_pdu_0_0_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000, False) self.blocks_file_source_0_0 = blocks.file_source(gr.sizeof_gr_complex * 1, "sms_multirtl_uplink_tail", False) self.blocks_file_source_0 = blocks.file_source(gr.sizeof_gr_complex * 1, "sms_multirtl_downlink_tail", False) ################################################## # Connections ################################################## self.msg_connect((self.gsm_clock_offset_control_0, "ppm"), (self.gsm_input_0, "ppm_in")) self.msg_connect((self.gsm_clock_offset_control_0, "ppm"), (self.gsm_input_0_0, "ppm_in")) self.msg_connect((self.gsm_control_channels_decoder_0_1, "msgs"), (self.blocks_socket_pdu_0_0_0, "pdus")) self.msg_connect((self.gsm_control_channels_decoder_0_1, "msgs"), (self.gsm_message_printer_0_0, "msgs")) self.msg_connect((self.gsm_control_channels_decoder_0_1_0, "msgs"), (self.blocks_socket_pdu_0_0_0, "pdus")) self.msg_connect((self.gsm_control_channels_decoder_0_1_0, "msgs"), (self.gsm_message_printer_0_0, "msgs")) self.msg_connect((self.gsm_decryption_0_3, "bursts"), (self.gsm_control_channels_decoder_0_1_0, "bursts")) self.msg_connect( (self.gsm_receiver_with_uplink_0, "measurements"), (self.gsm_clock_offset_control_0, "measurements") ) self.msg_connect((self.gsm_receiver_with_uplink_0, "C0"), (self.gsm_sdcch8_demapper_0, "bursts")) self.msg_connect((self.gsm_sdcch8_demapper_0, "bursts"), (self.gsm_control_channels_decoder_0_1, "bursts")) self.msg_connect((self.gsm_sdcch8_demapper_0, "bursts"), (self.gsm_decryption_0_3, "bursts")) self.connect((self.blocks_file_source_0, 0), (self.gsm_input_0, 0)) self.connect((self.blocks_file_source_0_0, 0), (self.gsm_input_0_0, 0)) self.connect((self.gsm_input_0, 0), (self.gsm_receiver_with_uplink_0, 0)) self.connect((self.gsm_input_0_0, 0), (self.gsm_receiver_with_uplink_0, 1))
def __init__(self, timeslot, burst_file, mode): gr.top_block.__init__(self, "Top Block") self.si_messages = dict() self.burst_file_source = grgsm.burst_file_source(burst_file) self.timeslot_filter = grgsm.burst_timeslot_filter(timeslot) if mode == 'BCCH_SDCCH4': self.demapper = grgsm.gsm_bcch_ccch_sdcch4_demapper(timeslot_nr=timeslot, ) else: self.demapper = grgsm.gsm_sdcch8_demapper(timeslot_nr=timeslot, ) self.decoder = grgsm.control_channels_decoder() self.control_channels_decoder = grgsm.control_channels_decoder() self.collect_system_info = grgsm.collect_system_info() self.msg_connect((self.burst_file_source, 'out'), (self.timeslot_filter, 'in')) self.msg_connect((self.timeslot_filter, 'out'), (self.demapper, 'bursts')) self.msg_connect((self.demapper, 'bursts'), (self.decoder, 'bursts')) self.msg_connect((self.decoder, 'msgs'), (self.collect_system_info, 'msgs'))
def __init__(self, args="", fc=939.4e6, gain=30, ppm=0, samp_rate=2000000.052982, shiftoff=400e3, osr=4): gr.top_block.__init__(self, "Gr-gsm Livemon") ################################################## # Parameters ################################################## self.args = args self.fc = fc self.gain = gain self.ppm = ppm self.samp_rate = samp_rate self.shiftoff = shiftoff self.osr = osr print " [+] starting grgsm_livemon_headless..." print " [>] frequency: %s Hz (specify with -fc)" % fc print " [>] gain: %s dB (specify with --gain)" % gain print " [>] ppm: %s (specify with --ppm)" % ppm print " [>] sample rate: %s (specify with --samp_rate)" % samp_rate print " [>] shift offset: %s Hz (specify with --shiftoff)" % shiftoff self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + args ) self.rtlsdr_source_0.set_sample_rate(samp_rate) self.rtlsdr_source_0.set_center_freq(fc-shiftoff, 0) self.rtlsdr_source_0.set_freq_corr(self.ppm, 0) self.rtlsdr_source_0.set_dc_offset_mode(2, 0) self.rtlsdr_source_0.set_iq_balance_mode(2, 0) self.rtlsdr_source_0.set_gain_mode(True, 0) self.rtlsdr_source_0.set_gain(self.gain, 0) self.rtlsdr_source_0.set_if_gain(20, 0) self.rtlsdr_source_0.set_bb_gain(20, 0) self.rtlsdr_source_0.set_antenna("", 0) self.rtlsdr_source_0.set_bandwidth(250e3+abs(shiftoff), 0) self.gsm_sdcch8_demapper_0 = grgsm.gsm_sdcch8_demapper( timeslot_nr=1, ) self.gsm_receiver_0 = grgsm.receiver(4, ([0]), ([]), False) self.gsm_message_printer_1 = grgsm.message_printer(pmt.intern(""), False, False, False) self.gsm_input_0 = grgsm.gsm_input( ppm=0, osr=4, fc=fc, samp_rate_in=samp_rate, ) self.gsm_decryption_0 = grgsm.decryption(([]), 1) self.gsm_control_channels_decoder_0_0 = grgsm.control_channels_decoder() self.gsm_control_channels_decoder_0 = grgsm.control_channels_decoder() self.gsm_clock_offset_control_0 = grgsm.clock_offset_control(fc-shiftoff, samp_rate, osr) self.gsm_bcch_ccch_demapper_0 = grgsm.gsm_bcch_ccch_demapper( timeslot_nr=0, ) self.blocks_socket_pdu_0_0 = blocks.socket_pdu("UDP_SERVER", "127.0.0.1", "4730", 10000, False) self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000, False) self.blocks_rotator_cc_0 = blocks.rotator_cc(-2*pi*shiftoff/samp_rate) ################################################## # Connections ################################################## self.msg_connect((self.gsm_bcch_ccch_demapper_0, 'bursts'), (self.gsm_control_channels_decoder_0, 'bursts')) self.msg_connect((self.gsm_clock_offset_control_0, 'ctrl'), (self.gsm_input_0, 'ctrl_in')) self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.blocks_socket_pdu_0, 'pdus')) self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.gsm_message_printer_1, 'msgs')) self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.blocks_socket_pdu_0, 'pdus')) self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.gsm_message_printer_1, 'msgs')) self.msg_connect((self.gsm_decryption_0, 'bursts'), (self.gsm_control_channels_decoder_0_0, 'bursts')) self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_bcch_ccch_demapper_0, 'bursts')) self.msg_connect((self.gsm_receiver_0, 'measurements'), (self.gsm_clock_offset_control_0, 'measurements')) self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_sdcch8_demapper_0, 'bursts')) self.msg_connect((self.gsm_sdcch8_demapper_0, 'bursts'), (self.gsm_decryption_0, 'bursts')) self.connect((self.blocks_rotator_cc_0, 0), (self.gsm_input_0, 0)) self.connect((self.gsm_input_0, 0), (self.gsm_receiver_0, 0)) self.connect((self.rtlsdr_source_0, 0), (self.blocks_rotator_cc_0, 0)) print " [+] go!"
def __init__(self, gain=None, samp_rate=None, ppm=None, arfcn=None, capture_id=None, udp_ports=[], max_timeslot=0, store_capture=True, verbose=False, band=None, rec_length=None, test=False, args=""): """ capture_id = identifier for the capture used to store the files (e.g. <capture_id>.cfile) store_capture = boolean indicating if the capture should be stored on disk or not rec_length = capture time in seconds max_timeslot = timeslot 0...max_timeslot will be decoded udp_ports = a list of udp ports to send the captured GSMTap frames to """ gr.top_block.__init__(self, "Gr-gsm Capture") ################################################## # Parameters ################################################## self.arfcn = arfcn for band in grgsm.arfcn.get_bands(): if grgsm.arfcn.is_valid_arfcn(self.arfcn, band): self.fc = grgsm.arfcn.arfcn2downlink(arfcn, band) break self.gain = gain self.samp_rate = samp_rate self.ppm = ppm self.arfcn = arfcn self.band = band self.shiftoff = shiftoff = 400e3 self.rec_length = rec_length self.store_capture = store_capture self.capture_id = capture_id self.udp_ports = udp_ports self.verbose = verbose ################################################## # Processing Blocks ################################################## self.rtlsdr_source = osmosdr.source( args="numchan=" + str(1) + " " + "" ) self.rtlsdr_source.set_sample_rate(samp_rate) self.rtlsdr_source.set_center_freq(self.fc - shiftoff, 0) self.rtlsdr_source.set_freq_corr(ppm, 0) self.rtlsdr_source.set_dc_offset_mode(2, 0) self.rtlsdr_source.set_iq_balance_mode(2, 0) self.rtlsdr_source.set_gain_mode(True, 0) self.rtlsdr_source.set_gain(gain, 0) self.rtlsdr_source.set_if_gain(20, 0) self.rtlsdr_source.set_bb_gain(20, 0) self.rtlsdr_source.set_antenna("", 0) self.rtlsdr_source.set_bandwidth(250e3+abs(shiftoff), 0) self.blocks_rotator = blocks.rotator_cc(-2*pi*shiftoff/samp_rate) #RUn for the specified amount of seconds or indefenitely if self.rec_length is not None: self.blocks_head_0 = blocks.head(gr.sizeof_gr_complex, int(samp_rate*rec_length)) self.gsm_receiver = grgsm.receiver(4, ([self.arfcn]), ([])) self.gsm_input = grgsm.gsm_input( ppm=0, osr=4, fc=self.fc, samp_rate_in=samp_rate, ) self.gsm_clock_offset_control = grgsm.clock_offset_control(self.fc-shiftoff) #Control channel demapper for timeslot 0 #self.gsm_bcch_ccch_demapper_0 = grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([1,2,2,2,2,2,2,2,2,2])) self.gsm_bcch_ccch_demapper_0 = grgsm.gsm_bcch_ccch_demapper(0) #For all other timeslots are assumed to contain sdcch8 logical channels, this demapping may be incorrect if max_timeslot >= 1 and max_timeslot <= 8: self.gsm_sdcch8_demappers = [] for i in range(1,max_timeslot + 1): #self.gsm_sdcch8_demappers.append(grgsm.universal_ctrl_chans_demapper(i, ([0,4,8,12,16,20,24,28,32,36,40,44]), ([8,8,8,8,8,8,8,8,136,136,136,136]))) self.gsm_sdcch8_demappers.append(grgsm.gsm_sdcch8_demapper(i)) #Control channel decoder (extracts the packets), one for each timeslot self.gsm_control_channels_decoders = [] for i in range(0,max_timeslot + 1): self.gsm_control_channels_decoders.append(grgsm.control_channels_decoder()) # self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000, False)# self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000, False) #UDP client that sends all decoded C0T0 packets to the specified port on localhost if requested self.client_sockets = [] self.server_sockets = [] for udp_port in self.udp_ports: #The server is for testing only #WARNING remove the server if you want connect to a different one if test: self.server_sockets.append(blocks.socket_pdu("UDP_SERVER", "127.0.0.1", str(udp_port), 10000)) self.client_sockets.append(blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", str(udp_port), 10000)) #Sinks to store the capture file if requested if self.store_capture: self.gsm_burst_file_sink = grgsm.burst_file_sink(str(self.capture_id) + ".burstfile") self.blocks_file_sink = blocks.file_sink(gr.sizeof_gr_complex*1, str(self.capture_id) + ".cfile", False) self.blocks_file_sink.set_unbuffered(False) #Printer for printing messages when verbose flag is True if self.verbose: self.gsm_message_printer = grgsm.message_printer(pmt.intern(""), False) """ if self.verbose: self.gsm_bursts_printer_0 = grgsm.bursts_printer(pmt.intern(""), False, False, False, False) """ ################################################## # Connections ################################################## if self.rec_length is not None: #if recording length is defined connect head block after the source self.connect((self.rtlsdr_source, 0), (self.blocks_head_0, 0)) self.connect((self.blocks_head_0, 0), (self.blocks_rotator, 0)) else: self.connect((self.rtlsdr_source, 0), (self.blocks_rotator, 0)) #Connect the file sinks if self.store_capture: self.connect((self.blocks_rotator, 0), (self.blocks_file_sink, 0)) self.msg_connect(self.gsm_receiver, "C0", self.gsm_burst_file_sink, "in") #Connect the GSM receiver self.connect((self.gsm_input, 0), (self.gsm_receiver, 0)) self.connect((self.blocks_rotator, 0), (self.gsm_input, 0)) self.msg_connect(self.gsm_clock_offset_control, "ppm", self.gsm_input, "ppm_in") self.msg_connect(self.gsm_receiver, "measurements", self.gsm_clock_offset_control, "measurements") #Connect the demapper and decoder for timeslot 0 self.msg_connect((self.gsm_receiver, 'C0'), (self.gsm_bcch_ccch_demapper_0, 'bursts')) self.msg_connect((self.gsm_bcch_ccch_demapper_0, 'bursts'), (self.gsm_control_channels_decoders[0], 'bursts')) #Connect the demapper and decoders for the other timeslots for i in range(1,max_timeslot +1): self.msg_connect((self.gsm_receiver, 'C0'), (self.gsm_sdcch8_demappers[i-1], 'bursts')) self.msg_connect((self.gsm_sdcch8_demappers[i-1], 'bursts'), (self.gsm_control_channels_decoders[i], 'bursts')) #Connect the UDP clients if requested for client_socket in self.client_sockets: for i in range(0,max_timeslot + 1): self.msg_connect((self.gsm_control_channels_decoders[i], 'msgs'), (client_socket, 'pdus')) #Connect the printer is self.verbose is True if self.verbose: for i in range(0,max_timeslot + 1): self.msg_connect((self.gsm_control_channels_decoders[i], 'msgs'), (self.gsm_message_printer, 'msgs')) """
def __init__(self, args="", collector="localhost", collectorport='4729', fc=941.8e6, gain=30, osr=4, ppm=0, samp_rate=2000000.052982, serverport='4729', shiftoff=400e3): gr.top_block.__init__(self, "Gr-gsm Livemon") Qt.QWidget.__init__(self) self.setWindowTitle("Gr-gsm Livemon") qtgui.util.check_set_qss() try: self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) except: pass self.top_scroll_layout = Qt.QVBoxLayout() self.setLayout(self.top_scroll_layout) self.top_scroll = Qt.QScrollArea() self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) self.top_scroll_layout.addWidget(self.top_scroll) self.top_scroll.setWidgetResizable(True) self.top_widget = Qt.QWidget() self.top_scroll.setWidget(self.top_widget) self.top_layout = Qt.QVBoxLayout(self.top_widget) self.top_grid_layout = Qt.QGridLayout() self.top_layout.addLayout(self.top_grid_layout) self.settings = Qt.QSettings("GNU Radio", "grgsm_livemon") try: if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"): self.restoreGeometry( self.settings.value("geometry").toByteArray()) else: self.restoreGeometry(self.settings.value("geometry")) except: pass ################################################## # Parameters ################################################## self.args = args self.collector = collector self.collectorport = collectorport self.fc = fc self.gain = gain self.osr = osr self.ppm = ppm self.samp_rate = samp_rate self.serverport = serverport self.shiftoff = shiftoff ################################################## # Variables ################################################## self.ppm_slider = ppm_slider = ppm self.gain_slider = gain_slider = gain self.fc_slider = fc_slider = fc ################################################## # Blocks ################################################## self._ppm_slider_range = Range(-150, 150, 0.1, ppm, 100) self._ppm_slider_win = RangeWidget(self._ppm_slider_range, self.set_ppm_slider, 'PPM Offset', "counter", float) self.top_grid_layout.addWidget(self._ppm_slider_win) self._gain_slider_range = Range(0, 100, 0.5, gain, 100) self._gain_slider_win = RangeWidget(self._gain_slider_range, self.set_gain_slider, 'Gain', "counter", float) self.top_grid_layout.addWidget(self._gain_slider_win) self._fc_slider_range = Range(800e6, 1990e6, 2e5, fc, 100) self._fc_slider_win = RangeWidget(self._fc_slider_range, self.set_fc_slider, 'Frequency', "counter_slider", float) self.top_grid_layout.addWidget(self._fc_slider_win) self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + 'str(grgsm.device.get_default_args(args))') self.rtlsdr_source_0.set_sample_rate(samp_rate) self.rtlsdr_source_0.set_center_freq(fc_slider - shiftoff, 0) self.rtlsdr_source_0.set_freq_corr(ppm_slider, 0) self.rtlsdr_source_0.set_gain(gain_slider, 0) self.rtlsdr_source_0.set_if_gain(20, 0) self.rtlsdr_source_0.set_bb_gain(20, 0) self.rtlsdr_source_0.set_antenna('', 0) self.rtlsdr_source_0.set_bandwidth(250e3 + abs(shiftoff), 0) self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c( 1024, #size firdes.WIN_BLACKMAN_hARRIS, #wintype fc_slider, #fc samp_rate, #bw "", #name 1) self.qtgui_freq_sink_x_0.set_update_time(0.10) self.qtgui_freq_sink_x_0.set_y_axis(-140, 10) self.qtgui_freq_sink_x_0.set_y_label('Relative Gain', 'dB') self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "") self.qtgui_freq_sink_x_0.enable_autoscale(False) self.qtgui_freq_sink_x_0.enable_grid(False) self.qtgui_freq_sink_x_0.set_fft_average(1.0) self.qtgui_freq_sink_x_0.enable_axis_labels(True) self.qtgui_freq_sink_x_0.enable_control_panel(False) labels = ['', '', '', '', '', '', '', '', '', ''] widths = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] colors = [ "blue", "red", "green", "black", "cyan", "magenta", "yellow", "dark red", "dark green", "dark blue" ] alphas = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] for i in range(1): if len(labels[i]) == 0: self.qtgui_freq_sink_x_0.set_line_label( i, "Data {0}".format(i)) else: self.qtgui_freq_sink_x_0.set_line_label(i, labels[i]) self.qtgui_freq_sink_x_0.set_line_width(i, widths[i]) self.qtgui_freq_sink_x_0.set_line_color(i, colors[i]) self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i]) self._qtgui_freq_sink_x_0_win = sip.wrapinstance( self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget) self.top_grid_layout.addWidget(self._qtgui_freq_sink_x_0_win) self.gsm_sdcch8_demapper_0 = grgsm.gsm_sdcch8_demapper(timeslot_nr=1, ) self.gsm_receiver_0 = grgsm.receiver(osr, [1022], [], False) self.gsm_message_printer_1 = grgsm.message_printer( pmt.intern(""), False, False, False) self.gsm_input_0 = grgsm.gsm_input( ppm=ppm - int(ppm), osr=osr, fc=fc_slider - shiftoff, samp_rate_in=samp_rate, ) self.gsm_decryption_0 = grgsm.decryption([], 1) self.gsm_control_channels_decoder_0_0 = grgsm.control_channels_decoder( ) self.gsm_control_channels_decoder_0 = grgsm.control_channels_decoder() self.gsm_clock_offset_control_0 = grgsm.clock_offset_control( fc_slider - shiftoff, samp_rate, osr) self.gsm_bcch_ccch_demapper_0 = grgsm.gsm_bcch_ccch_demapper( timeslot_nr=0, ) self.blocks_socket_pdu_0_1 = blocks.socket_pdu('UDP_CLIENT', collector, collectorport, 1500, False) self.blocks_socket_pdu_0_0 = blocks.socket_pdu('UDP_SERVER', '127.0.0.1', serverport, 10000, False) self.blocks_rotator_cc_0 = blocks.rotator_cc(-2 * pi * shiftoff / samp_rate) ################################################## # Connections ################################################## self.msg_connect((self.blocks_socket_pdu_0_0, 'pdus'), (self.gsm_message_printer_1, 'msgs')) self.msg_connect((self.gsm_bcch_ccch_demapper_0, 'bursts'), (self.gsm_control_channels_decoder_0, 'bursts')) self.msg_connect((self.gsm_clock_offset_control_0, 'ctrl'), (self.gsm_input_0, 'ctrl_in')) self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.blocks_socket_pdu_0_1, 'pdus')) self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.blocks_socket_pdu_0_1, 'pdus')) self.msg_connect((self.gsm_decryption_0, 'bursts'), (self.gsm_control_channels_decoder_0_0, 'bursts')) self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_bcch_ccch_demapper_0, 'bursts')) self.msg_connect((self.gsm_receiver_0, 'measurements'), (self.gsm_clock_offset_control_0, 'measurements')) self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_sdcch8_demapper_0, 'bursts')) self.msg_connect((self.gsm_sdcch8_demapper_0, 'bursts'), (self.gsm_decryption_0, 'bursts')) self.connect((self.blocks_rotator_cc_0, 0), (self.gsm_input_0, 0)) self.connect((self.blocks_rotator_cc_0, 0), (self.qtgui_freq_sink_x_0, 0)) self.connect((self.gsm_input_0, 0), (self.gsm_receiver_0, 0)) self.connect((self.rtlsdr_source_0, 0), (self.blocks_rotator_cc_0, 0))
def __init__(self, filename, samp_rate, arfcn, chan_mode='BCCH', udp_port=4000, max_timeslot=0, verbose=True, args="", connectToSelf=False): """ """ gr.top_block.__init__(self, "FileAnalyzer") ################################################## # Parameters ################################################## self.arfcn = arfcn for band in grgsm.arfcn.get_bands(): if grgsm.arfcn.is_valid_arfcn(self.arfcn, band): self.fc = grgsm.arfcn.arfcn2downlink(arfcn, band) break self.samp_rate = samp_rate self.arfcn = arfcn self.udp_port = udp_port self.verbose = verbose self.cfile = filename.encode('utf-8') self.max_timeslot = max_timeslot self.chan_mode = chan_mode ################################################## # Processing Blocks ################################################## self.file_source = blocks.file_source(gr.sizeof_gr_complex * 1, self.cfile, False) self.receiver = grgsm.receiver(4, ([0]), ([])) if self.fc is not None: self.input_adapter = grgsm.gsm_input(ppm=0, osr=4, fc=self.fc, samp_rate_in=self.samp_rate) self.offset_control = grgsm.clock_offset_control(self.fc) else: self.input_adapter = grgsm.gsm_input(ppm=0, osr=4, samp_rate_in=self.samp_rate) self.bursts_printer = grgsm.bursts_printer(pmt.intern(""), True, True, True, True) self.timeslot_filters = [] for i in range(0, self.max_timeslot + 1): self.timeslot_filters.append(grgsm.burst_timeslot_filter(i)) self.dummy_burst_filters = [] for i in range(0, self.max_timeslot + 1): self.dummy_burst_filters.append(grgsm.dummy_burst_filter()) self.other_demappers = [] #Control channel demapper for timeslot 0 self.control_demapper = grgsm.gsm_bcch_ccch_demapper(0) #Demapping other timeslots than 0 to BCCH does not really make sense # if self.chan_mode == 'BCCH': # #Control channel demapper for other timeslots # for i in range(1, self.timeslot + 1): # self.other_demappers.append(grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([1,2,2,2,2,2,2,2,2,2]))) # #self.bcch_demapper = grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([1,2,2,2,2,2,2,2,2,2])) # #This is for a newer version of grgsm # #self.bcch_demapper = grgsm.gsm_bcch_ccch_demapper(self.timeslot) if self.chan_mode == 'BCCH_SDCCH4': for i in range(1, self.max_timeslot + 1): self.other_demappers.append(grgsm.gsm_sdcch4_demapper(i)) elif self.chan_mode == 'SDCCH8': for i in range(1, self.max_timeslot + 1): #self.other_demappers.append(grgsm.universal_ctrl_chans_demapper(i, ([0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44]), ([8, 8, 8, 8, 8, 8, 8, 8, 136, 136, 136, 136]))) self.other_demappers.append(grgsm.gsm_sdcch8_demapper(i)) # else: #Defaults to SDCCH8 for i in range(1, self.max_timeslot + 1): #self.other_demappers.append(grgsm.universal_ctrl_chans_demapper(i, ([0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44]), ([8, 8, 8, 8, 8, 8, 8, 8, 136, 136, 136, 136]))) self.other_demappers.append(grgsm.gsm_sdcch8_demapper(i)) self.decoders = [] for i in range(0, self.max_timeslot + 1): self.decoders.append(grgsm.control_channels_decoder()) #Server socket if connectToSelf: self.serversocket = blocks.socket_pdu("UDP_SERVER", "127.0.0.1", str(self.udp_port), 10000) self.socket_pdu = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", str(self.udp_port), 10000) if self.verbose: self.message_printer = grgsm.message_printer( pmt.intern(""), True, True, False) ################################################## # Asynch Message Connections ################################################## self.connect((self.file_source, 0), (self.input_adapter, 0)) self.connect((self.input_adapter, 0), (self.receiver, 0)) if self.fc is not None: self.msg_connect(self.offset_control, "ppm", self.input_adapter, "ppm_in") self.msg_connect(self.receiver, "measurements", self.offset_control, "measurements") #for df in self.dummy_burst_filters: # self.msg_connect(self.receiver, "C0", df, "in") #self.msg_connect(self.receiver, "C0", self.dummy_burst_filter, "in") #for index, tf in enumerate(self.dummy_burst_filters): # self.msg_connect(self.dummy_burst_filters[index], "out", self.timeslot_filters[index], "in") #self.msg_connect(self.dummy_burst_filter, "out", self.timeslot_filter, "in") #if self.print_bursts: #for tf in self.timeslot_filters: # self.msg_connect(tf, "out", self.bursts_printer, 'bursts') #self.msg_connect(self.timeslot_filter, "out", self.bursts_printer, 'bursts') #Connect the timeslot 0 demapper and decoder #self.msg_connect(self.timeslot_filters[0], "out", self.control_demapper, "bursts") self.msg_connect(self.receiver, "C0", self.control_demapper, "bursts") self.msg_connect(self.control_demapper, "bursts", self.decoders[0], "bursts") self.msg_connect(self.decoders[0], "msgs", self.socket_pdu, "pdus") if self.verbose: self.msg_connect(self.decoders[0], "msgs", self.message_printer, "msgs") #Connect the demappers and decoders for the other timeslots for i in range(1, self.max_timeslot + 1): self.msg_connect(self.receiver, "C0", self.other_demappers[i - 1], "bursts") #self.msg_connect(self.timeslot_filters[i], "out", self.other_demappers[i - 1], "bursts") self.msg_connect(self.other_demappers[i - 1], "bursts", self.decoders[i], "bursts") self.msg_connect(self.decoders[i], "msgs", self.socket_pdu, "pdus") if self.verbose: self.msg_connect(self.decoders[i], "msgs", self.message_printer, "msgs")
def __init__(self, osr=4): gr.top_block.__init__(self, "Uplink decoding demo") ################################################## # Parameters ################################################## self.osr = osr ################################################## # Variables ################################################## self.samp_rate = samp_rate = 1e6 ################################################## # Blocks ################################################## self.socket_pdu_server = blocks.socket_pdu("UDP_SERVER", '127.0.0.1', '4729', 10000, False) self.gsm_sdcch8_demapper_0 = grgsm.gsm_sdcch8_demapper(timeslot_nr=1, ) self.gsm_receiver_with_uplink_0 = grgsm.receiver( 4, ([22]), ([2]), True) self.gsm_message_printer_0_0 = grgsm.message_printer( pmt.intern(""), False, False, False) self.gsm_input_0_0 = grgsm.gsm_input( ppm=0, osr=4, fc=947.8e6 - 45e6, samp_rate_in=samp_rate, ) self.gsm_input_0 = grgsm.gsm_input( ppm=0, osr=4, fc=947.8e6, samp_rate_in=samp_rate, ) self.gsm_decryption_0_3 = grgsm.decryption( ([0x46, 0x77, 0x2d, 0x54, 0xa3, 0xa3, 0xc3, 0x1c]), 1) self.gsm_control_channels_decoder_0_1_0 = grgsm.control_channels_decoder( ) self.gsm_control_channels_decoder_0_1 = grgsm.control_channels_decoder( ) self.gsm_clock_offset_control_0 = grgsm.clock_offset_control( 947.8e6, samp_rate, osr) self.blocks_socket_pdu_0_0_0 = blocks.socket_pdu( "UDP_CLIENT", '127.0.0.1', '4729', 10000, False) self.blocks_file_source_0_0 = blocks.file_source( gr.sizeof_gr_complex * 1, 'sms_multirtl_uplink_tail.cfile', False) self.blocks_file_source_0 = blocks.file_source( gr.sizeof_gr_complex * 1, 'sms_multirtl_downlink_tail.cfile', False) ################################################## # Connections ################################################## self.msg_connect((self.gsm_clock_offset_control_0, 'ctrl'), (self.gsm_input_0, 'ctrl_in')) self.msg_connect((self.gsm_clock_offset_control_0, 'ctrl'), (self.gsm_input_0_0, 'ctrl_in')) self.msg_connect((self.gsm_control_channels_decoder_0_1, 'msgs'), (self.blocks_socket_pdu_0_0_0, 'pdus')) self.msg_connect((self.gsm_control_channels_decoder_0_1, 'msgs'), (self.gsm_message_printer_0_0, 'msgs')) self.msg_connect((self.gsm_control_channels_decoder_0_1_0, 'msgs'), (self.blocks_socket_pdu_0_0_0, 'pdus')) self.msg_connect((self.gsm_control_channels_decoder_0_1_0, 'msgs'), (self.gsm_message_printer_0_0, 'msgs')) self.msg_connect((self.gsm_decryption_0_3, 'bursts'), (self.gsm_control_channels_decoder_0_1_0, 'bursts')) self.msg_connect((self.gsm_receiver_with_uplink_0, 'measurements'), (self.gsm_clock_offset_control_0, 'measurements')) self.msg_connect((self.gsm_receiver_with_uplink_0, 'C0'), (self.gsm_sdcch8_demapper_0, 'bursts')) self.msg_connect((self.gsm_sdcch8_demapper_0, 'bursts'), (self.gsm_control_channels_decoder_0_1, 'bursts')) self.msg_connect((self.gsm_sdcch8_demapper_0, 'bursts'), (self.gsm_decryption_0_3, 'bursts')) self.connect((self.blocks_file_source_0, 0), (self.gsm_input_0, 0)) self.connect((self.blocks_file_source_0_0, 0), (self.gsm_input_0_0, 0)) self.connect((self.gsm_input_0, 0), (self.gsm_receiver_with_uplink_0, 0)) self.connect((self.gsm_input_0_0, 0), (self.gsm_receiver_with_uplink_0, 1))
def __init__(self, rec_len=1000000, samp_rate=2000000.052982, fc=941.8e6, shiftoff=400e3, args="", osr=4, collector="localhost", collectorport="4729", serverport="4729", gain=30, ppm=0): gr.top_block.__init__(self, "Gr-gsm Livemon") ################################################## # Parameters ################################################## self.rec_len = rec_len self.samp_rate = samp_rate self.fc = fc self.shiftoff = shiftoff self.args = args self.osr = osr self.collector = collector self.collectorport = collectorport self.serverport = serverport self.gain = gain self.ppm = ppm ################################################## # Blocks ################################################## self.rtlsdr_source_0 = osmosdr.source(args="numchan=" + str(1) + " " + args) self.rtlsdr_source_0.set_sample_rate(samp_rate) self.rtlsdr_source_0.set_center_freq(fc - shiftoff, 0) self.rtlsdr_source_0.set_freq_corr(ppm, 0) self.rtlsdr_source_0.set_dc_offset_mode(2, 0) self.rtlsdr_source_0.set_iq_balance_mode(2, 0) self.rtlsdr_source_0.set_gain_mode(False, 0) self.rtlsdr_source_0.set_gain(gain, 0) self.rtlsdr_source_0.set_if_gain(20, 0) self.rtlsdr_source_0.set_bb_gain(20, 0) self.rtlsdr_source_0.set_antenna("", 0) self.rtlsdr_source_0.set_bandwidth(250e3 + abs(shiftoff), 0) self.gsm_sdcch8_demapper_0 = grgsm.gsm_sdcch8_demapper(timeslot_nr=1, ) self.gsm_receiver_0 = grgsm.receiver(4, ([0]), ([]), False) self.gsm_message_printer_1 = grgsm.message_printer( pmt.intern(""), False, False, False) self.gsm_input_0 = grgsm.gsm_input( ppm=ppm - int(ppm), osr=4, fc=fc, samp_rate_in=samp_rate, ) self.gsm_decryption_0 = grgsm.decryption(([]), 1) self.gsm_control_channels_decoder_0_0 = grgsm.control_channels_decoder( ) self.gsm_control_channels_decoder_0 = grgsm.control_channels_decoder() self.gsm_clock_offset_control_0 = grgsm.clock_offset_control( fc - shiftoff, samp_rate, osr) self.gsm_bcch_ccch_sdcch4_demapper_0 = grgsm.gsm_bcch_ccch_sdcch4_demapper( timeslot_nr=0, ) self.blocks_socket_pdu_0_1 = blocks.socket_pdu("UDP_CLIENT", collector, collectorport, 1500, False) self.blocks_socket_pdu_0_0 = blocks.socket_pdu("UDP_SERVER", "127.0.0.1", serverport, 10000, False) self.blocks_rotator_cc_0 = blocks.rotator_cc(-2 * pi * shiftoff / samp_rate) self.blocks_head_0 = blocks.head(gr.sizeof_gr_complex * 1, int(rec_len * samp_rate)) ################################################## # Connections ################################################## self.msg_connect((self.blocks_socket_pdu_0_0, 'pdus'), (self.gsm_message_printer_1, 'msgs')) self.msg_connect((self.gsm_bcch_ccch_sdcch4_demapper_0, 'bursts'), (self.gsm_control_channels_decoder_0, 'bursts')) self.msg_connect((self.gsm_clock_offset_control_0, 'ctrl'), (self.gsm_input_0, 'ctrl_in')) self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.blocks_socket_pdu_0_1, 'pdus')) self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.blocks_socket_pdu_0_1, 'pdus')) self.msg_connect((self.gsm_decryption_0, 'bursts'), (self.gsm_control_channels_decoder_0_0, 'bursts')) self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_bcch_ccch_sdcch4_demapper_0, 'bursts')) self.msg_connect((self.gsm_receiver_0, 'measurements'), (self.gsm_clock_offset_control_0, 'measurements')) self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_sdcch8_demapper_0, 'bursts')) self.msg_connect((self.gsm_sdcch8_demapper_0, 'bursts'), (self.gsm_decryption_0, 'bursts')) self.connect((self.blocks_head_0, 0), (self.blocks_rotator_cc_0, 0)) self.connect((self.blocks_rotator_cc_0, 0), (self.gsm_input_0, 0)) self.connect((self.gsm_input_0, 0), (self.gsm_receiver_0, 0)) self.connect((self.rtlsdr_source_0, 0), (self.blocks_head_0, 0))
def __init__(self, filename, samp_rate, arfcn, chan_mode='BCCH', udp_port=4000, max_timeslot=0, verbose=True, args="", connectToSelf=False): """ """ gr.top_block.__init__(self, "FileAnalyzer") ################################################## # Parameters ################################################## self.arfcn = arfcn for band in grgsm.arfcn.get_bands(): if grgsm.arfcn.is_valid_arfcn(self.arfcn, band): self.fc = grgsm.arfcn.arfcn2downlink(arfcn, band) break self.samp_rate = samp_rate self.arfcn = arfcn self.udp_port = udp_port self.verbose = verbose self.cfile = filename.encode('utf-8') self.max_timeslot = max_timeslot self.chan_mode = chan_mode ################################################## # Processing Blocks ################################################## self.file_source = blocks.file_source(gr.sizeof_gr_complex*1, self.cfile, False) self.receiver = grgsm.receiver(4, ([0]), ([])) if self.fc is not None: self.input_adapter = grgsm.gsm_input(ppm=0, osr=4, fc=self.fc, samp_rate_in=self.samp_rate) self.offset_control = grgsm.clock_offset_control(self.fc) else: self.input_adapter = grgsm.gsm_input(ppm=0, osr=4, samp_rate_in=self.samp_rate) self.bursts_printer = grgsm.bursts_printer(pmt.intern(""), True, True, True, True) self.timeslot_filters = [] for i in range(0, self.max_timeslot + 1): self.timeslot_filters.append(grgsm.burst_timeslot_filter(i)) self.dummy_burst_filters = [] for i in range(0, self.max_timeslot + 1): self.dummy_burst_filters.append(grgsm.dummy_burst_filter()) self.other_demappers = [] #Control channel demapper for timeslot 0 self.control_demapper = grgsm.gsm_bcch_ccch_demapper(0) #Demapping other timeslots than 0 to BCCH does not really make sense # if self.chan_mode == 'BCCH': # #Control channel demapper for other timeslots # for i in range(1, self.timeslot + 1): # self.other_demappers.append(grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([1,2,2,2,2,2,2,2,2,2]))) # #self.bcch_demapper = grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([1,2,2,2,2,2,2,2,2,2])) # #This is for a newer version of grgsm # #self.bcch_demapper = grgsm.gsm_bcch_ccch_demapper(self.timeslot) if self.chan_mode == 'BCCH_SDCCH4': for i in range(1, self.max_timeslot + 1): self.other_demappers.append(grgsm.gsm_sdcch4_demapper(i)) elif self.chan_mode == 'SDCCH8': for i in range(1, self.max_timeslot + 1): #self.other_demappers.append(grgsm.universal_ctrl_chans_demapper(i, ([0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44]), ([8, 8, 8, 8, 8, 8, 8, 8, 136, 136, 136, 136]))) self.other_demappers.append(grgsm.gsm_sdcch8_demapper(i)) # else: #Defaults to SDCCH8 for i in range(1, self.max_timeslot + 1): #self.other_demappers.append(grgsm.universal_ctrl_chans_demapper(i, ([0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44]), ([8, 8, 8, 8, 8, 8, 8, 8, 136, 136, 136, 136]))) self.other_demappers.append(grgsm.gsm_sdcch8_demapper(i)) self.decoders = [] for i in range(0, self.max_timeslot + 1): self.decoders.append(grgsm.control_channels_decoder()) #Server socket if connectToSelf: self.serversocket = blocks.socket_pdu("UDP_SERVER", "127.0.0.1", str(self.udp_port), 10000) self.socket_pdu = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", str(self.udp_port), 10000) if self.verbose: self.message_printer = grgsm.message_printer(pmt.intern(""), True, True, False) ################################################## # Asynch Message Connections ################################################## self.connect((self.file_source, 0), (self.input_adapter, 0)) self.connect((self.input_adapter, 0), (self.receiver, 0)) if self.fc is not None: self.msg_connect(self.offset_control, "ppm", self.input_adapter, "ppm_in") self.msg_connect(self.receiver, "measurements", self.offset_control, "measurements") #for df in self.dummy_burst_filters: # self.msg_connect(self.receiver, "C0", df, "in") #self.msg_connect(self.receiver, "C0", self.dummy_burst_filter, "in") #for index, tf in enumerate(self.dummy_burst_filters): # self.msg_connect(self.dummy_burst_filters[index], "out", self.timeslot_filters[index], "in") #self.msg_connect(self.dummy_burst_filter, "out", self.timeslot_filter, "in") #if self.print_bursts: #for tf in self.timeslot_filters: # self.msg_connect(tf, "out", self.bursts_printer, 'bursts') #self.msg_connect(self.timeslot_filter, "out", self.bursts_printer, 'bursts') #Connect the timeslot 0 demapper and decoder #self.msg_connect(self.timeslot_filters[0], "out", self.control_demapper, "bursts") self.msg_connect(self.receiver, "C0", self.control_demapper, "bursts") self.msg_connect(self.control_demapper, "bursts", self.decoders[0], "bursts") self.msg_connect(self.decoders[0], "msgs", self.socket_pdu, "pdus") if self.verbose: self.msg_connect(self.decoders[0], "msgs", self.message_printer, "msgs") #Connect the demappers and decoders for the other timeslots for i in range(1, self.max_timeslot + 1): self.msg_connect(self.receiver, "C0", self.other_demappers[i-1], "bursts") #self.msg_connect(self.timeslot_filters[i], "out", self.other_demappers[i - 1], "bursts") self.msg_connect(self.other_demappers[i - 1], "bursts", self.decoders[i], "bursts") self.msg_connect(self.decoders[i], "msgs", self.socket_pdu, "pdus") if self.verbose: self.msg_connect(self.decoders[i], "msgs", self.message_printer, "msgs")
def __init__(self, gain=None, samp_rate=None, ppm=None, arfcn=None, capture_id=None, udp_ports=[], max_timeslot=0, store_capture=True, verbose=False, band=None, rec_length=None, test=False, args=""): """ capture_id = identifier for the capture used to store the files (e.g. <capture_id>.cfile) store_capture = boolean indicating if the capture should be stored on disk or not rec_length = capture time in seconds max_timeslot = timeslot 0...max_timeslot will be decoded udp_ports = a list of udp ports to send the captured GSMTap frames to """ gr.top_block.__init__(self, "Gr-gsm Capture") ################################################## # Parameters ################################################## self.arfcn = arfcn for band in grgsm.arfcn.get_bands(): if grgsm.arfcn.is_valid_arfcn(self.arfcn, band): self.fc = grgsm.arfcn.arfcn2downlink(arfcn, band) break self.gain = gain self.samp_rate = samp_rate self.ppm = ppm self.arfcn = arfcn self.band = band self.shiftoff = shiftoff = 400e3 self.rec_length = rec_length self.store_capture = store_capture self.capture_id = capture_id self.udp_ports = udp_ports self.verbose = verbose ################################################## # Processing Blocks ################################################## self.rtlsdr_source = osmosdr.source(args="numchan=" + str(1) + " " + "") self.rtlsdr_source.set_sample_rate(samp_rate) self.rtlsdr_source.set_center_freq(self.fc - shiftoff, 0) self.rtlsdr_source.set_freq_corr(ppm, 0) self.rtlsdr_source.set_dc_offset_mode(2, 0) self.rtlsdr_source.set_iq_balance_mode(2, 0) self.rtlsdr_source.set_gain_mode(True, 0) self.rtlsdr_source.set_gain(gain, 0) self.rtlsdr_source.set_if_gain(20, 0) self.rtlsdr_source.set_bb_gain(20, 0) self.rtlsdr_source.set_antenna("", 0) self.rtlsdr_source.set_bandwidth(250e3 + abs(shiftoff), 0) self.blocks_rotator = blocks.rotator_cc(-2 * pi * shiftoff / samp_rate) #RUn for the specified amount of seconds or indefenitely if self.rec_length is not None: self.blocks_head_0 = blocks.head(gr.sizeof_gr_complex, int(samp_rate * rec_length)) self.gsm_receiver = grgsm.receiver(4, ([self.arfcn]), ([])) self.gsm_input = grgsm.gsm_input( ppm=0, osr=4, fc=self.fc, samp_rate_in=samp_rate, ) self.gsm_clock_offset_control = grgsm.clock_offset_control(self.fc - shiftoff) #Control channel demapper for timeslot 0 #self.gsm_bcch_ccch_demapper_0 = grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([1,2,2,2,2,2,2,2,2,2])) self.gsm_bcch_ccch_demapper_0 = grgsm.gsm_bcch_ccch_demapper(0) #For all other timeslots are assumed to contain sdcch8 logical channels, this demapping may be incorrect if max_timeslot >= 1 and max_timeslot <= 8: self.gsm_sdcch8_demappers = [] for i in range(1, max_timeslot + 1): #self.gsm_sdcch8_demappers.append(grgsm.universal_ctrl_chans_demapper(i, ([0,4,8,12,16,20,24,28,32,36,40,44]), ([8,8,8,8,8,8,8,8,136,136,136,136]))) self.gsm_sdcch8_demappers.append(grgsm.gsm_sdcch8_demapper(i)) #Control channel decoder (extracts the packets), one for each timeslot self.gsm_control_channels_decoders = [] for i in range(0, max_timeslot + 1): self.gsm_control_channels_decoders.append( grgsm.control_channels_decoder()) # self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000, False)# self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000, False) #UDP client that sends all decoded C0T0 packets to the specified port on localhost if requested self.client_sockets = [] self.server_sockets = [] for udp_port in self.udp_ports: #The server is for testing only #WARNING remove the server if you want connect to a different one if test: self.server_sockets.append( blocks.socket_pdu("UDP_SERVER", "127.0.0.1", str(udp_port), 10000)) self.client_sockets.append( blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", str(udp_port), 10000)) #Sinks to store the capture file if requested if self.store_capture: self.gsm_burst_file_sink = grgsm.burst_file_sink( str(self.capture_id) + ".burstfile") self.blocks_file_sink = blocks.file_sink( gr.sizeof_gr_complex * 1, str(self.capture_id) + ".cfile", False) self.blocks_file_sink.set_unbuffered(False) #Printer for printing messages when verbose flag is True if self.verbose: self.gsm_message_printer = grgsm.message_printer( pmt.intern(""), False) """ if self.verbose: self.gsm_bursts_printer_0 = grgsm.bursts_printer(pmt.intern(""), False, False, False, False) """ ################################################## # Connections ################################################## if self.rec_length is not None: #if recording length is defined connect head block after the source self.connect((self.rtlsdr_source, 0), (self.blocks_head_0, 0)) self.connect((self.blocks_head_0, 0), (self.blocks_rotator, 0)) else: self.connect((self.rtlsdr_source, 0), (self.blocks_rotator, 0)) #Connect the file sinks if self.store_capture: self.connect((self.blocks_rotator, 0), (self.blocks_file_sink, 0)) self.msg_connect(self.gsm_receiver, "C0", self.gsm_burst_file_sink, "in") #Connect the GSM receiver self.connect((self.gsm_input, 0), (self.gsm_receiver, 0)) self.connect((self.blocks_rotator, 0), (self.gsm_input, 0)) self.msg_connect(self.gsm_clock_offset_control, "ppm", self.gsm_input, "ppm_in") self.msg_connect(self.gsm_receiver, "measurements", self.gsm_clock_offset_control, "measurements") #Connect the demapper and decoder for timeslot 0 self.msg_connect((self.gsm_receiver, 'C0'), (self.gsm_bcch_ccch_demapper_0, 'bursts')) self.msg_connect((self.gsm_bcch_ccch_demapper_0, 'bursts'), (self.gsm_control_channels_decoders[0], 'bursts')) #Connect the demapper and decoders for the other timeslots for i in range(1, max_timeslot + 1): self.msg_connect((self.gsm_receiver, 'C0'), (self.gsm_sdcch8_demappers[i - 1], 'bursts')) self.msg_connect((self.gsm_sdcch8_demappers[i - 1], 'bursts'), (self.gsm_control_channels_decoders[i], 'bursts')) #Connect the UDP clients if requested for client_socket in self.client_sockets: for i in range(0, max_timeslot + 1): self.msg_connect( (self.gsm_control_channels_decoders[i], 'msgs'), (client_socket, 'pdus')) #Connect the printer is self.verbose is True if self.verbose: for i in range(0, max_timeslot + 1): self.msg_connect( (self.gsm_control_channels_decoders[i], 'msgs'), (self.gsm_message_printer, 'msgs')) """
def test_downlink (self): """ SDCCH8 demapper downlink test """ src = grgsm.burst_source(test_data.frames, test_data.timeslots, test_data.bursts) src.set_arfcn(0); # downlink demapper = grgsm.gsm_sdcch8_demapper(timeslot_nr=0) dst = grgsm.burst_sink() self.tb.msg_connect(src, "out", demapper, "bursts") self.tb.msg_connect(demapper, "bursts", dst, "in") self.tb.run () b = test_data.bursts self.assertEqual([ b[ 0], b[ 1], b[ 2], b[ 3], #SDCCH 0 b[ 4], b[ 5], b[ 6], b[ 7], #SDCCH 1 b[ 8], b[ 9], b[ 10], b[ 11], #SDCCH 2 b[ 12], b[ 13], b[ 14], b[ 15], #SDCCH 3 b[ 16], b[ 17], b[ 18], b[ 19], #SDCCH 4 b[ 20], b[ 21], b[ 22], b[ 23], #SDCCH 5 b[ 24], b[ 25], b[ 26], b[ 27], #SDCCH 6 b[ 28], b[ 29], b[ 30], b[ 31], #SDCCH 7 b[ 32], b[ 33], b[ 34], b[ 35], #SACCH 0 b[ 36], b[ 37], b[ 38], b[ 39], #SACCH 1 b[ 40], b[ 41], b[ 42], b[ 43], #SACCH 2 b[ 44], b[ 45], b[ 46], b[ 47], #SACCH 3 #skip 48-50 b[ 51], b[ 52], b[ 53], b[ 54], #SDCCH 0 b[ 55], b[ 56], b[ 57], b[ 58], #SDCCH 1 b[ 59], b[ 60], b[ 61], b[ 62], #SDCCH 2 b[ 63], b[ 64], b[ 65], b[ 66], #SDCCH 3 b[ 67], b[ 68], b[ 69], b[ 70], #SDCCH 4 b[ 71], b[ 72], b[ 73], b[ 74], #SDCCH 5 b[ 75], b[ 76], b[ 77], b[ 78], #SDCCH 6 b[ 79], b[ 80], b[ 81], b[ 82], #SDCCH 7 b[ 83], b[ 84], b[ 85], b[ 86], #SACCH 4 b[ 87], b[ 88], b[ 89], b[ 90], #SACCH 5 b[ 91], b[ 92], b[ 93], b[ 94], #SACCH 6 b[ 95], b[ 96], b[ 97], b[ 98], #SACCH 7 #skip 99-101 b[102], b[103], b[104], b[105], #SDCCH ], list(dst.get_burst_data())) self.assertEqual([ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 8, 8, 8, 8, ], list(dst.get_sub_types())) self.assertEqual([ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 0, 0, 0, 0, #SACCH 0 1, 1, 1, 1, #SACCH 1 2, 2, 2, 2, #SACCH 2 3, 3, 3, 3, #SACCH 3 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 4, 4, 4, 4, #SACCH 4 5, 5, 5, 5, #SACCH 5 6, 6, 6, 6, #SACCH 6 7, 7, 7, 7, #SACCH 7 0, 0, 0, 0, ], list(dst.get_sub_slots()))