Нам недавно пришлось реализовывать «кабельный тестер» на PHP. В Инете нашлась статья, спасибо автору большое, которую я и приведу, прежде чем переходить к кодингу:
В коммутаторы DES-3526 и DES-3550 (возможно DES-3028 и DES-3052) встроен кабельный тестер который позволяет определять (уточнить точность измерений) длину кабеля.
Использование из CLI
Комманда не требует админских полномочий (повторяющиеся строки удалены):
DES3526:user#cable_diag ports 1-24 Command: cable_diag ports 1-24 Perform Cable Diagnostics ... Port Type Link Status Test Result Cable Length (M) ---- ------ ------------- ----------------------------- ---------------- 1 FE Link Down OK - 2 FE Link Down No Cable - ... 10 FE Link Down Pair1 Open at 22 M - Pair2 Open at 22 M 11 FE Link Down Pair1 Open at 25 M - Pair2 Open at 25 M 12 FE Link Down Pair1 Open at 88 M - Pair2 Open at 88 M 14 FE Link Up OK 40 15 FE Link Down Pair1 Open at 18 M - Pair2 Open at 18 M 16 FE Link Up OK 69 18 FE Link Down Pair1 Open at 4 M - Pair2 Open at 4 M 19 FE Link Up OK 34 20 FE Link Down OK - 21 FE Link Up OK 40 22 FE Link Down Pair1 Open at 29 M - Pair2 Open at 29 M 24 FE Link Down Pair1 Open at 22 M - Pair2 Open at 22 M
Возможные значения:
- Pair Open — обрыв на растоянии ХХ метров
- Link Up, длинна ХХ метров
- Link Down, OK — нельзя измерить длинну кабеля (но нагрузка есть)
- Link Down, No Cable — нет кабеля
Описание OID-ов:
1.3.6.1.4.1.171.12.58.1.1.1.2 - swEtherCableDiagPortType OBJECT-TYPE SYNTAX INTEGER { fastEthernet(0), gigaEthernet(1), other(2) }
# snmpwalk -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.2
SNMPv2-SMI::enterprises.171.12.58.1.1.1.2.1 = INTEGER: 0
…
SNMPv2-SMI::enterprises.171.12.58.1.1.1.2.25 = INTEGER: 1
SNMPv2-SMI::enterprises.171.12.58.1.1.1.2.26 = INTEGER: 1
Имеем, порты 1-24 поддерживают нужный функционал. Проверить состояние линков:
1.3.6.1.4.1.171.12.58.1.1.1.3 - swEtherCableDiagLinkStatus OBJECT-TYPE SYNTAX INTEGER { link-down(0), link-up(1), other(2) }
# snmpwalk -v2c -c public 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.3
SNMPv2-SMI::enterprises.171.12.58.1.1.1.3.1 = INTEGER: 0
Все OID с результатом имеют валидные значения только после выполнения теста. Далее — OIDы для состояния пар:
- 1.3.6.1.4.1.171.12.58.1.1.1.4 — cтатус первой пары
- 1.3.6.1.4.1.171.12.58.1.1.1.5 — cтатус второй пары
- 1.3.6.1.4.1.171.12.58.1.1.1.6 — cтатус третьей пары
- 1.3.6.1.4.1.171.12.58.1.1.1.7 — cтатус четвертой пары
Возможные значения:
- ok(0)
- open(1)
- short(2)
- open-short(3)
- crosstalk(4)
- unknown(5)
- count(6)
- no-cable(7)
- other(8)
И, соответственно, длины пар: 1.3.6.1.4.1.171.12.58.1.1.1.8 — длинна первой пары 1.3.6.1.4.1.171.12.58.1.1.1.11 — длинна четвертой пары OID, предназначенный для запуска теста:
1.3.6.1.4.1.171.12.58.1.1.1.12
Это единственный OID предназначенный как для чтения так и для записи.
- action(1)
- processing(2)
- other(3)
Тестирование
Работа с кабельным тестером в целом совершенно стандартна (что есть несомненный плюс)
Общий подход:
- Запустить тест (запись нужного значения в соответвующий OID
- Дождаться завершения (проверить стением OID со статусом)
- Считать интересующие значения.
Попробую проверить работу этой ф-и на портах с различными длинами и состоянием кабеля.
Линк есть, работающий абонент:
DES3526:user#cable_diag ports 21 Command: cable_diag ports 21 Perform Cable Diagnostics ... Port Type Link Status Test Result Cable Length (M) ---- ------ ------------- ----------------------------- ---------------- 21 FE Link Up OK 40
Запустить тест:
# snmpset -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.12.21 i 1
SNMPv2-SMI::enterprises.171.12.58.1.1.1.12.21 = INTEGER: 1
Проверить что он завершился (cтатус != 2):
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.12.21
SNMPv2-SMI::enterprises.171.12.58.1.1.1.12.21 = INTEGER: 3
Проверить состояние линка (1 — есть линк)
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.3.21
SNMPv2-SMI::enterprises.171.12.58.1.1.1.3.21 = INTEGER: 1
Проверить состояние 1-й пары (0 — ОК)
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.4.21
SNMPv2-SMI::enterprises.171.12.58.1.1.1.4.21 = INTEGER: 0
Проверить состояние 2-й пары (0 — ОК)
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.5.21
SNMPv2-SMI::enterprises.171.12.58.1.1.1.5.21 = INTEGER: 0
Проверить состояние 3-й пары (8 — Нет кабеля, что естественно для 100-мбитного порта)
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.6.21
SNMPv2-SMI::enterprises.171.12.58.1.1.1.6.21 = INTEGER: 8
Проверить состояние 4-й пары (8 — Нет кабеля, что естественно для 100-мбитного порта)
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.7.21
SNMPv2-SMI::enterprises.171.12.58.1.1.1.7.21 = INTEGER: 8
Определить длинну 1-й пары (40 метров) # snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.8.21
SNMPv2-SMI::enterprises.171.12.58.1.1.1.9.21 = INTEGER: 40
Определить длинну 2-й пары (40 метров, что логично, т.к. пары одинаковые)
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.9.21
SNMPv2-SMI::enterprises.171.12.58.1.1.1.9.21 = INTEGER: 40
Определить длинну 3-й пары (0 метров, фактически — не используется, не включена)
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.10.21
SNMPv2-SMI::enterprises.171.12.58.1.1.1.10.21 = INTEGER: 0
Определить длинну 4-й пары (0 метров, фактически — не используется, не включена)
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.11.21
SNMPv2-SMI::enterprises.171.12.58.1.1.1.11.21 = INTEGER: 0
Кабель не подключен:
DES3526:user#cable_diag ports 2 Command: cable_diag ports 2 Perform Cable Diagnostics ... Port Type Link Status Test Result Cable Length (M) ---- ------ ------------- ----------------------------- ---------------- 2 FE Link Down No Cable -
Запустить тест, убедиться что при запросе ответе — «нет кабеля» (8)
# snmpset -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.12.2 i 1
SNMPv2-SMI::enterprises.171.12.58.1.1.1.12.2 = INTEGER: 1
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.4.2
SNMPv2-SMI::enterprises.171.12.58.1.1.1.6.2 = INTEGER: 8
Кабель есть, отключен
Подключаю 2-х метровый патч-корд к коммутатору (второй конец висит в воздухе):
DES3526:user#cable_diag ports 2 Command: cable_diag ports 2 Perform Cable Diagnostics ... Port Type Link Status Test Result Cable Length (M) ---- ------ ------------- ----------------------------- ---------------- 2 FE Link Down Pair1 Open at 3 M - Pair2 Open at 2 M
# snmpset -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.12.2 i 1
SNMPv2-SMI::enterprises.171.12.58.1.1.1.12.2 = INTEGER: 1
Кабель имеет статус open:
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.4.2
SNMPv2-SMI::enterprises.171.12.58.1.1.1.4.2 = INTEGER: 1
«Обрыв» (в реальности — просто конец кабеля) на расстоянии 3 метра по одной и 2 метра по другой паре.
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.8.2
SNMPv2-SMI::enterprises.171.12.58.1.1.1.8.2 = INTEGER: 3
# snmpget -v2c -c private 172.16.34.3 1.3.6.1.4.1.171.12.58.1.1.1.9.2
SNMPv2-SMI::enterprises.171.12.58.1.1.1.9.2 = INTEGER: 2
Насколько я могу судить, точности измерения вполне достаточня (плюс-минус метр).
Короткое на нескольких парах Сделал тестовый кабель с «коротким» на первой и третьей парах. Коммутатор показал правильные результаты для используемых пар:
DES3526:user#cable_diag ports 3 Command: cable_diag ports 3 Perform Cable Diagnostics ... Port Type Link Status Test Result Cable Length (M) ---- ------ ------------- ----------------------------- ---------------- 3 FE Link Down Pair1 Short at 3 M - Pair2 Open at 3 M
При проверке через SNMP соответвующих OID результат такой же, останавливаться подробнее нет смысла.
Ссылка на оригинал статьи: http://wiki.sirmax.noname.com.ua/index.php/Dlink_Cable_Tester
Спасибо автору за труд, ну а мы перейдем к реализации этого безобразия на PHP.
PHP
Приведу простой пример, как все это может выглядеть на PHP.
Так как код в блоге выглядит не айс, то выкладываю файликом: http://subnets.ru/saved/dlink_cable_tester.php.txt
В моем рабочем варианте я ессно использую MySQL и все данные о свичах, OID`ах и значениях беру из БД.
З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !
Автор: Николаев Дмитрий (virus (at) subnets.ru)
Похожие статьи:
- Не найдено
art.prof сказал:
актуально))
09.02.2012, 11:46