diff --git a/README.md b/README.md index 8f1edc6..6fbb034 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ dev_id,osmosdr_device_string ``` `create-devices-txt.py` will attempt to detect supported devices on your system, and automatically output a devices.txt file with a line for each of those devices. +**TX Antenna Ports:** challengectl will transmit by default from the default transmit port on your SDR device, the only port if your SDR only has one transmit port, TX1 on bladeRF 2.0 Micro, TX/RX on a USRP B200 - whichever port is selected by an empty string passed to the antenna parameter for the Osmocom GNU Radio Sink. If you would like to transmit from a different port than the default, you will need to update the `get_antenna_port` function in challengectl.py to select a different port for the device. There is an example in that function, selecting TX2 for one of the RFHS bladeRF devices with a physically broken TX1 port. Setting transmit ports via configuration files will likely be in a future iteration of challengectl, but for now changing the transmit port requires updating the code. + ### Supported Devices Any transmit capable device that can be used to transmit using a GNURadio gr-osmosdr sink *should* work, however only the following devices have been tested so far. - [Nuand bladeRF 2.0](https://www.nuand.com/bladerf-2-0-micro/) diff --git a/challengectl.py b/challengectl.py index 8622d2a..134471f 100755 --- a/challengectl.py +++ b/challengectl.py @@ -55,20 +55,11 @@ def fire_ask(self, device_string, flag_q, device_q, *flag_args): freq = int(flag_args[6]) * 1000 mintime = flag_args[4] maxtime = flag_args[5] - antenna = "" - if(device_string.find("bladerf=1c4842b8d80e43438c042dbd752c6640") != -1): - antenna = "TX2" - print("Set antenna to TX2") - else: - print("Antenna set to default empty string. device: {}".format(device_string)) + antenna = get_antenna_port(device_string) # print("I ran fire_ask with flag=" + str(flag) + " and freq=" + str(freq)) ask.main(flag.encode("utf-8").hex(), freq, device_string, antenna) sleep(3) - # Turn off biastee if the device is a bladerf with the biastee enabled - if(device_string.find("bladerf") != -1 and device_string.find("biastee=1") != -1): - bladeserial = parse_bladerf_ser(device_string) - serialarg = '*:serial={}'.format(bladeserial) - subprocess.run(['bladeRF-cli', '-d', serialarg, 'set', 'biastee', 'tx', 'off']) + disable_amp(device_string) device_q.put(device_string) norandsleep = flag_args[8] if(norandsleep == False): @@ -86,23 +77,14 @@ def fire_cw(self, device_string, flag_q, device_q, *flag_args): freq = int(flag_args[6]) * 1000 mintime = flag_args[4] maxtime = flag_args[5] - antenna = "" - if(device_string.find("bladerf=1c4842b8d80e43438c042dbd752c6640") != -1): - antenna = "TX2" - print("Set antenna to TX2") - else: - print("Antenna set to default empty string. device: {}".format(device_string)) + antenna = get_antenna_port(device_string) # print("I ran fire_cw with flag=" + str(flag) + " and freq=" + # str(freq) + " and speed=" + str(speed)) p = Process(target=cw.main, args=(flag, speed, freq, device_string, antenna)) p.start() p.join() sleep(3) - # Turn off biastee if the device is a bladerf with the biastee enabled - if(device_string.find("bladerf") != -1 and device_string.find("biastee=1") != -1): - bladeserial = parse_bladerf_ser(device_string) - serialarg = '*:serial={}'.format(bladeserial) - subprocess.run(['bladeRF-cli', '-d', serialarg, 'set', 'biastee', 'tx', 'off']) + disable_amp(device_string) device_q.put(device_string) norandsleep = flag_args[8] if(norandsleep == False): @@ -124,21 +106,12 @@ def fire_usb(self, device_string, flag_q, device_q, *flag_args): freq = int(flag_args[6]) * 1000 mintime = flag_args[4] maxtime = flag_args[5] - antenna = "" - if(device_string.find("bladerf=1c4842b8d80e43438c042dbd752c6640") != -1): - antenna = "TX2" - print("Set antenna to TX2") - else: - print("Antenna set to default empty string. device_string: {}".format(device_string)) + antenna = get_antenna_port(device_string) # print("I ran fire_usb with flag=" + str(wav_src) + " and freq=" + # str(freq) + " and wav_rate=" + str(wav_rate)) usb_tx.main(wav_src, wav_rate, freq, device_string, antenna) sleep(3) - # Turn off biastee if the device is a bladerf with the biastee enabled - if(device_string.find("bladerf") != -1 and device_string.find("biastee=1") != -1): - bladeserial = parse_bladerf_ser(device_string) - serialarg = '*:serial={}'.format(bladeserial) - subprocess.run(['bladeRF-cli', '-d', serialarg, 'set', 'biastee', 'tx', 'off']) + disable_amp(device_string) device_q.put(device_string) norandsleep = flag_args[8] if(norandsleep == False): @@ -158,21 +131,12 @@ def fire_nbfm(self, device_string, flag_q, device_q, *flag_args): freq = int(flag_args[6]) * 1000 mintime = flag_args[4] maxtime = flag_args[5] - antenna = "" - if(device_string.find("bladerf=1c4842b8d80e43438c042dbd752c6640") != -1): - antenna = "TX2" - print("Set antenna to TX2") - else: - print("Antenna set to default empty string. device: {}".format(device_string)) + antenna = get_antenna_port(device_string) # print("I ran fire_nbfm with flag=" + str(wav_src) + " and freq=" + # str(freq) + " and wav_rate=" + str(wav_rate)) nbfm.main(wav_src, wav_rate, freq, device_string, antenna) sleep(3) - # Turn off biastee if the device is a bladerf with the biastee enabled - if(device_string.find("bladerf") != -1 and device_string.find("biastee=1") != -1): - bladeserial = parse_bladerf_ser(device_string) - serialarg = '*:serial={}'.format(bladeserial) - subprocess.run(['bladeRF-cli', '-d', serialarg, 'set', 'biastee', 'tx', 'off']) + disable_amp(device_string) device_q.put(device_string) norandsleep = flag_args[8] if(norandsleep == False): @@ -197,23 +161,14 @@ def fire_pocsag(self, device_string, flag_q, device_q, *flag_args): pocsagopts.pagerfreq = freq pocsagopts.capcode = int(modopt1) pocsagopts.message = flag - antenna = "" - if(device_string.find("bladerf=1c4842b8d80e43438c042dbd752c6640") != -1): - antenna = "TX2" - print("Set antenna to TX2") - else: - print("Antenna set to default empty string. device: {}".format(device_string)) + antenna = get_antenna_port(device_string) pocsagopts.antenna = antenna # Call main in pocsagtx_osmocom, passing in pocsagopts options array pocsagtx_osmocom.main(options=pocsagopts) # pocsag_tx.main(flag, int(modopt1), freq, device) print("Finished TX POCSAG, sleeping for 3sec before returning device") sleep(3) - # Turn off biastee if the device is a bladerf with the biastee enabled - if(device_string.find("bladerf") != -1 and device_string.find("biastee=1") != -1): - bladeserial = parse_bladerf_ser(device_string) - serialarg = '*:serial={}'.format(bladeserial) - subprocess.run(['bladeRF-cli', '-d', serialarg, 'set', 'biastee', 'tx', 'off']) + disable_amp(device_string) # print("Slept for 30 seconds") device_q.put(device_string) # print("Returned Device top pool") @@ -251,12 +206,7 @@ def fire_lrs(self, device_string, flag_q, device_q, *flag_args): lrsopts.deviceargs = device_string lrsopts.freq = freq lrsopts.binfile = outfile - antenna = "" - if(device_string.find("bladerf=1c4842b8d80e43438c042dbd752c6640") != -1): - antenna = "TX2" - print("Set antenna to TX2") - else: - print("Antenna set to default empty string. device_string: {}".format(device_string)) + antenna = get_antenna_port(device_string) lrsopts.antenna = antenna # Gains below are defaults, added in case they need to be changed # lrsopts.bbgain = 20.0 @@ -266,11 +216,7 @@ def fire_lrs(self, device_string, flag_q, device_q, *flag_args): # Call main in pocsagtx_osmocom, passing in lrsopts options array lrs_tx.main(options=lrsopts) sleep(3) - # Turn off biastee if the device is a bladerf with the biastee enabled - if(device_string.find("bladerf") != -1 and device_string.find("biastee=1") != -1): - bladeserial = parse_bladerf_ser(device_string) - serialarg = '*:serial={}'.format(bladeserial) - subprocess.run(['bladeRF-cli', '-d', serialarg, 'set', 'biastee', 'tx', 'off']) + disable_amp(device_string) # Delete pager bin file from /tmp/ os.remove(outfile) print("Removed outfile") @@ -334,6 +280,30 @@ def parse_bladerf_ser(device): bladeserial = device[serialstart:serialend] return bladeserial +def disable_amp(device_string): + """Turn off biastee if the device is a bladerf with the biastee enabled""" + if(device_string.find("bladerf") != -1 and device_string.find("biastee=1") != -1): + bladeserial = parse_bladerf_ser(device_string) + serialarg = '*:serial={}'.format(bladeserial) + subprocess.run(['bladeRF-cli', '-d', serialarg, 'set', 'biastee', 'tx', 'off']) + else: + # If different logic is required for other device types, it should go here. + pass + +def get_antenna_port(device): + """Given a device string, return the string to pass in to the antenna parameter. Default return value is an empty string.""" + # empty string is default value for antenna argument + antenna = "" + # bladerf with serial 1c4842b8d80e43438c042dbd752c6640 has a broken TX1 port + if(device.find("bladerf=1c4842b8d80e43438c042dbd752c6640") != -1): + antenna = "TX2" + print("Set antenna to TX2") + else: + # If you would like to use a different TX port, other than the default for your SDR, the logic to do so should go here. + antenna = "" + #print("Antenna set to default empty string. device: {}".format(device)) + return antenna + def argument_parser(): parser = argparse.ArgumentParser(description="A script to run SDR challenges on multiple SDR devices.") parser.add_argument("-f", '--flagfile', help="Flags file") @@ -423,22 +393,12 @@ def main(options=None): if(test != True or challenges_transmitted == 0): print(f"\nPainting Waterfall on {txfreq}\n") # spectrum_paint.main(current_chal[7] * 1000, fetch_device(dev_available)) - antenna = "" - # bladerf with serial 1c4842b8d80e43438c042dbd752c6640 has a broken TX1 port - if(dev_available.find("bladerf=1c4842b8d80e43438c042dbd752c6640") != -1): - antenna = "TX2" - print("Set antenna to TX2") - else: - print("Antenna set to default empty string. device: {}".format(dev_available)) + antenna = get_antenna_port(dev_available) p = Process(target=spectrum_paint.main, args=(txfreq * 1000, dev_available, antenna)) # , daemon=True) p.start() p.join() - # Turn off biastee if the device is a bladerf with the biastee enabled - if(dev_available.find("bladerf") != -1 and dev_available.find("biastee=1") != -1): - bladeserial = parse_bladerf_ser(dev_available) - serialarg = '*:serial={}'.format(bladeserial) - subprocess.run(['bladeRF-cli', '-d', serialarg, 'set', 'biastee', 'tx', 'off']) + disable_amp(dev_available) print(f"\nStarting {cc_name} on {txfreq}") # Create list of challenge module arguments, using txfreq to allow setting random freq here instead of in the challenge module replaceinqueue = True