aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/CMakeLists.txt6
-rw-r--r--apps/README2
-rwxr-xr-xapps/grgsm_decode2
-rwxr-xr-xapps/grgsm_livemon64
-rwxr-xr-xapps/grgsm_scanner120
-rw-r--r--apps/helpers/CMakeLists.txt6
-rwxr-xr-xapps/helpers/grgsm_capture (renamed from apps/helpers/grgsm_capture.py)2
-rwxr-xr-xapps/helpers/grgsm_channelize (renamed from apps/helpers/grgsm_channelize.py)2
8 files changed, 132 insertions, 72 deletions
diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt
index 48fabb0..1e8890f 100644
--- a/apps/CMakeLists.txt
+++ b/apps/CMakeLists.txt
@@ -29,9 +29,9 @@ GR_PYTHON_INSTALL(
DESTINATION bin
)
-CREATE_SYMLINK(grgsm_livemon airprobe_rtlsdr.py)
-CREATE_SYMLINK(grgsm_decode airprobe_decode.py)
-CREATE_SYMLINK(grgsm_scanner airprobe_rtlsdr_scanner.py)
+#CREATE_SYMLINK(grgsm_livemon airprobe_rtlsdr.py)
+#CREATE_SYMLINK(grgsm_decode airprobe_decode.py)
+#CREATE_SYMLINK(grgsm_scanner airprobe_rtlsdr_scanner.py)
add_custom_target(apps_symlinks ALL DEPENDS ${symlinks})
diff --git a/apps/README b/apps/README
index e811c06..39374ce 100644
--- a/apps/README
+++ b/apps/README
@@ -4,7 +4,7 @@ This directory contains programs based on gr-gsm:
from Airprobe project, with ability to decode signalling channels and traffic channels with speech
(analysis of the data can be performed in Wireshark, decoded sound is stored to an audio file),
* grgsm_livemon (old name: airprobe_rtlsdr.py) - 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),
+ performed by Wireshark (command to run wireshark: sudo wireshark -k -f udp -Y gsmtap -i lo),
* grgsm_scanner (old name: airprobe_rtlsdr_scanner.py) - an application that scans GSM bands and prints
information about base transceiver stations transmitting in the area.
diff --git a/apps/grgsm_decode b/apps/grgsm_decode
index 2198bc4..222d67e 100755
--- a/apps/grgsm_decode
+++ b/apps/grgsm_decode
@@ -1,7 +1,7 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @file
-# @author Roman Khassraf <rkhassraf@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
diff --git a/apps/grgsm_livemon b/apps/grgsm_livemon
index cb63bdc..389e2a0 100755
--- a/apps/grgsm_livemon
+++ b/apps/grgsm_livemon
@@ -1,5 +1,25 @@
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
+# @file
+# @author (C) 2014-2016 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
@@ -38,7 +58,7 @@ import time
class grgsm_livemon(gr.top_block, Qt.QWidget):
- def __init__(self, args="", gain=30, osr=4, ppm=0, samp_rate=2000000.052982, shiftoff=400e3, fc=941.8e6):
+ def __init__(self, args="", fc=941.8e6, gain=30, osr=4, ppm=0, samp_rate=2000000.052982, shiftoff=400e3, collector="localhost", collectorport="4729"):
gr.top_block.__init__(self, "Gr-gsm Livemon")
Qt.QWidget.__init__(self)
self.setWindowTitle("Gr-gsm Livemon")
@@ -65,12 +85,14 @@ class grgsm_livemon(gr.top_block, Qt.QWidget):
# Parameters
##################################################
self.args = args
+ self.fc = fc
self.gain = gain
self.osr = osr
self.ppm = ppm
self.samp_rate = samp_rate
self.shiftoff = shiftoff
- self.fc = fc
+ self.collector = collector
+ self.collectorport = collectorport
##################################################
# Variables
@@ -165,7 +187,7 @@ class grgsm_livemon(gr.top_block, Qt.QWidget):
timeslot_nr=0,
)
self.blocks_socket_pdu_0_0 = blocks.socket_pdu("UDP_SERVER", "127.0.0.1", "4729", 10000, False)
- 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", collector, collectorport, 1500, False)
self.blocks_rotator_cc_0 = blocks.rotator_cc(-2*pi*shiftoff/samp_rate)
##################################################
@@ -199,6 +221,14 @@ class grgsm_livemon(gr.top_block, Qt.QWidget):
def set_args(self, args):
self.args = args
+ def get_fc(self):
+ return self.fc
+
+ def set_fc(self, fc):
+ self.fc = fc
+ self.set_fc_slider(self.fc)
+ self.gsm_input_0.set_fc(self.fc)
+
def get_gain(self):
return self.gain
@@ -239,13 +269,17 @@ class grgsm_livemon(gr.top_block, Qt.QWidget):
self.rtlsdr_source_0.set_center_freq(self.fc_slider-self.shiftoff, 0)
self.rtlsdr_source_0.set_bandwidth(250e3+abs(self.shiftoff), 0)
- def get_fc(self):
- return self.fc
+ def get_collector(self):
+ return self.collector
- def set_fc(self, fc):
- self.fc = fc
- self.set_fc_slider(self.fc)
- self.gsm_input_0.set_fc(self.fc)
+ def set_collector(self, collector):
+ self.collector = collector
+
+ def get_collectorport(self):
+ return self.collectorport
+
+ def set_collectorport(self, collectorport):
+ self.collectorport = collectorport
def get_ppm_slider(self):
return self.ppm_slider
@@ -276,6 +310,9 @@ def argument_parser():
"", "--args", dest="args", type="string", default="",
help="Set Device Arguments [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]")
parser.add_option(
@@ -291,8 +328,11 @@ def argument_parser():
"-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(941.8e6),
- help="Set GSM channel's central frequency [default=%default]")
+ "", "--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",
+ help="Set UDP port number of collector [default=%default]")
return parser
@@ -306,7 +346,7 @@ def main(top_block_cls=grgsm_livemon, options=None):
Qt.QApplication.setGraphicsSystem(style)
qapp = Qt.QApplication(sys.argv)
- tb = top_block_cls(args=options.args, gain=options.gain, osr=options.osr, ppm=options.ppm, samp_rate=options.samp_rate, shiftoff=options.shiftoff, fc=options.fc)
+ tb = top_block_cls(args=options.args, fc=options.fc, gain=options.gain, osr=options.osr, ppm=options.ppm, samp_rate=options.samp_rate, shiftoff=options.shiftoff, collector=options.collector, collectorport=options.collectorport)
tb.start()
tb.show()
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()
diff --git a/apps/helpers/CMakeLists.txt b/apps/helpers/CMakeLists.txt
index 4418ed7..fff9593 100644
--- a/apps/helpers/CMakeLists.txt
+++ b/apps/helpers/CMakeLists.txt
@@ -22,12 +22,12 @@ include(CreateSymlink)
GR_PYTHON_INSTALL(
PROGRAMS
- grgsm_capture.py
- grgsm_channelize.py
+ grgsm_capture
+ grgsm_channelize
DESTINATION bin
)
-CREATE_SYMLINK(grgsm_capture.py airprobe_rtlsdr_capture.py)
+CREATE_SYMLINK(grgsm_capture airprobe_rtlsdr_capture.py)
add_custom_target(helpers_symlinks ALL DEPENDS ${symlinks})
diff --git a/apps/helpers/grgsm_capture.py b/apps/helpers/grgsm_capture
index a71c2c8..add42d3 100755
--- a/apps/helpers/grgsm_capture.py
+++ b/apps/helpers/grgsm_capture
@@ -1,7 +1,7 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @file
-# @author Roman Khassraf <rkhassraf@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
diff --git a/apps/helpers/grgsm_channelize.py b/apps/helpers/grgsm_channelize
index 146bb8f..fb30334 100755
--- a/apps/helpers/grgsm_channelize.py
+++ b/apps/helpers/grgsm_channelize
@@ -1,7 +1,7 @@
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# @file
-# @author Pieter Robyns <pieter.robyns@uhasselt.be>
+# @author (C) 2015 by Pieter Robyns <pieter.robyns@uhasselt.be>
# @section LICENSE
#
# Gr-gsm is free software; you can redistribute it and/or modify