#!/usr/bin/env python2 # -*- coding: utf-8 -*- # GR-GSM based transceiver # # (C) 2016-2018 by Vadim Yanitskiy # (C) 2017-2018 by Piotr Krysik # # All Rights Reserved # # This program 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 2 of the License, or # (at your option) any later version. # # This program 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 this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import signal import getopt import sys from gnuradio import eng_notation from grgsm.trx import ctrl_if_bb from grgsm.trx import radio_if from grgsm.trx import fake_pm from argparse import ArgumentParser COPYRIGHT = \ "Copyright (C) 2016-2018 by Vadim Yanitskiy \n" \ "Copyright (C) 2017-2018 by Piotr Krysik \n" \ "License GPLv2+: GNU GPL version 2 or later " \ "\n" \ "This is free software: you are free to change and redistribute it.\n" \ "There is NO WARRANTY, to the extent permitted by law.\n" class grgsm_trx: def __init__(self, remote_addr, bind_addr, base_port, args, sample_rate, rx_gain, tx_gain, rx_antenna, tx_antenna, freq_offset, ppm): self.remote_addr = remote_addr self.bind_addr = bind_addr self.base_port = base_port self.phy_args = args self.phy_sample_rate = sample_rate self.phy_rx_gain = rx_gain self.phy_tx_gain = tx_gain self.phy_rx_antenna = rx_antenna self.phy_tx_antenna = tx_antenna self.phy_freq_offset = freq_offset self.phy_ppm = ppm # Set up signal handlers signal.signal(signal.SIGINT, self.sig_handler) def run(self): # Init Radio interface self.radio = radio_if(self.phy_args, self.phy_sample_rate, self.phy_rx_gain, self.phy_tx_gain, self.phy_ppm, self.phy_rx_antenna, self.phy_tx_antenna, self.phy_freq_offset, self.bind_addr, self.remote_addr, self.base_port) # Power measurement emulation # Noise: -120 .. -105 # BTS: -75 .. -50 self.pm = fake_pm(-120, -105, -75, -50) # Init TRX CTRL interface self.server = ctrl_if_bb( self.remote_addr, self.base_port + 101, self.bind_addr, self.base_port + 1, self.radio, self.pm) print("[i] Init complete") # Enter main loop while True: self.server.loop() def shutdown(self): print("[i] Shutting down...") self.radio.shutdown() def sig_handler(self, signum, frame): print("Signal %d received" % signum) if signum is signal.SIGINT: self.shutdown() sys.exit(0) def parse_args(): description = 'Burst transceiver for GSM Mobile Station' parser = ArgumentParser(prog="grgsm_trx", usage='%(prog)s [options]', description=description) # TRX specific parser.add_argument("-i", "--remote-addr", dest="remote_addr", type=str, default='127.0.0.1', help="Set remote address default=%(default)s") parser.add_argument("-b", "--bind-addr", dest="bind_addr", type=str, default='0.0.0.0', help="Set bind address default=%(default)s") parser.add_argument( "-p", "--base_port", dest="base_port", type=int, default=6700, help="Set base port number default=%(default)s") # PHY specific parser.add_argument("-a", "--args", dest="args", type=str, default="", help="Set Device Arguments default=%(default)s") parser.add_argument("-s", "--sample-rate", dest="sample_rate", type=float, default=1083333.3333333333, help="Set samp_rate default=%(default)s") parser.add_argument("-g", "--rx-gain", dest="rx_gain", type=float, default=30, help="Set RX gain default=%(default)s") parser.add_argument("-G", "--tx-gain", dest="tx_gain", type=float, default=10, help="Set TX gain default=%(default)s") parser.add_argument("--rx-antenna", dest="rx_antenna", type=str, default="RX2", help="Set RX antenna") parser.add_argument("--tx-antenna", dest="tx_antenna", type=str, default='TX/RX', help="Set TX antenna default=%(default)s") parser.add_argument( "--freq-offset", dest="freq_offset", type=float, default=0, help="Shift Tx and Rx frequencies default=%(default)s") parser.add_argument("--ppm", dest="ppm", type=float, default=0, help="Set ppm default=%(default)s") return parser.parse_args() def main(): print(COPYRIGHT) options = parse_args() app = grgsm_trx( remote_addr=options.remote_addr, bind_addr=options.bind_addr, base_port=options.base_port, args=options.args, sample_rate=options.sample_rate, rx_gain=options.rx_gain, tx_gain=options.tx_gain, rx_antenna=options.rx_antenna, tx_antenna=options.tx_antenna, freq_offset=options.freq_offset, ppm=options.ppm) app.run() if __name__ == '__main__': main()