| #!/usr/bin/env python2 |
| # -*- coding: utf-8 -*- |
| |
| # GR-GSM based transceiver |
| # |
| # (C) 2016-2018 by Vadim Yanitskiy <axilirator@gmail.com> |
| # (C) 2017-2018 by Piotr Krysik <ptrkrysik@gmail.com> |
| # |
| # 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 <axilirator@gmail.com>\n" \ |
| "Copyright (C) 2017-2018 by Piotr Krysik <ptrkrysik@gmail.com>\n" \ |
| "License GPLv2+: GNU GPL version 2 or later " \ |
| "<http://gnu.org/licenses/gpl.html>\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() |