public override void SimulatorStart() { if (simulatorTimer == null) { simulatorTimer = new Timer(delegate { Task.Run(() => { for (int i = 0; i < this.IODevices.Count; i++) { try { ParaPack devicePack = new ParaPack(this.IODevices[i].IO_DEVICE_PARASTRING); //构造Json模拟数据 MqttJsonObject mqttJsonObject = new MqttJsonObject(); mqttJsonObject.paras = new List <MqttJsonPara>(); mqttJsonObject.device = new MqttJsonDevice() { hard_version = "1.0.0", run_time = "", soft_version = "1.0.0", status = "normal", uid = devicePack.GetValue("设备识别号") }; for (int p = 0; p < this.IODevices[i].IOParas.Count; p++) { if (this.IODevices[i].IOParas[p].IO_POINTTYPE == "模拟量" || this.IODevices[i].IOParas[p].IO_POINTTYPE == "开关量") { int simulatorValue = 0; if (this.IODevices[i].IOParas[p].IO_MINVALUE != this.IODevices[i].IOParas[p].IO_MAXVALUE) { int min = -100; if (this.IODevices[i].IOParas[p].IO_MINVALUE != null && this.IODevices[i].IOParas[p].IO_MINVALUE != "") { min = int.Parse(this.IODevices[i].IOParas[p].IO_MINVALUE); } int max = 100; if (this.IODevices[i].IOParas[p].IO_MAXVALUE != null && this.IODevices[i].IOParas[p].IO_MAXVALUE != "") { min = int.Parse(this.IODevices[i].IOParas[p].IO_MAXVALUE); } simulatorValue = random.Next(min, max); } else { simulatorValue = random.Next(-100, 100); } ParaPack paraPack = new ParaPack(this.IODevices[i].IOParas[p].IO_PARASTRING); mqttJsonObject.paras.Add(new MqttJsonPara() { name = paraPack.GetValue("JSON名称"), datatype = paraPack.GetValue("数据类型"), iotype = "analog", version = "1.0.0", data = new List <object>() { DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), paraPack.GetValue("版子地址"), paraPack.GetValue("端口号"), simulatorValue } }); } } // string json = ScadaHexByteOperator.ObjectToJson(mqttJsonObject); if (mqttJsonObject != null) { byte[] datas = ScadaHexByteOperator.StringToUTF8Byte(json); this.ReceiveData(this.IOServer, this.IOCommunication, this.IODevices[i], datas, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } this.SimulatorAppendLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 时间初始化一条设备模拟数据!"); } catch (Exception emx) { this.SimulatorAppendLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 接收数据错误! " + emx.Message); } } }); }, null, 1000, Internal * 1000); } }
protected override IOData Analysis(IO_SERVER server, IO_COMMUNICATION Communication, IO_DEVICE device, IO_PARA para, byte[] datas, DateTime datatime, object sender) { ParaPack commPack = new ParaPack(Communication.IO_COMM_PARASTRING); ParaPack devicePack = new ParaPack(device.IO_DEVICE_PARASTRING); IOData data = new IOData(); data.QualityStamp = QualityStamp.BAD; if (device == null) { return(data); } if (para == null) { return(data); } if (sender == null) { return(data); } if (datas.Length <= 0) { return(data); } if (commPack.GetValue("数据格式") == "江苏协昌环保股份有限公司") { #region 江苏协昌环保股份有限公司 try { ParaPack paraPack = new ParaPack(para.IO_PARASTRING); string deviceUid = devicePack.GetValue("设备识别号").Trim(); data.CommunicationID = Communication.IO_COMM_ID; data.ID = device.IO_DEVICE_ADDRESS; data.ParaName = para.IO_NAME; data.ServerID = server.SERVER_ID; data.Date = DateTime.Now; string str = ScadaHexByteOperator.UTF8ByteToString(datas); MqttJsonObject mqttJsonObject = (MqttJsonObject)sender; if (mqttJsonObject != null && !string.IsNullOrEmpty(deviceUid) && mqttJsonObject.device.uid.Trim() == deviceUid.Trim()) { //由于一次性获取的是所有数据,所以需要解析所有数据 data.QualityStamp = QualityStamp.GOOD; string jsonname = paraPack.GetValue("JSON名称").Trim(); string boardAddress = paraPack.GetValue("版子地址"); string boardIndex = paraPack.GetValue("版子索引号"); string port = paraPack.GetValue("端口号"); string portIndex = paraPack.GetValue("端口索引号"); string DataType = paraPack.GetValue("数据类型"); string valueIndex = paraPack.GetValue("采集值索引号"); if (mqttJsonObject.paras != null) { MqttJsonPara selectObj = mqttJsonObject.paras.Find(x => x.name.Trim() == jsonname.Trim()); if (selectObj != null) { if (selectObj.data != null && selectObj.data.Count > 0) { string date = selectObj.data[0].ToString(); try { ///解析Json数据 DateTime?dateTime = GetDateTime(date); if (dateTime != null) { string pboardAddress = selectObj.data[int.Parse(boardIndex)].ToString(); string pport = selectObj.data[int.Parse(portIndex)].ToString(); string value = selectObj.data[int.Parse(valueIndex)].ToString(); data.QualityStamp = QualityStamp.GOOD; data.ParaValue = value; data.Date = dateTime; } else { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } catch (Exception emx) { this.DeviceException(emx.Message); data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } } else { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } } else { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } catch (Exception emx) { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); this.DeviceException(emx.Message); } #endregion } else if (commPack.GetValue("数据格式") == "通用MQTT解析") { #region 通用MQTT解析 try { ParaPack paraPack = new ParaPack(para.IO_PARASTRING); string deviceUid = devicePack.GetValue("设备ID编码").Trim(); data.CommunicationID = Communication.IO_COMM_ID; data.ID = device.IO_DEVICE_ADDRESS; data.ParaName = para.IO_NAME; data.ServerID = server.SERVER_ID; data.Date = DateTime.Now; string str = ScadaHexByteOperator.UTF8ByteToString(datas); CommonMqttJsonObject mqttJsonObject = (CommonMqttJsonObject)sender; if (mqttJsonObject != null && !string.IsNullOrEmpty(deviceUid) && mqttJsonObject.device.uid.Trim() == deviceUid.Trim()) { //由于一次性获取的是所有数据,所以需要解析所有数据 data.QualityStamp = QualityStamp.GOOD; string jsonname = paraPack.GetValue("IO标识").Trim(); string timeIndex = paraPack.GetValue("时间值索引"); string DataType = paraPack.GetValue("数据类型"); string valueIndex = paraPack.GetValue("采集值索引"); if (DataType == "命令参数") { data.QualityStamp = QualityStamp.GOOD; data.ParaValue = data.QualityStampValue.ToString(); return(data); } //采集参数 if (mqttJsonObject.paras != null) { CommonMqttJsonPara selectObj = mqttJsonObject.paras.Find(x => x.name.Trim() == jsonname.Trim()); if (selectObj != null) { if (selectObj.data != null && selectObj.data.Count > 0) { string date = selectObj.data.Count > (int.Parse(timeIndex) + 1)? selectObj.data[int.Parse(timeIndex)].ToString():DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,f"); try { ///解析Json数据 DateTime?dateTime = GetDateTime(date); if (dateTime != null) { string value = selectObj.data.Count > (int.Parse(valueIndex) + 1) ? selectObj.data[int.Parse(valueIndex)].ToString():"-9999"; data.QualityStamp = value != "-9999"?QualityStamp.GOOD: QualityStamp.BAD; data.ParaValue = value; data.Date = dateTime; } else { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } catch (Exception emx) { this.DeviceException(emx.Message); data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } } else { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } } else { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } catch (Exception emx) { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); this.DeviceException(emx.Message); } #endregion } return(data); }