ePMP snmp signal strength OID/MIB

I'm trying to get mrtg to graph signal strength history. Right now I have it graphing bandwidth, but I want to know which OID/MIB I should be using for RF strength.

It would be super nice to have an example mrtg config for graphing RF strength if anyone has an example.

I pull . for RSSI and . for SNR every 10 mins.  (I use RRD, 10-min cronjob polls all SMs for RSSI, SNR, MCS up & dn, bps up/down, pps up/dn, TXpower into 1year db)


1 Like

Thanks, that worked :)

I never could get RRD to behave. I hand code this stuff mostly to make it do what I want, and I couldn't get the RRD db to update right so I could pull it into html. Are you using hand coded stuff, or some other implementation of RRD?

Simple answer: yes, hand coded stuff.

Complicated answer:  Multiple 10-minute interval perl cronjobs (one on the 2's, one on the 5's, etc) scan 10.a.b.c IP blocks looking for gear, when found pulls scads of data from them and updates a MySQL db, then stuffs the relevant data into the RRD for each radio. (everything is 10.a.b.c private IPs with second octet tower-specific and third octet tech-specific)

I'm currently in transition on presentation - originally I generated a graph each time a device was polled (worked ok with only a hundred radios off a half-dozen towers/subnets but now we're over 2000 clients and over 50 towers, with 5 distinct techs deployed) but later generate them on the fly via rrdgraph/rrdcgi.

More recently I've been pulling the raw numbers via AJAX into javascript and drawing the graph client-side, though not yet for SM signal/throughput graphs, just fiber and backhaul stuff.

I haven't checked in a couple years, but I'm somewhere past a hundred thousand lines code probably, between all the perl polling scripts on the backed, all the PHP and HTML/AJAX/JavaScript stuff on the frontend, plus Android apps.   (polling APs and SMs of PMP100, PMP320, PMP450i, ePMP, and also ePMP, PMP300/500/600, Apex9, UBNT AirFiber backhauls, plus Mikrotik routers and Cisco ATAs for VOIP customers)


Yeah, I kind of thought I'd wind up writing my own franken-code too :)

Interesting that you port it all into mysql with a perl frontend and then just use RRD to help with graphing. I like the idea of making it modular. I was having trouble with the RRD polling, will look into gettting rrdgraph/rrdcgi to display the results and see what happens. I like LibreNMS, but it doesn't do exaclty what I want either.

Thanks a lot for the deep dive on your setup, really appreciate it, hopefully I won't end up with 100K of code, but I understand the scalability, that's similar to the issues we're having :)

Just to dive a little deeper, this is the rrd-related parts of my perl polling code for ePMP SMs (obviously lots of code NOT shown pulls data from SMs into the variables referenced, and smid is determined when it updates the mysql just before this code snippet):

use RRDs;
   unless (-e "/usr/local/canmon/rrd/sm/sm-$smid.rrd")
        push_result("RRD for smid $smid doesn't exist, creating.\n") if ($debug>0);
        RRDs::create ("/usr/local/canmon/rrd/sm/sm-$smid.rrd", "--step=600",
    RRDs::update ("/usr/local/canmon/rrd/sm/sm-$smid.rrd","N:$bytesin:$bytesout:$pktsin:$pktsout:$bcastin:$bcastout:$mcastin:$mcastout:$dlmcs:$ulmcs:$cinr:$xmitpower:$radiodbm:$rfindiscards:$rfoutdiscards:$rf


And this is the rrdcgi code I pull in to display radio signal stats for ePMP SMs:

<script type='text/javascript'>
function upsmrrdradio()
    var days=$('#upsmrrdradio').val();
    url="smepmprrdradio.cgi?smid=<RRD::CV::PATH smid>&days="+days+"&name=<RRD::CV::PATH name>"
 <RRD::GRAPH rrd/<RRD::CV::PATH smid>d<RRD::CV::PATH days>.png
    --title <RRD::CV::PATH days>" day dBm Stats for "<RRD::CV::PATH name>
    --width 800 --height 140 --upper-limit -50 --lower-limit -105 --rigid
    --end now --start end-<RRD::CV::PATH days>d
    --color BACK#d0e0f0d0 --color CANVAS#ffffff --color GRID#707070 --color MGRID#500000
    --imginfo '<IMG src="rrd/%s">'
    DEF:DA=/usr/local/canmon/rrd/sm/sm-<RRD::CV::PATH smid>.rrd:DBM:AVERAGE
    DEF:DM=/usr/local/canmon/rrd/sm/sm-<RRD::CV::PATH smid>.rrd:DBM:MAX
    DEF:CA=/usr/local/canmon/rrd/sm/sm-<RRD::CV::PATH smid>.rrd:cinr:AVERAGE
 <RRD::GRAPH rrd/<RRD::CV::PATH smid>c<RRD::CV::PATH days>.png
    --title <RRD::CV::PATH days>" day CINR Stats for "<RRD::CV::PATH name>
    --width 800 --height 80 --upper-limit 50 --lower-limit 0 --rigid
    --end now --start end-<RRD::CV::PATH days>d
    --color BACK#d0e0f0d0 --color CANVAS#ffffff --color GRID#707070 --color MGRID#500000
    --imginfo '<IMG src="rrd/%s">'
    DEF:CA=/usr/local/canmon/rrd/sm/sm-<RRD::CV::PATH smid>.rrd:cinr:AVERAGE
    DEF:CM=/usr/local/canmon/rrd/sm/sm-<RRD::CV::PATH smid>.rrd:cinr:MAX
 <RRD::GRAPH rrd/<RRD::CV::PATH smid>x<RRD::CV::PATH days>.png
    --title <RRD::CV::PATH days>" day XmitPower Stats for "<RRD::CV::PATH name>
    --width 800 --height 80 --upper-limit 30 --lower-limit 0 --rigid
    --end now --start end-<RRD::CV::PATH days>d
    --color BACK#d0e0f0d0 --color CANVAS#ffffff --color GRID#707070 --color MGRID#500000
    --imginfo '<IMG src="rrd/%s">'
    DEF:JA=/usr/local/canmon/rrd/sm/sm-<RRD::CV::PATH smid>.rrd:xmitpower:AVERAGE
    DEF:JM=/usr/local/canmon/rrd/sm/sm-<RRD::CV::PATH smid>.rrd:xmitpower:MAX
<select id='upsmrrdradio' name='days' onchange='upsmrrdradio();'>
<option name='duration' value='1'>Duration...</option>
<option name='1 day' value='1'>1 Day</option>
<option name='7 days' value='7'>1 Week</option>
<option name='30 days' value='30'>1 Month</option>
<option name='90 days' value='90'>3 month</option>
<option name='365 days' value='365'>1 year</option>

Passed two parameters from the HTML/Javascript that embeds it - smid and days.  (smid is unique per the mysql db for each radio - web view shows stats from the mysql db then throughput and radio are separate tabs, loaded via AJAX from the script above and others like it for throughput and other radio techs)


This is an example of the signal graph generated by the rrdcgi code above - I plot the signal level and the noise level (signal-snr) filled between the two.  (so the bottom of the graph will visually indicate changes in noise floor, top of the graph indicates received signal level, difference between them is SNR)  Dip week 35/36 was client-end unplanned realignment, week 41 was hurricane Matthew.


Hey, wonderful, thanks a ton :)

I'll try to spin up some code and see what I get, and then report back in case others are trying to do this...very helpful!

what OID are you using to get the SM traffic from the AP ?


@snc-jd wrote:

what OID are you using to get the SM traffic from the AP ?


Actually I "cheat" a bit, I use the ethernet TX bytes count, rather than the radio RX bytes count...

.  CAMBIUM-PMP80211-MIB::cambiumEthTXBytes.0 3817757900

You could also use the basic SNMP IF-MIB fields, under . (like ifInOctets.2 = ., etc) but need to pick the 'correct' interface (.2 in the example), which may vary depending on bridge/NAT/route/pppoe modes.  


how do I know which mac is associated with which oid? when I walk the mac address I get

C:\snmp>snmpwalk ***********.
.iso. = "00:04:56:f5:fd:5d"
.iso. = "00:04:56:f0:27:5b"
.iso. = "00:04:56:f0:2a:1b"
.iso. = "00:04:56:f5:fd:3f"
.iso. = "00:04:56:ed:75:1b"
.iso. = "00:04:56:f3:33:cb"

When I walk . I get 10.1, 10.2, 11.1, 11.2 etc.. 

.iso. = 1777603352
.iso. = 3131043527
.iso. = 594631763
.iso. = 25234571
.iso. = 5500050
.iso. = 142060
.iso. = 0
.iso. = 0
.iso. = 0
.iso. = 13371
.iso. = 0
.iso. = 0
.iso. = 416630418
.iso. = 2939139700
.iso. = 287849798
.iso. = 62161208
.iso. = 1232419
.iso. = 423500

I would think that I can use the mac walk last digit to corrilate that to the tx/rx traffic, but I cant find a relation.

any help you could give would me much appreciated. 

Not sure if this is what you're looking for.  Have you tried walking this table?


...1 is index for SM

...2 is SM MAC

...3 Uplink kbits for SM

It has kbits, packets, drops, retransmits.  Most are uplink and downlink, but for uplink retransmits and capacity drops you have to get those from the SM.

1 Like

in the dude the same ones are used OID ?