/// <summary> /// 从程序集加载所有格式器到DefaultDatagrams。 /// </summary> public void LoadFromAssembly() { DefaultDatagrams.Clear(); var q = from i in typeof(DatagramFormatterBase).Assembly.GetTypes() where i.IsSubclassOf(typeof(DatagramFormatterBase)) && !i.IsAbstract select i; foreach (var i in q) { try { var c = i.GetConstructor(new Type[] { typeof(byte) }); DatagramFormatterBase d = (DatagramFormatterBase)c.Invoke(new object[] { c.GetParameters().First().DefaultValue }); //Activator.CreateInstance(i) ; DefaultDatagrams.Add(d.ASDUType, d); } catch (Exception) { } } }
/// <summary> /// 使用默认或指定的格式器组解析报文。 /// </summary> /// <param name="buf">报文数据</param> /// <param name="formatters">指定格式器组</param> /// <returns></returns> public ParseResult ParseAPDU(byte[] buf, Dictionary <byte, DatagramFormatterBase> formatters = null) { if (formatters == null) { formatters = DefaultDatagrams; } ParseResult result; result.APDU = null; result.Datagram = null; try { DatagramFormatterBase formatter = null; var APDU = new APDU(buf); if (APDU.Format == DatagramFormat.InformationTransmit) { var ASDU = new ASDU(buf, APDU.APCILength); APDU.ASDU = ASDU; if (formatters.TryGetValue(ASDU.Type, out formatter)) { APDU.Formatter = formatter; byte bi = APDU.APCILength + ASDU.HeaderLength; if (ASDU.SQ) { var m = new Message(formatter.ElementType, formatter.AddrLength, formatter.ExtraLength, formatter.TimeStampLength); for (int i = 0; i < formatter.AddrLength; i++) { m.Addr[i] = buf[bi++]; } for (int i = 0; i < formatter.ElementType.Length(); i++) { m.Element[i] = buf[bi++]; } for (int i = 0; i < formatter.ExtraLength; i++) { m.Extra[i] = buf[bi++]; } for (int i = 0; i < formatter.TimeStampLength; i++) { m.TimeStamp[i] = buf[bi++]; } ASDU.Messages.Add(m); var addr = m.Address; for (int k = 1; k < ASDU.MsgCount; k++) { m = new Message(formatter.ElementType, 0, formatter.ExtraLength, formatter.TimeStampLength); m.Address = ++addr; for (int i = 0; i < formatter.ElementType.Length(); i++) { m.Element[i] = buf[bi++]; } for (int i = 0; i < formatter.ExtraLength; i++) { m.Extra[i] = buf[bi++]; } for (int i = 0; i < formatter.TimeStampLength; i++) { m.TimeStamp[i] = buf[bi++]; } ASDU.Messages.Add(m); } } else { for (int k = 0; k < ASDU.MsgCount; k++) { var m = new Message(formatter.ElementType, formatter.AddrLength, formatter.ExtraLength, formatter.TimeStampLength); for (int i = 0; i < formatter.AddrLength; i++) { m.Addr[i] = buf[bi++]; } for (int i = 0; i < formatter.ElementType.Length(); i++) { m.Element[i] = buf[bi++]; } for (int i = 0; i < formatter.ExtraLength; i++) { m.Extra[i] = buf[bi++]; } for (int i = 0; i < formatter.TimeStampLength; i++) { m.TimeStamp[i] = buf[bi++]; } ASDU.Messages.Add(m); } } } } result.Datagram = formatter; result.APDU = APDU; } catch (Exception) { } return(result); }