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; } } }