2010年1月31日 星期日

C# 使用SNMP

在C#上使用SNMP
且可將OID碼下所有位置列出


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace ConsoleApplication1
{
public class MainSnmP
{
public static void Main()
{
string[] argv = new string[3];
argv[0] = "127.0.0.1";
argv[1] = "public";

argv[2] = "1.3.6.1.2.1.2.2.1.10";
//SimpleSNMP.SiSNMP(argv);
MacAddress.MacAdd(argv);
argv[2] = "1.3.6.1.2.1.2.2.1.16";
MacAddress.MacAdd(argv);

Console.ReadLine();

}
}
public class SimpleSNMP
{
public static void SiSNMP(string[] argv)
{

int commlength, miblength, datatype, datalength, datastart;
int uptime = 0;
string output;
SNMP conn = new SNMP();
byte[] response = new byte[1024];

Console.WriteLine("Device SNMP information:");

// Send sysName SNMP request
response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.5.0");
if (response[0] == 0xff)
{
Console.WriteLine("No response from {0}", argv[0]);
return;
}

// If response, get the community name and MIB lengths
commlength = Convert.ToInt16(response[6]);
miblength = Convert.ToInt16(response[23 + commlength]);

// Extract the MIB data from the SNMP response
datatype = Convert.ToInt16(response[24 + commlength + miblength]);
datalength = Convert.ToInt16(response[25 + commlength + miblength]);
datastart = 26 + commlength + miblength;
output = Encoding.ASCII.GetString(response, datastart, datalength);
Console.WriteLine(" sysName - Datatype: {0}, Value: {1}",
datatype, output);
//----------
// Send a sysLocation SNMP request
response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.6.0");
if (response[0] == 0xff)
{
Console.WriteLine("No response from {0}", argv[0]);
return;
}

// If response, get the community name and MIB lengths
commlength = Convert.ToInt16(response[6]);
miblength = Convert.ToInt16(response[23 + commlength]);

// Extract the MIB data from the SNMP response
datatype = Convert.ToInt16(response[24 + commlength + miblength]);
datalength = Convert.ToInt16(response[25 + commlength + miblength]);
datastart = 26 + commlength + miblength;
output = Encoding.ASCII.GetString(response, datastart, datalength);
Console.WriteLine(" sysLocation - Datatype: {0}, Value: {1}", datatype, output);
//------------
// Send a SysUptime SNMP request
response = conn.get("getnextMIB", argv[0], argv[1], "1.3.6.1.2.1.2.2.1.16.256.3");
if (response[0] == 0xff)
{
Console.WriteLine("No response from {0}", argv[0]);
return;
}

// Get the community and MIB lengths of the response
commlength = Convert.ToInt16(response[6]);
miblength = Convert.ToInt16(response[23 + commlength]);

// Extract the MIB data from the SNMp response
datatype = Convert.ToInt16(response[24 + commlength + miblength]);
datalength = Convert.ToInt16(response[25 + commlength + miblength]);
datastart = 26 + commlength + miblength;

// The sysUptime value may by a multi-byte integer
// Each byte read must be shifted to the higher byte order
while (datalength > 0)
{
uptime = (uptime << 8) + response[datastart++];
datalength--;
}
Console.WriteLine(" sysUptime - Datatype: {0}, Value: {1}", datatype, uptime);
//---------
// Send a SysUptime SNMP request
response = conn.get("getnextMIB", argv[0], argv[1], "1.3.6.1.2.1.2.2.1.10.256.3");
if (response[0] == 0xff)
{
Console.WriteLine("No response from {0}", argv[0]);
return;
}

// Get the community and MIB lengths of the response
commlength = Convert.ToInt16(response[6]);
miblength = Convert.ToInt16(response[23 + commlength]);

// Extract the MIB data from the SNMp response
datatype = Convert.ToInt16(response[24 + commlength + miblength]);
datalength = Convert.ToInt16(response[25 + commlength + miblength]);
datastart = 26 + commlength + miblength;

// The sysUptime value may by a multi-byte integer
// Each byte read must be shifted to the higher byte order
while (datalength > 0)
{
uptime = (uptime << 8) + response[datastart++];
datalength--;
}
Console.WriteLine(" sysUptime - Datatype: {0}, Value: {1}", datatype, uptime);

}

}

class MacAddress
{
public static void MacAdd(string[] argv)
{
int commlength=0, miblength=0, datastart=0, datatype=0, datalength=0;
int valueint = 0;
string nextmib="";
SNMP conn = new SNMP();
string mib = "";

int orgmiblength = 0;
byte[] response = new byte[1024];

//-----------------------
mib = argv[2];
orgmiblength = mib.Length;
nextmib = mib;
while (true)
{
response = conn.get("getnext", argv[0], argv[1], nextmib);
commlength = Convert.ToInt16(response[6]);
miblength = Convert.ToInt16(response[23 + commlength]);
datatype = Convert.ToInt16(response[24 + commlength + miblength]);
datalength = Convert.ToInt16(response[25 + commlength + miblength]);
datastart = 26 + commlength + miblength;
valueint = 0;
while (datalength > 0)
{
valueint = (valueint << 8) + response[datastart++];
datalength--;
}

//Console.WriteLine(" sysUptime - Datatype: {0}, Value: {1}", datatype, valueint);
// value = Encoding.ASCII.GetString(response, datastart, datalength);
//value = BitConverter.ToString(response, datastart, datalength);
nextmib = conn.getnextMIB(response);
if (!(nextmib.Substring(0, orgmiblength) == mib))
break;
Console.WriteLine("{0} = {1}", nextmib, valueint);
}


}

}

class SNMP
{
public SNMP()
{

}

public byte[] get(string request, string host, string community, string mibstring)
{
byte[] packet = new byte[1024];
byte[] mib = new byte[1024];
int snmplen;
int comlen = community.Length;
string[] mibvals = mibstring.Split('.');
int miblen = mibvals.Length;
int cnt = 0, temp, i;
int orgmiblen = miblen;
int pos = 0;

// Convert the string MIB into a byte array of integer values
// Unfortunately, values over 128 require multiple bytes
// which also increases the MIB length
for (i = 0; i < orgmiblen; i++)
{
temp = Convert.ToInt16(mibvals[i]);
if (temp > 127)
{
mib[cnt] = Convert.ToByte(128 + (temp / 128));
mib[cnt + 1] = Convert.ToByte(temp - ((temp / 128) * 128));
cnt += 2;
miblen++;
}
else
{
mib[cnt] = Convert.ToByte(temp);
cnt++;
}
}
snmplen = 29 + comlen + miblen - 1; //Length of entire SNMP packet

//The SNMP sequence start
packet[pos++] = 0x30; //Sequence start
packet[pos++] = Convert.ToByte(snmplen - 2); //sequence size

//SNMP version
packet[pos++] = 0x02; //Integer type
packet[pos++] = 0x01; //length
packet[pos++] = 0x00; //SNMP version 1

//Community name
packet[pos++] = 0x04; // String type
packet[pos++] = Convert.ToByte(comlen); //length
//Convert community name to byte array
byte[] data = Encoding.ASCII.GetBytes(community);
for (i = 0; i < data.Length; i++)
{
packet[pos++] = data[i];
}

//Add GetRequest or GetNextRequest value
if (request == "get")
packet[pos++] = 0xA0;
else
packet[pos++] = 0xA1;

packet[pos++] = Convert.ToByte(20 + miblen - 1); //Size of total MIB

//Request ID
packet[pos++] = 0x02; //Integer type
packet[pos++] = 0x04; //length
packet[pos++] = 0x00; //SNMP request ID
packet[pos++] = 0x00;
packet[pos++] = 0x00;
packet[pos++] = 0x01;

//Error status
packet[pos++] = 0x02; //Integer type
packet[pos++] = 0x01; //length
packet[pos++] = 0x00; //SNMP error status

//Error index
packet[pos++] = 0x02; //Integer type
packet[pos++] = 0x01; //length
packet[pos++] = 0x00; //SNMP error index

//Start of variable bindings
packet[pos++] = 0x30; //Start of variable bindings sequence

packet[pos++] = Convert.ToByte(6 + miblen - 1); // Size of variable binding

packet[pos++] = 0x30; //Start of first variable bindings sequence
packet[pos++] = Convert.ToByte(6 + miblen - 1 - 2); // size
packet[pos++] = 0x06; //Object type
packet[pos++] = Convert.ToByte(miblen - 1); //length

//Start of MIB
packet[pos++] = 0x2b;
//Place MIB array in packet
for (i = 2; i < miblen; i++)
packet[pos++] = Convert.ToByte(mib[i]);
packet[pos++] = 0x05; //Null object value
packet[pos++] = 0x00; //Null

//Send packet to destination
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
sock.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout, 5000);
IPHostEntry ihe = Dns.Resolve(host);
IPEndPoint iep = new IPEndPoint(ihe.AddressList[0], 161);
EndPoint ep = (EndPoint)iep;
sock.SendTo(packet, snmplen, SocketFlags.None, iep);

//Receive response from packet
try
{
int recv = sock.ReceiveFrom(packet, ref ep);
}
catch (SocketException)
{
packet[0] = 0xff;
}
return packet;
}

public string getnextMIB(byte[] mibin)
{
string output = "1.3";
int commlength = mibin[6];
int mibstart = 6 + commlength + 17; //find the start of the mib section
//The MIB length is the length defined in the SNMP packet
// minus 1 to remove the ending .0, which is not used
int miblength = mibin[mibstart] - 1;
mibstart += 2; //skip over the length and 0x2b values
int mibvalue=0;

for (int i = mibstart; i < mibstart + miblength; i++)
{
mibvalue = Convert.ToInt16(mibin[i]);
if (mibvalue > 128)
{
mibvalue = (mibvalue / 128) * 128 + Convert.ToInt16(mibin[i + 1]);
i++;
}
output += "." + mibvalue;
}
return output;
}


}


}




參考:C-Sharp_Network_Programming 書

C# 全域變數

全域變數宣告方法


public class Global
{
public static int iVars = 0;
}

2010年1月27日 星期三

SNMP oid 意義

1.3.6.1.2.1.2.2.1.5.1 網路速度
1.3.6.1.2.1.4.9.0 網路進入流量

oid碼後需加實體OR虛擬網路

這次測試虛擬網路值為1

C# 原件陣列

用checkbox表示


CheckBox[] check = new CheckBox[8];
check[1] = CheckBox1;
check[2] = CheckBox2;
check[3] = CheckBox3;
check[4] = CheckBox4;
check[5] = CheckBox5;
check[6] = CheckBox6;
check[7] = CheckBox7;

for ( i = 1; i < 7; i++)
{
check[i].Checked = true;

2010年1月25日 星期一

C#上使用SNMP

Firstly, you have to add a reference to OLEPRNLIB. You can find it from "Add reference" -> "COM". The path of the dll is located at C:\Windows\System32 by Default.