首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个设备的Perl NetSNMP扩展

具有多个设备的Perl NetSNMP扩展
EN

Stack Overflow用户
提问于 2013-01-03 06:28:58
回答 1查看 436关注 0票数 0

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

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

我以前从未使用过snmp,而且我的perl也不是很好,所以如果有任何帮助,我将不胜感激。下面是我的代码:

代码语言:javascript
复制
#!/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 ++;
}
EN

回答 1

Stack Overflow用户

发布于 2013-01-08 04:31:38

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

我怀疑您的问题存在于读取数据文件的过程中,方法是向cat发出命令,而不是打开文件并循环遍历行式内容。

尝试转储@sensors的值。如果它是一个单条目数组,其中唯一的元素包含整个文件,那么只需将@sensors切换为标量。然后将$sensors拆分成一个数组,并对其进行循环。

代码语言:javascript
复制
my $sensors = `read something`
chomp $sensors;
my @sensors = split(/\n/, $sensors);

foreach传感器(@ $line ){ ...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14130259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档