code: public byte[] deliverSm(int sequenceNumber, String serviceType,
              byte sourceAddrTon, byte sourceAddrNpi, String sourceAddr,
              byte destAddrTon, byte destAddrNpi, String destinationAddr,
              byte esmClass, byte protocolId, byte priorityFlag,
              byte registeredDelivery, byte dataCoding, byte[] shortMessage,
              OptionalParameter... optionalParameters) throws PDUStringException {
  
          StringValidator.validateString(serviceType,
                  StringParameter.SERVICE_TYPE);
          StringValidator.validateString(sourceAddr, StringParameter.SOURCE_ADDR);
          StringValidator.validateString(destinationAddr,
                  StringParameter.DESTINATION_ADDR);
          StringValidator.validateString(shortMessage,
                  StringParameter.SHORT_MESSAGE);
  
          PDUByteBuffer buf = new PDUByteBuffer(SMPPConstant.CID_DELIVER_SM, 0,
                  sequenceNumber);
          buf.append(serviceType);
          buf.append(sourceAddrTon);
          buf.append(sourceAddrNpi);
          buf.append(sourceAddr);
          buf.append(destAddrTon);
          buf.append(destAddrNpi);
          buf.append(destinationAddr);
          buf.append(esmClass);
          buf.append(protocolId);
          buf.append(priorityFlag);
          buf.append((String)null); // schedule delivery time
          buf.append((String)null); // validity period
          buf.append(registeredDelivery);
          buf.append((byte)0); // replace if present flag
          buf.append(dataCoding);
          buf.append((byte)0); // sm default msg id
          buf.append((byte)shortMessage.length);
          buf.append(shortMessage);
          buf.appendAll(optionalParameters);
          ;
          return buf.toBytes();
      }
docs: /*
  (non-Javadoc)
  
  @see org.jsmpp.util.PDUComposer#deliverSm(int, java.lang.String, byte,
  byte, java.lang.String, byte, byte, java.lang.String, byte, byte,
  byte, byte, byte, byte[], org.jsmpp.bean.OptionalParameter[])