2017-05-29 283 views
0

我試圖從gosnmp包返回的SNMP PDU獲取OctetString值。即使是字節也足夠了。gosnmp從SNMP PDU獲取八位字節

這裏是我的代碼:

package snmp_abstract 

import (
    "github.com/soniah/gosnmp" 
    "time" 
    "log" 
    "os" 
    "strings" 
) 

type Switch struct { 
    Hostname string 
    Connection gosnmp.GoSNMP 
} 


var ConnectionParams = &gosnmp.GoSNMP{ 
    Target: "", 
    Port: 161, 
    Community: "community", 
    Version: gosnmp.Version2c, 
    Timeout: time.Duration(5) * time.Second, 
    Logger: log.New(os.Stdout, "", 0), 
} 

type Mibs struct { 
    VtpVlanState, 
    Dot1dBasePortIfIndex string 
} 

var Default = &Mibs{ 
    VtpVlanState: "1.3.6.1.4.1.9.9.46.1.3.1.1.2", 
    Dot1dBasePortIfIndex: "1.3.6.1.2.1.17.1.4.1.2", 
} 


func SNMPGet(conn *gosnmp.GoSNMP, host string, mib []string) { 
    conn.Target = host 
    log.Println(conn) 
    err := conn.Connect() 
    if err != nil { 
     log.Printf("Unable to connect to %s\n", host) 
    } 
    defer conn.Conn.Close() 
    res, err := conn.Get(mib) 
    if err != nil { 
     log.Println("GET error") 
     log.Print(err) 
    } 
    log.Println(res) 
} 


func SNMPWalk(conn *gosnmp.GoSNMP, host string, mib string) []gosnmp.SnmpPDU { 
    conn.Target = host 
    log.Println(conn) 
    err := conn.Connect() 
    if err != nil { 
     log.Printf("Unable to connect to %s\n", host) 
    } 
    defer conn.Conn.Close() 
    res, err := conn.BulkWalkAll(mib) 
    if err != nil { 
     log.Println("GET error") 
     log.Print(err) 
    } 
    return res 
} 

func (sw *Switch) Vlans() []string { 

    res := SNMPWalk(&sw.Connection, sw.Hostname, Default.VtpVlanState) 
    var vlans = make([]string, len(res)) 
    for i, vlan := range res { 
     oidSlice := strings.Split(vlan.Name, ".") 
     v := oidSlice[len(oidSlice)-1] 
     vlans[i] = v 
    } 
    return vlans 
} 

func (sw *Switch) MapBPIIfindex(vlan string) { 
    log.Println(vlan) 
    s := *sw 
    s.Connection.Community += "@" + vlan 
    log.Println(s.Connection.Community) 
    res := SNMPWalk(&s.Connection, s.Hostname, Default.Dot1dBasePortIfIndex) 
    for _, p := range res { 
     log.Println(p.Name) 
     log.Println(p.Value) 
    } 
} 

當我使用MapBPIIfindex方法得到以下的輸出:

OID: [.1.3.6.1.2.1.31.1.1.1.1.10001] 
[decodeValue: type is OctetString] 
decodeValue: value is []interface {}{[]uint8{0x46, 0x61, 0x30, 0x2f, 0x31}} 

現在,這應該包含一個OctetString。 uint8字節應解碼爲Fa0/1,但我無法做到這一點。

當我改變log.Println(p.Value)log.Println(p.Value.([]uint8)),我得到以下錯誤:

2017/05/29 12:54:59 .1.3.6.1.2.1.17.1.4.1.2 
panic: interface conversion: interface {} is nil, not []uint8 

我怎樣才能得到這個值?文檔不太清楚。

回答