0

いくつかの温度センサーが取り付けられたマシン (Debian ベース) を持っています。1 つのスクリプトから、snmp を介してそれらを照会したいと考えています。1つのセンサーで問題なく動作しますが、別のセンサーを接続すると苦労します.

私がやろうとしているのは、各デバイスをループして、それぞれに 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 ++;
}
4

1 に答える 1

0

エラーや出力はありますか?

あなたの問題は、ファイルを開いて行単位の内容をループするのではなく、 cat にシェルアウトしてデータファイルを読み取ることにあると思われます。

@sensors の値をダンプしてみてください。ファイル全体を含む唯一の要素を持つ単一エントリ配列の場合は、@sensors をスカラーに切り替えるだけです。次に $sensors を配列に分割し、それをループします。

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

foreach $line (@sensors) { ...

于 2013-01-07T20:31:38.350 に答える