/// <summary> /// Generates the APDU for a GET request </summary> /// <param name="att"> LnDescriptor describing the object to be accessed </param> /// <returns> byte array representation of the APDU </returns> /// <exception cref="DlmsException"> </exception> public byte[] requestGet(LnDescriptor att) { try { System.IO.MemoryStream stream = new System.IO.MemoryStream(); stream.WriteByte(Constants.xDlmsApdu.NoCiphering.GET_REQUEST); stream.WriteByte((byte)(connection.datablock.blockNum == 0 ? 1 : 2)); stream.WriteByte((byte)(parameters.priority | parameters.serviceClass | Constants.INVOKE_ID)); if (connection.datablock.blockNum != 0) { //stream.WriteByte(ByteBuffer.allocate(4).putInt(connection.datablock.blockNum).array()); stream.Write(new byte[] { (byte)(connection.datablock.blockNum >> 24), (byte)(connection.datablock.blockNum >> 16), (byte)(connection.datablock.blockNum >> 8), (byte)(connection.datablock.blockNum) }, 0, 4); } else { //Array.Reverse(att.getClassId()); stream.Write(att.getClassId(), 0, att.getClassId().Length); //Array.Reverse(att.getObis()); stream.Write(att.getObis(), 0, att.getObis().Length); stream.WriteByte((byte)(att.getIndex())); stream.WriteByte((byte)(att.getRequestData().Length == 0 ? 0 : 1)); //Array.Reverse(att.getRequestData()); stream.Write(att.getRequestData(), 0, att.getRequestData().Length); } return(packFrame(Constants.xDlmsApdu.GlobalCiphering.GET_REQUEST, stream.ToArray())); } catch (IOException) { throw new DlmsException(DlmsException.DlmsExceptionReason.INTERNAL_ERROR); } }
/// <summary> /// Generates the APDU for a ACTION request </summary> /// <param name="att"> LnDescriptor describing the object to be accessed </param> /// <returns> byte array representation of the APDU </returns> /// <exception cref="DlmsException"> </exception> public byte[] requestAction(LnDescriptor att) { try { System.IO.MemoryStream stream = new System.IO.MemoryStream(); stream.WriteByte(Constants.xDlmsApdu.NoCiphering.ACTION_REQUEST); stream.WriteByte(1); stream.WriteByte((byte)(parameters.priority | parameters.serviceClass | Constants.INVOKE_ID)); //Array.Reverse(att.getClassId()); stream.Write(att.getClassId(), 0, att.getClassId().Length); //.Reverse(att.getObis()); stream.Write(att.getObis(), 0, att.getObis().Length); stream.WriteByte((byte)(att.getIndex())); stream.WriteByte((byte)(att.getRequestData().Length == 0 ? 0 : 1)); //Array.Reverse(att.getRequestData()); stream.Write(att.getRequestData(), 0, att.getRequestData().Length); return(packFrame(Constants.xDlmsApdu.GlobalCiphering.ACTION_REQUEST, stream.ToArray())); } catch (IOException) { throw new DlmsException(DlmsException.DlmsExceptionReason.INTERNAL_ERROR); } }
/// <summary> /// Generates the APDU for a SET request </summary> /// <param name="att"> LnDescriptor describing the object to be accessed </param> /// <returns> byte array representation of the APDU </returns> /// <exception cref="DlmsException"> </exception> public byte[] requestSet(LnDescriptor att) { try { System.IO.MemoryStream stream = new System.IO.MemoryStream(); stream.WriteByte(Constants.xDlmsApdu.NoCiphering.SET_REQUEST); byte[] data = att.getRequestData(); if (data.Length > (connection.maxPduSize - 50)) { if (connection.datablock.nextBlockNum == 1) { connection.datablock.setData(data, connection.maxPduSize - 50); //Set-Request-With-First-Datablock stream.WriteByte(2); stream.WriteByte((byte)(parameters.priority | parameters.serviceClass | Constants.INVOKE_ID)); //Array.Reverse(att.getClassId()); stream.Write(att.getClassId(), 0, att.getClassId().Length); //Array.Reverse(att.getObis()); stream.Write(att.getObis(), 0, att.getObis().Length); stream.WriteByte((byte)(att.getIndex())); stream.WriteByte(0); stream.WriteByte(0); //Array.Reverse(connection.datablock.getNextBlockNum()); stream.Write(connection.datablock.getNextBlockNum(), 0, connection.datablock.getNextBlockNum().Length); byte[] blockdata = connection.datablock.getNextBlock(); if (blockdata.Length > 128) { stream.WriteByte(0x81); } stream.WriteByte((byte)(blockdata.Length)); //Array.Reverse(blockdata); stream.Write(blockdata, 0, blockdata.Length); } else { //Set-Request-With-Datablock stream.WriteByte(3); stream.WriteByte((byte)(parameters.priority | parameters.serviceClass | Constants.INVOKE_ID)); if (connection.datablock.nextIsLast()) { stream.WriteByte(1); } else { stream.WriteByte(0); } //Array.Reverse(connection.datablock.getNextBlockNum()); stream.Write(connection.datablock.getNextBlockNum(), 0, connection.datablock.getNextBlockNum().Length); byte[] blockdata = connection.datablock.getNextBlock(); if (blockdata.Length > 128) { stream.WriteByte(0x81); } stream.WriteByte((byte)(blockdata.Length)); //Array.Reverse(blockdata); stream.Write(blockdata, 0, blockdata.Length); } } else { //Set-Request-Normal stream.WriteByte(1); stream.WriteByte((byte)(parameters.priority | parameters.serviceClass | Constants.INVOKE_ID)); //Array.Reverse(att.getClassId()); stream.Write(att.getClassId(), 0, att.getClassId().Length); //Array.Reverse(att.getObis()); stream.Write(att.getObis(), 0, att.getObis().Length); stream.WriteByte((byte)(att.getIndex())); stream.WriteByte(0); //Array.Reverse(att.getRequestData()); stream.Write(att.getRequestData(), 0, att.getRequestData().Length); } return(packFrame(Constants.xDlmsApdu.GlobalCiphering.SET_REQUEST, stream.ToArray())); } catch (IOException) { throw new DlmsException(DlmsException.DlmsExceptionReason.INTERNAL_ERROR); } }