Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个设备的Perl NetSNMP扩展_Perl_Net Snmp - Fatal编程技术网

具有多个设备的Perl NetSNMP扩展

具有多个设备的Perl NetSNMP扩展,perl,net-snmp,Perl,Net Snmp,我有一台机器(基于Debian),上面连接了一些温度传感器,我想通过snmp从一个脚本中查询它们。我可以使用一个传感器正常工作,但当我插入另一个传感器时,我很挣扎 我要做的是循环遍历每个设备,给每个设备一个id,然后使用这个id作为OID的一部分,然后给它一个值 我以前从未使用过snmp,而且我的perl也不是很好,因此非常感谢您的帮助。下面是我的代码: #!/usr/bin/perl use NetSNMP::agent (':all'); use NetSNMP::ASN qw(ASN_O

我有一台机器(基于Debian),上面连接了一些温度传感器,我想通过snmp从一个脚本中查询它们。我可以使用一个传感器正常工作,但当我插入另一个传感器时,我很挣扎

我要做的是循环遍历每个设备,给每个设备一个id,然后使用这个id作为OID的一部分,然后给它一个值

我以前从未使用过snmp,而且我的perl也不是很好,因此非常感谢您的帮助。下面是我的代码:

#!/usr/bin/perl

use NetSNMP::agent (':all');
use NetSNMP::ASN qw(ASN_OCTET_STR ASN_INTEGER);

$BASE_OID=".1.3.6.1.4.1.41050";
$dev_id=1;
$string_value;
$integer_value;

sub pimon_handler {
  my ($handler, $registration_info, $request_info, $requests) = @_;
  my $request;
  my $oid_key;

  for($request = $requests; $request; $request = $request->next()) {

    $oid_key=$BASE_OID . '.' . $dev_id;
    my $oid = $request->getOID();
    if ($request_info->getMode() == MODE_GET) {
      if ($oid == new NetSNMP::OID($oid_key . '.0')) {
        $request->setValue(ASN_OCTET_STR, $string_value);
      }
      elsif ($oid == new NetSNMP::OID($oid_key . '.1')) {
        $request->setValue(ASN_INTEGER, $integer_value);
      }
    } elsif ($request_info->getMode() == MODE_GETNEXT) {
      if ($oid == new NetSNMP::OID($oid_key . '.0')) {
        $request->setOID($oid_key . '.1');
        $request->setValue(ASN_INTEGER, $integer_value);
      }
      elsif ($oid < new NetSNMP::OID($oid_key . '.0')) {
        $request->setOID($oid_key . '.0');
        $request->setValue(ASN_OCTET_STR, $string_value);
      }
    }
  }
}

#location of where we are going to find the 1wire devices
@sensors = `cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves`;
chomp(@sensors);

#loop through the sensors we find
foreach $line(@sensors) {

        #work out the temp we have got. Need to change this for other sensor types
        $output = `cat /sys/bus/w1/devices/$line/w1_slave`;
        $output =~ /t=(?<temp>\d+)/;
        $integer_value = sprintf "%.0f",$+{temp} / 1000;
        $string_value = $line;

        my $agent = new NetSNMP::agent();
        $agent->register("Pimon$looptest", $BASE_OID . '.' . $dev_id,
                 \&pimon_handler);

        print "Dev $dev_id temp $line temp is $integer_value\n";
        $dev_id ++;
}
#/usr/bin/perl
使用NetSNMP::agent(':all');
使用NetSNMP::ASN qw(ASN_八位字节\u STR ASN_整数);
$BASE_OID=“.1.3.6.1.4.1.41050”;
$dev_id=1;
$string_值;
$integer_值;
副皮蒙处理器{
我的($handler,$registration\u info,$request\u info,$requests)=@;
我的$请求;
我的$oid_钥匙;
对于($request=$requests;$request;$request=$request->next()){
$oid\U key=$BASE\U oid..$dev\U id;
我的$oid=$request->getOID();
如果($request\u info->getMode()==MODE\u GET){
如果($oid==new NetSNMP::oid($oid_key.'.0')){
$request->setValue(ASN\u八位字节\u STR,$string\u值);
}
elsif($oid==newnetsnmp::oid($oid_key.'.1')){
$request->setValue(ASN_INTEGER,$INTEGER_value);
}
}elsif($request\u info->getMode()==MODE\u GETNEXT){
如果($oid==new NetSNMP::oid($oid_key.'.0')){
$request->setOID($oid_key..1');
$request->setValue(ASN_INTEGER,$INTEGER_value);
}
elsif($oidsetOID($oid_key..0');
$request->setValue(ASN\u八位字节\u STR,$string\u值);
}
}
}
}
#我们将在哪里找到1wire设备的位置
@传感器=`cat/sys/bus/w1/devices/w1_总线_master1/w1_master_slaves`;
chomp(@传感器);
#通过我们找到的传感器循环
foreach$行(@sensors){
#计算出我们得到的温度。需要更改其他传感器类型的温度
$output=`cat/sys/bus/w1/devices/$line/w1_slave`;
$output=~/t=(?\d+)/;
$integer_value=sprintf“%.0f”,$+{temp}/1000;
$string_value=$line;
my$agent=new NetSNMP::agent();
$agent->register(“Pimon$looptest”、$BASE\u OID...$dev\u id、,
\&皮蒙(汉德勒),;
打印“Dev$Dev\u id temp$line temp为$integer\u值\n”;
$dev_id++;
}

您是否收到任何错误或输出

我怀疑您的问题在于读取数据文件,方法是将数据文件发送到cat,而不是打开文件并循环行内容

尝试转储@sensors的值。如果它是一个单条目数组,只有一个元素包含整个文件,那么只需将@sensors切换为标量。然后将$sensors分割成一个阵列,并在其上循环

my $sensors = `read something`
chomp $sensors;
my @sensors = split(/\n/, $sensors);
foreach$行(@sensors){

为什么这一点被否决了?