/api/v1/monitor/fftFFT#
Responses
200OKapplication/json
sizerequiredinteger · int32
sourcerequiredinteger · int32
monitor.fft.SRC_SEL — which tap the core is pointed at.
bins_db requiredarray of number · double
Frequency-domain magnitude samples.
syntheticrequiredboolean
TRUE while these bins are MANUFACTURED HERE and do not come from the PL.
The field exists because nothing in the response distinguished a
measurement from an invention: a spectrum served by /api/v1/... reads
as signal, and the UI displayed it as such. The client now labels itself
from this value rather than from a hard-coded string, which would have
gone stale the day the real path landed — and a stale note is this
project's dominant failure mode.
Set it to false IN THE SAME COMMIT as the real sample read, not
before: a premature false is worse than today's true, because it
makes the invention undetectable.
channelrequiredstring
Which end of the link this spectrum describes ("rx" / "tx").
enabledrequiredboolean
Whether analysis is switched on for that channel. Off by default: a frame costs a DMA block plus a transform, and nothing should pay that because a dashboard tab happens to be open.
sample_rate_hz requiredinteger · int64
Sample rate the block was taken at, 0 when there is no block.
unavailableUnavailable · nullable
Request
curl "http://192.168.2.1:8080/api/v1/monitor/fft"import requests
BASE_URL = "http://192.168.2.1:8080"
response = requests.get(f"{BASE_URL}/api/v1/monitor/fft")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let response = reqwest::Client::new()
.get(format!("{base_url}/api/v1/monitor/fft"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"size": 0,
"source": 0,
"bins_db": [
0.0
],
"synthetic": true,
"channel": "string",
"enabled": true,
"sample_rate_hz": 0,
"unavailable": {}
}/api/v1/monitor/powerPower#
Responses
200OKapplication/json
taprequiredinteger · int32
power_dbfs requirednumber · double
Request
curl "http://192.168.2.1:8080/api/v1/monitor/power"import requests
BASE_URL = "http://192.168.2.1:8080"
response = requests.get(f"{BASE_URL}/api/v1/monitor/power")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let response = reqwest::Client::new()
.get(format!("{base_url}/api/v1/monitor/power"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"tap": 0,
"power_dbfs": 0.0
}/api/v1/monitor/rssiRSSI#
Responses
200OKapplication/json
average_dbm requirednumber · double
instant_dbm requirednumber · double
threshold_dbm requirednumber · double
Request
curl "http://192.168.2.1:8080/api/v1/monitor/rssi"import requests
BASE_URL = "http://192.168.2.1:8080"
response = requests.get(f"{BASE_URL}/api/v1/monitor/rssi")
response.raise_for_status()
print(response.json())let base_url = "http://192.168.2.1:8080";
let response = reqwest::Client::new()
.get(format!("{base_url}/api/v1/monitor/rssi"))
.send()
.await?
.error_for_status()?;
let body: serde_json::Value = response.json().await?;
println!("{body:#}");Response
{
"average_dbm": 0.0,
"instant_dbm": 0.0,
"threshold_dbm": 0.0
}