Таблица уровней клиентов для точек доступа Cisco
Задача
Собирать данные о траффике и уровне сигнала с точек доступа
- Клиенты динамические, их мак-адреса заранее не известны
- SSID добавляются и удаляются по мере необходимости
- Точки могут иметь как один интерфейс так и два
Для того что бы получить информацию по SNMP о клиентах подключенных к точке доступа, существует специальный MIB CISCO-DOT11-ASSOCIATION-MIB
Он доступен достаточно давно, как минимум он работает на точках 1200 и 1100 серий, ну и на более современных тоже.
Просмотр OID
Пример с использованием display-hint
# snmpwalk -v2c -c MON 192.168.77.2 .1.3.6.1.4.1.9.9.273.1.3.1 -OX
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientCurrentTxRateSet[1]["450"][STRING: da:20:60:64:36:95] = Hex-STRING: 07
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientCurrentTxRateSet[2]["450"][STRING: a4:45:19:5a:ef:48] = Hex-STRING: 01
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientUpTime[1]["450"][STRING: da:20:60:64:36:95] = Gauge32: 15898 second
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientUpTime[2]["450"][STRING: a4:45:19:5a:ef:48] = Gauge32: 425 second
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[1]["450"][STRING: da:20:60:64:36:95] = INTEGER: -64 dBm
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[2]["450"][STRING: a4:45:19:5a:ef:48] = INTEGER: -89 dBm
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSigQuality[1]["450"][STRING: da:20:60:64:36:95] = Gauge32: 24 percentage
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSigQuality[2]["450"][STRING: a4:45:19:5a:ef:48] = Gauge32: 9 percentage
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientAgingLeft[1]["450"][STRING: da:20:60:64:36:95] = Gauge32: 58 second
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientAgingLeft[2]["450"][STRING: a4:45:19:5a:ef:48] = Gauge32: 34 second
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientPacketsReceived[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 149529 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientPacketsReceived[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 346 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientBytesReceived[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 23101125 byte
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientBytesReceived[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 113287 byte
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientPacketsSent[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 617733 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientPacketsSent[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 251 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientBytesSent[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 745190393 byte
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientBytesSent[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 47693 byte
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientDuplicates[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 2389 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientDuplicates[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 12 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMsduRetries[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 159859 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMsduRetries[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 331 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMsduFails[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 0 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMsduFails[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 0 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientWepErrors[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 0 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientWepErrors[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 0 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMicErrors[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 0 error
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMicErrors[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 0 error
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMicMissingFrames[1]["450"][STRING: da:20:60:64:36:95] = Counter32: 0 packet
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientMicMissingFrames[2]["450"][STRING: a4:45:19:5a:ef:48] = Counter32: 0 packet
Или без использования
# snmpwalk -v2c -c MON 192.168.77.2 .1.3.6.1.4.1.9.9.273.1.3.1 -On
.1.3.6.1.4.1.9.9.273.1.3.1.1.1.1.3.52.53.48.218.32.96.100.54.149 = Hex-STRING: 05
.1.3.6.1.4.1.9.9.273.1.3.1.1.1.2.3.52.53.48.164.69.25.90.239.72 = Hex-STRING: 01
.1.3.6.1.4.1.9.9.273.1.3.1.1.2.1.3.52.53.48.218.32.96.100.54.149 = Gauge32: 15911 second
.1.3.6.1.4.1.9.9.273.1.3.1.1.2.2.3.52.53.48.164.69.25.90.239.72 = Gauge32: 439 second
.1.3.6.1.4.1.9.9.273.1.3.1.1.3.1.3.52.53.48.218.32.96.100.54.149 = INTEGER: -63 dBm
.1.3.6.1.4.1.9.9.273.1.3.1.1.3.2.3.52.53.48.164.69.25.90.239.72 = INTEGER: -89 dBm
.1.3.6.1.4.1.9.9.273.1.3.1.1.4.1.3.52.53.48.218.32.96.100.54.149 = Gauge32: 31 percentage
.1.3.6.1.4.1.9.9.273.1.3.1.1.4.2.3.52.53.48.164.69.25.90.239.72 = Gauge32: 10 percentage
.1.3.6.1.4.1.9.9.273.1.3.1.1.5.1.3.52.53.48.218.32.96.100.54.149 = Gauge32: 58 second
.1.3.6.1.4.1.9.9.273.1.3.1.1.5.2.3.52.53.48.164.69.25.90.239.72 = Gauge32: 51 second
.1.3.6.1.4.1.9.9.273.1.3.1.1.6.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 149587 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.6.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 347 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.7.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 23109939 byte
.1.3.6.1.4.1.9.9.273.1.3.1.1.7.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 113333 byte
.1.3.6.1.4.1.9.9.273.1.3.1.1.8.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 618046 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.8.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 251 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.9.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 745583754 byte
.1.3.6.1.4.1.9.9.273.1.3.1.1.9.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 47693 byte
.1.3.6.1.4.1.9.9.273.1.3.1.1.10.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 2392 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.10.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 12 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.11.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 159964 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.11.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 331 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.12.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 0 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.12.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 0 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.13.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 0 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.13.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 0 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.14.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 0 error
.1.3.6.1.4.1.9.9.273.1.3.1.1.14.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 0 error
.1.3.6.1.4.1.9.9.273.1.3.1.1.15.1.3.52.53.48.218.32.96.100.54.149 = Counter32: 0 packet
.1.3.6.1.4.1.9.9.273.1.3.1.1.15.2.3.52.53.48.164.69.25.90.239.72 = Counter32: 0 packet
Разбор OID
Как можно видеть, сам OID состоит из нескольких частей
Для определенности рассмотрим уровни сигнала:
.1.3.6.1.4.1.9.9.273.1.3.1.1.3.1.3.52.53.48.218.32.96.100.54.149 = INTEGER: -63 dBm
.1.3.6.1.4.1.9.9.273.1.3.1.1.3.2.3.52.53.48.164.69.25.90.239.72 = INTEGER: -89 dBm
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[1]["450"][STRING: da:20:60:64:36:95] = INTEGER: -64 dBm
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[2]["450"][STRING: a4:45:19:5a:ef:48] = INTEGER: -89 dBm
Часть .1.3.6.1.4.1.9.9.273.1.3.1.1.3 это и есть OID CISCO-DOT11-ASSOCIATION и она общая
Далее в самом OID закодировано значение "кому принадлежит сигнал", т е какому клиенту
Выделенное значение и его описание:
- 2.3.52.53.48.164.69.25.90.239.72 - номер интерфейса, он же ifIndex, dot11Radio0 (1), или dot11Radio1 (2), в примере клиент подключен к 5Ghz интерфейсу (dot11Radio1)
- 2.3.52.53.48.164.69.25.90.239.72 - Длинна SSID в байтах, в пример 3 символа (SSID в примере "450")
- 2.3.52.53.48.164.69.25.90.239.72 - коды ASCII символов SSID, их три - "450"
- 2.3.52.53.48.164.69.25.90.239.72 - мак-адрес, 6 байт, записаны в деятичной форме, "a4:45:19:5a:ef:48", например 164(десятичное) = a4(hex), 69(десятичное) = 45 (hex) и так далее.
Интеграция с Zabbix
SNMP autodiscovery
Есть дока но мне она не нравится =)
В моем случае правило автообнаружения выглядит так:
В целом идея такая:
- В поле SNMP OID указываю discovery[{#S},1.3.6.1.4.1.9.9.273.1.3.1.1.3]
- Заббикс сам делает snmpwalk 1.3.6.1.4.1.9.9.273.1.3.1.1.3 и в результате получает список клиентов и их сигналы
snmpwalk -v2c -c MON 192.168.77.2 1.3.6.1.4.1.9.9.273.1.3.1.1.3 -OX
Bad operator (INTEGER): At line 73 in /usr/share/snmp/mibs/ietf/SNMPv2-PDU
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[1]["450"][STRING: 0:8:ca:2b:1:24] = INTEGER: -65 dBm
CISCO-DOT11-ASSOCIATION-MIB::cDot11ClientSignalStrength[2]["450"][STRING: a4:45:19:5a:ef:48] = INTEGER: -67 dBm
и на выходе формирует JSON в котором есть поля
"{#SNMPINDEX}" - это часть которую нужно дописать к OID указанному в discovery что бы получить значение
[
{
"{#SNMPINDEX}": "1.3.52.53.48.0.8.202.43.1.36",
"{#S}": "-66"
},
{
"{#SNMPINDEX}": "2.3.52.53.48.164.69.25.90.239.72",
"{#S}": "-66"
}
]
Это выглядит странновато, но суть этого - получить список суффиксов, которые потом можно использовать для получения других значений
В поле "{#S}" записан сигнал и его значение я нигде не использую, но в общем случае (для других MIB/OID) тут может быть что-то что можно использовать (в оригинальной документации это имена интерфейсов)
В общем случае можно указать несколько OID которые нужно обходить snmpwalk-ом, но при этом нужно держать в голове что SNMPINDEX должен совпадать - так работает для таблицы интерфейсов где по разным префиксам но с одним и тем же ifIndex можно получить данные с интерфейса - имя, дескрипшен, байты и т.п.
Если же указать 2 OID с разной структурой (например интерфейсы и таблицу регистрации клиентов) то ничего хорошего не получится - данные будут перемешаны (подробно я не смотрел код как именно и почему )
Далее при создании прототипов элементов данных можно использовать "{#SNMPINDEX}" и тогда все остальные переменны в JSON полученном при discovery будут доступны
Например, если при создании прототипа данныхь указать OID=.1.3.6.1.4.1.9.9.273.1.3.1.1.2.{#SNMPINDEX} то (для моего примера будет автоматически создано 2 элемента данных, в именах которых можно использовать например значение макроса "{$S}". Это хорошо ложиться на пример с интерфейсом, но в моем случае этот макрос как и остальные совершенно бесполезен так как вся статическая информация закодирована в OID который собственно доступен через макрос "{SNMPINDEX}"
Processing
Для того что бы получить нужные данные в удобном виде полученный при discovery JSON можно редактировать с помошью встроенного JavaScript
В моем случае на скорую руку вышел вот такой скрипт:
var records = JSON.parse(value);
for (i = 0; i < records.length; i++) {
var OID = records[i]["{#SNMPINDEX}"].split('.')
// IFINDEX AND IFNAME
var dot1RadioIfIndex = OID.shift();
records[i]['{#DOT1RADIO_IFINDEX}'] = dot1RadioIfIndex
records[i]['{#DOT1RADIO_IFNAME}'] = "Dot11Radio" + (parseInt(dot1RadioIfIndex) - 1).toString()
// get mac as 6 last digits converted dec -> hex and joined with ':'
var MAC = ""
var MACDigitHex
for (j = 0; j < 6; j++) {
MACDigitDec = OID.pop();
MACDigitHex = parseInt(MACDigitDec).toString(16);
MAC = MACDigitHex + " " + MAC
}
records[i]['{#MAC}'] = MAC.trim().split(" ").join(":")
// SSID. The first octet is length, others are ASCII characters
SSID = ""
ssidLength = OID.shift();
for (j = 0; j < ssidLength; j++) {
SSID += String.fromCharCode(parseInt(OID[j]));
}
records[i]['{#SSID}'] = SSID
}
return JSON.stringify(records);
Идея в том что бы добавить поля построенные на основе SNMPINDEX в Json, и в дальнейшем они будут доступны при создании элементов данных
В результате из исходного JSON получаю такой
[
{
"{#SNMPINDEX}": "1.3.52.53.48.0.8.202.43.1.36",
"{#S}": "-62",
"{#DOT1RADIO_IFINDEX}": "1",
"{#DOT1RADIO_IFNAME}": "Dot11Radio0",
"{#MAC}": "0:8:ca:2b:1:24",
"{#SSID}": "450"
},
{
"{#SNMPINDEX}": "2.3.52.53.48.164.69.25.90.239.72",
"{#S}": "-79",
"{#DOT1RADIO_IFINDEX}": "2",
"{#DOT1RADIO_IFNAME}": "Dot11Radio1",
"{#MAC}": "a4:45:19:5a:ef:48",
"{#SSID}": "450"
}
]
который уже содержит статическую информацию о клиенте и который можно использовать для создания элеметов данных
Прототпипы элементов данных
Формируем имя и ключ на основе данных из Json, например
Name cDot11ClientSignalStrength [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]
где для кажого клиента будет создан отдельный элемент данных,
при этом используются три уникальных значения.
Клиент с тем же маком но подключившись в другом диапазоне (другой интерфейс) рассматривается как другой клиент даже если используется один SSID для разных частот)
Готовый Темплейт
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
<version>5.0</version>
<date>2022-08-21T13:15:45Z</date>
<groups>
<group>
<name>Templates/Modules</name>
</group>
</groups>
<templates>
<template>
<template>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</template>
<name>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</name>
<groups>
<group>
<name>Templates/Modules</name>
</group>
</groups>
<applications>
<application>
<name>cDot11ClientBytes</name>
</application>
<application>
<name>cDot11ClientErrors</name>
</application>
<application>
<name>cDot11ClientPackets</name>
</application>
<application>
<name>cDot11Clients</name>
</application>
<application>
<name>cDot11ClientSignal</name>
</application>
</applications>
<discovery_rules>
<discovery_rule>
<name>cDot11ActiveWirelessClientsCount</name>
<type>SNMP_AGENT</type>
<snmp_oid>discovery[{#CLIENTSCOUNT},1.3.6.1.4.1.9.9.273.1.1.2.1.1]</snmp_oid>
<key>cDot11ActiveWirelessClientsCount</key>
<lifetime>300d</lifetime>
<item_prototypes>
<item_prototype>
<name>cDot11ActiveWirelessClientsCount [ {#DOT1RADIO_IFNAME} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>1.3.6.1.4.1.9.9.273.1.1.2.1.1.{#SNMPINDEX}</snmp_oid>
<key>cDot11ActiveWirelessClientsCount[{#DOT1RADIO_IFNAME}]</key>
<units>Devices</units>
<applications>
<application>
<name>cDot11Clients</name>
</application>
</applications>
</item_prototype>
</item_prototypes>
<graph_prototypes>
<graph_prototype>
<name>cDot11ActiveWirelessClientsCoun [ {#DOT1RADIO_IFNAME} ]</name>
<graph_items>
<graph_item>
<sortorder>1</sortorder>
<color>1A7C11</color>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ActiveWirelessClientsCount[{#DOT1RADIO_IFNAME}]</key>
</item>
</graph_item>
</graph_items>
</graph_prototype>
</graph_prototypes>
<preprocessing>
<step>
<type>JAVASCRIPT</type>
<params>Zabbix.Log(3, value)
var records = JSON.parse(value);
for (i = 0; i < records.length; i++) {
var dot1RadioIfIndex = records[i]["{#SNMPINDEX}"]
records[i]['{#DOT1RADIO_IFINDEX}'] = dot1RadioIfIndex
records[i]['{#DOT1RADIO_IFNAME}'] = "Dot11Radio" + (parseInt(dot1RadioIfIndex) - 1).toString()
}
Zabbix.Log(3, JSON.stringify(records))
return JSON.stringify(records);</params>
</step>
</preprocessing>
</discovery_rule>
<discovery_rule>
<name>CISCO-DOT11-ASSOCIATION-MIB</name>
<type>SNMP_AGENT</type>
<snmp_oid>discovery[{#S},1.3.6.1.4.1.9.9.273.1.3.1.1.3]</snmp_oid>
<key>CISCO-DOT11-ASSOCIATION-MIB</key>
<lifetime>365d</lifetime>
<item_prototypes>
<item_prototype>
<name>07 cDot11ClientBytesReceived [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.7.{#SNMPINDEX}</snmp_oid>
<key>cDot11ClientBytesReceived[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
<units>bytes/s</units>
<description>cDot11ClientBytesReceived OBJECT-TYPE
SYNTAX Counter32
UNITS "byte"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The number of bytes received from this client."
::= { cDot11ClientStatisticEntry 7 }</description>
<applications>
<application>
<name>cDot11ClientBytes</name>
</application>
</applications>
<preprocessing>
<step>
<type>CHANGE_PER_SECOND</type>
<params/>
</step>
</preprocessing>
</item_prototype>
<item_prototype>
<name>09 cDot11ClientBytesSent [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.9.{#SNMPINDEX}</snmp_oid>
<key>cDot11ClientBytesSent[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
<units>bytes/s</units>
<description>cDot11ClientBytesSent OBJECT-TYPE
SYNTAX Counter32
UNITS "byte"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The number of bytes sent to this client."
::= { cDot11ClientStatisticEntry 9 }</description>
<applications>
<application>
<name>cDot11ClientBytes</name>
</application>
</applications>
<preprocessing>
<step>
<type>CHANGE_PER_SECOND</type>
<params/>
</step>
</preprocessing>
</item_prototype>
<item_prototype>
<name>10 cDot11ClientDuplicates [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.10.{#SNMPINDEX}</snmp_oid>
<key>cDot11ClientDuplicates[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
<units>pps</units>
<description>cDot11ClientDuplicates OBJECT-TYPE
SYNTAX Counter32
UNITS "packet"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"This counter increments when a packet for this
client is received and the Sequence Control field
in the packet header indicates the packet is a
duplicate."
::= { cDot11ClientStatisticEntry 10 }</description>
<applications>
<application>
<name>cDot11ClientErrors</name>
</application>
</applications>
<preprocessing>
<step>
<type>CHANGE_PER_SECOND</type>
<params/>
</step>
</preprocessing>
</item_prototype>
<item_prototype>
<name>14 cDot11ClientMicErrors [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.14.{#SNMPINDEX}</snmp_oid>
<key>cDot11ClientMicErrors[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
<units>pps</units>
<description>cDot11ClientMicErrors OBJECT-TYPE
SYNTAX Counter32
UNITS "error"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"This is the number of MIC errors for this client."
::= { cDot11ClientStatisticEntry 14 }</description>
<applications>
<application>
<name>cDot11ClientErrors</name>
</application>
</applications>
<preprocessing>
<step>
<type>CHANGE_PER_SECOND</type>
<params/>
</step>
</preprocessing>
</item_prototype>
<item_prototype>
<name>15 cDot11ClientMicMissingFrames [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.15.{#SNMPINDEX}</snmp_oid>
<key>cDot11ClientMicMissingFrames[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
<units>pps</units>
<description>cDot11ClientMicMissingFrames OBJECT-TYPE
SYNTAX Counter32
UNITS "packet"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"This is the number of missing MIC packets for
this client.".
::= { cDot11ClientStatisticEntry 15 }</description>
<applications>
<application>
<name>cDot11ClientErrors</name>
</application>
</applications>
<preprocessing>
<step>
<type>CHANGE_PER_SECOND</type>
<params/>
</step>
</preprocessing>
</item_prototype>
<item_prototype>
<name>12 cDot11ClientMsduFails [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.12.{#SNMPINDEX}</snmp_oid>
<key>cDot11ClientMsduFails[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
<units>pps</units>
<description>cDot11ClientMsduFails OBJECT-TYPE
SYNTAX Counter32
UNITS "packet"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"This counter increments when an MSDU is not
transmitted successfully for this client due to the
number of transmit attempts exceeding some limit.
::= { cDot11ClientStatisticEntry 12 }</description>
<applications>
<application>
<name>cDot11ClientErrors</name>
</application>
</applications>
<preprocessing>
<step>
<type>CHANGE_PER_SECOND</type>
<params/>
</step>
</preprocessing>
</item_prototype>
<item_prototype>
<name>11 cDot11ClientMsduRetries [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.11.{#SNMPINDEX}</snmp_oid>
<key>cDot11ClientMsduRetries[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
<units>pps</units>
<description>cDot11ClientMsduRetries OBJECT-TYPE
SYNTAX Counter32
UNITS "packet"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"This counter increments when an MSDU is successfully
transmitted after one or more retransmissions for this
client."
::= { cDot11ClientStatisticEntry 11 }</description>
<applications>
<application>
<name>cDot11ClientErrors</name>
</application>
</applications>
<preprocessing>
<step>
<type>CHANGE_PER_SECOND</type>
<params/>
</step>
</preprocessing>
</item_prototype>
<item_prototype>
<name>06 cDot11ClientPacketsReceived [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.6.{#SNMPINDEX}</snmp_oid>
<key>cDot11ClientPacketsReceived[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
<units>pps</units>
<description>cDot11ClientPacketsReceived OBJECT-TYPE
SYNTAX Counter32
UNITS "packet"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The number of packets received from this client."
::= { cDot11ClientStatisticEntry 6 }</description>
<applications>
<application>
<name>cDot11ClientPackets</name>
</application>
</applications>
<preprocessing>
<step>
<type>CHANGE_PER_SECOND</type>
<params/>
</step>
</preprocessing>
</item_prototype>
<item_prototype>
<name>08 cDot11ClientPacketsSent [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.8.{#SNMPINDEX}</snmp_oid>
<key>cDot11ClientPacketsSent[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
<units>pps</units>
<description>cDot11ClientPacketsSent OBJECT-TYPE
SYNTAX Counter32
UNITS "packet"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The number of packets sent to this client.".
::= { cDot11ClientStatisticEntry 8 }</description>
<applications>
<application>
<name>cDot11ClientPackets</name>
</application>
</applications>
<preprocessing>
<step>
<type>CHANGE_PER_SECOND</type>
<params/>
</step>
</preprocessing>
</item_prototype>
<item_prototype>
<name>03 cDot11ClientSignalStrength [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.3.{#SNMPINDEX}</snmp_oid>
<key>cDot11ClientSignalStrength[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
<value_type>FLOAT</value_type>
<units>dBm</units>
<description>cDot11ClientSignalStrength OBJECT-TYPE
SYNTAX Integer32 (-100..0)
UNITS "dBm"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"This is a device-dependent measure of the signal
strength of the most recently received packet from.
this client. It may be normalized or unnormalized.".
::= { cDot11ClientStatisticEntry 3 }</description>
<applications>
<application>
<name>cDot11ClientSignal</name>
</application>
</applications>
</item_prototype>
<item_prototype>
<name>04 cDot11ClientSigQuality [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.4.{#SNMPINDEX}</snmp_oid>
<key>cDot11ClientSigQuality[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
<units>%</units>
<description>cDot11ClientSigQuality OBJECT-TYPE
SYNTAX Unsigned32 (0..100)
UNITS "percentage"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"This is a device-dependent measure of the signal
quality of the most recently received packet from.
this client.".
::= { cDot11ClientStatisticEntry 4 }</description>
<applications>
<application>
<name>cDot11ClientSignal</name>
</application>
</applications>
</item_prototype>
<item_prototype>
<name>02 cDot11ClientUpTime [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<type>SNMP_AGENT</type>
<snmp_oid>.1.3.6.1.4.1.9.9.273.1.3.1.1.2.{#SNMPINDEX}</snmp_oid>
<key>cDot11ClientUpTime[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
<units>s</units>
<description>cDot11ClientUpTime OBJECT-TYPE
SYNTAX Unsigned32
UNITS "second"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The time in seconds that this client has been
associated with this device."
::= { cDot11ClientStatisticEntry 2 }</description>
<applications>
<application>
<name>cDot11Clients</name>
</application>
</applications>
</item_prototype>
</item_prototypes>
<graph_prototypes>
<graph_prototype>
<name>cDot11ClientBytes [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<graph_items>
<graph_item>
<sortorder>1</sortorder>
<color>1A7C11</color>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ClientBytesReceived[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>2</sortorder>
<color>F63100</color>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ClientBytesSent[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
</item>
</graph_item>
</graph_items>
</graph_prototype>
<graph_prototype>
<name>cDot11ClientErrors [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<graph_items>
<graph_item>
<sortorder>1</sortorder>
<color>1A7C11</color>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ClientDuplicates[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>2</sortorder>
<color>F63100</color>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ClientMsduRetries[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>3</sortorder>
<color>2774A4</color>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ClientMsduFails[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>4</sortorder>
<color>A54F10</color>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ClientMicErrors[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>5</sortorder>
<color>FC6EA3</color>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ClientMicMissingFrames[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
</item>
</graph_item>
</graph_items>
</graph_prototype>
<graph_prototype>
<name>cDot11ClientPackets[ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<graph_items>
<graph_item>
<sortorder>1</sortorder>
<color>1A7C11</color>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ClientPacketsReceived[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>2</sortorder>
<color>F63100</color>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ClientPacketsSent[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
</item>
</graph_item>
</graph_items>
</graph_prototype>
<graph_prototype>
<name>cDot11ClientSignal [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<graph_items>
<graph_item>
<sortorder>1</sortorder>
<color>1A7C11</color>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ClientSignalStrength[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>2</sortorder>
<color>F63100</color>
<yaxisside>RIGHT</yaxisside>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ClientSigQuality[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
</item>
</graph_item>
</graph_items>
</graph_prototype>
<graph_prototype>
<name>cDot11ClientUpTime [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<graph_items>
<graph_item>
<sortorder>1</sortorder>
<drawtype>FILLED_REGION</drawtype>
<color>1A7C11</color>
<item>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
<key>cDot11ClientUpTime[{#MAC}@{#DOT1RADIO_IFNAME}:{#SSID}]</key>
</item>
</graph_item>
</graph_items>
</graph_prototype>
</graph_prototypes>
<preprocessing>
<step>
<type>JAVASCRIPT</type>
<params>//debugPrefix = "TESTING\n"
//Zabbix.Log(3, "------------------------")
//Zabbix.Log(3, debugPrefix + "this is a log entry written with 'Warning' log level")
//Zabbix.Log(3, debugPrefix + value)
//Zabbix.Log(3, "------------------------")
var records = JSON.parse(value);
for (i = 0; i < records.length; i++) {
var OID = records[i]["{#SNMPINDEX}"].split('.')
// IFINDEX AND IFNAME
var dot1RadioIfIndex = OID.shift();
records[i]['{#DOT1RADIO_IFINDEX}'] = dot1RadioIfIndex
records[i]['{#DOT1RADIO_IFNAME}'] = "Dot11Radio" + (parseInt(dot1RadioIfIndex) - 1).toString()
// get mac as 6 last digits converted dec -> hex and joined with ':'
var MAC = ""
var MACDigitHex
for (j = 0; j < 6; j++) {
MACDigitDec = OID.pop();
MACDigitHex = parseInt(MACDigitDec).toString(16);
MAC = MACDigitHex + " " + MAC
}
records[i]['{#MAC}'] = MAC.trim().split(" ").join(":")
// SSID. The first octet is length, others are ASCII characters
SSID = ""
ssidLength = OID.shift();
for (j = 0; j < ssidLength; j++) {
SSID += String.fromCharCode(parseInt(OID[j]));
}
records[i]['{#SSID}'] = SSID
}
//Zabbix.Log(3, "------------------------")
Zabbix.Log(3, JSON.stringify(records))
return JSON.stringify(records);
//return value
</params>
</step>
</preprocessing>
</discovery_rule>
</discovery_rules>
<screens>
<screen>
<name>cDot11ActiveWirelessClientsBytesRxTx</name>
<hsize>1</hsize>
<vsize>1</vsize>
<screen_items>
<screen_item>
<resourcetype>20</resourcetype>
<style>0</style>
<resource>
<name>cDot11ClientBytes [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
</resource>
<width>500</width>
<height>200</height>
<x>0</x>
<y>0</y>
<colspan>1</colspan>
<rowspan>1</rowspan>
<elements>0</elements>
<valign>0</valign>
<halign>0</halign>
<dynamic>0</dynamic>
<sort_triggers>0</sort_triggers>
<url/>
<application/>
<max_columns>3</max_columns>
</screen_item>
</screen_items>
</screen>
<screen>
<name>cDot11ActiveWirelessClientsCount</name>
<hsize>1</hsize>
<vsize>1</vsize>
<screen_items>
<screen_item>
<resourcetype>20</resourcetype>
<style>0</style>
<resource>
<name>cDot11ActiveWirelessClientsCoun [ {#DOT1RADIO_IFNAME} ]</name>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
</resource>
<width>800</width>
<height>300</height>
<x>0</x>
<y>0</y>
<colspan>1</colspan>
<rowspan>1</rowspan>
<elements>0</elements>
<valign>0</valign>
<halign>0</halign>
<dynamic>0</dynamic>
<sort_triggers>0</sort_triggers>
<url/>
<application/>
<max_columns>3</max_columns>
</screen_item>
</screen_items>
</screen>
<screen>
<name>cDot11ActiveWirelessClientsSignalLevels</name>
<hsize>1</hsize>
<vsize>1</vsize>
<screen_items>
<screen_item>
<resourcetype>20</resourcetype>
<style>0</style>
<resource>
<name>cDot11ClientSignal [ {#MAC}@{#DOT1RADIO_IFNAME}:{#SSID} ]</name>
<host>Template Module Cisco CISCO-DOT11-ASSOCIATION-MIB</host>
</resource>
<width>500</width>
<height>200</height>
<x>0</x>
<y>0</y>
<colspan>1</colspan>
<rowspan>1</rowspan>
<elements>0</elements>
<valign>0</valign>
<halign>0</halign>
<dynamic>0</dynamic>
<sort_triggers>0</sort_triggers>
<url/>
<application/>
<max_columns>3</max_columns>
</screen_item>
</screen_items>
</screen>
</screens>
</template>
</templates>
</zabbix_export>