aboutsummaryrefslogtreecommitdiffstats
path: root/apps/grgsm_scanner
diff options
context:
space:
mode:
Diffstat (limited to 'apps/grgsm_scanner')
-rwxr-xr-xapps/grgsm_scanner120
1 files changed, 70 insertions, 50 deletions
diff --git a/apps/grgsm_scanner b/apps/grgsm_scanner
index 397d51e..cb56bb3 100755
--- a/apps/grgsm_scanner
+++ b/apps/grgsm_scanner
@@ -1,8 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @file
-# @author Piotr Krysik <ptrkrysik@gmail.com>
-# @author Roman Khassraf <rkhassraf@gmail.com>
+# @author (C) 2015 by Piotr Krysik <ptrkrysik@gmail.com>
+# @author (C) 2015 by Roman Khassraf <rkhassraf@gmail.com>
# @section LICENSE
#
# Gr-gsm is free software; you can redistribute it and/or modify
@@ -288,52 +288,25 @@ class channel_info(object):
return self.getKey().__cmp__(other.getKey())
def __repr__(self):
+ return "%s(%s, %s, %s, %s, %s, %s, %s, %s, %s)" % (
+ self.__class__, self.arfcn, self.freq, self.cid, self.lac,
+ self.mcc, self.mnc, self.ccch_conf, self.power,
+ self.neighbours, self.cell_arfcns)
+
+ def __str__(self):
return "ARFCN: %4u, Freq: %6.1fM, CID: %5u, LAC: %5u, MCC: %3u, MNC: %3u, Pwr: %3i" % (
self.arfcn, self.freq / 1e6, self.cid, self.lac, self.mcc, self.mnc, self.power)
-
-if __name__ == '__main__':
- 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",
- 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")
- parser.add_option("-p", "--ppm", dest="ppm", type="intx", default=0,
- help="Set frequency correction in ppm [default=%default]")
- parser.add_option("-g", "--gain", dest="gain", type="eng_float", default=24.0,
- help="Set gain [default=%default]")
- parser.add_option("", "--args", dest="args", type="string", default="",
- help="Set device arguments [default=%default]")
- parser.add_option("--speed", dest="speed", type="intx", default=4,
- help="Scan speed [default=%default]. Value range 0-5.")
- parser.add_option("-v", "--verbose", action="store_true",
- help="If set, verbose information output is printed: ccch configuration, cell ARFCN's, neighbour ARFCN's")
-
- """
- Dont forget: sudo sysctl kernel.shmmni=32000
- """
-
- (options, args) = parser.parse_args()
-
- if options.band not in grgsm.arfcn.get_bands():
- parser.error("Invalid GSM band\n")
-
- if options.speed < 0 or options.speed > 5:
- parser.error("Invalid scan speed.\n")
-
- if (options.samp_rate / 0.2e6) % 2 != 0:
- parser.error("Invalid sample rate. Sample rate must be an even numer * 0.2e6")
-
- channels_num = int(options.samp_rate / 0.2e6)
- print ""
- for arfcn_range in grgsm.arfcn.get_arfcn_ranges(options.band):
+def do_scan(samp_rate, band, speed, ppm, gain, args, prn = None):
+ signallist = []
+ channels_num = int(samp_rate / 0.2e6)
+ for arfcn_range in grgsm.arfcn.get_arfcn_ranges(band):
first_arfcn = arfcn_range[0]
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, options.band)
- last_freq = grgsm.arfcn.arfcn2downlink(last_center_arfcn, options.band)
+ current_freq = grgsm.arfcn.arfcn2downlink(first_arfcn + int(channels_num / 2) - 1, band)
+ last_freq = grgsm.arfcn.arfcn2downlink(last_center_arfcn, band)
stop_freq = last_freq + 0.2e6 * channels_num
while current_freq < stop_freq:
@@ -348,10 +321,10 @@ if __name__ == '__main__':
os.dup2(null_fds[1], 2)
# instantiate scanner and processor
- scanner = wideband_scanner(rec_len=6 - options.speed,
- sample_rate=options.samp_rate,
+ scanner = wideband_scanner(rec_len=6 - speed,
+ sample_rate=samp_rate,
carrier_frequency=current_freq,
- ppm=options.ppm, gain=options.gain, args=options.args)
+ ppm=ppm, gain=gain, args=args)
# start recording
scanner.start()
@@ -379,7 +352,7 @@ if __name__ == '__main__':
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], options.band), found_freqs[i],
+ info = channel_info(grgsm.arfcn.downlink2arfcn(found_freqs[i], band), 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)
@@ -392,10 +365,57 @@ if __name__ == '__main__':
# close the temporary fds
os.close(null_fds[0])
os.close(null_fds[1])
-
- for info in sorted(found_list):
- print info
- if options.verbose:
- print info.get_verbose_info()
+ if prn:
+ prn(found_list)
+ signallist.extend(found_list)
current_freq += channels_num * 0.2e6
+ return signallist
+
+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",
+ 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")
+ parser.add_option("-p", "--ppm", dest="ppm", type="intx", default=0,
+ help="Set frequency correction in ppm [default=%default]")
+ parser.add_option("-g", "--gain", dest="gain", type="eng_float", default=24.0,
+ help="Set gain [default=%default]")
+ parser.add_option("", "--args", dest="args", type="string", default="",
+ help="Set device arguments [default=%default]")
+ parser.add_option("--speed", dest="speed", type="intx", default=4,
+ help="Scan speed [default=%default]. Value range 0-5.")
+ parser.add_option("-v", "--verbose", action="store_true",
+ help="If set, verbose information output is printed: ccch configuration, cell ARFCN's, neighbour ARFCN's")
+
+ """
+ Dont forget: sudo sysctl kernel.shmmni=32000
+ """
+ return parser
+
+def main(options = None):
+ if options is None:
+ (options, args) = argument_parser().parse_args()
+
+ if options.band not in grgsm.arfcn.get_bands():
+ parser.error("Invalid GSM band\n")
+
+ if options.speed < 0 or options.speed > 5:
+ parser.error("Invalid scan speed.\n")
+
+ if (options.samp_rate / 0.2e6) % 2 != 0:
+ parser.error("Invalid sample rate. Sample rate must be an even numer * 0.2e6")
+
+ def printfunc(found_list):
+ for info in sorted(found_list):
+ print info
+ if options.verbose:
+ print info.get_verbose_info()
+ print ""
+ do_scan(options.samp_rate, options.band, options.speed,
+ options.ppm, options.gain, options.args, prn = printfunc)
+
+if __name__ == '__main__':
+ main()