예제 #1
0
        private void Resovle()
        {
            RptID = listOfAccessResult[pos].Success.GetValue <VisibleString>().Value;
            pos++;  // 0 is RptID, 1 is OptFlds

            BitString bitstr = listOfAccessResult[pos].Success.GetValue <BitString>();

            pos++;

            ReportedOptFldsType optFlds = (ReportedOptFldsType)BigEndianBitConverter.Big.ToUInt16(bitstr.Bytes.ActualBytes(), 3);

            ReportedOptFlds = optFlds; //new List<ReportedOptFldsType>();


            if ((optFlds & ReportedOptFldsType.SequenceNumber) > 0)
            {
                //ReportedOptFlds.Add(ReportedOptFldsType.Sequence_Number);
                SeqNum = listOfAccessResult[pos].Success.GetValue <Integer>().Value;
                pos++;
            }
            if ((optFlds & ReportedOptFldsType.ReportTimeStamp) > 0)
            {
                //ReportedOptFlds.Add(ReportedOptFldsType.Report_Time_Stamp);
                TimeofEntry = listOfAccessResult[pos].Success.GetValue <TimeOfDay>().Value;
                pos++;
            }
            if ((optFlds & ReportedOptFldsType.DataSetName) > 0)
            {
                //ReportedOptFlds.Add(ReportedOptFldsType.Data_Set_Name);
                DatSet = listOfAccessResult[pos].Success.GetValue <VisibleString>().Value;
                pos++;
            }
            if ((optFlds & ReportedOptFldsType.BufferOverflow) > 0)
            {
                //ReportedOptFlds.Add(ReportedOptFldsType.Buffer_Overflow);
                BufOvfl = listOfAccessResult[pos].Success.GetValue <TAsn1.Boolean>().Value;
                pos++;
            }
            if ((optFlds & ReportedOptFldsType.EntryID) > 0)
            {
                //ReportedOptFlds.Add(ReportedOptFldsType.EntryID);
                EntryID = listOfAccessResult[pos].Success.GetValue <OctetString>().Value;
                pos++;
            }
            if ((optFlds & ReportedOptFldsType.Segmentation) > 0)
            {
                //ReportedOptFlds.Add(ReportedOptFldsType.Segmentation);
                // Incorrect codes below, won't use recently.
                SubSeqNum = listOfAccessResult[pos].Success.GetValue <Integer>().Value;
                pos++;
                MoreSegmentFollow = listOfAccessResult[pos].Success.GetValue <TAsn1.Boolean>().Value;
                pos++;
            }

            // Inclusion-bitstring
            Inclusion_Bitstring = listOfAccessResult[pos].Success.GetValue <BitString>().Value;
            pos++;

            if ((optFlds & ReportedOptFldsType.DataReference) > 0)
            {
                DataRef = new List <string>();
                //ReportedOptFlds.Add(ReportedOptFldsType.Data_Reference);
                avaliableCnt = Inclusion_Bitstring.Count(ch => ch == '1');
                for (int i = 0; i < avaliableCnt; i++)
                {
                    DataRef.Add(listOfAccessResult[pos].Success.GetValue <VisibleString>().Value);
                    pos++;
                }
            }

            // Value
            Value = new List <BasicType>();
            for (int i = 0; i < avaliableCnt; i++)
            {
                Value.Add(listOfAccessResult[pos].Success.GetValue <BasicType>());
                pos++;
            }

            // This filed never show up in packet, but still a option in ReportedOptFlds
            if ((optFlds & ReportedOptFldsType.ConfRev) > 0)
            {
                //ReportedOptFlds.Add(ReportedOptFldsType.Conf_Rev);
            }
            if ((optFlds & ReportedOptFldsType.ReasonForInclusion) > 0)
            {
                //ReportedOptFlds.Add(ReportedOptFldsType.Reason_For_Inclusion);
                ReasonCode = new List <ReasonCodeType>();
                for (int i = 0; i < avaliableCnt; i++)
                {
                    ReasonCode.Add((ReasonCodeType)BigEndianBitConverter.Big.ToUInt32(
                                       listOfAccessResult[pos].Success.GetValue <BitString>().Bytes.ActualBytes(), 0
                                       ));
                    pos++;
                }
            }
        }
예제 #2
0
        void Dev_OnOpened(object sender, DeviceOpenedEventArgs e)
        {
            while (dev.HasNextPacket)
            {
                Packet        p  = dev.GetNextPacket();
                StringBuilder sb = new StringBuilder();
                //      StringWriter sw = new StringWriter();

                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;


                        if (test)
                        {
                            string ip        = mms.ParentPacket <IPv4Packet>().SourceAddress.ToString();
                            string rawDatSet = acsi.DatSet;
                            string dsName    = rawDatSet.Substring(rawDatSet.LastIndexOf('$') + 1);
                            sb.AppendFormat("RptID: {0}\n", acsi.RptID);
                            sb.AppendFormat("ReportedFileds: {0}\n", acsi.ReportedOptFlds);
                            sb.AppendFormat("TimeofEntry: {0}\n", acsi.TimeofEntry);
                            sb.AppendFormat("DatSet: {0},dsName(not a field of the packet): {1}\n", rawDatSet, dsName);
                            sb.AppendFormat("EntryID: {0}\n", acsi.EntryID);
                            sb.AppendFormat("Inclusion-bitstring: {0}\n", acsi.Inclusion_Bitstring);

                            for (int i = 0; i < acsi.DataRef.Count; i++)
                            {
                                sb.AppendFormat("{0}: {1}, Reason: {2}\n", acsi.DataRef[i], acsi.Value[i].ToString(), acsi.ReasonCode[i]);
                            }
                        }
                    }
                }
                else if (p.GetType() == typeof(GoosePacket))
                {
                    var    goose = (GoosePacket)p;
                    string appId = goose.APPID.ToString("X4");
                    sb.AppendFormat("gocbRef: {0} APPID: {1}\n", goose.APDU.gocbRef.Value, appId);

                    // Check if alarm
                    sb.AppendFormat("timeAllowedtoLive:{0}", goose.APDU.timeAllowedtoLive);
                    sb.AppendFormat("datSet: {0}", goose.APDU.datSet);
                    sb.AppendFormat("numDatSetEntries: {0}", goose.APDU.numDatSetEntries);
                    for (int i = 0; i < goose.APDU.numDatSetEntries.Value; i++)
                    {
                        var    type = goose.APDU.allData[i].Type;
                        Type   t    = System.Reflection.Assembly.Load("IEC61850Packet").GetType("IEC61850Packet.Asn1.Types.UtcTime");
                        object value;
                        switch (type)
                        {
                        case VariableType.Boolean:
                            value = goose.APDU.allData[i].GetValue <TAsn1.Boolean>().Value;
                            sb.AppendFormat("No.{0}. Boolean: {1}\n", i + 1, value);
                            break;

                        case VariableType.FloatPoint:
                            value = goose.APDU.allData[i].GetValue <FloatPoint>().Value;
                            sb.AppendFormat("No.{0}. FloatPoint: {1}\n", i + 1, value);
                            break;

                        case VariableType.BitString:
                            value = goose.APDU.allData[i].GetValue <BitString>().Value;
                            sb.AppendFormat("No.{0}. BitString: {1}\n", i + 1, value);
                            break;

                        case VariableType.UtcTime:
                            value = goose.APDU.allData[i].GetValue <UtcTime>().Value;
                            sb.AppendFormat("No.{0}. UtcTime: {1}\n", i + 1, value);
                            break;

                        default:
                            value = null;
                            sb.AppendFormat("No.{0}. Unknown: {1}\n", i + 1, value);
                            break;
                        }
                    }
                    Console.WriteLine(sb.ToString());
                }
                else if (p.GetType() == typeof(SvPacket))
                {
                    var sv = (SvPacket)p;
                    Console.WriteLine("SV 9-2, APPID: {0}, svID: {1}", sv.APPID, sv.APDU.ASDU[0].svID);
                }
                Console.WriteLine(sb.ToString());
                sb.Clear();
            }
            Console.WriteLine("{0} packets have been resolved", dev.PacketCount);
        }
예제 #3
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();
        }