SNMP 类

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

介绍

表示 SNMP 会话。

类概要

class SNMP {
/* 常量 */
public const int VERSION_1;
public const int VERSION_2c;
public const int VERSION_2C;
public const int VERSION_3;
public const int ERRNO_NOERROR;
public const int ERRNO_ANY;
public const int ERRNO_GENERIC;
public const int ERRNO_TIMEOUT;
/* 属性 */
public readonly array $info;
public ?int $max_oids;
/* 方法 */
public __construct(
    int $version,
    string $hostname,
    string $community,
    int $timeout = -1,
    int $retries = -1
)
public close(): bool
public get(array|string $objectId, bool $preserveKeys = false): mixed
public getErrno(): int
public getError(): string
public getnext(array|string $objectId): mixed
public set(array|string $objectId, array|string $type, array|string $value): bool
public setSecurity(
    string $securityLevel,
    string $authProtocol = "",
    string $authPassphrase = "",
    string $privacyProtocol = "",
    string $privacyPassphrase = "",
    string $contextName = "",
    string $contextEngineId = ""
): bool
public walk(
    array|string $objectId,
    bool $suffixAsKey = false,
    int $maxRepetitions = -1,
    int $nonRepeaters = -1
): array|false
}

属性

max_oids

每个 GET/SET/GETBULK 请求的最大 OID 数

valueretrieval

控制 SNMP 值的返回方法

SNMP_VALUE_LIBRARY返回值将与 Net-SNMP 库返回的值相同。
SNMP_VALUE_PLAIN返回值将是纯值,不包含 SNMP 类型信息。
SNMP_VALUE_OBJECT返回值将是一个包含“value”和“type”属性的对象,其中后者是 SNMP_OCTET_STR、SNMP_COUNTER 等常量之一。 “value”的返回方式取决于设置了哪个 **SNMP_VALUE_LIBRARY** 、 **SNMP_VALUE_PLAIN**
quick_print

NET-SNMP 库中 quick_print 的值

设置 NET-SNMP 库中 quick_print 的值。当设置此值(1)时,SNMP 库将返回“快速打印”的值。这意味着将只打印值。当 quick_print 未启用(默认)时,NET-SNMP 库将打印额外的信息,包括值的类型(例如 IpAddress 或 OID)。此外,如果 quick_print 未启用,库将为所有三个字符或更少的字符串打印额外的十六进制值。

enum_print

控制枚举值打印的方式

参数切换 walk/get 等是否应该自动在 MIB 中查找枚举值并将其与其人类可读的字符串一起返回。

oid_output_format

控制 OID 输出格式

各种 oid_output_format 值的 OID .1.3.6.1.2.1.1.3.0 表示
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_NONE未定义
oid_increasing_check

控制在遍历 OID 树时禁用对递增 OID 的检查

已知某些 SNMP 代理会以乱序返回 OID,但无论如何都可以完成遍历。其他代理返回乱序的 OID,并可能导致 SNMP::walk() 无限循环,直到内存限制达到为止。PHP SNMP 库默认情况下执行 OID 递增检查,并在检测到可能的循环时停止遍历 OID 树,同时发出有关遇到的非递增 OID 的警告。将 oid_increasing_check 设置为 **false** 以禁用此检查。

exceptions_enabled

控制哪些故障会引发 SNMPException 而不是警告。使用按位 OR 的 **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 代理在执行 (BULK)WALK 命令时遇到了 OID 循环报告非递增 OID。这表明远程 SNMP 代理存在缺陷。

SNMP::ERRNO_OID_PARSING_ERROR

库在解析 OID(以及/或者 SET 命令的类型)时失败。没有进行查询。

SNMP::ERRNO_MULTIPLE_SET_QUERIES

库将使用多个查询来执行请求的 SET 操作。这意味着该操作将以非事务方式执行,如果遇到类型或值故障,第二个或后续块可能会失败。

SNMP::ERRNO_ANY

所有 SNMP::ERRNO_* 代码按位 OR。

目录

添加说明

用户贡献说明 2 个说明

swannie at swannie dot net
3 年前
希望这对其他人有所帮助,因为这让我苦恼了两个小时。看起来 valueretrieval 和 enum_print 协同工作的方式是我之前没有预料到的,而且在重新阅读后,可能是设计使然,但我并不确定。如果你无法打印枚举,这可能是原因。

<?php
$snmp
= new SNMP(SNMP::VERSION_2C,'192.168.1.9','test');
$snmp->oid_output_format = SNMP_OID_OUTPUT_SUFFIX;
$snmp->valueretrieval = SNMP_VALUE_PLAIN;
$snmp->enum_print = 0;
echo
$snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
$snmp->enum_print = 1;
echo
$snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
$snmp->quick_print = 1;
echo
$snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
$snmp->valueretrieval = SNMP_VALUE_LIBRARY;
echo
$snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
$snmp->enum_print = 0;
echo
$snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
?>

输出
1
1
1
1
上移
madjev1990 at gmail dot com
8 年前
我的毕业论文的一部分是创建 web 界面来通过 SNMP 命令控制设备。所以我创建了自己的 SNMP 类抽象级别

<?php

/**
* 一个对 SNMP 原生库进行抽象的 SNMP 库。
* 它添加了与 PicoIP 模块交互的功能。使用此库,您可以:
* 1. 激活/禁用定义的引脚;
* 2. 获取所有引脚的状态。
*
* 实例化时,您应该将关键字传递给构造函数,该关键字将
* 使库创建具有必要属性和访问权限的对象。
*
* 私有属性设置了一些配置:
* Host 是我们将要命令的设备的 IP 地址。
* 设置了两个密码用于读写。
* 我们将使用的 SNMP 协议版本是版本 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');

/**
* 根据我们将执行的操作创建 SNMP 原生类实例。
*
* @param string $action
*/
public function __construct($action) {
if (
in_array($action, array('read', 'write'))) {
if (
strcmp($action, 'read') === 0) {
$this->_read();
} else {
$this->_write();
}
}
}

/**
* 创建具有读取权限的实例。
*/
private function _read() {
$this->snmpInstance = new SNMP($this->VERSION, $this->HOST, $this->passwordRead);
}

/**
* 创建具有写入权限的实例。
*/
private function _write() {
$this->snmpInstance = new SNMP($this->VERSION, $this->HOST, $this->passwordWrite);
}

/**
* 关闭 SNMP 会话。
*
* @return boolean
*/
public function closeSession() {
return
$this->snmpInstance->close();
}

/**
* 将整数 1 设置为定义的引脚的值。
*/
public function activate($relay) {
$this->snmpInstance->set($this->releys[$relay], 'i', '1');
}

/**
* 将整数 0 设置为定义的引脚的值。
*/
public function deactivate($relay) {
$this->snmpInstance->set($this->releys[$relay], 'i', '0');
}

/**
* 获取模块所有端口的引脚状态。
*
* @return array
*/
public function getAllPortsStatus() {
$allPins = array();
foreach (
$this->allPorts as $number => $port) {
// 获取定义端口的 8 位整数形式的活动引脚
$getbits = $this->snmpInstance->get($port);
$bits = str_replace('INTEGER: ', '', $getbits);
// 获取引脚状态
$pinsStatus = $this->_getActivePins($bits);
$allPins[$number] = $pinsStatus;
}

return
$allPins;
}

/**
* 执行位运算以确定
* 哪些是活动引脚。
*
* @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;
}

}

?>

我有一个接收 SNMP 请求并向继电器发送命令的模块。以下是一些使用此库的示例脚本
打开脚本
<?php
require_once 'snmp_lib.php';

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

关闭脚本
<?php
require_once 'snmp_lib.php';

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

获取所有端口状态的脚本
<?php
require_once 'snmp_lib.php';

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