Ejemplo n.º 1
0
        //  数据下行解析
        public bool Parse(string msg, out CDownConf downConf)
        {
            downConf = new CDownConf();
            int mgb = 0;

            try
            {
                string data = string.Empty;
                if (!ProtocolHelpers.DeleteSpecialChar(msg, out data))
                {
                    return(false);
                }



                //  解析站点ID
                String stationID = data.Substring(0, 4);
                //  解析通信类别
                String type = data.Substring(4, 2);
                data = data.Substring(6);
                var segs = data.Split(CSpecialChars.BALNK_CHAR);
                foreach (var item in segs)
                {
                    try
                    {
                        //  数据分为两部分
                        //  2 Byte 指令  +  剩下的为数据,数据的长度>= 2
                        //  解析指令类型param
                        EDownParam param = ProtocolMaps.DownParamMap.FindKey(item.Substring(0, 2) == "13" ? "12" : item.Substring(0, 2));
                        //  如果接收到的数据段长度大于2,表示对应的字段有值
                        //  默认为String.Empty
                        string info = string.Empty;
                        if (item.Length > 2)
                        {
                            int length = Int32.Parse(ProtocolMaps.DownParamLengthMap.FindValue(param));
                            //  如果接收到的数据段的长度不等于规定长度,或者规定长度为-1(即长度不定)
                            //        截取剩下的所有字符串
                            //  否则,截取规定长度的字符串
                            info = (item.Length - 2 != length || length == -1) ? item.Substring(2) : item.Substring(2, length);
                        }
                        if (String.IsNullOrEmpty(info))
                        {
                            continue;
                        }

                        switch (param)
                        {
                        case EDownParam.Clock:
                            int year   = Int32.Parse("20" + info.Substring(0, 2));
                            int month  = Int32.Parse(info.Substring(2, 2));
                            int day    = Int32.Parse(info.Substring(4, 2));
                            int hour   = Int32.Parse(info.Substring(6, 2));
                            int minute = Int32.Parse(info.Substring(8, 2));
                            int second = Int32.Parse(info.Substring(10, 2));
                            downConf.Clock = new DateTime(year, month, day, hour, minute, second);
                            break;

                        case EDownParam.NormalState: downConf.NormalState = ProtocolMaps.NormalState4ProtoMap.FindKey(info); break;

                        case EDownParam.Voltage: downConf.Voltage = (Decimal.Parse(info) * (Decimal)0.01); break;

                        case EDownParam.StationCmdID: downConf.StationCmdID = info; break;

                        case EDownParam.TimeChoice: downConf.TimeChoice = ProtocolMaps.TimeChoice4ProtoMap.FindKey(info == "01" ? info : "02"); break;

                        case EDownParam.TimePeriod: downConf.TimePeriod = ProtocolMaps.TimePeriodMap.FindKey(info); break;

                        case EDownParam.WorkStatus: downConf.WorkStatus = ProtocolMaps.WorkStatus4ProtoMap.FindKey(info); break;

                        case EDownParam.VersionNum: downConf.VersionNum = info; break;

                        case EDownParam.StandbyChannel:
                            downConf.MainChannel = ProtocolMaps.ChannelType4ProtoMap.FindKey(info.Substring(0, 2));
                            System.Diagnostics.Debug.Assert(downConf.MainChannel != EChannelType.None, "主用信道不能为NONE");
                            downConf.ViceChannel = ProtocolMaps.ChannelType4ProtoMap.FindKey(info.Substring(2, 2));
                            break;

                        case EDownParam.TeleNum: downConf.TeleNum = info; break;

                        case EDownParam.RingsNum: downConf.RingsNum = Decimal.Parse(info); break;

                        case EDownParam.DestPhoneNum: downConf.DestPhoneNum = info; break;

                        case EDownParam.TerminalNum: downConf.TerminalNum = info; break;

                        case EDownParam.GSMElec: downConf.GSMElec = ProtocolMaps.GSMElec4ProtoMap.FindKey(info); break;

                        case EDownParam.RespBeam: downConf.RespBeam = info; break;

                        case EDownParam.AvegTime: downConf.AvegTime = Decimal.Parse(info); break;

                        case EDownParam.RainPlusReportedValue: downConf.RainPlusReportedValue = Decimal.Parse(info); break;

                        case EDownParam.KC: downConf.KC = info; break;

                        case EDownParam.Rain: downConf.Rain = Decimal.Parse(info); break;

                        //  单位为米    case EDownParam.Water: downConf.Water = (Decimal.Parse(info) * (Decimal)0.01); break;
                        //  默认单位为厘米
                        case EDownParam.storeWater: downConf.storeWater = Decimal.Parse(info); break;

                        case EDownParam.realWater: downConf.realWater = Decimal.Parse(info); break;

                        case EDownParam.WaterBase: downConf.WaterBase = Decimal.Parse(info); break;

                        case EDownParam.WaterPlusReportedValue: downConf.WaterPlusReportedValue = Decimal.Parse(info); break;

                        case EDownParam.SelectCollectionParagraphs: downConf.SelectCollectionParagraphs = ProtocolMaps.SelectCollectionParagraphs4ProtoMap.FindKey(info); break;

                        case EDownParam.StationType:
                            var stype = ProtocolMaps.StationType4ProtoMap.FindKey(info);
                            downConf.StationType = stype; break;

                        case EDownParam.UserName:
                            downConf.UserName = info;
                            break;

                        case EDownParam.StationName:
                            downConf.StationName = info;
                            break;

                        case EDownParam.SensorType:
                            downConf.SensorType = ProtocolMaps.SensorType4ProtoMap.FindKey(info);
                            break;

                        case EDownParam.FlashClear:
                            downConf.FlashClear = info;
                            break;

                        default:
                            mgb--;
                            break;
                        }
                        mgb++;
                    }
                    catch (Exception e)
                    {
                        System.Diagnostics.Debug.WriteLine("数据:" + msg);
                        System.Diagnostics.Debug.WriteLine("下行指令解析数据不完整!" + e.Message);
                    }
                }
            }
            catch (Exception exp)
            {
                System.Diagnostics.Debug.WriteLine(exp.Message);
            }
            if (mgb == 0)
            {
                downConf = null;
                return(false);
            }
            return(true);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 处理请求方法,向终端发送请求并返回上行数据
        /// </summary>
        /// <param name="DownRequest"></param>
        /// <returns></returns>
        private DownConf GetDownConf(DownRequest DownRequest)
        {
            m_timer.Start();
            DownConf result = new DownConf();

            downConfList = null;
            downConfList = new List <DownConf>();
            downdataGet  = false;
            string downQuery = string.Empty;

            gprsNum   = DownRequest.GprsNum;
            stationId = DownRequest.StationId;
            cmds      = DownRequest.Cmds;
            isSet     = DownRequest.IsSet;

            if (isSet == false)
            {
                List <EDownParam> query = new List <EDownParam>();

                for (int i = cmds.Length; i > 0; i = i - 2)
                {
                    string     downParamValue = cmds.Substring(0, 2);
                    EDownParam downParamKey   = ProtocolMaps.DownParamMap.FindKey(downParamValue);
                    query.Add(downParamKey);
                    cmds = cmds.Substring(2);
                }

                downQuery = CPortDataMgr.Instance.SendGprsRead_BS(gprsNum, stationId, query);

                if (downQuery == "")
                {
                    result.IsOL = false;
                    return(result);
                }
            }
            else if (isSet == true)
            {
                StringBuilder query = new StringBuilder();
                query.Append(ProtocolMaps.ChannelProtocolStartCharMap.FindValue(EChannelType.GPRS));
                query.Append(String.Format("{0:D4}", Int32.Parse(stationId.Trim())));
                query.Append("0S");

                query.Append(cmds);
                //while(cmds.Length > 0)
                //{
                //    try
                //    {
                //        query.Append(CSpecialChars.BALNK_CHAR);
                //        string downParamValue = cmds.Substring(0, 2);
                //        query.Append(downParamValue);
                //        EDownParam downParamKey = ProtocolMaps.DownParamMap.FindKey(downParamValue);
                //        int downParamLength = int.Parse(ProtocolMaps.DownParamLengthMap.FindValue(downParamKey));
                //        string downData = cmds.Substring(2, downParamLength);
                //        query.Append(downData);
                //        cmds = cmds.Substring(2 + downParamLength);
                //    }
                //    catch (Exception e)
                //    {
                //        Debug.WriteLine("下行指令解析失败" + e.Message);
                //    }
                //}

                query.Append(CSpecialChars.ENTER_CHAR);

                var gprs = CPortDataMgr.Instance.FindGprsByUserid(gprsNum);
                if (gprs != null)
                {
                    uint dtuID = 0;
                    if (gprs.FindByID(gprsNum, out dtuID))
                    {
                        gprs.SendDataTwice(dtuID, query.ToString());
                    }
                    else
                    {
                        result.IsOL = false;
                        return(result);
                    }
                }
                else
                {
                    result.IsOL = false;
                    return(result);
                }
            }

            result = CheckDownConf(DownRequest);

            while (!downdataGet)
            {
                Thread.Sleep(1000);
                result = CheckDownConf(DownRequest);
                if (timeDown)
                {
                    timeDown = false;
                    break;
                }
            }

            m_timer.Stop();

            return(result);
        }