mirror of https://github.com/aredn/aredn.git
convert signal.json to lua, changed style, add tx/rx rates
Change-Id: Id46fc2cd74a39f1a1ec6922ba93154df33b95654
This commit is contained in:
parent
a1da9c0ad7
commit
ffc76619cc
|
@ -58,7 +58,7 @@ function parsecgi(str)
|
||||||
local rv = {}
|
local rv = {}
|
||||||
for pair in str:gmatch"[^&]+" do
|
for pair in str:gmatch"[^&]+" do
|
||||||
local key, val = pair:match"([^=]*)=(.*)"
|
local key, val = pair:match"([^=]*)=(.*)"
|
||||||
if key then rv[key] = val end
|
if key then rv[cgidecode(key)] = cgidecode(val) end
|
||||||
end
|
end
|
||||||
return rv
|
return rv
|
||||||
end
|
end
|
||||||
|
|
|
@ -60,7 +60,7 @@ $header = <<EOF;
|
||||||
<script src="/js/jquery-2.1.4.min.js"></script>
|
<script src="/js/jquery-2.1.4.min.js"></script>
|
||||||
<script src="/js/jquery.canvasjs.min.js"></script>
|
<script src="/js/jquery.canvasjs.min.js"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var dps=[[{"label":"Init","y":-95}],[{"label":"Init","y":-95}]];
|
var dps=[[{"label":"Init","y":[-95,-95]}]];
|
||||||
|
|
||||||
// Read a page's GET URL variables and return them as an associative array.
|
// Read a page's GET URL variables and return them as an associative array.
|
||||||
function getUrlVars()
|
function getUrlVars()
|
||||||
|
@ -112,17 +112,11 @@ $header = <<EOF;
|
||||||
},
|
},
|
||||||
data: [
|
data: [
|
||||||
{
|
{
|
||||||
type: "spline",
|
type: "rangeSplineArea",
|
||||||
showInLegend: true,
|
showInLegend: true,
|
||||||
legendText: "Signal",
|
legendText: "Signal",
|
||||||
toolTipContent: "Signal: {y}dBm @ {label}",
|
toolTipContent: "At {label}<br />Signal: {y[0]}dBm<br />Noise: {y[1]}dBm<br />SNR: {m}dBm<br /><hr />TX Rate: {tx_rate} Mbps<br />TX MCS: {tx_mcs}<br />RX Rate: {rx_rate} Mbps<br />RX MCS: {rx_mcs}<br />",
|
||||||
dataPoints: dps[0]
|
dataPoints: dps[0]
|
||||||
},{
|
|
||||||
type: "line",
|
|
||||||
showInLegend: true,
|
|
||||||
legendText: "Noise",
|
|
||||||
toolTipContent: "Noise: {y}dBm @ {label}",
|
|
||||||
dataPoints: dps[1]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
}); // --- chart
|
}); // --- chart
|
||||||
|
@ -130,7 +124,7 @@ $header = <<EOF;
|
||||||
var updateArchiveChart = function () {
|
var updateArchiveChart = function () {
|
||||||
\$.getJSON("/cgi-bin/signal.json?device=$parms{device}", function (result) {
|
\$.getJSON("/cgi-bin/signal.json?device=$parms{device}", function (result) {
|
||||||
chart.options.data[0].dataPoints = result[0];
|
chart.options.data[0].dataPoints = result[0];
|
||||||
chart.options.data[1].dataPoints = result[1];
|
// chart.options.data[1].dataPoints = result[1];
|
||||||
chart.render();
|
chart.render();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -138,7 +132,7 @@ $header = <<EOF;
|
||||||
var updateRealtimeChart = function () {
|
var updateRealtimeChart = function () {
|
||||||
\$.getJSON("/cgi-bin/signal.json?realtime=1&device=$parms{device}", function (result) {
|
\$.getJSON("/cgi-bin/signal.json?realtime=1&device=$parms{device}", function (result) {
|
||||||
dps[0].push(result[0][0]);
|
dps[0].push(result[0][0]);
|
||||||
dps[1].push(result[1][0]);
|
// dps[1].push(result[1][0]);
|
||||||
chart.render();
|
chart.render();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
#!/usr/bin/perl
|
#!/usr/bin/lua
|
||||||
=for commnet
|
--[[
|
||||||
|
|
||||||
Part of AREDN -- Used for creating Amateur Radio Emergency Data Networks
|
Part of AREDN -- Used for creating Amateur Radio Emergency Data Networks
|
||||||
Copyright (C) 2015 Conrad Lara
|
Copyright (C) 2016 Darryl Quinn
|
||||||
See Contributors file for additional contributors
|
See Contributors file for additional contributors
|
||||||
|
|
||||||
Copyright (c) 2013 David Rivenburg et al. BroadBand-HamNet
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation version 3 of the License.
|
the Free Software Foundation version 3 of the License.
|
||||||
|
@ -28,100 +26,142 @@
|
||||||
If importing this code into a new or existing project attribution
|
If importing this code into a new or existing project attribution
|
||||||
to the AREDN project must be added to the source code.
|
to the AREDN project must be added to the source code.
|
||||||
|
|
||||||
You must not misrepresent the origin of the material conained within.
|
You must not misrepresent the origin of the material contained within.
|
||||||
|
|
||||||
Modified versions must be modified to attribute to the original source
|
Modified versions must be modified to attribute to the original source
|
||||||
and be marked in reasonable ways as differentiate it from the original
|
and be marked in reasonable ways as differentiate it from the original
|
||||||
version.
|
version
|
||||||
|
|
||||||
=cut
|
--]]
|
||||||
|
|
||||||
BEGIN {push @INC, '/www/cgi-bin'};
|
require("uci")
|
||||||
use perlfunc;
|
require("aredn.uci")
|
||||||
|
require("aredn.utils")
|
||||||
|
require("aredn.http")
|
||||||
|
require("nixio")
|
||||||
|
require("iwinfo")
|
||||||
|
local ipc = require("luci.ip")
|
||||||
|
local json = require ("luci.jsonc")
|
||||||
|
|
||||||
read_query_string();
|
-- Function extensions
|
||||||
|
os.capture = capture
|
||||||
my $debug = 0;
|
|
||||||
my $dirname="/tmp/snrlog";
|
|
||||||
my @values;
|
|
||||||
my $counter=0;
|
|
||||||
my $sjson;
|
|
||||||
my $njson;
|
|
||||||
|
|
||||||
system("mkdir $dirname") unless (-d $dirname);
|
|
||||||
|
|
||||||
if($parms{"realtime"}) {
|
|
||||||
# ==== REALTIME DATA =====
|
|
||||||
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
|
|
||||||
$d = sprintf ("%02d:%02d:%02d", $hour, $min, $sec);
|
|
||||||
|
|
||||||
if($parms{device} eq '' or $parms{device} eq 'strongest') {
|
|
||||||
($s, $n) = get_wifi_signal(get_interface("wifi"));
|
|
||||||
} else {
|
|
||||||
my ($dmac, $dname) = $parms{device} =~ /^(.*?)\-(.*)/;
|
|
||||||
($s, $n) = get_realtime_signal($dmac);
|
|
||||||
}
|
|
||||||
|
|
||||||
if($s==0) { $s=$n }
|
|
||||||
$sjson= sprintf("{\"label\":\"%s\",\"y\":%s}",$d,$s);
|
|
||||||
$njson= sprintf("{\"label\":\"%s\",\"y\":%s}",$d,$n);
|
|
||||||
} else {
|
|
||||||
# ==== ARCHIVE DATA =====
|
|
||||||
# --- Load the snr data into an array
|
|
||||||
if($parms{device} eq '') { chomp ($parms{device}=`ls -1A $dirname | head -1`); }
|
|
||||||
|
|
||||||
$filename=$dirname . "/" . $parms{device};
|
|
||||||
open my $fh, '<', $filename or die "Could not open file '$filename' $!";
|
|
||||||
chomp(my @lines = <$fh>);
|
|
||||||
close $fh;
|
|
||||||
|
|
||||||
# --- iterate over each line and build the json strings
|
|
||||||
foreach my $line (@lines) {
|
|
||||||
@values = split(',', $line);
|
|
||||||
chomp($values[0]);
|
|
||||||
chomp($values[1]);
|
|
||||||
chomp($values[2]);
|
|
||||||
#print "{\"label\":\"$values[0]\",\"y\":\"$values[1]\",\"n\":\"$values[2]\"},";
|
|
||||||
$sjson= join("", $sjson, sprintf("{\"label\":\"%s\",\"y\":%s}",$values[0],$values[1]));
|
|
||||||
$njson= join("", $njson, sprintf("{\"label\":\"%s\",\"y\":%s}",$values[0],$values[2]));
|
|
||||||
|
|
||||||
# --- properly terminate json
|
|
||||||
if(++$counter != scalar(@lines)) {
|
|
||||||
$sjson=join("", $sjson, ",");
|
|
||||||
$njson=join("", $njson, ",");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&json_header();
|
|
||||||
|
|
||||||
print "[[";
|
|
||||||
print $sjson;
|
|
||||||
print "],[";
|
|
||||||
print $njson;
|
|
||||||
print "]]";
|
|
||||||
|
|
||||||
|
|
||||||
sub json_header
|
-- ==== MAIN =====
|
||||||
{
|
ctx = uci.cursor()
|
||||||
# THIS MUST BE ONE LINE!
|
if not ctx then
|
||||||
# otherwise an intermittent busybox bug will incorrectly "fix" the generated output
|
error("Failed to get uci cursor")
|
||||||
# print "HTTP/1.0 200 OK\r\n"; # Not needed under Uhttpd
|
end
|
||||||
print "Content-type: application/json\r\n";
|
|
||||||
print "Cache-Control: no-store\r\n";
|
|
||||||
print "\r\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_realtime_signal()
|
local defnoise=-95
|
||||||
{
|
local ol={}
|
||||||
my $s, $n;
|
local dpa={} -- datapoint table/array
|
||||||
my ($var) = @_;
|
local dirname="/tmp/snrlog"
|
||||||
return ("-1","-1") if not defined $var;
|
local values={}
|
||||||
if (-d "/sys/kernel/debug/ieee80211/phy0/netdev:wlan0/stations/$var") {
|
local counter=0
|
||||||
chomp($s = `cat /sys/kernel/debug/ieee80211/phy0/netdev:wlan0/stations/$var/last_signal`);
|
|
||||||
} else {
|
local parms={}
|
||||||
return ("-95","-95");
|
parms=parsecgi(nixio.getenv("QUERY_STRING") or "")
|
||||||
}
|
|
||||||
($junk, $n) = get_wifi_signal(get_interface("wifi"));
|
-- make sure snrlog dir is created
|
||||||
return ($s, $n);
|
if dir_exists(dirname) then
|
||||||
}
|
nixio.fs.mkdir(dirname)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- get wifi ifname
|
||||||
|
local wifiiface=get_ifname("wifi")
|
||||||
|
|
||||||
|
if parms.realtime then
|
||||||
|
-- REALTIME
|
||||||
|
local d=os.date("%H:%M:%S")
|
||||||
|
local n -- noise
|
||||||
|
local m -- margin
|
||||||
|
local s -- signal
|
||||||
|
local dp={} -- datapoint
|
||||||
|
local yinfo={}
|
||||||
|
|
||||||
|
if (parms.device=="strongest" or parms.device=="" or (not parms.device)) then
|
||||||
|
-- REALTIME/STRONGEST SIGNAL
|
||||||
|
-- get radio noise floor
|
||||||
|
n=iwinfo["nl80211"].noise(wifiiface)
|
||||||
|
if (n < -101 or n > -50) then
|
||||||
|
n=defnoise
|
||||||
|
end
|
||||||
|
-- get strongest signal
|
||||||
|
s=iwinfo["nl80211"].signal(wifiiface)
|
||||||
|
m=tonumber(n)-tonumber(s)
|
||||||
|
tx_rate="N/A"
|
||||||
|
rx_rate="N/A"
|
||||||
|
tx_mcs="N/A"
|
||||||
|
rx_mcs="N/A"
|
||||||
|
dp.tx_rate=tx_rate
|
||||||
|
dp.rx_rate=rx_rate
|
||||||
|
dp.tx_mcs=tx_mcs
|
||||||
|
dp.rx_mcs=rx_mcs
|
||||||
|
else
|
||||||
|
-- REALTIME/SPECIFIC SIGNAL
|
||||||
|
-- split out device to mac-host
|
||||||
|
local mac,host=string.match(parms.device,"([^-]*)-(.*)")
|
||||||
|
local macinfo=iwinfo["nl80211"].assoclist(wifiiface)[mac:upper()]
|
||||||
|
n=macinfo.noise
|
||||||
|
s=macinfo.signal
|
||||||
|
tx_rate=macinfo.tx_rate/1000
|
||||||
|
rx_rate=macinfo.rx_rate/1000
|
||||||
|
tx_mcs=macinfo.tx_mcs
|
||||||
|
rx_mcs=macinfo.rx_mcs
|
||||||
|
m=tonumber(s)-tonumber(n)
|
||||||
|
end
|
||||||
|
if s~=0 then
|
||||||
|
table.insert(yinfo,tonumber(s))
|
||||||
|
table.insert(yinfo,tonumber(n))
|
||||||
|
dp.label=d
|
||||||
|
dp.y=yinfo
|
||||||
|
dp.m=m
|
||||||
|
dp.tx_rate=tx_rate
|
||||||
|
dp.rx_rate=rx_rate
|
||||||
|
dp.tx_mcs=tx_mcs
|
||||||
|
dp.rx_mcs=rx_mcs
|
||||||
|
table.insert(dpa,dp)
|
||||||
|
table.insert(ol,dpa)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- ARCHIVE
|
||||||
|
local filename
|
||||||
|
if not parms.device or parms.device=="" then
|
||||||
|
-- get the first file from dirlist
|
||||||
|
for maclist in nixio.fs.glob(dirname.."/".."*") do
|
||||||
|
filename=maclist
|
||||||
|
parms.device=maclist
|
||||||
|
break
|
||||||
|
end
|
||||||
|
else
|
||||||
|
filename=dirname.."/"..parms.device
|
||||||
|
end
|
||||||
|
|
||||||
|
if filename then
|
||||||
|
for line in io.lines(filename) do
|
||||||
|
local yinfo={}
|
||||||
|
local dp={}
|
||||||
|
local dt,s,n=line:match("(.*)%,(.*)%,(.*)")
|
||||||
|
m=tonumber(s)-tonumber(n)
|
||||||
|
table.insert(yinfo,tonumber(s))
|
||||||
|
table.insert(yinfo,tonumber(n))
|
||||||
|
dp.label=dt
|
||||||
|
dp.y=yinfo
|
||||||
|
dp.m=m
|
||||||
|
dp.tx_rate="N/A"
|
||||||
|
dp.rx_rate="N/A"
|
||||||
|
dp.tx_mcs="N/A"
|
||||||
|
dp.rx_mcs="N/A"
|
||||||
|
table.insert(dpa,dp)
|
||||||
|
end
|
||||||
|
table.insert(ol,dpa)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Output the HTTP header for JSON
|
||||||
|
json_header()
|
||||||
|
|
||||||
|
-- Output the info table as json
|
||||||
|
print(json.stringify(ol,false))
|
||||||
|
-- END MAIN
|
Loading…
Reference in New Issue