Я работаю над консольным приложением C #.Я жестко закодировал запрос на мыло, в котором передал 200 уникальных идентификаторов, как показано ниже.
Запрос
<soapenv:Envelope
xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/""
xmlns:soap=""http://soap.inf.hexing.cn"">
<soapenv:Header/>
<soapenv:Body>
<soap:doCommand>
<!--Optional:-->
<arg0><![CDATA[<?xml version=""1.0"" encoding=""UTF-8""?>
<RequestMessage xmlns=""http://iec.ch/TC57/2011/schema/message""
xmlns:m=""http://iec.ch/TC57/2011/MeterReadSchedule#""
xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
xsi:schemaLocation=""http://iec.ch/TC57/2011/schema/message Message.xsd"">
<Header>
<Verb>create</Verb>
<Noun>MeterReadSchedule</Noun>
<Revision>2.0</Revision>
<Timestamp>" + timestamp + @"</Timestamp>
<Source>Hesco</Source>
<AsyncReplyFlag>false</AsyncReplyFlag>
<ReplyAddress>" + hexURL + @"</ReplyAddress>
<AckRequired>false</AckRequired>
<User>
<UserID>"+userID+@"</UserID>
</User>
<MessageID>String</MessageID>
<CorrelationID>String</CorrelationID>
<Property>
<Name>password</Name>
<Value>"+pass+@"</Value>
</Property>
<Property>
<Name>timeout(h)</Name>
<Value>8</Value>
</Property>
</Header>
<Payload>
<m:MeterReadSchedule>
<m:EndDevice>
<m:mRID></m:mRID>
<Names>
<name>37010732575</name>
</Names>
</m:EndDevice>
<m:EndDevice>
<m:mRID></m:mRID>
<Names>
<name>37010719918</name>
</Names>
</m:EndDevice>
.
.
200 ID's
.
.
<m:EndDevice>
<m:mRID></m:mRID>
<Names>
<name>37030315780</name>
</Names>
</m:EndDevice>
<m:ReadingType>
<m:Names>
<m:name>MonthlyBilling</m:name>
<m:NameType>
<m:name>BillingType</m:name>
</m:NameType>
</m:Names>
</m:ReadingType>
<m:TimeSchedule>
<m:recurrencePeriod>86400</m:recurrencePeriod>
<m:scheduleInterval>
<m:end>" + endTime + @"</m:end>
<m:start>" + startTime + @"</m:start>
</m:scheduleInterval>
</m:TimeSchedule>
</m:MeterReadSchedule>
</Payload>
</RequestMessage>]]></arg0>
</soap:doCommand>
</soapenv:Body>
</soapenv:Envelope>
После прохождения я могу получить ответ сзначения
Ответ
<ResponseMessage xmlns="http://iec.ch/TC57/2011/schema/message"
xmlns:m="http://iec.ch/TC57/2011/MeterReadings#"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://iec.ch/TC57/2011/schema/message Message.xsd">
<Header>
<Verb>created</Verb>
<Noun>MeterReadings</Noun>
<Timestamp>2019-04-22T14:41:15+04:30</Timestamp>
<Source>HES_BASE</Source>
<AsyncReplyFlag>true</AsyncReplyFlag>
<ReplyAddress>http://192.168.15.2:8090/HES/services/DoCommandRequest?wsdl</ReplyAddress>
<AckRequired>true</AckRequired>
<User>
<UserID>....</UserID>
</User>
<Property>
<Name>password</Name>
<Value>....</Value>
</Property>
<MessageID>85C67BF1-1C39-4FD1-B801-1FF693061672</MessageID>
<CorrelationID>String</CorrelationID>
</Header>
<Reply>
<Result>OK</Result>
<Error>
<code>0.0</code>
</Error>
</Reply>
<Payload>
<m:MeterReadings>
<m:MeterReading>
<m:valuesInterval>
<m:end>2019-03-31T00:00:00+04:30</m:end>
<m:start>2019-03-01T00:00:00+04:30</m:start>
</m:valuesInterval>
<m:Meter>
<m:Names>
<m:name>37010732575</m:name>
<m:NameType>
<m:name>28372830035610U</m:name>
</m:NameType>
</m:Names>
<m:mRID>002999001210</m:mRID>
</m:Meter>
<m:Readings>
<m:ReadingType ref="13.8.0.6.1.1.12.0.0.0.0.0.0.0.224.3.38.0" />
<m:ReadingQualities>
<m:ReadingQualityType ref="2.0.0" />
</m:ReadingQualities>
<m:timePeriod>
<m:end>2019-03-31T00:00:00+04:30</m:end>
<m:start>2019-03-01T00:00:00+04:30</m:start>
</m:timePeriod>
<m:value>1.45200</m:value>
<m:timeStamp>2019-03-01T00:00:00+04:30</m:timeStamp>
</m:Readings>
<m:Readings>
<m:ReadingType ref="13.8.0.6.1.1.8.0.0.0.0.0.0.0.224.3.38.0" />
<m:ReadingQualities>
<m:ReadingQualityType ref="2.0.0" />
</m:ReadingQualities>
<m:timePeriod>
<m:end>2019-03-31T00:00:00+04:30</m:end>
<m:start>2019-03-01T00:00:00+04:30</m:start>
</m:timePeriod>
<m:value>0.57400</m:value>
<m:timeStamp>2019-03-01T00:00:00+04:30</m:timeStamp>
</m:Readings>
<m:Readings>
<m:ReadingType ref="13.8.0.6.1.1.12.0.0.0.0.4.0.0.224.3.38.0" />
<m:ReadingQualities>
<m:ReadingQualityType ref="2.0.0" />
</m:ReadingQualities>
<m:timePeriod>
<m:end>2019-03-31T00:00:00+04:30</m:end>
<m:start>2019-03-01T00:00:00+04:30</m:start>
</m:timePeriod>
<m:value>0.00000</m:value>
<m:timeStamp>2019-03-01T00:00:00+04:30</m:timeStamp>
</m:Readings>
</m:MeterReading>
.
.
.
other values
.
.
.
<m:MeterReading>
<m:valuesInterval>
<m:end>2019-03-31T00:00:00+04:30</m:end>
<m:start>2019-03-01T00:00:00+04:30</m:start>
</m:valuesInterval>
<m:Meter>
<m:Names>
<m:name>37010734223</m:name>
<m:NameType>
<m:name>28371540085541U</m:name>
</m:NameType>
</m:Names>
<m:mRID>002999000828</m:mRID>
</m:Meter>
<m:Readings>
<m:ReadingType ref="13.8.0.6.1.1.12.0.0.0.0.0.0.0.224.3.38.0" />
<m:ReadingQualities>
<m:ReadingQualityType ref="2.0.0" />
</m:ReadingQualities>
<m:timePeriod>
<m:end>2019-03-31T00:00:00+04:30</m:end>
<m:start>2019-03-01T00:00:00+04:30</m:start>
</m:timePeriod>
<m:value>1.03200</m:value>
<m:timeStamp>2019-03-01T00:00:00+04:30</m:timeStamp>
</m:Readings>
</m:MeterReading>
<m:Reading />
</m:MeterReadings>
Код для получения ответа и значений
using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
{
using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
{
soapResult = rd.ReadToEnd();
var result = XmlDecode(soapResult);
XDocument doc = XDocument.Parse(result);
XmlReader read = doc.CreateReader();
DataSet ds = new DataSet();
ds.ReadXml(read);
read.Close();
if (ds.Tables.Count > 0 && ds.Tables["Reply"] != null && ds.Tables["Reply"].Rows.Count > 0)
{
kwhRead1 = GetRead(ds, ReadTypeEnum.KWH1);
kvhRead1 = GetRead(ds, ReadTypeEnum.KVH1);
mdiRead1 = GetRead(ds, ReadTypeEnum.MDI1);
kwhRead2 = GetRead(ds, ReadTypeEnum.KWH2);
kvhRead2 = GetRead(ds, ReadTypeEnum.KVH2);
mdiRead2 = GetRead(ds, ReadTypeEnum.MDI2);
string ts = GetTSpan(ds, ReadTypeEnum.KWH1).Replace("T", " ");
timeSpan = ts.Remove(ts.Length-6);
if (ds.Tables["Reply"].Rows[0][0].ToString().ToUpper() == "OK")
{
if (ds.Tables["Names"] != null && ds.Tables["Names"].Rows.Count > 0)
{
uniqueKey = ds.Tables["Names"].Rows[0]["name"].ToString();
}
if (ds.Tables["NameType"] != null && ds.Tables["NameType"].Rows.Count > 0)
{
refNo = ds.Tables["NameType"].Rows[0]["name"].ToString();
}
if (ds.Tables["Meter"] != null && ds.Tables["Meter"].Rows.Count > 0)
{
if (ds.Tables["Meter"].Columns.Contains("mRID"))
{
meterNo = ds.Tables["Meter"].Rows[0]["mRID"].ToString();
processedRec++;
}
}
}
}
}
}
Приведенный выше код дает мне значения только против 1-го ID.Как я могу получить все значения всех идентификаторов?
Обновление 1
Согласно jdweng
решению.Я пытался, и у меня все работает.В ответе много значений, поэтому я не хочу их всех.Я просто хочу полезных данных.Другими словами, существует много ReadingType
, но я хочу получить некоторые конкретные ReadingType
значения, перечисленные ниже
const string _readTypeKWH1 = "13.26.0.1.1.1.12.0.0.0.0.1.0.0.224.3.72.0";
const string _readTypeKWH2 = "13.26.0.1.1.1.12.0.0.0.0.2.0.0.224.3.72.0";
const string _readTypeKVH1 = "13.26.0.1.1.1.12.0.0.0.0.1.0.0.224.3.73.0";
const string _readTypeKVH2 = "13.26.0.1.1.1.12.0.0.0.0.2.0.0.224.3.73.0";
const string _readTypeMDI1 = "13.8.0.6.1.1.8.0.0.0.0.1.0.0.224.3.38.0";
const string _readTypeMDI2 = "13.8.0.6.1.1.8.0.0.0.0.2.0.0.224.3.38.0";
private enum ReadTypeEnum
{
KWH1,
KVH1,
MDI1,
KWH2,
KVH2,
MDI2,
}
Ранее для одного ответа я использовал функцию.
private static double GetRead(DataSet ds, ReadTypeEnum type, int i)
{
double TotRead = 0;
int ReadID = 0;
string readType = "";
try
{
if (ds.Tables.Count > 0)
{
if (ds.Tables["ReadingType"] != null && ds.Tables["ReadingType"].Rows.Count > 0)
{
switch (type)
{
case ReadTypeEnum.KWH1:
readType = _readTypeKWH1;
break;
case ReadTypeEnum.KVH1:
readType = _readTypeKVH1;
break;
case ReadTypeEnum.MDI1:
readType = _readTypeMDI1;
break;
case ReadTypeEnum.KWH2:
readType = _readTypeKWH2;
break;
case ReadTypeEnum.KVH2:
readType = _readTypeKVH2;
break;
case ReadTypeEnum.MDI2:
readType = _readTypeMDI2;
break;
default:
readType = _readTypeKWH1;
break;
}
DataRow[] dr = ds.Tables["ReadingType"].Select("ref='" + readType + "'");
if (dr != null && dr.Length > 0)
{
ReadID = int.Parse(dr[i]["Readings_Id"].ToString());
}
}
if (ReadID != 0 && ds.Tables["Readings"] != null && ds.Tables["Readings"].Rows.Count > 0)
{
DataRow[] drRead = ds.Tables["Readings"].Select("Readings_Id='" + ReadID.ToString() + "'");
if (drRead != null && drRead.Length > 0 && drRead[0]["value"] != null && !drRead[0]["value"].ToString().Equals("null"))
TotRead = double.Parse(drRead[0]["value"].ToString());
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return TotRead;
}
Как видите, эта функция уже вызывается в моем 1-м коде kwhRead1 = GetRead(ds, ReadTypeEnum.KWH1);
.Я хочу сделать то же самое.
Любая помощь будет принята с благодарностью.