public static HandleReadRequest ( |
||
settings | DLMS settings. | |
server | DLMS server. | |
data | Received data. | |
replyData | ||
xml | ||
리턴 | void |
public static void HandleReadRequest(GXDLMSSettings settings, GXDLMSServer server, GXByteBuffer data, GXByteBuffer replyData, GXDLMSTranslatorStructure xml)
{
GXByteBuffer bb = new GXByteBuffer();
int cnt = 0xFF;
byte type = 0;
List<ValueEventArgs> list = new List<ValueEventArgs>();
//If get next frame.
if (xml == null && data.Size == 0)
{
if (server.transaction != null)
{
return;
}
bb.Set(replyData);
replyData.Clear();
foreach (ValueEventArgs it in server.transaction.targets)
{
list.Add(it);
}
}
else
{
cnt = GXCommon.GetObjectCount(data);
List<ValueEventArgs> reads = new List<ValueEventArgs>();
List<ValueEventArgs> actions = new List<ValueEventArgs>();
if (xml != null)
{
xml.AppendStartTag(Command.ReadRequest, "Qty", xml.IntegerToHex(cnt, 2));
}
for (int pos = 0; pos != cnt; ++pos)
{
type = data.GetUInt8();
if (type == (byte)VariableAccessSpecification.VariableName ||
type == (byte)VariableAccessSpecification.ParameterisedAccess)
{
HandleRead(settings, server, type, data, list, reads, actions, replyData, xml);
}
else if (type == (byte)VariableAccessSpecification.BlockNumberAccess)
{
HandleReadBlockNumberAccess(settings, server, data, replyData, xml);
if (xml != null)
{
xml.AppendEndTag(Command.ReadRequest);
}
return;
}
else if (type == (byte)VariableAccessSpecification.ReadDataBlockAccess)
{
HandleReadDataBlockAccess(settings, server, Command.ReadResponse, data, cnt, replyData, xml);
if (xml != null)
{
xml.AppendEndTag(Command.ReadRequest);
}
return;
}
else
{
ReturnSNError(settings, server, Command.ReadResponse, ErrorCode.ReadWriteDenied, replyData);
if (xml != null)
{
xml.AppendEndTag(Command.ReadRequest);
}
return;
}
}
if (reads.Count != 0)
{
server.NotifyRead(reads.ToArray());
}
if (actions.Count != 0)
{
server.NotifyAction(actions.ToArray());
}
}
if (xml != null)
{
xml.AppendEndTag(Command.ReadRequest);
return;
}
byte requestType = (byte)GetReadData(settings, list.ToArray(), bb);
GXDLMSSNParameters p = new GXDLMSSNParameters(settings, Command.ReadResponse, list.Count, requestType, null, bb);
GXDLMS.GetSNPdu(p, replyData);
if (server.transaction == null && (bb.Size != bb.Position || settings.Count != settings.Index))
{
List<ValueEventArgs> reads = new List<ValueEventArgs>();
foreach (var it in list)
{
reads.Add(it);
}
server.transaction = new GXDLMSLongTransaction(reads.ToArray(), Command.ReadRequest, bb);
}
else if (server.transaction != null)
{
replyData.Set(bb);
return;
}
}
///<summary> /// Handle received command. ///</summary> private byte[] HandleCommand(Command cmd, GXByteBuffer data, GXDLMSConnectionEventArgs connectionInfo) { byte frame = 0; switch (cmd) { case Command.AccessRequest: GXDLMSLNCommandHandler.HandleAccessRequest(Settings, this, data, replyData, null); break; case Command.SetRequest: GXDLMSLNCommandHandler.HandleSetRequest(Settings, this, data, replyData, null); break; case Command.WriteRequest: GXDLMSSNCommandHandler.HandleWriteRequest(Settings, this, data, replyData, null); break; case Command.GetRequest: if (data.Size != 0) { GXDLMSLNCommandHandler.HandleGetRequest(Settings, this, data, replyData, null); } break; case Command.ReadRequest: GXDLMSSNCommandHandler.HandleReadRequest(Settings, this, data, replyData, null); break; case Command.MethodRequest: GXDLMSLNCommandHandler.HandleMethodRequest(Settings, this, data, connectionInfo, replyData, null); break; case Command.Snrm: HandleSnrmRequest(); frame = (byte)Command.Ua; break; case Command.Aarq: HandleAarqRequest(data, connectionInfo); break; case Command.ReleaseRequest: case Command.DisconnectRequest: GenerateDisconnectRequest(); Settings.Connected = false; Disconnected(connectionInfo); frame = (byte)Command.Ua; break; case Command.None: //Get next frame. break; default: Debug.WriteLine("Invalid command: " + (int)cmd); break; } byte[] reply; if (this.InterfaceType == Enums.InterfaceType.WRAPPER) { reply = GXDLMS.GetWrapperFrame(Settings, replyData); } else { reply = GXDLMS.GetHdlcFrame(Settings, frame, replyData); } return(reply); }