2013-01-02 24 views
0

我有一臺機器(基於Debian)連接了一些溫度傳感器,我想通過一個腳本在snmp上查詢它們。我可以使用一個傳感器,但我掙扎時,我插入另一個。具有多個設備的Perl NetSNMP擴展

我想要做的是循環通過每個設備,並給每一個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 ++; 
} 
+0

爲什麼這是downvoted? – beakersoft

回答

0

您是否收到任何錯誤或輸出?

我懷疑你的問題存在於你周圍的閱讀數據文件,通過對貓進行脫殼處理而不是打開文件和循環遍歷行內容。

嘗試傾銷@sensors的值。如果它是單個條目數組,只有包含整個文件的元素,則只需將@sensors切換爲標量即可。然後將$傳感器分成一個數組並循環。

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

的foreach $線(@sensors){ ...