Newer
Older
Correlator / PipeGallery / Correlator / CmdClass.cs
using System;
using System.Collections.Generic;
using System.IO.Ports;
using PipeGallery.Manage;
using PipeGallery.SensorHubTag;

namespace PipeGallery.Correlator
{
    public class CmdClass
    {
        private static string devCode = "";

        /// <summary>
        /// 数据解析
        /// </summary>
        /// <param name="strTags"></param>
        /// <returns></returns>
        //public void analysisData(String receiveData, SerialPort sp)
        //{
        //    if (receiveData.Contains("\r\n"))
        //        analysisSignalValue(receiveData, sp);
        //    else
        //        analysisDataValue(receiveData, sp);
        //}
        public void analysisDataValue(byte[] receiveData, SerialPort sp)
        {
            byte[] deviceId = new byte[6];
            Array.Copy(receiveData, 4, deviceId, 0, 6);
            String strDeviceId = StringUtil.ConvertBytes2String(deviceId);

            byte[] pduType = new byte[2];
            Array.Copy(receiveData, 13, pduType, 0, 2);

            byte[] settings = new byte[receiveData.Length - 18];
            Array.Copy(receiveData, 16, settings, 0, receiveData.Length - 18);

            //String devType = SensorHubClass.getDeviceTypeByPdu(pduType);
            String operType = SensorHubClass.getOpeTypeByPdu(pduType);

            List<Tag> tags = this.getTags(settings);
            CellTag cellTag = this.getCellTag(tags);
            SystemDateTag systemDateTag = this.getSystemDateTag(tags);

            try
            {
                //TODO LIST:处理主动上报的数据、参数查询、参数设置
                TagHandler systemDateHandler = new SystemDateTagHandler();
                TagHandler sysTimeHandler = new SystemTimeTagHandler();
                TagHandler cellTagHandler = new CellTagHandler();
                TagHandler listenHandler = new ListenTagHandler();
                TagHandler rangingHandler = new RangingTagHandler();
                TagHandler correlatorHandler = new CorrelatorTagHandler();
                TagHandler sensorExceptionHandler = new SensorExceptionTagHandler();

                systemDateHandler.NextHandler = sysTimeHandler;
                sysTimeHandler.NextHandler = cellTagHandler;
                cellTagHandler.NextHandler = listenHandler;
                listenHandler.NextHandler = rangingHandler;
                rangingHandler.NextHandler = correlatorHandler;
                correlatorHandler.NextHandler = sensorExceptionHandler;
                foreach (Tag tag in tags)
                {
                    //采用责任链的方式来处理各个tag:系统日期、间、唤系统时醒、电量、相关仪
                    systemDateHandler.handleTag(tag, strDeviceId, cellTag, systemDateTag);
                }

                if (operType == "WakeupResponse")
                {
                    devCode = strDeviceId;
                    sp.Write("+++");
                    LogHelper.Info("发送“+++”指令");
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("上传数据解析出错:" + ex.Message);
            }
        }

        public void analysisSignalValue(String receiveDate, SerialPort sp)
        {
            if (receiveDate.Contains("NO CARRIER"))
            {
                sp.Write("ATS124?" + Environment.NewLine);
                LogHelper.Info("发送“ATS124?+回车”指令");
            }
            else if (receiveDate.Contains("ATS124?"))
            {
                //ATS124?\r\nN/A\r\nOK\r\n
                string strReceiveDate = receiveDate.Replace("\r\n", ",");
                string[] signalArray = strReceiveDate.Split(',');
                DevStatus devStatus = CorrelatorDataSaveThread.devStatusMaps[devCode];
                devStatus.Signal = signalArray[1];
            }
        }

        private List<Tag> getTags(byte[] strTags)
        {
            List<Tag> tags = new List<Tag>();
            try
            {
                int i = 0;
                while (i < strTags.Length)
                {
                    //get each tag from strTag and construct tag list; 
                    byte[] oid = new byte[4];
                    byte[] len = new byte[2];
                    Array.Copy(strTags, i, oid, 0, 4);
                    Array.Copy(strTags, i + 4, len, 0, 2);

                    Array.Reverse(len);
                    int iLen = System.BitConverter.ToInt16(len, 0);
                    string strOid = StringUtil.ConvertBytes2String(oid);

                    byte[] value = new byte[iLen];
                    Array.Copy(strTags, i + 6, value, 0, iLen);

                    i = i + 6 + iLen;
                    //TODO LIST:Construct a tag according to oid
                    Tag tag = TagFactory.create(strOid, iLen, value);
                    tags.Add(tag);
                }
            }
            catch (Exception e)
            {
                LogHelper.Info("设备上传协议出错:" + e.Message);
            }

            return tags;
        }

        private CellTag getCellTag(List<Tag> tags)
        {
            foreach (Tag tag in tags)
            {
                if (tag != null && tag is CellTag)
                {
                    return (CellTag)tag;
                }
            }

            return null;
        }

        private SystemDateTag getSystemDateTag(List<Tag> tags)
        {
            foreach (Tag tag in tags)
            {
                if (tag != null && tag is SystemDateTag)
                {
                    return (SystemDateTag)tag;
                }
            }

            return null;
        }
    }
}