PHP 7.2.0 Release Candidate 4 Released

Класс SNMP

(PHP 5 >= 5.4.0, PHP 7)

Введение

Представляет сессию SNMP.

Обзор классов

SNMP {
/* Свойства */
public int $max_oids ;
public int $valueretrieval ;
public bool $quick_print ;
public bool $enum_print ;
public int $oid_output_format ;
public bool $oid_increasing_check ;
public int $exceptions_enabled ;
public array $info ;
/* Методы */
public __construct ( int $version , string $hostname , string $community [, int $timeout = 1000000 [, int $retries = 5 ]] )
public bool close ( void )
public mixed get ( mixed $object_id [, bool $preserve_keys = false ] )
public int getErrno ( void )
public string getError ( void )
public mixed getnext ( mixed $object_id )
public bool set ( mixed $object_id , mixed $type , mixed $value )
public bool setSecurity ( string $sec_level [, string $auth_protocol = [, string $auth_passphrase = [, string $priv_protocol = [, string $priv_passphrase = [, string $contextName = [, string $contextEngineID = ]]]]]] )
public array walk ( string $object_id [, bool $suffix_as_key = FALSE [, int $max_repetitions [, int $non_repeaters ]]] )
/* Константы */
const integer ERRNO_NOERROR = 0 ;
const integer ERRNO_GENERIC = 2 ;
const integer ERRNO_TIMEOUT = 4 ;
const integer ERRNO_ERROR_IN_REPLY = 8 ;
const integer ERRNO_OID_NOT_INCREASING = 16 ;
const integer ERRNO_OID_PARSING_ERROR = 32 ;
const integer ERRNO_MULTIPLE_SET_QUERIES = 64 ;
const integer ERRNO_ANY = 126 ;
const integer VERSION_1 = 0 ;
const integer VERSION_2C = 1 ;
const integer VERSION_2c = 1 ;
const integer VERSION_3 = 3 ;
}

Свойства

max_oids

Максимальный OID для запросов GET/SET/GETBULK

valueretrieval

Контролирует способ, как будут возвращаться значения SNMP

SNMP_VALUE_LIBRARYВозвращаемые значения будут такики, как будто возвращены библиотекой Net-SNMP.
SNMP_VALUE_PLAINВозвращаемые значения будут простыми, без подсказок типов SNMP.
SNMP_VALUE_OBJECT Возвращаемые значения будут объектами со свойствами "value" и "type", где "type" будет содержать одну из констант: SNMP_OCTET_STR, SNMP_COUNTER и т.д., а "value" будет зависеть от того, установлено SNMP_VALUE_LIBRARY или SNMP_VALUE_PLAIN.
quick_print

Значение quick_print в библиотеке NET-SNMP

Устанавливает значение quick_print в библиотеке NET-SNMP. если задано как (1), то библиотека SNMP будет возвращать значения 'quick printed'. Это значит, что будут напечатаны только значения. Если quick_print не разрешен (по умолчанию), библиотека UCD SNMP будет печатать дополнительную информацию, включая тип значения (то есть IpAddress или OID). Дополнительно, если quick_print не разрешен, библиотека будет печатать шестнадцатеричные значения для всех строк короче четырех символов.

enum_print

Контролирует способ, которым будут печататься значения перечислений

Параметр переключает поведение walk/get и т.д., чтобы они автоматически смотрели значения перечислений в MIB и возвращали их вместе с понятным человеку текстом.

oid_output_format

Контролирует формат вывода OID

OID-представление .1.3.6.1.2.1.1.3.0 для различных значений oid_output_format
SNMP_OID_OUTPUT_FULL.iso.org.dod.internet.mgmt.mib-2.system.sysUpTime.sysUpTimeInstance
SNMP_OID_OUTPUT_NUMERIC.1.3.6.1.2.1.1.3.0
SNMP_OID_OUTPUT_MODULEDISMAN-EVENT-MIB::sysUpTimeInstance
SNMP_OID_OUTPUT_SUFFIXsysUpTimeInstance
SNMP_OID_OUTPUT_UCDsystem.sysUpTime.sysUpTimeInstance
SNMP_OID_OUTPUT_NONEUndefined
oid_increasing_check

Контролирует запрет на проверку увеличения OID при обходе дерева OID

Некоторые агенты SNMP известны тем, что возвращают OID не по порядку, но все равно завершают проход. Другие агенты, возвращают OID не по порядку и могут вызвать бесконечное зацикливание SNMP::walk(), пока не будет исчерпана вся память. Библиотека PHP SNMP по умолчанию предпринимает проверку увеличения OID и прекращает обход дерева, если определяет возможную закольцовку, выдавая соответствующее предупреждение. Установите oid_increasing_check в значение FALSE для запрета этой проверки.

exceptions_enabled

Контролирует, в каких случаях будут бросаться исключения SNMPException вместо предупреждений. Используйте побитовое ИЛИ из констант SNMP::ERRNO_*. По умолчанию SNMP исключений не бросает.

info

Свойство доступное только для чтения, содержащее конфигурацию удаленного агента: имя хоста, порт, таймаут по умолчанию, количество повторов по умолчанию

Предопределенные константы

Типы ошибок SNMP

SNMP::ERRNO_NOERROR

Ошибки SNMP отсутствуют.

SNMP::ERRNO_GENERIC

Общая ошибка SNMP.

SNMP::ERRNO_TIMEOUT

Истек таймаут запроса к SNMP-агенту.

SNMP::ERRNO_ERROR_IN_REPLY

SNMP-агент вернул ошибку в ответ.

SNMP::ERRNO_OID_NOT_INCREASING

SNMP-агент обнаружил возможную закольцовку из-за неувеличение OID при выполнении команд (BULK)WALK. Говорит нам, что удаленный SNMP-агент фиктивный.

SNMP::ERRNO_OID_PARSING_ERROR

Библиотека не смогла разобрать OID (и/или тип для команды SET). Запросов не было.

SNMP::ERRNO_MULTIPLE_SET_QUERIES

Библиотека используем множественные запросы для операции SET. Это означает, что операция должна быть произведена в нетранзакционном режима и следующий блок может завершиться с ошибкой если тип случится ошибка типа или значения.

SNMP::ERRNO_ANY

Все коды SNMP::ERRNO_* объединенные побитовым ИЛИ.

Версии протокола SNMP

SNMP::VERSION_1

SNMP::VERSION_2C, SNMP::VERSION_2c

SNMP::VERSION_3

Содержание

add a note add a note

User Contributed Notes 1 note

up
0
madjev1990 at gmail dot com
1 year ago
Part of my diploma thesis was to create web interface to command device via SNMP. So I create my own level of abstraction over SNMP class:

<?php

/**
* Snmp library which add one level of abstraction to snmp native library.
* It adds functionality to work with module PicoIP.With this library you can:
* 1.Activate/deactive defined pin;
* 2.Get status of all pins.
*
* When make an instance you should pass to the constructor key word which will
* make the library create an object with necessary properetis and access permissions.
*
* Private properties set some of configurations:
* Host is IP address of the divece which we will command.
* Two passwords are set for reading and writing.
* Version of snmp protocol that we will use is version 1.
*
* @author Radoslav Madjev
* @year 2016
* @version 1.0 beta
*
*
*/
class snmp_lib {

    private
$snmpInstance;
    private
$VERSION = SNMP::VERSION_1;
    private
$HOST = '192.168.0.150';
    private
$passwordRead = '000000000000';
    private
$passwordWrite = 'private';
    private
$releys = array(1 => '1.3.6.1.4.1.19865.1.2.1.1.0',
       
2 => '1.3.6.1.4.1.19865.1.2.1.2.0');
    private
$allPorts = array('3' => '1.3.6.1.4.1.19865.1.2.1.33.0',
       
'5' => '1.3.6.1.4.1.19865.1.2.2.33.0');

   
/**
     * Create instance of SNMP native class, based on actions that we will
     * perform.
     *
     * @param string $action
     */
   
public function __construct($action) {
        if (
in_array($action, array('read', 'write'))) {
            if (
strcmp($action, 'read') === 0) {
               
$this->_read();
            } else {
               
$this->_write();
            }
        }
    }

   
/**
     * Create instance with reading permissions.
     */
   
private function _read() {
       
$this->snmpInstance = new SNMP($this->VERSION, $this->HOST, $this->passwordRead);
    }

   
/**
     * Create instance with writing permissions.
     */
   
private function _write() {
       
$this->snmpInstance = new SNMP($this->VERSION, $this->HOST, $this->passwordWrite);
    }

   
/**
     * Close snmp session.
     *
     * @return boolean
     */
   
public function closeSession() {
        return
$this->snmpInstance->close();
    }

   
/**
     * Set integer 1 as value of defined pin.
     */
   
public function activate($relay) {
       
$this->snmpInstance->set($this->releys[$relay], 'i', '1');
    }

   
/**
     * Set integer 0 as value of defined pin.
     */
   
public function deactivate($relay) {
       
$this->snmpInstance->set($this->releys[$relay], 'i', '0');
    }

   
/**
     * Get pin status of all ports of the module.
     *
     * @return array
     */
   
public function getAllPortsStatus() {
       
$allPins = array();
        foreach (
$this->allPorts as $number => $port) {
           
//get active pins as 8-bit integer of defined port
           
$getbits = $this->snmpInstance->get($port);
           
$bits = str_replace('INTEGER: ', '', $getbits);
           
//get pins status
           
$pinsStatus = $this->_getActivePins($bits);
           
$allPins[$number] = $pinsStatus;
        }

        return
$allPins;
    }

   
/**
     * Make bitwise operation which will determine,
     * which are active pins.
     *
     * @param int $bits
     * @return array
     */
   
private function _getActivePins($bits) {

       
$bitMapping = array(
           
1 => 1,
           
2 => 2,
           
3 => 4,
           
4 => 8,
           
5 => 16,
           
6 => 32,
           
7 => 64,
           
8 => 128
       
);

       
$pinsStatus = array();

        foreach (
$bitMapping as $int => $bit) {
            if ((
$bits & $bit) == $bit) {
               
$pinsStatus[$int] = true;
                continue;
            }
           
$pinsStatus[$int] = false;
        }

        return
$pinsStatus;
    }

}

?>

I have one module that receive SNMP request and send a command to relays. Also these are example scripts that use this lib:
Turn on script:
<?php
require_once 'snmp_lib.php';

$snmp = new snmp_lib('write');
$snmp->activate($getRelayNumber);
$snmp->closeSession();
?>

Turn off script:
<?php
require_once 'snmp_lib.php';

$snmp = new snmp_lib('write');
$snmp->deactivate($getRelayNumber);
$snmp->closeSession();
?>

Script that get all ports status:
<?php
require_once 'snmp_lib.php';

$snmp = new snmp_lib('read');
$getActive = $snmp->getAllPortsStatus();
?>
To Top