Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/)
Expand Down
116 changes: 38 additions & 78 deletions challengectl.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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):
Expand All @@ -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):
Expand All @@ -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):
Expand All @@ -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")
Expand Down Expand Up @@ -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
Expand All @@ -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")
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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
Expand Down
Loading