예제 #1
0
파일: KpSnmpLogic.cs 프로젝트: wjffsx/scada
        /// <summary>
        /// Расшифровать данные переменной SNMP
        /// </summary>
        private SrezTable.CnlData DecodeVarData(ISnmpData data)
        {
            if (data == null)
            {
                return(SrezTable.CnlData.Empty);
            }
            else
            {
                try
                {
                    switch (data.TypeCode)
                    {
                    case SnmpType.Integer32:
                        return(new SrezTable.CnlData(((Integer32)data).ToInt32(), 1));

                    case SnmpType.Counter32:
                        return(new SrezTable.CnlData(((Counter32)data).ToUInt32(), 1));

                    case SnmpType.Counter64:
                        return(new SrezTable.CnlData(((Counter64)data).ToUInt64(), 1));

                    case SnmpType.TimeTicks:
                        return(new SrezTable.CnlData(((TimeTicks)data).ToUInt32(), 1));

                    case SnmpType.OctetString:
                        string s = data.ToString().Trim();
                        double val;
                        if (s.Equals("true", StringComparison.OrdinalIgnoreCase))
                        {
                            return(new SrezTable.CnlData(1.0, 1));
                        }
                        else if (s.Equals("false", StringComparison.OrdinalIgnoreCase))
                        {
                            return(new SrezTable.CnlData(0.0, 1));
                        }
                        else if (double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out val))
                        {
                            return(new SrezTable.CnlData(val, 1));
                        }
                        else
                        {
                            return(SrezTable.CnlData.Empty);
                        }

                    default:
                        return(SrezTable.CnlData.Empty);
                    }
                }
                catch (Exception ex)
                {
                    WriteToLog(string.Format(Localization.UseRussian ?
                                             "Ошибка при расшифровке данных \"{0}\" типа {1}: {2}" :
                                             "Error decoding data \"{0}\" of type {1}: {2}",
                                             data.ToString(), data.TypeCode.ToString(), ex.Message));
                    return(SrezTable.CnlData.Empty);
                }
            }
        }
예제 #2
0
        protected string ConvertVariableData(ISnmpData data)
        {
            if (!(data is OctetString s))
            {
                return(data.ToString());
            }

            var count = System.Text.Encoding.ASCII.GetByteCount(s.ToString());

            return(count == 6 ? s.ToHexString() : data.ToString());
        }
예제 #3
0
        public void TestCreateOctetString()
        {
            byte[]    expected = new byte[] { 0x04, 0x06, 0x70, 0x75, 0x62, 0x6C, 0x69, 0x63 };
            ISnmpData data     = DataFactory.CreateSnmpData(expected);

            Assert.Equal(SnmpType.OctetString, data.TypeCode);
            Assert.Equal("public", data.ToString());
        }
예제 #4
0
        /// <summary>
        /// Преобразовать данные переменной SNMP в строку для вывода в журнал
        /// </summary>
        private string ConvertVarDataToString(ISnmpData snmpData, bool isBits, int maxLen = -1, bool addType = true)
        {
            if (snmpData == null)
            {
                return("null");
            }
            else
            {
                StringBuilder sb = new StringBuilder();

                if (snmpData is OctetString)
                {
                    if (isBits)
                    {
                        sb.Append(((OctetString)snmpData).ToHexString());
                    }
                    else
                    {
                        string s = snmpData.ToString();
                        if (maxLen > 0 && s.Length > maxLen)
                        {
                            sb.Append(s.Substring(0, maxLen)).Append("...");
                        }
                        else
                        {
                            sb.Append(s);
                        }
                    }
                }
                else
                {
                    sb.Append(snmpData.ToString());
                }

                if (addType)
                {
                    sb.Append(" (").Append(snmpData.TypeCode.ToString()).Append(")");
                }

                return(sb.ToString());
            }
        }
예제 #5
0
        /// <summary>
        /// Check whether data is integer
        /// </summary>
        /// <param name="snmpData"></param>
        /// <returns></returns>
        int CheckVariableDataForInt(ISnmpData snmpData)
        {
            string snmpStirng = snmpData.ToString();
            int    res        = 0;

            if (snmpStirng != "NoSuchInstance")
            {
                res = Convert.ToInt32(snmpStirng);
            }
            return(res);
        }
예제 #6
0
        public object GetValuesAgainstOids(string oid, String community)
        {
            IList <Variable> oids = new List <Variable>();

            oids.Add(new Variable(new ObjectIdentifier(String.Format(".{0}.0", oid))));

            try
            {
#if !NETCORE
                if (this.messenger != null)
                {
                    oids = messenger.GetValuesAgaintOIDs(new OctetString(community), oids);
                    exceptionOccurred = false;
                }
#endif
            }
            catch (Exception ex)
            {
                exceptionOccurred = true;
                throw;
            }

            if (oids != null && oids.Count > 0)
            {
                ISnmpData data = oids[0].Data;
                if (data != null)
                {
                    string dataStr = data.ToString();

                    if (!data.ToString().Equals("Null"))
                    {
                        return(dataStr);
                    }
                }
            }

            return(null);
        }
예제 #7
0
파일: KpSnmpLogic.cs 프로젝트: wjffsx/scada
 /// <summary>
 /// Преобразовать данные переменной SNMP в строку для вывода в журнал
 /// </summary>
 private string ConvertVarDataToString(ISnmpData data)
 {
     if (data == null)
     {
         return("null");
     }
     else
     {
         return(new StringBuilder(data.ToString())
                .Append(" (")
                .Append(data.TypeCode.ToString())
                .Append(")").ToString());
     }
 }
예제 #8
0
 public void PduSetReceived_handler(string oid, ISnmpData data)
 {
     if (QueryOid.Contains(oid))
     {
         /** Tengo que escribir en Properties.Settings.Default.OidRespuesta la Oid Base (fila)
          * de la tabla correspondiente al equipo */
         string oid_equipo = equipments.OidEquipo(data.ToString());
         SnmpStringObject.Get(AnswerOid).Value = oid_equipo;
     }
     else
     {
         /** Tengo que avisar que hay cambios... */
         NotifyExternalChange?.Invoke(equipments.EquipmentName(oid));
     }
 }
        public JsonResult getSingleInformation()
        {
            ISnmpData data   = null;
            var       result = Messenger.Get(VersionCode.V2,
                                             new IPEndPoint(IPAddress.Any, 161),
                                             new OctetString("public"),
                                             new List <Variable> {
                new Variable(new ObjectIdentifier(".1.3.6.1.2.1.1.3"))
            },
                                             60000);

            foreach (var a in result)
            {
                data = a.Data;
            }


            return(new JsonResult(new
            {
                SystemUpTime = data.ToString(),
            }));
        }
예제 #10
0
        static List <ArpEntry> ScanTarget(IPAddress ip, ScanOptions options)
        {
            List <ArpEntry> results = new List <ArpEntry>();

            OctetString community = new OctetString(options.Community);

            List <Variable> ARPTypeResult     = new List <Variable>();
            List <Variable> ARPIPResult       = new List <Variable>();
            List <Variable> ARPPhysAddrResult = new List <Variable>();

            try
            {
                Messenger.BulkWalk(VersionCode.V2,
                                   new IPEndPoint(ip, 161),
                                   new OctetString(options.Community),
                                   new ObjectIdentifier("1.3.6.1.2.1.4.22.1.4"),
                                   ARPTypeResult,
                                   options.SNMPTimeout,
                                   10,
                                   WalkMode.WithinSubtree,
                                   null,
                                   null);

                Messenger.BulkWalk(VersionCode.V2,
                                   new IPEndPoint(ip, 161),
                                   new OctetString(options.Community),
                                   new ObjectIdentifier("1.3.6.1.2.1.4.22.1.2"),
                                   ARPPhysAddrResult,
                                   options.SNMPTimeout,
                                   10,
                                   WalkMode.WithinSubtree,
                                   null,
                                   null);

                Messenger.BulkWalk(VersionCode.V2,
                                   new IPEndPoint(ip, 161),
                                   new OctetString(options.Community),
                                   new ObjectIdentifier("1.3.6.1.2.1.4.22.1.3"),
                                   ARPIPResult,
                                   options.SNMPTimeout,
                                   10,
                                   WalkMode.WithinSubtree,
                                   null,
                                   null);
            }
            catch (Lextm.SharpSnmpLib.Messaging.TimeoutException te)
            {
                Console.WriteLine("Request to {0} timed out, skipping... : {1}", ip, te);
                return(results);
            }


            foreach (Variable v in ARPTypeResult)
            {
                if (v.Data.Equals(new Integer32(4)) && options.ProcessStaticARPEntries == false)
                {
                    continue;
                }
                else if (v.Data.Equals(new Integer32(3)) && options.ProcessDynamicARPEntries == false)
                {
                    continue;
                }
                else if (v.Data.Equals(new Integer32(2)) && options.ProcessInvalidARPEntries == false)
                {
                    continue;
                }
                else if (v.Data.Equals(new Integer32(1)) && options.ProcessOtherARPEntries == false)
                {
                    continue;
                }

                uint[] numID = v.Id.ToNumerical().ToArray();

                numID[9] = 3;
                ObjectIdentifier IPID = new ObjectIdentifier(numID);

                ISnmpData IPData = ARPIPResult.Where(i => i.Id == IPID).Select(x => x).Single().Data;

                numID[9] = 2;
                ObjectIdentifier PhysAddrID   = new ObjectIdentifier(numID);
                ISnmpData        PhysAddrData = ARPPhysAddrResult.Where(i => i.Id == PhysAddrID).Select(x => x).Single().Data;

                System.Net.NetworkInformation.PhysicalAddress mac = new System.Net.NetworkInformation.PhysicalAddress(PhysAddrData.ToBytes().Skip(2).ToArray());

                ArpEntry entry = new ArpEntry(IPAddress.Parse(IPData.ToString()), mac);

                results.Add(entry);
            }

            return(results);
        }
예제 #11
0
 /// <summary>
 /// Расшифровать данные переменной SNMP
 /// </summary>
 private SrezTable.CnlData DecodeVarData(ISnmpData data)
 {
     if (data == null)
     {
         return SrezTable.CnlData.Empty;
     }
     else
     {
         try
         {
             switch (data.TypeCode)
             {
                 case SnmpType.Integer32:
                     return new SrezTable.CnlData(((Integer32)data).ToInt32(), 1);
                 case SnmpType.Counter32:
                     return new SrezTable.CnlData(((Counter32)data).ToUInt32(), 1);
                 case SnmpType.Counter64:
                     return new SrezTable.CnlData(((Counter64)data).ToUInt64(), 1);
                 case SnmpType.TimeTicks:
                     return new SrezTable.CnlData(((TimeTicks)data).ToUInt32(), 1);
                 case SnmpType.OctetString:
                     string s = data.ToString().Trim();
                     double val;
                     if (s.Equals("true", StringComparison.OrdinalIgnoreCase))
                         return new SrezTable.CnlData(1.0, 1);
                     else if (s.Equals("false", StringComparison.OrdinalIgnoreCase))
                         return new SrezTable.CnlData(0.0, 1);
                     else if (double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out val))
                         return new SrezTable.CnlData(val, 1);
                     else
                         return SrezTable.CnlData.Empty;
                 default:
                     return SrezTable.CnlData.Empty;
             }
         }
         catch (Exception ex)
         {
             WriteToLog(string.Format(Localization.UseRussian ?
                 "Ошибка при расшифровке данных \"{0}\" типа {1}: {2}" :
                 "Error decoding data \"{0}\" of type {1}: {2}",
                 data.ToString(), data.TypeCode.ToString(), ex.Message));
             return SrezTable.CnlData.Empty;
         }
     }
 }
예제 #12
0
 /// <summary>
 /// Преобразовать данные переменной SNMP в строку для вывода в журнал
 /// </summary>
 private string ConvertVarDataToString(ISnmpData data)
 {
     if (data == null)
     {
         return "null";
     }
     else
     {
         return new StringBuilder(data.ToString())
             .Append(" (")
             .Append(data.TypeCode.ToString())
             .Append(")").ToString();
     }
 }
예제 #13
0
        /// <summary>
        /// Декодировать данные переменной SNMP
        /// </summary>
        private bool DecodeVarData(ISnmpData snmpData, bool isBits,
                                   out SrezTableLight.CnlData tagData, out bool isString)
        {
            tagData  = SrezTableLight.CnlData.Empty;
            isString = false;

            if (snmpData == null)
            {
                return(false);
            }
            else if (isBits)
            {
                if (snmpData.TypeCode == SnmpType.OctetString)
                {
                    // получение значения типа BITS: последний полученный байт строки - младший байт значения тега
                    byte[] snmpRaw = ((OctetString)snmpData).GetRaw();
                    byte[] tagRaw  = new byte[8];

                    for (int i = 0, j = snmpRaw.Length - 1; i < 8; i++, j--)
                    {
                        tagRaw[i] = j >= 0 ? snmpRaw[j] : (byte)0;
                    }

                    tagData = new SrezTableLight.CnlData(BitConverter.ToUInt64(tagRaw, 0), 1);
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            else
            {
                try
                {
                    switch (snmpData.TypeCode)
                    {
                    case SnmpType.Integer32:
                        tagData = new SrezTableLight.CnlData(((Integer32)snmpData).ToInt32(), 1);
                        return(true);

                    case SnmpType.Counter32:
                        tagData = new SrezTableLight.CnlData(((Counter32)snmpData).ToUInt32(), 1);
                        return(true);

                    case SnmpType.Counter64:
                        tagData = new SrezTableLight.CnlData(((Counter64)snmpData).ToUInt64(), 1);
                        return(true);

                    case SnmpType.Gauge32:
                        tagData = new SrezTableLight.CnlData(((Gauge32)snmpData).ToUInt32(), 1);
                        return(true);

                    case SnmpType.TimeTicks:
                        tagData = new SrezTableLight.CnlData(((TimeTicks)snmpData).ToUInt32(), 1);
                        return(true);

                    case SnmpType.OctetString:
                        string s = snmpData.ToString().Trim();
                        double val;
                        if (s.Equals("true", StringComparison.OrdinalIgnoreCase))
                        {
                            tagData = new SrezTableLight.CnlData(1.0, 1);
                            return(true);
                        }
                        else if (s.Equals("false", StringComparison.OrdinalIgnoreCase))
                        {
                            tagData = new SrezTableLight.CnlData(0.0, 1);
                            return(true);
                        }
                        else if (double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out val))
                        {
                            tagData = new SrezTableLight.CnlData(val, 1);
                            return(true);
                        }
                        else
                        {
                            // преобразование 8 байт строки в число double
                            tagData  = new SrezTableLight.CnlData(ScadaUtils.EncodeAscii(s), 1);
                            isString = true;
                            return(true);
                        }

                    default:
                        return(false);
                    }
                }
                catch (Exception ex)
                {
                    WriteToLog(string.Format(Localization.UseRussian ?
                                             "Ошибка при расшифровке данных \"{0}\" типа {1}: {2}" :
                                             "Error decoding data \"{0}\" of type {1}: {2}",
                                             snmpData.ToString(), snmpData.TypeCode.ToString(), ex.Message));
                    return(false);
                }
            }
        }
예제 #14
0
 public SNMPReceivedArgs(ObjectIdentifier oid, ISnmpData data)
 {
     OID  = oid.ToString();
     Data = data.ToString();
 }