2017-05-29 282 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 

我怎样才能得到这个值?文档不太清楚。

回答