using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using Aitex.Core.RT.Log; using SnmpSharpNet; namespace MECF.Framework.Common.Communications { public class SNMPFactory : IDisposable { public string _address; public string _community; public int _versionNo; public UdpTarget target; public AgentParameters param; public bool EnableLog { get; set; } public string Address { get { return _address; } set { _address = value; } } public event Action OnErrorHappened; public event Action> OnDataDicChanged; public event Action OnDataChanged; public event Action OnDataWriteChanged; public event Action OnTrapChanged; public SNMPFactory(string address, string community, int VersionNo, string newline = "\r", bool isAsciiMode = true) { _address = address; _community = community; _versionNo = VersionNo; OctetString community2 = new OctetString(community); param = new AgentParameters(community2); param.Version = (SnmpVersion)_versionNo; IpAddress ipAddress = new IpAddress(Address); target = new UdpTarget((IPAddress)ipAddress, 161, 2000, 1); } public void Dispose() { Close(); } public bool Open() { if (target != null) { Close(); } try { IpAddress ipAddress = new IpAddress(Address); target = new UdpTarget((IPAddress)ipAddress, 161, 2000, 1); } catch (Exception ex) { string message = Address + "open failed,please check configuration." + ex.Message; LOG.Write(message); return false; } return true; } public bool IsOpen() { return target != null; } public bool Close() { if (target != null) { try { target.Close(); target.Dispose(); } catch (Exception ex) { string message = Address + "close failed." + ex.Message; LOG.Write(message); return false; } } return true; } public bool SnmpGet(string oIds) { try { Pdu pdu = new Pdu(PduType.Get); pdu.VbList.Add(oIds); if (_versionNo == 0) { SnmpV1Packet snmpV1Packet = (SnmpV1Packet)target.Request(pdu, param); if (EnableLog) { LOG.Info($"Communication {Address} Send {oIds}.", isTraceOn: false); } if (snmpV1Packet != null) { Dictionary dictionary = new Dictionary(); if (snmpV1Packet.Pdu.ErrorStatus != 0) { if (this.OnErrorHappened != null) { this.OnErrorHappened(snmpV1Packet.Pdu.ErrorStatus.ToString(), snmpV1Packet.Pdu.ErrorStatus.ToString()); } } else { string text = null; foreach (Vb vb in snmpV1Packet.Pdu.VbList) { if (this.OnDataChanged != null) { dictionary.Add(vb.Oid.ToString(), vb.Value.ToString()); if (EnableLog) { text = text + vb.Oid.ToString() + "(" + vb.Value.ToString() + ")\r\n"; } } } if (EnableLog) { LOG.Info($"Communication {Address} Receive {text}.", isTraceOn: false); } this.OnDataDicChanged(dictionary); } return true; } } else if (_versionNo == 1) { SnmpV2Packet snmpV2Packet = (SnmpV2Packet)target.Request(pdu, param); if (EnableLog) { LOG.Info($"Communication {Address} Send {oIds}.", isTraceOn: false); } if (snmpV2Packet != null) { Dictionary dictionary2 = new Dictionary(); if (snmpV2Packet.Pdu.ErrorStatus != 0) { string text2 = null; if (this.OnErrorHappened != null) { this.OnErrorHappened(snmpV2Packet.Pdu.ErrorStatus.ToString(), snmpV2Packet.Pdu.ErrorStatus.ToString()); } if (EnableLog) { LOG.Info($"Communication {Address} Receive {snmpV2Packet.Pdu.VbList.FirstOrDefault().Oid}({snmpV2Packet.Pdu.VbList.FirstOrDefault().Value}):ErrorStatus({snmpV2Packet.Pdu.ErrorStatus.ToString()}).", isTraceOn: false); } this.OnDataDicChanged(dictionary2); } else { string text3 = null; foreach (Vb vb2 in snmpV2Packet.Pdu.VbList) { if (this.OnDataChanged != null) { dictionary2.Add(vb2.Oid.ToString(), vb2.Value.ToString()); } if (EnableLog) { text3 = text3 + vb2.Oid.ToString() + "(" + vb2.Value.ToString() + ")\r\n"; } } if (EnableLog) { LOG.Info($"Communication {Address} Receive {text3}.", isTraceOn: false); } this.OnDataDicChanged(dictionary2); } return true; } } } catch (Exception ex) { string text4 = ex.ToString(); return false; } return false; } public bool SnmpGetNext(string oIds) { try { Pdu pdu = new Pdu(PduType.GetNext); pdu.VbList.Add(oIds); if (_versionNo == 0) { SnmpV1Packet snmpV1Packet = (SnmpV1Packet)target.Request(pdu, param); if (EnableLog) { LOG.Info($"Communication {Address} Send {oIds}.", isTraceOn: false); } if (snmpV1Packet != null) { Dictionary dictionary = new Dictionary(); if (snmpV1Packet.Pdu.ErrorStatus != 0) { if (this.OnErrorHappened != null) { this.OnErrorHappened(snmpV1Packet.Pdu.ErrorStatus.ToString(), snmpV1Packet.Pdu.ErrorStatus.ToString()); } } else { string text = null; foreach (Vb vb in snmpV1Packet.Pdu.VbList) { if (this.OnDataChanged != null) { dictionary.Add(vb.Oid.ToString(), vb.Value.ToString()); if (EnableLog) { text = text + vb.Oid.ToString() + "(" + vb.Value.ToString() + ")\r\n"; } } } if (EnableLog) { LOG.Info($"Communication {Address} Receive {text}.", isTraceOn: false); } this.OnDataDicChanged(dictionary); } return true; } } else if (_versionNo == 1) { SnmpV2Packet snmpV2Packet = (SnmpV2Packet)target.Request(pdu, param); if (EnableLog) { LOG.Info($"Communication {Address} Send {oIds}.", isTraceOn: false); } if (snmpV2Packet != null) { Dictionary dictionary2 = new Dictionary(); if (snmpV2Packet.Pdu.ErrorStatus != 0) { string text2 = null; if (this.OnErrorHappened != null) { this.OnErrorHappened(snmpV2Packet.Pdu.ErrorStatus.ToString(), snmpV2Packet.Pdu.ErrorStatus.ToString()); } if (EnableLog) { LOG.Info($"Communication {Address} Receive {snmpV2Packet.Pdu.VbList.FirstOrDefault().Oid}({snmpV2Packet.Pdu.VbList.FirstOrDefault().Value}):ErrorStatus({snmpV2Packet.Pdu.ErrorStatus.ToString()}).", isTraceOn: false); } this.OnDataDicChanged(dictionary2); } else { string text3 = null; foreach (Vb vb2 in snmpV2Packet.Pdu.VbList) { if (this.OnDataChanged != null) { dictionary2.Add(vb2.Oid.ToString(), vb2.Value.ToString()); } if (EnableLog) { text3 = text3 + vb2.Oid.ToString() + "(" + vb2.Value.ToString() + ")\r\n"; } } if (EnableLog) { LOG.Info($"Communication {Address} Receive {text3}.", isTraceOn: false); } this.OnDataDicChanged(dictionary2); } return true; } } } catch (Exception ex) { string text4 = ex.ToString(); return false; } return false; } public bool SnmpGetList(List oIds) { try { Pdu pdu = new Pdu(PduType.Get); foreach (string oId in oIds) { pdu.VbList.Add(oId); } if (_versionNo == 0) { SnmpV1Packet snmpV1Packet = (SnmpV1Packet)target.Request(pdu, param); if (snmpV1Packet != null) { Dictionary dictionary = new Dictionary(); if (snmpV1Packet.Pdu.ErrorStatus != 0) { if (this.OnErrorHappened != null) { this.OnErrorHappened(snmpV1Packet.Pdu.ErrorStatus.ToString(), snmpV1Packet.Pdu.ErrorStatus.ToString()); } } else { foreach (Vb vb in snmpV1Packet.Pdu.VbList) { dictionary.Add(vb.Oid.ToString(), vb.Value.ToString()); } if (this.OnDataDicChanged != null) { this.OnDataDicChanged(dictionary); } } return true; } } else if (_versionNo == 1) { SnmpV2Packet snmpV2Packet = (SnmpV2Packet)target.Request(pdu, param); if (snmpV2Packet != null) { Dictionary dictionary2 = new Dictionary(); if (snmpV2Packet.Pdu.ErrorStatus != 0) { if (this.OnErrorHappened != null) { this.OnErrorHappened(snmpV2Packet.Pdu.ErrorStatus.ToString(), snmpV2Packet.Pdu.ErrorStatus.ToString()); } } else { foreach (Vb vb2 in snmpV2Packet.Pdu.VbList) { dictionary2.Add(vb2.Oid.ToString(), vb2.Value.ToString()); } if (this.OnDataDicChanged != null) { this.OnDataDicChanged(dictionary2); } } return true; } } } catch { return false; } return false; } public bool SnmpWalk(string oIds) { try { Oid oid = new Oid(oIds); Oid oid2 = (Oid)oid.Clone(); Pdu pdu = new Pdu(PduType.GetBulk); pdu.NonRepeaters = 0; pdu.MaxRepetitions = 5; while (oid2 != null) { if (pdu.RequestId != 0) { pdu.RequestId++; } pdu.VbList.Clear(); pdu.VbList.Add(oid2); SnmpV2Packet snmpV2Packet = (SnmpV2Packet)target.Request(pdu, param); if (EnableLog) { LOG.Info($"Communication {Address} Send {oIds}.", isTraceOn: false); } if (snmpV2Packet == null) { continue; } Dictionary dictionary = new Dictionary(); if (snmpV2Packet.Pdu.ErrorStatus != 0) { if (this.OnErrorHappened != null) { this.OnErrorHappened(snmpV2Packet.Pdu.ErrorStatus.ToString(), snmpV2Packet.Pdu.ErrorStatus.ToString()); } oid2 = null; if (EnableLog) { LOG.Info($"Communication {Address} Receive {snmpV2Packet.Pdu.VbList.FirstOrDefault().Oid}({snmpV2Packet.Pdu.VbList.FirstOrDefault().Value}):ErrorStatus({snmpV2Packet.Pdu.ErrorStatus.ToString()}).", isTraceOn: false); } this.OnDataDicChanged(dictionary); break; } string text = null; foreach (Vb vb in snmpV2Packet.Pdu.VbList) { if (oid.IsRootOf(vb.Oid)) { if (!dictionary.ContainsKey(vb.Oid.ToString())) { dictionary.Add(vb.Oid.ToString(), vb.Value.ToString()); if (EnableLog) { text = text + vb.Oid.ToString() + "(" + vb.Value.ToString() + ")\r\n"; } } oid2 = vb.Oid; } else { oid2 = null; } } if (this.OnDataDicChanged != null) { this.OnDataDicChanged(dictionary); } if (EnableLog) { LOG.Info($"Communication {Address} Receive {text}.", isTraceOn: false); } return true; } } catch (Exception ex) { string text2 = ex.ToString(); return false; } return false; } public bool SnmpSet(string oids, string type, string value) { Pdu pdu = new Pdu(PduType.Set); if (type == "Integer") { int val = Convert.ToInt32(value); pdu.VbList.Add(new Oid(oids), new Integer32(val)); } else if (type == "UInteger") { uint val2 = Convert.ToUInt32(value); pdu.VbList.Add(new Oid(oids), new UInteger32(val2)); } SnmpV2Packet snmpV2Packet; try { snmpV2Packet = target.Request(pdu, param) as SnmpV2Packet; } catch (Exception ex) { Console.WriteLine($"Request failed with exception: {ex.Message}"); target.Close(); return false; } if (snmpV2Packet == null) { if (this.OnErrorHappened != null) { this.OnErrorHappened(snmpV2Packet.Pdu.ErrorStatus.ToString(), snmpV2Packet.Pdu.ErrorStatus.ToString()); } return false; } if (snmpV2Packet.Pdu.ErrorStatus != 0) { if (this.OnErrorHappened != null) { this.OnErrorHappened(snmpV2Packet.Pdu.ErrorStatus.ToString(), snmpV2Packet.Pdu.ErrorStatus.ToString()); } } else { this.OnDataWriteChanged($"Set OID{oids}:Value{value} succeed"); } return true; } public void GetTrap() { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Any, 162); EndPoint localEP = iPEndPoint; socket.Bind(localEP); socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 0); bool flag = true; int num = -1; while (flag) { byte[] buffer = new byte[16384]; IPEndPoint iPEndPoint2 = new IPEndPoint(IPAddress.Any, 0); EndPoint remoteEP = iPEndPoint2; try { num = socket.ReceiveFrom(buffer, ref remoteEP); } catch (Exception ex) { Console.WriteLine("Exception {0}", ex.Message); num = -1; } if (num <= 0) { continue; } TrapInfo trapInfo = new TrapInfo(); if (SnmpPacket.GetProtocolVersion(buffer, num) == 0) { SnmpV1TrapPacket snmpV1TrapPacket = new SnmpV1TrapPacket(); snmpV1TrapPacket.decode(buffer, num); foreach (Vb vb in snmpV1TrapPacket.Pdu.VbList) { trapInfo.OID = vb.Oid.ToString(); trapInfo.ValueType = SnmpConstants.GetTypeName(vb.Value.Type); trapInfo.Value = vb.Value.ToString(); if (this.OnTrapChanged != null) { this.OnTrapChanged(trapInfo); } } continue; } SnmpV2Packet snmpV2Packet = new SnmpV2Packet(); snmpV2Packet.decode(buffer, num); if (snmpV2Packet.Pdu.Type != PduType.V2Trap) { continue; } foreach (Vb vb2 in snmpV2Packet.Pdu.VbList) { trapInfo.OID = vb2.Oid.ToString(); trapInfo.ValueType = SnmpConstants.GetTypeName(vb2.Value.Type); trapInfo.Value = vb2.Value.ToString(); if (this.OnTrapChanged != null) { this.OnTrapChanged(trapInfo); } } } } } }