mirror of
https://github.com/hak5/nano-tetra-modules.git
synced 2025-10-29 16:58:09 +00:00
Add modules to repository
This commit is contained in:
184
HackRF/api/module.php
Normal file
184
HackRF/api/module.php
Normal file
@@ -0,0 +1,184 @@
|
||||
<?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
|
||||
|
||||
175
HackRF/js/module.js
Normal file
175
HackRF/js/module.js
Normal file
@@ -0,0 +1,175 @@
|
||||
registerController('HackRFController', ['$api', '$scope', '$interval', function($api, $scope, $interval) {
|
||||
$scope.foundBoard = false;
|
||||
$scope.availableHackRFs = "";
|
||||
$scope.running = false;
|
||||
$scope.installed = false;
|
||||
$scope.installling = false;
|
||||
|
||||
$scope.hackrfInfo = (function() {
|
||||
$api.request({
|
||||
module: 'HackRF',
|
||||
action: 'hackrfInfo'
|
||||
}, function(response) {
|
||||
$scope.foundBoard = response.foundBoard;
|
||||
|
||||
if (response.foundBoard === true) {
|
||||
$scope.availableHackRFs = response.availableHackRFs;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$scope.hackrfChecker = (function() {
|
||||
$api.request({
|
||||
module: 'HackRF',
|
||||
action: 'hackrfChecker'
|
||||
}, function(response) {
|
||||
if(response.installed === true) {
|
||||
$scope.installed = true;
|
||||
$scope.installing = false;
|
||||
$scope.hackrfInfo();
|
||||
$interval.cancel($scope.install_interval);
|
||||
} else {
|
||||
$scope.installed = false;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$scope.hackrfInstall = (function() {
|
||||
$api.request({
|
||||
module: 'HackRF',
|
||||
action: 'hackrfInstall'
|
||||
}, function(response) {
|
||||
if(response.installing === true) {
|
||||
$scope.installing = true;
|
||||
$scope.install_interval = $interval(function(){
|
||||
$scope.hackrfChecker();
|
||||
}, 1000);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$scope.hackrfUninstall = (function() {
|
||||
$api.request({
|
||||
module: 'HackRF',
|
||||
action: 'hackrfUninstall'
|
||||
}, function(response) {
|
||||
if(response.success === true) {
|
||||
$scope.hackrfChecker();
|
||||
$scope.hackrfInfo();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$scope.hackrfChecker();
|
||||
$scope.hackrfInfo();
|
||||
|
||||
$scope.$on('$destroy', function() {
|
||||
$interval.cancel($scope.install_interval);
|
||||
});
|
||||
}]);
|
||||
|
||||
registerController('HackRFSettingsController', ['$api', '$scope', '$timeout', function($api, $scope, $timeout) {
|
||||
$scope.mode = "rx";
|
||||
$scope.sampleRate = "";
|
||||
$scope.centerFreq = "";
|
||||
$scope.filename = "";
|
||||
$scope.amp = false;
|
||||
$scope.antpower = false;
|
||||
$scope.txRepeat = false;
|
||||
$scope.txIfCheckbox = false;
|
||||
$scope.rxIfCheckbox = false;
|
||||
$scope.rxBbCheckbox = false;
|
||||
$scope.txIfGain = 0;
|
||||
$scope.rxIfGain = 0;
|
||||
$scope.rxBbGain = 0;
|
||||
$scope.sampleRateError = false;
|
||||
$scope.filenameError = false;
|
||||
$scope.centerFreqError = false;
|
||||
|
||||
$scope.hackrfTransfer = (function() {
|
||||
$api.request({
|
||||
module: 'HackRF',
|
||||
action: 'hackrfTransfer',
|
||||
mode: $scope.mode,
|
||||
sampleRate: $scope.sampleRate,
|
||||
centerFreq: $scope.centerFreq,
|
||||
filename: $scope.filename,
|
||||
amp: $scope.amp,
|
||||
antpower: $scope.antpower,
|
||||
txRepeat: $scope.txRepeat,
|
||||
txIfCheckbox: $scope.txIfCheckbox,
|
||||
txIfGain: $scope.txIfGain,
|
||||
rxIfCheckbox: $scope.rxIfCheckbox,
|
||||
rxBbCheckbox: $scope.rxBbCheckbox,
|
||||
rxIfGain: $scope.rxIfGain,
|
||||
rxBbGain: $scope.rxBbGain
|
||||
}, function(response) {
|
||||
if(response.success === true) {
|
||||
$scope.running = true;
|
||||
} else if(response.success === false) {
|
||||
if(response.error == "samplerate") {
|
||||
$scope.sampleRateError = true;
|
||||
$timeout(function() {
|
||||
$scope.sampleRateError = false;
|
||||
}, 3000);
|
||||
} else if(response.error == "filename") {
|
||||
$scope.filenameError = true;
|
||||
$timeout(function() {
|
||||
$scope.filenameError = false;
|
||||
}, 3000);
|
||||
} else if(response.error == "centerfreq") {
|
||||
$scope.centerFreqError = true;
|
||||
$timeout(function() {
|
||||
$scope.centerFreqError = false;
|
||||
}, 3000);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$scope.hackrfStop = (function() {
|
||||
$api.request({
|
||||
module: 'HackRF',
|
||||
action: 'hackrfStop'
|
||||
}, function(response) {
|
||||
if (response.success === true) {
|
||||
$scope.running = false;
|
||||
}
|
||||
});
|
||||
});
|
||||
}]);
|
||||
|
||||
registerController('HackRFLoggingController', ['$api', '$scope', '$interval', function($api, $scope, $interval) {
|
||||
$scope.log = "";
|
||||
$scope.autoRefresh = false;
|
||||
|
||||
$scope.hackrfLog = (function() {
|
||||
$api.request({
|
||||
module: 'HackRF',
|
||||
action: 'hackrfLog'
|
||||
}, function(response) {
|
||||
if (response.success === true) {
|
||||
$scope.log = response.log;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$scope.enableAutoRefresh = (function() {
|
||||
$scope.autoRefresh = true;
|
||||
$scope.refresh_interval = $interval(function(){
|
||||
$scope.hackrfLog();
|
||||
}, 1000);
|
||||
});
|
||||
|
||||
$scope.disableAutoRefresh = (function() {
|
||||
$scope.autoRefresh = false;
|
||||
$interval.cancel($scope.refresh_interval);
|
||||
});
|
||||
|
||||
$scope.hackrfLog();
|
||||
$scope.$on('$destroy', function() {
|
||||
$interval.cancel($scope.refresh_interval);
|
||||
});
|
||||
|
||||
}]);
|
||||
219
HackRF/module.html
Normal file
219
HackRF/module.html
Normal file
@@ -0,0 +1,219 @@
|
||||
<div ng-controller="HackRFController">
|
||||
<div class="row">
|
||||
<div class="col-md-5">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">HackRF
|
||||
<span class="pull-right" data-toggle="modal" data-target="#ModuleInfo">
|
||||
ℹ
|
||||
</span>
|
||||
<span style="padding-right: 10px;" class="pull-right" ng-click="hackrfInfo();">
|
||||
↻
|
||||
</span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<span class="label label-success" data-toggle="modal" data-target="#HackRFInfo" ng-show="foundBoard">HackRF Found</span>
|
||||
<span class="label label-danger" ng-show="!foundBoard" ng-hide="!installed">HackRF Not Found</span>
|
||||
<span class="label label-warning" ng-hide="installed">Dependencies Not Met</span>
|
||||
<div class="pull-right" style="display: inline-block;">
|
||||
<button class="btn btn-sm btn-default" ng-disabled="installing" ng-hide="installed" ng-click="hackrfInstall();">Install Dependencies</button>
|
||||
<img src="/img/throbber.gif" ng-show="installing">
|
||||
<button class="btn btn-sm btn-default" ng-show="installed" ng-click="hackrfUninstall();">Remove Dependencies</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="panel panel-default" ng-hide="!foundBoard" ng-controller="HackRFSettingsController">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
Settings
|
||||
<span class="pull-right" data-toggle="modal" data-target="#ManageInfo">
|
||||
ℹ
|
||||
</span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div ng-show="sampleRateError" class="alert alert-danger">You did not specify a sample rate.</div>
|
||||
<div ng-show="centerFreqError" class="alert alert-danger">You did not specify a center frequency</div>
|
||||
<div ng-show="filenameError" class="alert alert-danger">You did not specify a filename.</div>
|
||||
|
||||
|
||||
<form class="form-horizontal">
|
||||
<div class="col-md-10">
|
||||
<div class="form-group">
|
||||
<label for="samplerate" class="col-sm-2">Sample Rate</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="textbox" class="form-control" id="samplerate" ng-model="sampleRate" placeholder="10M">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="centerfreq" class="col-sm-2">Center Frequency</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="textbox" class="form-control" id="centerfreq" ng-model="centerFreq" placeholder="900MHz">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="service" class="col-sm-2">Transceiver Mode</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" ng-model="mode">
|
||||
<option value="rx">RX</option>
|
||||
<option value="tx">TX</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="filename" class="col-sm-2">File Name</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="textbox" class="form-control" id="filename" placeholder="/sd/capture.cs8" ng-model="filename">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2">Other Options</label>
|
||||
<div class="col-sm-10">
|
||||
<label class="checkbox-inline"><input type="checkbox" ng-model="amp">Enable RF Amp</label>
|
||||
<label class="checkbox-inline"><input type="checkbox" ng-model="antpower">Antenna Power</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-show="mode == 'tx'">
|
||||
<label class="col-sm-2">TX Options</label>
|
||||
<div class="col-sm-10">
|
||||
<label class="checkbox-inline"><input type="checkbox" ng-model="txRepeat">Repeat Transmission</label>
|
||||
<label class="checkbox-inline"><input type="checkbox" ng-model="txIfCheckbox">TX IF Gain</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-show="txIfCheckbox && mode == 'tx'">
|
||||
<label for="txIfGain" class="col-sm-2">TX IF Gain Amount</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="textbox" class="form-control" id="txIfGain" ng-model="txIfGain">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-show="mode == 'rx'">
|
||||
<label class="col-sm-2">RX Options</label>
|
||||
<div class="col-sm-10">
|
||||
<label class="checkbox-inline"><input type="checkbox" ng-model="rxBbCheckbox">RX BB Gain</label>
|
||||
<label class="checkbox-inline"><input type="checkbox" ng-model="rxIfCheckbox">RX IF Gain</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-show="rxBbCheckbox && mode == 'rx'">
|
||||
<label for="rxBbGain" class="col-sm-2">RX BB Gain Amount</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="textbox" class="form-control" id="rxBbGain" ng-model="rxBbGain">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-show="rxIfCheckbox && mode == 'rx'">
|
||||
<label for="rxIfGain" class="col-sm-2">RX IF Gain Amount</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="textbox" class="form-control" id="rxIfGain" ng-model="rxIfGain">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" ng-hide="running" class="btn btn-success" ng-click="hackrfTransfer();">Start</button>
|
||||
<button type="submit" ng-show="running" class="btn btn-danger" ng-click="hackrfStop();">Stop</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="panel panel-default" ng-hide="!foundBoard" ng-controller="HackRFLoggingController">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
Logging
|
||||
<span style="padding-top: 2px; padding-left: 10px;" class="pull-right" ng-click="hackrfLog();">
|
||||
↻
|
||||
</span>
|
||||
<button class="btn btn-success btn-xs pull-right" style="width: 30px;" ng-show="autoRefresh" ng-click="disableAutoRefresh();">On</button>
|
||||
<button class="btn btn-danger btn-xs pull-right" style="width: 30px;" ng-show="!autoRefresh" ng-click="enableAutoRefresh();">Off</button>
|
||||
<span class="pull-right" style="font-size: 10px; padding-top: 5px; padding-right: 5px;">Auto-Refresh: </span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<pre>{{ log }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="modal fade" id="ModuleInfo" tabindex="-1" role="dialog" aria-labelledBy="ModuleInfoModal">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title" id="myModalLabel">HackRF</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>
|
||||
<p style="text-align: center;">Version 1.4</p>
|
||||
<p style="text-align: center;">Written by <a href="https://twitter.com/FoxtrotNull">Foxtrot</a></p>
|
||||
<br/>
|
||||
<p style="text-align: center;">"HackRF" is a trademark of Great Scott Gadgets. Permission to use the trademark with attribution to Great Scott Gadgets is granted to all licensees of HackRF for the sole purpose of naming or describing copies or derived works.</p>
|
||||
<p style="text-align: center;">HackRF is released under the <a href="https://github.com/mossmann/hackrf/blob/master/COPYING">GPL 2.0 License</a></p>
|
||||
|
||||
<p style="text-align: center;"><span style="color:red;">Warning:</span> The HackRF is a delicate device, and using some features such as the RF Amplifier incorrectly may result in damaging your HackRF. I am not responsible for any damage you do this. Be careful!</p>
|
||||
|
||||
<span class="help-block">Binaries & Lib: <span style="text-decoration: underline;">4eeddc0</span></span>
|
||||
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="HackRFInfo" tabindex="-1" role="dialog" aria-labelledBy="HackRFInfoModal" ng-controller="HackRFController">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title" id="myModalLabel">HackRF Boards</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<pre>{{ availableHackRFs }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="ManageInfo" tabindex="-1" role="dialog" aria-labelledBy="ManageInfoModal">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title" id="myModalLabel">HackRF Settings</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<h3>Sample Rate</h3>
|
||||
<p>The sample rate is the amount of samples sent or receieved per second. Exceeding 10M samples may cause an unstable system due to computation limits.</p>
|
||||
|
||||
<h3>Center Frequency</h3>
|
||||
<p>This is the frequency that the HackRF will tune to once started. Remember to keep the DC offset in mind!</p>
|
||||
|
||||
<h3>Transceiever Mode</h3>
|
||||
<p>The HackRF One is half-duplex, thus you must specify whether you want the HackRF to transmit(TX) or receieve(RX).</p>
|
||||
|
||||
<h3>File Name</h3>
|
||||
<p>This is the path to the file that you will record to, or transmit from. Linux special files such as /dev/null and /dev/zero can be used too.</p>
|
||||
|
||||
<h3>RF Amp & Antenna Power</h3>
|
||||
<p>The <b>RF Amp</b> checkbox will enable or disable the RF amplifier. The <b>Antenna Power</b> checkbox will enable or disable power being delivered to the Antenna port (max. 50 mA at 3.3 V DC).</p>
|
||||
|
||||
<h3>RX IF Gain & RX BB Gain</h3>
|
||||
<p><b>RX IF Gain</b> is controlled by supplying a value from <b>0dB</b> to <b>40dB</b>, with 8dB steps. <b>RX BB Gain</b> controls the baseband gain by supplying a value from <b>0dB</b> to <b>62dB</b>, with 2dB steps.</p>
|
||||
|
||||
<h3>Repeat Transmission & TX IF Gain</h3>
|
||||
<p><b>Repeat Transmission</b> allows you to enable or disable replaying of the transfer. <b>TX IF Gain</b> is controlled by supplying a value from <b>0dB</b> to <b>47dB</b>, with 1dB steps.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
10
HackRF/module.info
Normal file
10
HackRF/module.info
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"author": "Foxtrot",
|
||||
"description": "HackRF on the WiFi Pineapple",
|
||||
"devices": [
|
||||
"nano",
|
||||
"tetra"
|
||||
],
|
||||
"title": "HackRF",
|
||||
"version": "1.4"
|
||||
}
|
||||
Reference in New Issue
Block a user