mirror of
https://github.com/hak5/nano-tetra-modules.git
synced 2025-10-29 16:58:09 +00:00
185 lines
6.1 KiB
PHP
185 lines
6.1 KiB
PHP
<?php namespace pineapple;
|
|
|
|
class HackRF extends Module
|
|
{
|
|
public function route()
|
|
{
|
|
switch ($this->request->action) {
|
|
case 'hackrfInfo':
|
|
$this->hackrfInfo();
|
|
break;
|
|
|
|
case 'hackrfInstall':
|
|
$this->hackrfInstall();
|
|
break;
|
|
|
|
case 'hackrfUninstall':
|
|
$this->hackrfUninstall();
|
|
break;
|
|
|
|
case 'hackrfChecker':
|
|
$this->hackrfChecker();
|
|
break;
|
|
|
|
case 'hackrfTransfer':
|
|
$this->hackrfTransfer();
|
|
break;
|
|
|
|
case 'hackrfStop':
|
|
$this->hackrfStop();
|
|
break;
|
|
|
|
case 'hackrfLog':
|
|
$this->hackrfLog();
|
|
break;
|
|
}
|
|
}
|
|
|
|
private function hackrfInfo()
|
|
{
|
|
exec('hackrf_info', $message);
|
|
$message = implode("\n", $message);
|
|
|
|
if ($message == "No HackRF boards found.") {
|
|
$this->response = array("foundBoard" => false);
|
|
} else if ($this->checkDependency('hackrf_info') == false) {
|
|
$this->response = array("foundBoard" => false);
|
|
} else {
|
|
$this->response = array("foundBoard" => true,
|
|
"availableHackRFs" => $message);
|
|
}
|
|
}
|
|
|
|
private function hackrfChecker()
|
|
{
|
|
if ($this->checkDependency('hackrf_info')) {
|
|
$this->response = array("installed" => true);
|
|
} else {
|
|
$this->response = array("installed" => false);
|
|
}
|
|
}
|
|
|
|
private function hackrfInstall()
|
|
{
|
|
if ($this->getDevice() == 'tetra') {
|
|
$this->execBackground('opkg update && opkg install hackrf-mini');
|
|
} else {
|
|
$this->execBackground('opkg update && opkg install hackrf-mini --dest sd');
|
|
}
|
|
exec('echo "Welcome to HackRF!" > /tmp/hackrf_log');
|
|
|
|
$this->response = array("installing" => true);
|
|
}
|
|
|
|
private function hackrfUninstall()
|
|
{
|
|
exec('opkg remove hackrf-mini');
|
|
unlink('/tmp/hackrf_log');
|
|
$this->response = array("success" => true);
|
|
}
|
|
|
|
private function hackrfTransfer()
|
|
{
|
|
$mode = $this->request->mode;
|
|
$sampleRate = $this->request->sampleRate;
|
|
$centerFreq = $this->request->centerFreq;
|
|
$filename = $this->request->filename;
|
|
$amp = $this->request->amp;
|
|
$antPower = $this->request->antpower;
|
|
$txRepeat = $this->request->txRepeat;
|
|
$txIfCheckbox = $this->request->txIfCheckbox;
|
|
$txIfGain = $this->request->txIfGain;
|
|
$rxIfCheckbox = $this->request->rxIfCheckbox;
|
|
$rxBbCheckbox = $this->request->rxBbCheckbox;
|
|
$rxIfGain = $this->request->rxIfGain;
|
|
$rxBbGain = $this->request->rxBbGain;
|
|
|
|
if(!$sampleRate) {
|
|
$this->response = array("success" => false, "error" => "samplerate");
|
|
} else if(!$centerFreq) {
|
|
$this->response = array("success" => false, "error" => "centerfreq");
|
|
} else if(!$filename) {
|
|
$this->response = array("success" => false, "error" => "filename");
|
|
} else {
|
|
if ($mode == "rx") {
|
|
$mode = "-r";
|
|
} else {
|
|
$mode = "-t";
|
|
}
|
|
|
|
if(strpos(strtolower($sampleRate), 'k') == true) {
|
|
$sampleRate = str_replace('k', '', $sampleRate);
|
|
$sampleRate = (int)$sampleRate * 1000;
|
|
} else if(strpos(strtolower($sampleRate), 'm') == true) {
|
|
$sampleRate = str_replace('m', '', $sampleRate);
|
|
$sampleRate = (int)$sampleRate * 1000000;
|
|
}
|
|
|
|
if(strpos(strtolower($centerFreq), 'khz') == true) {
|
|
$centerFreq = str_replace('khz', '', $centerFreq);
|
|
$centerFreq = floatval($centerFreq);
|
|
$centerFreq = $centerFreq * 1000;
|
|
} else if(strpos(strtolower($centerFreq), 'mhz') == true) {
|
|
$centerFreq = str_replace('mhz', '', $centerFreq);
|
|
$centerFreq = floatval($centerFreq);
|
|
$centerFreq = $centerFreq * 1000000;
|
|
} else if(strpos(strtolower($centerFreq), 'ghz') == true) {
|
|
$centerFreq = str_replace('ghz', '', $centerFreq);
|
|
$centerFreq = floatval($centerFreq);
|
|
$centerFreq = $centerFreq * 1000000000;
|
|
}
|
|
|
|
$command = "hackrf_transfer $mode $filename -f $centerFreq -s $sampleRate";
|
|
|
|
if ($amp) {
|
|
$command = $command . " -a 1";
|
|
}
|
|
if ($antPower) {
|
|
$command = $command . " -p 1";
|
|
}
|
|
if ($txRepeat) {
|
|
$command = $command . " -R";
|
|
}
|
|
|
|
if ($txIfCheckbox == true && $mode == '-t' && empty($txIfGain) == false) {
|
|
$command = $command . " -x $txIfGain";
|
|
}
|
|
|
|
if ($rxIfCheckbox == true && $mode == '-r' && empty($rxIfGain) == false) {
|
|
$command = $command . " -l $rxIfGain";
|
|
}
|
|
|
|
if ($rxBbCheckbox == true && $mode == '-r' && empty($rxBbGain) == false) {
|
|
$command = $command . " -g $rxBbGain";
|
|
}
|
|
|
|
unlink("/tmp/hackrf_log");
|
|
$this->execBackground("$command > /tmp/hackrf_log 2>&1");
|
|
$this->response = array("success" => true);
|
|
}
|
|
}
|
|
|
|
private function hackrfStop()
|
|
{
|
|
exec("killall hackrf_transfer");
|
|
|
|
$this->response = array("success" => true);
|
|
}
|
|
|
|
private function hackrfLog()
|
|
{
|
|
$log = '/tmp/hackrf_log';
|
|
if(file_exists($log)) {
|
|
$log = file_get_contents($log);
|
|
$this->response = array("success" => true, "log" => $log);
|
|
} else {
|
|
$this->response = array("success" => true, "log" => "Welcome to HackRF!");
|
|
}
|
|
}
|
|
}
|
|
|
|
// 01110100 01101000 01100001 01101110 01101011 00100000 01111001 01101111 01110101 00100000 01110011 01100101 01100010 01100001
|
|
// 01110011 01110100 01101001 01100001 01101110 00101110 0001010 01101001 00100000 01101100 01101111 01110110 01100101 00100000
|
|
// 01111001 01101111 01110101 00100000 00111100 00110011
|
|
|