Ejemplo n.º 1
0
        public void LoadPackets(string filename)
        {
            dev           = new ResolveDevice(filename);
            dev.OnOpened += Dev_OnOpened;
            //dev.OnOpening += Dev_OnOpening;
            dev.Open();

            dev.Close();
        }
Ejemplo n.º 2
0
        public async Task LoadPacketsAsync(string filename)
        {
            Task task = Task.Run(() =>
            {
                dev           = new ResolveDevice(filename);
                dev.OnOpened += Dev_OnOpened;
                //dev.OnOpening += Dev_OnOpening;
                dev.Open();

                dev.Close();
            });
            await task;
        }
Ejemplo n.º 3
0
        public void ResovleDevice_Test()
        {
            string captureFilename = @"..\..\CapturedFiles\20140813-150920_0005ED9B-50+60_MMS.pcap";
            // string captureFilename = @"..\..\CapturedFiles\20140725-210910_00036E3E-20+20_RcdD05.pcap";
            //string captureFilename = @"..\..\CapturedFiles\20140826-113450-10+20_RcdD05_.pcap";
            ResolveDevice dev   = new ResolveDevice(captureFilename);
            DateTime      start = DateTime.Now;

            dev.Open();
            // some works here
            dev.Close();
            DateTime end = DateTime.Now;

            Console.WriteLine("Time eclapsed: {0}", (end - start).TotalSeconds);
            Console.WriteLine("Done.");
        }
Ejemplo n.º 4
0
        void dev_OnPacketArrival(object sender, CaptureEventArgs e)
        {
            bool broadcast = false;
            //ResolveDevice rd = new ResolveDevice(null);
            Packet p = ResolveDevice.Resovle(e.Packet);

            StringWriter sw = new StringWriter();
            JsonWriter   jw = new JsonTextWriter(sw);

            if (p.GetType() == typeof(MmsPacket))
            {
                MmsPacket mms = p as MmsPacket;
                if (mms.Pdu is UnconfirmedPdu)
                {
                    AcsiMapping         acsi    = mms.Acsi;
                    ReportedOptFldsType excpted = ReportedOptFldsType.DataSetName | ReportedOptFldsType.DataReference |
                                                  ReportedOptFldsType.ReasonForInclusion;// | ReportedOptFldsType.ReportTimeStamp;
                    bool test = (acsi.ReportedOptFlds & excpted) == excpted;
                    //test = true;

                    if (test)
                    {
                        string ip = mms.ParentPacket <IPv4Packet>().SourceAddress.ToString();
                        pm_ied = Map.IED.SingleOrDefault(ied => ied.MMS.IP == ip);                              // SingleOrDefault IP重复配置
                        if (pm_ied == null)
                        {
                            // Consider Network B
                            var tmp = ip.Split('.');
                            ip     = tmp[0] + ".120." + tmp[2] + "." + tmp[3];
                            pm_ied = Map.IED.SingleOrDefault(ied => ied.MMS.IP == ip);
                        }
                        if (pm_ied != null)
                        {
                            string iedName   = pm_ied.Name;
                            string iedDesc   = pm_ied.Desc;
                            string rawDatSet = acsi.DatSet;
                            string dsName    = rawDatSet.Substring(rawDatSet.LastIndexOf('$') + 1);

                            string ldInst = rawDatSet.Split('/')[0].Replace(iedName, "");
                            var    pm_ds  = pm_ied.MMS.DataSet.SingleOrDefault(ds => ds.LdInst == ldInst && ds.Name == dsName);
                            string dsDesc = pm_ds.Desc;

                            // TODO: Search the related
                            // warn.Related = {"",""};
                            // warn.TimeofEntry = asci.TimeofEntry;

                            jw.WriteStartObject();
                            jw.WritePropertyName("ied"); jw.WriteValue(iedName);

                            jw.WritePropertyName("desc"); jw.WriteValue(iedDesc);
                            jw.WritePropertyName("dataSet");
                            jw.WriteStartObject();
                            jw.WritePropertyName("type"); jw.WriteValue("MMS");
                            jw.WritePropertyName("name"); jw.WriteValue(dsName);
                            jw.WritePropertyName("desc"); jw.WriteValue(dsDesc);
                            jw.WritePropertyName("warnings"); jw.WriteStartArray();


                            if (dsName.Contains("dsAlarm") || dsName.Contains("dsWarning") ||
                                dsName.Contains("dsCommState") || dsName.Contains("dsTripInfo"))
                            {
                                for (int i = 0; i < acsi.DataRef.Count; i++)
                                {
                                    var item = pm_ds.Item.SingleOrDefault(d => d.Ref == acsi.DataRef[i].Replace(iedName, ""));
                                    if (item.Alarm)
                                    {
                                        //  sb.AppendFormat("{0}: {1}, Reason: {2}<br/>", item.Value, acsi.Value[i].ToString(), acsi.ReasonCode[i]);
                                        jw.WriteStartObject();
                                        jw.WritePropertyName("ref"); jw.WriteValue(item.Ref);
                                        jw.WritePropertyName("desc"); jw.WriteValue(item.Value);
                                        jw.WritePropertyName("value");
                                        jw.WriteValue(acsi.Value[i].ToString());
                                        jw.WriteEndObject();
                                        broadcast = true;
                                    }
                                }
                            }
                            jw.WriteEndArray();
                            jw.WriteEndObject();
                            jw.WriteEndObject();
                        }
                    }
                }
            }
            else if (p.GetType() == typeof(GoosePacket))
            {
                var        goose   = (GoosePacket)p;
                string     gocbRef = goose.APDU.gocbRef.Value;
                string     appId   = goose.APPID.ToString("X4");
                TG.DataSet pm_ds   = Map.IED.GetDataSetByAPPID(appId);
                pm_ied = Map.IED.GetIEDByAPPID(appId);
                //	List<string> related = pm_ied.GetRelatedIed();
                //sb.AppendFormat("gocbRef: {0} APPID: {1}<br/>", pm_ds.gocbRef, pm_ds.APPID);

                // Check if alarm
                if (pm_ied != null && pm_ds != null)
                {
                    string iedName = pm_ied.Name;
                    string iedDesc = pm_ied.Desc;

                    jw.WriteStartObject();
                    jw.WritePropertyName("ied"); jw.WriteValue(iedName);
                    jw.WritePropertyName("desc"); jw.WriteValue(iedDesc);

                    jw.WritePropertyName("dataSet");
                    jw.WriteStartObject();
                    jw.WritePropertyName("type"); jw.WriteValue("GOOSE");
                    jw.WritePropertyName("desc"); jw.WriteValue(pm_ds.Desc);
                    jw.WritePropertyName("gocbRef"); jw.WriteValue(pm_ds.gocbRef);
                    jw.WritePropertyName("cbName"); jw.WriteValue(pm_ds.cbName);
                    jw.WritePropertyName("VLAN"); jw.WriteValue(pm_ds.VLAN);
                    jw.WritePropertyName("MAC"); jw.WriteValue(pm_ds.MAC);
                    jw.WritePropertyName("APPID"); jw.WriteValue(pm_ds.APPID);
                    jw.WritePropertyName("warnings"); jw.WriteStartArray();
                    for (int i = 0; i < pm_ds.Item.Length; i++)
                    {
                        var    type = goose.APDU.allData[i].Type;
                        object value;
                        switch (type)
                        {
                        case IEC61850Packet.Mms.Types.Data.VariableType.Boolean:
                            value = goose.APDU.allData[i].GetValue <TAsn1.Boolean>().Value;
                            break;

                        case IEC61850Packet.Mms.Types.Data.VariableType.FloatPoint:
                            value = goose.APDU.allData[i].GetValue <FloatPoint>().Value;
                            break;

                        default:
                            value = null;
                            break;
                        }
                        var item = pm_ds.Item[i];
                        if (value is bool && item.Alarm)
                        {
                            // This packet is a warning packet and contains alarm
                            //Console.ForegroundColor = ConsoleColor.Red;

                            jw.WriteStartObject();
                            jw.WritePropertyName("ref"); jw.WriteValue(item.Ref);
                            jw.WritePropertyName("desc"); jw.WriteValue(item.Value);
                            jw.WritePropertyName("value"); jw.WriteValue(value);
                            if (item.To != null)
                            {
                                jw.WritePropertyName("to"); jw.WriteValue(item.To);
                            }
                            if (item.ExtAddr != null)
                            {
                                jw.WritePropertyName("extAddr"); jw.WriteValue(item.ExtAddr);
                            }
                            if (item.ExtDesc != null)
                            {
                                jw.WritePropertyName("extDesc"); jw.WriteValue(item.ExtDesc);
                            }
                            jw.WriteEndObject();


                            //   sb.AppendFormat("{0}: isAlarm: {1}, isTrigged: {2}<br/>", pm_ds.Item[i].Value, pm_ds.Item[i].Alarm, value);
                            broadcast = true;
                            //Console.ResetColor();
                        }

                        //   sb.AppendFormat("{0}: isAlarm: {1}, Value: {2}<br/>", pm_ds.Item[i].Value, pm_ds.Item[i].Alarm, value);
                    }
                    jw.WriteEndArray();
                    jw.WriteEndObject();
                    jw.WriteEndObject();
                }
            }


            //    sb.Append("<hr/>");
            if (broadcast)
            {
                BroadcastHandler.Clients.Broadcast(sw.ToString());
                broadcast = false;
            }

            jw.Flush();
        }