示例#1
0
 /// <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);
     }
 }
示例#2
0
 /// <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);
     }
 }
示例#3
0
        /// <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);
            }
        }