modified on 1 lip 2010 at 08:29 ••• 4 184 views

DOCSIS Statistics (Arris C3, Motorola cablemodems)

Z MikroTik Wiki

I am using The Dude to monitor and manage a HFC network with Arris C3 CMTS and clients with Motorola Surfboard cablemodems. I have made some Functions and Probes to monitor some signal and frequency parameters using SNMP OIDs. I would like to share them with you and I post some screenshots to show you how can you see the results in The Dude.


First, the results

Panel grouping charts of data sources of probes in Arris C3
Plik:Motorolapanel.jpg
A panel grouping charts of data sources of probes in Cablemodems


HowTo

Adding functions and probes to monitor CMTS (Arris C3)

First , you need to copy this code to clipboard (Ctrl-C) and then paste it on Functions window in The Dude client.

<?xml version="1.0" ?>
<dude version="4.0beta1">
<Function>
 <sys-type>57</sys-type>
 <sys-id>16314</sys-id>
 <sys-name>ArrisC3_SNR_available</sys-name>
 array_size(\0d\0aoid_column("1.3.6.1.4.1.4115.1.4.3.6.1.3.1.21")\0d\0a)\0d\0a
 <descr>Controla que este disponible el OID para poder medir el SNR</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16316</sys-id>
 <sys-name>ArrisC3_SNR_US3</sys-name>
 oid("1.3.6.1.4.1.4115.1.4.3.6.1.3.1.21.12") / 10
 <descr>Devuelve el SNR (dBm) del Upstream 3</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16318</sys-id>
 <sys-name>ArrisC3_SNR_US2</sys-name>
 oid("1.3.6.1.4.1.4115.1.4.3.6.1.3.1.21.11") / 10
 <descr>Devuelve el SNR (dBm) del Upstream 2</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16320</sys-id>
 <sys-name>ArrisC3_SNR_US1</sys-name>
 oid("1.3.6.1.4.1.4115.1.4.3.6.1.3.1.21.10") / 10
 <descr>Devuelve el SNR (dBm) del Upstream 1</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16322</sys-id>
 <sys-name>ArrisC3_SNR_US0</sys-name>
 oid("1.3.6.1.4.1.4115.1.4.3.6.1.3.1.21.9") / 10
 <descr>Devuelve el SNR (dBm) del Upstream 0</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16324</sys-id>
 <sys-name>ArrisC3_MER_available</sys-name>
 array_size(\0d\0aoid_column("1.3.6.1.2.1.10.127.1.1.4.1.5")\0d\0a)\0d\0a
 <descr>Controla que este disponible el OID para poder medir el MER</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16326</sys-id>
 <sys-name>ArrisC3_MER_US3</sys-name>
 oid("1.3.6.1.2.1.10.127.1.1.4.1.5.12") / 10
 <descr>Devuelve el MER (dBm) del Upstream 3</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16328</sys-id>
 <sys-name>ArrisC3_MER_US2</sys-name>
 oid("1.3.6.1.2.1.10.127.1.1.4.1.5.11") / 10
 <descr>Devuelve el MER (dBm) del Upstream 2</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16330</sys-id>
 <sys-name>ArrisC3_MER_US1</sys-name>
 oid("1.3.6.1.2.1.10.127.1.1.4.1.5.10") / 10
 <descr>Devuelve el MER (dBm) del Upstream 1</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16332</sys-id>
 <sys-name>ArrisC3_MER_US0</sys-name>
 oid("1.3.6.1.2.1.10.127.1.1.4.1.5.9") / 10
 <descr>Devuelve el MER (dBm) del Upstream 0</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16334</sys-id>
 <sys-name>ArrisC3_CMs_available</sys-name>
 array_size(\0d\0aoid_column("1.3.6.1.4.1.4115.1.4.3.1.1.1.1.14")\0d\0a)\0d\0a
 <descr>Controla que este disponible el OID para poder contar los Cablemodems</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16336</sys-id>
 <sys-name>ArrisC3_CMs_US3</sys-name>
 oid("1.3.6.1.4.1.4115.1.4.3.1.1.1.1.14.12")
 <descr>Devuelve la cantidad de Cablemodems del Upstream 3</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16338</sys-id>
 <sys-name>ArrisC3_CMs_US2</sys-name>
 oid("1.3.6.1.4.1.4115.1.4.3.1.1.1.1.14.11")
 <descr>Devuelve la cantidad de Cablemodems del Upstream 2</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16340</sys-id>
 <sys-name>ArrisC3_CMs_US1</sys-name>
 oid("1.3.6.1.4.1.4115.1.4.3.1.1.1.1.14.10")
 <descr>Devuelve la cantidad de Cablemodems del Upstream 1</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16342</sys-id>
 <sys-name>ArrisC3_CMs_US0</sys-name>
 oid("1.3.6.1.4.1.4115.1.4.3.1.1.1.1.14.9")
 <descr>Devuelve la cantidad de Cablemodems del Upstream 0</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>16344</sys-id>
 <sys-name>ArrisC3_CMs_Total</sys-name>
 sum(\0d\0aoid_column("1.3.6.1.4.1.4115.1.4.3.1.1.1.1.14")\0d\0a)\0d\0a
 <descr>Devuelve la cantidad de Cablemodems activos</descr>
</Function>
</dude>


Second, you must copy this code to clipboard (Ctrl-C) and then paste it on Probes window in The Dude client.

<?xml version="1.0" ?>
<dude version="4.0beta1">
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16347</sys-id>
 <sys-name>ArrisC3_SNR_check</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_SNR_available()</functionAvailable>
 <functionError>concatenate( if( and(ArrisC3_SNR_US0() > 25, ArrisC3_SNR_US0() < 30), "",
 concatenate(" SNR_US0 -> ", ArrisC3_SNR_US0(), " dBm") ), if( and(ArrisC3_SNR_US1() > 25, ArrisC3_SNR_US1() < 30), "",
 concatenate(" SNR_US1 -> ", ArrisC3_SNR_US1(), " dBm") ), if( and(ArrisC3_SNR_US2() > 25, ArrisC3_SNR_US2() < 30), "",
 concatenate(" SNR_US2 -> ", ArrisC3_SNR_US2(), " dBm") ), if( and(ArrisC3_SNR_US3() > 25, ArrisC3_SNR_US3() < 30), "",
 concatenate(" SNR_US3 -> ", ArrisC3_SNR_US3(), " dBm") ) )</functionError>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16353</sys-id>
 <sys-name>ArrisC3_SNR_US3</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_SNR_available()</functionAvailable>
 <functionError>if( ArrisC3_SNR_available(), "", "SNR unavailable" )</functionError>
 <functionValue>ArrisC3_SNR_US3()</functionValue>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16359</sys-id>
 <sys-name>ArrisC3_SNR_US2</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_SNR_available()</functionAvailable>
 <functionError>if( ArrisC3_SNR_available(), "", "SNR unavailable" )</functionError>
 <functionValue>ArrisC3_SNR_US2()</functionValue>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16365</sys-id>
 <sys-name>ArrisC3_SNR_US1</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_SNR_available()</functionAvailable>
 <functionError>if( ArrisC3_SNR_available(), "", "SNR unavailable" )</functionError>
 <functionValue>ArrisC3_SNR_US1()</functionValue>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16371</sys-id>
 <sys-name>ArrisC3_SNR_US0</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_SNR_available()</functionAvailable>
 <functionError>if( ArrisC3_SNR_available(), "", "SNR unavailable" )</functionError>
 <functionValue>ArrisC3_SNR_US0()</functionValue>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16377</sys-id>
 <sys-name>ArrisC3_MER_check</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_MER_available()</functionAvailable>
 <functionError>concatenate( if( and(ArrisC3_MER_US0() > 15, ArrisC3_MER_US0() < 20), "",
  concatenate(" MER_US0 -> ", ArrisC3_MER_US0(), " dBm") ), if( and(ArrisC3_MER_US1() > 15, ArrisC3_MER_US1() < 20), "",
  concatenate(" MER_US1 -> ", ArrisC3_MER_US1(), " dBm") ), if( and(ArrisC3_MER_US2() > 15, ArrisC3_MER_US2() < 20), "",
  concatenate(" MER_US2 -> ", ArrisC3_MER_US2(), " dBm") ), if( and(ArrisC3_MER_US3() > 15, ArrisC3_MER_US3() < 20), "",
  concatenate(" MER_US3 -> ", ArrisC3_MER_US3(), " dBm") ) )</functionError>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16383</sys-id>
 <sys-name>ArrisC3_MER_US3</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_MER_available()</functionAvailable>
 <functionError>if( ArrisC3_MER_available(), "", "down" )</functionError>
 <functionValue>ArrisC3_MER_US3()</functionValue>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16389</sys-id>
 <sys-name>ArrisC3_MER_US2</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_MER_available()</functionAvailable>
 <functionError>if( ArrisC3_MER_available(), "", "down" )</functionError>
 <functionValue>ArrisC3_MER_US2()</functionValue>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16395</sys-id>
 <sys-name>ArrisC3_MER_US1</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_MER_available()</functionAvailable>
 <functionError>if( ArrisC3_MER_available(), "", "down" )</functionError>
 <functionValue>ArrisC3_MER_US1()</functionValue>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16401</sys-id>
 <sys-name>ArrisC3_MER_US0</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_MER_available()</functionAvailable>
 <functionError>if( ArrisC3_MER_available(), "", "MER unavailable" )</functionError>
 <functionValue>ArrisC3_MER_US0()</functionValue>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16407</sys-id>
 <sys-name>ArrisC3_CMs_US3</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_CMs_available()</functionAvailable>
 <functionError>if( ArrisC3_CMs_available(), "", "No se pueden contar los CMs")</functionError>
 <functionValue>ArrisC3_CMs_US3()</functionValue>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16413</sys-id>
 <sys-name>ArrisC3_CMs_US2</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_CMs_available()</functionAvailable>
 <functionError>if( ArrisC3_CMs_available(), "", "No se pueden contar los CMs")</functionError>
 <functionValue>ArrisC3_CMs_US2()</functionValue>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16419</sys-id>
 <sys-name>ArrisC3_CMs_US1</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_CMs_available()</functionAvailable>
 <functionError>if( ArrisC3_CMs_available(), "", "No se pueden contar los CMs")</functionError>
 <functionValue>ArrisC3_CMs_US1()</functionValue>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16425</sys-id>
 <sys-name>ArrisC3_CMs_US0</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_CMs_available()</functionAvailable>
 <functionError>if( ArrisC3_CMs_available(), "", "No se pueden contar los CMs")</functionError>
 <functionValue>ArrisC3_CMs_US0()</functionValue>
</Probe>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>16431</sys-id>
 <sys-name>ArrisC3_CMs_Total</sys-name>
 <typeID>8</typeID>
 <functionAvailable>ArrisC3_CMs_available()</functionAvailable>
 <functionError>if(ArrisC3_CMs_available(), "", "No se pueden contar los CMs")</functionError>
 <functionValue>ArrisC3_CMs_Total()</functionValue>
</Probe>
</dude>


Adding functions and probes to monitor cablemodems (Motorola Surfboard)

First , you need to copy this code to clipboard (Ctrl-C) and then paste it on Functions window in The Dude client.

<?xml version="1.0" ?>
<dude version="4.0beta1">
<Function>
 <sys-type>57</sys-type>
 <sys-id>21191</sys-id>
 <sys-name>Motorola_SBV4200_available</sys-name>
 array_size(\0d\0aoid_column("1.3.6.1.2.1.10.127.1")\0d\0a)\0d\0a
 <descr>Controla que este disponible el rama DOCSIS en el Cablemomde</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>21176</sys-id>
 <sys-name>Motorola_SBV4200_UsPower</sys-name>
 oid("1.3.6.1.2.1.10.127.1.2.2.1.3.2") / 10
 <descr>Devuelve la potencia en el Upstream (dBm) del Cablemodem</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>21159</sys-id>
 <sys-name>Motorola_SBV4200_SNR</sys-name>
 oid("1.3.6.1.2.1.10.127.1.1.4.1.5.3") / 10
 <descr>Devuelve el SNR (dBm) del Cablemodem</descr>
</Function>
<Function>
 <sys-type>57</sys-type>
 <sys-id>21167</sys-id>
 <sys-name>Motorola_SBV4200_Microreflections</sys-name>
 oid("1.3.6.1.2.1.10.127.1.1.4.1.6.3")
 <descr>Devuelve Microreflections (dBc) del Cablemodem</descr>
</Function>
</dude>


Second, you must copy this code to clipboard (Ctrl-C) and then paste it on Probes window in The Dude client.

<?xml version="1.0" ?>
<dude version="4.0beta1">
<Probe>
 <sys-type>13</sys-type>
 <sys-id>21200</sys-id>
 <sys-name>Motorola_SBV4200_UsPower</sys-name>
 <typeID>8</typeID>
 <functionAvailable>Motorola_SBV4200_available()</functionAvailable>
 <functionError>if( Motorola_SBV4200_available(), "", "DOCSIS unavailable" )</functionError>
 <functionValue>Motorola_SBV4200_UsPower()</functionValue>
</Probe>
<DataSource>
 <sys-type>41</sys-type>
 <sys-id>21217</sys-id>
 <sys-name>Motorola_SBV4200_UsPower @ CarlosGonzalez</sys-name>
 <type>builtin</type>
</DataSource>
<Service>
 <sys-type>17</sys-type>
 <sys-id>21215</sys-id>
 <sys-name>Service</sys-name>
 <deviceID>21085</deviceID>
 <probeID>21200</probeID>
 <dataSourceID>21217</dataSourceID>
 <status>up</status>
 <value>40</value>
 <timeSinceChanged>06/24/2010 15:46:44</timeSinceChanged>
</Service>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>21194</sys-id>
 <sys-name>Motorola_SBV4200_SNR</sys-name>
 <typeID>8</typeID>
 <functionAvailable>Motorola_SBV4200_available()</functionAvailable>
 <functionError>if( Motorola_SBV4200_available(), "", "DOCSIS unavailable" )</functionError>
 <functionValue>Motorola_SBV4200_SNR()</functionValue>
</Probe>
<DataSource>
 <sys-type>41</sys-type>
 <sys-id>21213</sys-id>
 <sys-name>Motorola_SBV4200_SNR @ CarlosGonzalez</sys-name>
 <type>builtin</type>
</DataSource>
<Service>
 <sys-type>17</sys-type>
 <sys-id>21211</sys-id>
 <sys-name>Service</sys-name>
 <deviceID>21085</deviceID>
 <probeID>21194</probeID>
 <dataSourceID>21213</dataSourceID>
 <status>up</status>
 <value>31</value>
 <timeSinceChanged>06/24/2010 15:46:41</timeSinceChanged>
</Service>
<Probe>
 <sys-type>13</sys-type>
 <sys-id>21197</sys-id>
 <sys-name>Motorola_SBV4200_Microreflections</sys-name>
 <typeID>8</typeID>
 <functionAvailable>Motorola_SBV4200_available()</functionAvailable>
 <functionError>if( Motorola_SBV4200_available(), "", "DOCSIS unavailable" )</functionError>
 <functionValue>Motorola_SBV4200_Microreflections()</functionValue>
</Probe>
<DataSource>
 <sys-type>41</sys-type>
 <sys-id>21209</sys-id>
 <sys-name>Motorola_SBV4200_Microreflections @ CarlosGonzalez</sys-name>
 <type>builtin</type>
</DataSource>
<Service>
 <sys-type>17</sys-type>
 <sys-id>21207</sys-id>
 <sys-name>Service</sys-name>
 <deviceID>21085</deviceID>
 <probeID>21197</probeID>
 <dataSourceID>21209</dataSourceID>
 <status>up</status>
 <value>89</value>
 <timeSinceChanged>06/24/2010 15:46:36</timeSinceChanged>
</Service>
</dude>


Conclusion

This is a sample of you can do with some MIBs and writing some simple functions to retrieve DOCSIS data. I will try to update these scripts to add some functionalities and I will try to write them more cleaned. I used to monitor my network with Cacti RRDtool but I realize that you can do the same and more with The Dude. It will be perfect to make The Dude server run in Linux natively. Sorry about my limited english.