diff options
author | Piotr Krysik <ptrkrysik@gmail.com> | 2017-09-06 17:48:38 +0200 |
---|---|---|
committer | Piotr Krysik <ptrkrysik@gmail.com> | 2017-09-06 17:48:38 +0200 |
commit | 3dfa11b89e6a74e6857c11e3029b372c746d535f (patch) | |
tree | 5d8dfd8338e0b53b89241ee93cd189313152076b /apps | |
parent | 08c0c7cfe52666a7141d3007f3e30105598e2206 (diff) |
Making arfcn<->freq conversions more robust and uptading apps depending on it
Diffstat (limited to 'apps')
-rw-r--r-- | apps/grgsm_livemon_headless | 94 | ||||
-rw-r--r-- | apps/grgsm_livemon_headless.grc | 35 | ||||
-rwxr-xr-x | apps/grgsm_scanner | 8 |
3 files changed, 101 insertions, 36 deletions
diff --git a/apps/grgsm_livemon_headless b/apps/grgsm_livemon_headless index dc36fca..721bc11 100644 --- a/apps/grgsm_livemon_headless +++ b/apps/grgsm_livemon_headless @@ -1,11 +1,31 @@ #!/usr/bin/env python2 # -*- coding: utf-8 -*- +# @file +# @author (C) 2017 by Piotr Krysik <ptrkrysik@gmail.com> +# @section LICENSE +# +# Gr-gsm is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# Gr-gsm is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with gr-gsm; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# +# ################################################## # GNU Radio Python Flow Graph # Title: Gr-gsm Livemon # Author: Piotr Krysik # Description: Interactive monitor of a single C0 channel with analysis performed by Wireshark (command to run wireshark: sudo wireshark -k -f udp -Y gsmtap -i lo) -# Generated: Mon Aug 28 10:09:07 2017 +# Generated: Wed Sep 6 16:27:23 2017 ################################################## from gnuradio import blocks @@ -13,6 +33,7 @@ from gnuradio import eng_notation from gnuradio import gr from gnuradio.eng_option import eng_option from gnuradio.filter import firdes +from grgsm import arfcn from math import pi from optparse import OptionParser import grgsm @@ -23,7 +44,7 @@ import time class grgsm_livemon_headless(gr.top_block): - 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): + def __init__(self, args="", collector="localhost", collectorport="4729", gain=30, osr=4, ppm=0, rec_len=1000000, samp_rate=2000000.052982, serverport="4729", shiftoff=400e3, fc=957e6): gr.top_block.__init__(self, "Gr-gsm Livemon") ################################################## @@ -32,13 +53,14 @@ class grgsm_livemon_headless(gr.top_block): self.args = args self.collector = collector self.collectorport = collectorport - self.fc = fc self.gain = gain self.osr = osr self.ppm = ppm + self.rec_len = rec_len self.samp_rate = samp_rate self.serverport = serverport self.shiftoff = shiftoff + self.fc = fc ################################################## # Blocks @@ -53,13 +75,13 @@ class grgsm_livemon_headless(gr.top_block): 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_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_receiver_0 = grgsm.receiver(4, ([arfcn.downlink2arfcn(fc)]), ([]), False) self.gsm_message_printer_1 = grgsm.message_printer(pmt.intern(""), False, False, False) self.gsm_input_0 = grgsm.gsm_input( @@ -76,8 +98,9 @@ class grgsm_livemon_headless(gr.top_block): 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_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 @@ -92,9 +115,10 @@ class grgsm_livemon_headless(gr.top_block): 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_rotator_cc_0, 0)) + self.connect((self.rtlsdr_source_0, 0), (self.blocks_head_0, 0)) def get_args(self): return self.args @@ -114,14 +138,6 @@ class grgsm_livemon_headless(gr.top_block): def set_collectorport(self, collectorport): self.collectorport = collectorport - def get_fc(self): - return self.fc - - def set_fc(self, fc): - self.fc = fc - self.rtlsdr_source_0.set_center_freq(self.fc-self.shiftoff, 0) - self.gsm_input_0.set_fc(self.fc) - def get_gain(self): return self.gain @@ -140,17 +156,25 @@ class grgsm_livemon_headless(gr.top_block): def set_ppm(self, ppm): self.ppm = ppm - self.rtlsdr_source_0.set_freq_corr(self.ppm, 0) self.gsm_input_0.set_ppm(self.ppm-int(self.ppm)) + self.rtlsdr_source_0.set_freq_corr(self.ppm, 0) + + def get_rec_len(self): + return self.rec_len + + def set_rec_len(self, rec_len): + self.rec_len = rec_len + self.blocks_head_0.set_length(int(self.rec_len*self.samp_rate)) def get_samp_rate(self): return self.samp_rate def set_samp_rate(self, samp_rate): self.samp_rate = samp_rate - self.rtlsdr_source_0.set_sample_rate(self.samp_rate) - self.gsm_input_0.set_samp_rate_in(self.samp_rate) + self.blocks_head_0.set_length(int(self.rec_len*self.samp_rate)) self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate) + self.gsm_input_0.set_samp_rate_in(self.samp_rate) + self.rtlsdr_source_0.set_sample_rate(self.samp_rate) def get_serverport(self): return self.serverport @@ -163,44 +187,54 @@ class grgsm_livemon_headless(gr.top_block): def set_shiftoff(self, shiftoff): self.shiftoff = shiftoff + self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate) self.rtlsdr_source_0.set_center_freq(self.fc-self.shiftoff, 0) self.rtlsdr_source_0.set_bandwidth(250e3+abs(self.shiftoff), 0) - self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate) + + def get_fc(self): + return self.fc + + def set_fc(self, fc): + self.fc = fc + self.gsm_input_0.set_fc(self.fc) + self.rtlsdr_source_0.set_center_freq(self.fc-self.shiftoff, 0) def argument_parser(): - description = 'Interactive monitor of a single C0 channel with analysis performed by Wireshark (command to run wireshark: sudo wireshark -k -f udp -Y gsmtap -i lo)' - parser = OptionParser(usage="%prog: [options]", option_class=eng_option, description=description) + parser = OptionParser(option_class=eng_option, usage="%prog: [options]") parser.add_option( "", "--args", dest="args", type="string", default="", help="Set Device Arguments [default=%default]") parser.add_option( - "", "--collector", dest="collector", type="string", default='localhost', + "", "--collector", dest="collector", type="string", default="localhost", help="Set IP or DNS name of collector point [default=%default]") parser.add_option( - "", "--collectorport", dest="collectorport", type="string", default='4729', + "", "--collectorport", dest="collectorport", type="string", default="4729", help="Set UDP port number of collector [default=%default]") parser.add_option( - "-f", "--fc", dest="fc", type="eng_float", default=eng_notation.num_to_str(941.8e6), - help="Set GSM channel's central frequency [default=%default]") - parser.add_option( "-g", "--gain", dest="gain", type="eng_float", default=eng_notation.num_to_str(30), - help="Set gain [default=%default]") + help="Set RF Gain [default=%default]") parser.add_option( "", "--osr", dest="osr", type="intx", default=4, help="Set OverSampling Ratio [default=%default]") parser.add_option( "-p", "--ppm", dest="ppm", type="eng_float", default=eng_notation.num_to_str(0), - help="Set ppm [default=%default]") + help="Set Clock frequency offset in ppms (1/1e6 parts) [default=%default]") + parser.add_option( + "-T", "--rec-len", dest="rec_len", type="eng_float", default=eng_notation.num_to_str(1000000), + help="Set Recording length in seconds [default=%default]") parser.add_option( "-s", "--samp-rate", dest="samp_rate", type="eng_float", default=eng_notation.num_to_str(2000000.052982), help="Set samp_rate [default=%default]") parser.add_option( - "", "--serverport", dest="serverport", type="string", default='4729', + "", "--serverport", dest="serverport", type="string", default="4729", help="Set UDP server listening port [default=%default]") parser.add_option( "-o", "--shiftoff", dest="shiftoff", type="eng_float", default=eng_notation.num_to_str(400e3), help="Set Frequency Shiftoff [default=%default]") + parser.add_option( + "-f", "--fc", dest="fc", type="eng_float", default=eng_notation.num_to_str(957e6), + help="Set GSM channel's central frequency [default=%default]") return parser @@ -208,7 +242,7 @@ def main(top_block_cls=grgsm_livemon_headless, options=None): if options is None: options, _ = argument_parser().parse_args() - tb = top_block_cls(args=options.args, collector=options.collector, collectorport=options.collectorport, fc=options.fc, gain=options.gain, osr=options.osr, ppm=options.ppm, samp_rate=options.samp_rate, serverport=options.serverport, shiftoff=options.shiftoff) + tb = top_block_cls(args=options.args, collector=options.collector, collectorport=options.collectorport, gain=options.gain, osr=options.osr, ppm=options.ppm, rec_len=options.rec_len, samp_rate=options.samp_rate, serverport=options.serverport, shiftoff=options.shiftoff, fc=options.fc) tb.start() tb.wait() diff --git a/apps/grgsm_livemon_headless.grc b/apps/grgsm_livemon_headless.grc index caa8e28..f130d71 100644 --- a/apps/grgsm_livemon_headless.grc +++ b/apps/grgsm_livemon_headless.grc @@ -462,7 +462,7 @@ </param> <param> <key>value</key> - <value>941.8e6</value> + <value>957e6</value> </param> </block> <block> @@ -837,7 +837,7 @@ </param> <param> <key>cell_allocation</key> - <value>[0]</value> + <value>[arfcn.downlink2arfcn(fc)]</value> </param> <param> <key>comment</key> @@ -959,6 +959,37 @@ </param> </block> <block> + <key>import</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(200, 60)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>import_1</value> + </param> + <param> + <key>import</key> + <value>from grgsm import arfcn</value> + </param> + </block> + <block> <key>parameter</key> <param> <key>alias</key> diff --git a/apps/grgsm_scanner b/apps/grgsm_scanner index 6547b2c..1bff63a 100755 --- a/apps/grgsm_scanner +++ b/apps/grgsm_scanner @@ -305,8 +305,8 @@ def do_scan(samp_rate, band, speed, ppm, gain, args, prn = None): last_arfcn = arfcn_range[1] last_center_arfcn = last_arfcn - int((channels_num / 2) - 1) - current_freq = grgsm.arfcn.arfcn2downlink(first_arfcn + int(channels_num / 2) - 1, band) - last_freq = grgsm.arfcn.arfcn2downlink(last_center_arfcn, band) + current_freq = grgsm.arfcn.arfcn2downlink(first_arfcn + int(channels_num / 2) - 1) + last_freq = grgsm.arfcn.arfcn2downlink(last_center_arfcn) stop_freq = last_freq + 0.2e6 * channels_num while current_freq < stop_freq: @@ -352,7 +352,7 @@ def do_scan(samp_rate, band, speed, ppm, gain, args, prn = None): cell_arfcn_list = scanner.gsm_extract_system_info.get_cell_arfcns(chans[i]) neighbour_list = scanner.gsm_extract_system_info.get_neighbours(chans[i]) - info = channel_info(grgsm.arfcn.downlink2arfcn(found_freqs[i], band), found_freqs[i], + info = channel_info(grgsm.arfcn.downlink2arfcn(found_freqs[i]), found_freqs[i], cell_ids[i], lacs[i], mccs[i], mncs[i], ccch_confs[i], powers[i], neighbour_list, cell_arfcn_list) found_list.append(info) @@ -375,7 +375,7 @@ def do_scan(samp_rate, band, speed, ppm, gain, args, prn = None): def argument_parser(): parser = OptionParser(option_class=eng_option, usage="%prog: [options]") bands_list = ", ".join(grgsm.arfcn.get_bands()) - parser.add_option("-b", "--band", dest="band", default="P-GSM", + parser.add_option("-b", "--band", dest="band", default="GSM900", help="Specify the GSM band for the frequency.\nAvailable bands are: " + bands_list) parser.add_option("-s", "--samp-rate", dest="samp_rate", type="float", default=2e6, help="Set sample rate [default=%default] - allowed values even_number*0.2e6") |