/**
  * sendCommand
  *
  * @param command
  * @return byte[] response
  * @throws Exception
  */
 public static byte[] sendCommand(byte[] cmd, CardChannel channel) throws Exception {
   if (channel == null) {
     throw new ChannelNotOpenException();
   }
   byte[] rep = null;
   ResponseAPDU r = null;
   try {
     CommandAPDU apdu = new CommandAPDU(cmd);
     try {
       System.out.println("APDU Command: " + BytesTool.byteArrayToHexString(apdu.getBytes()));
     } catch (ByteArrayToHexaStringException e) {
       throw e;
     }
     r = channel.transmit(apdu);
     rep = r.getBytes();
     try {
       System.out.println("APDU Response: " + BytesTool.byteArrayToHexString(rep));
     } catch (ByteArrayToHexaStringException e) {
       throw e;
     }
     return rep;
   } catch (CardException e) {
     e.printStackTrace();
     throw e;
   }
 }
  /**
   * sayHello (SELECT AID APDU ISO 7816-4)
   *
   * @param appletName
   * @param commandId
   * @return boolean
   */
  @Override
  public boolean sayHello(String appletName, int commandHelloId) {
    try {
      AppletModel model = null;
      try {
        model = SeqlMetadata.getInstance(configFile).getAppletByAlias(appletName);
      } catch (Exception e) {
        e.printStackTrace();
      }
      if (model == null) {
        callback.onNoApplet();
      }

      channel = openChannel(model);

      byte[] apdu = null;
      APDUResponse resp = new APDUResponse();
      try {
        // select the applet
        apdu = APDUModel.getSelectAidApdu(BytesTool.hexStringToByteArray(model.getAID()));
        apdu = sendCommand(apdu, channel);
        resp.setResponse(apdu);
        return APDUModel.isResponseSucceded(resp.getStatusWord());
      } catch (Exception e) {
        e.printStackTrace();
        callback.onNoApplet();
      }
    } catch (NoSuchElementException e) {
      callback.onNoApplet();
    } catch (IOException e) {
      callback.onNoSecureElement();
    } catch (NoReaderException e) {
      callback.onNoReader();
    } catch (NoSecureElementException e) {
      callback.onNoSecureElement();
    } catch (BadRequestException e) {
      callback.onBadRequest(e.getMessage());
    } catch (Exception e) {
      callback.onNotConnected();
    }
    return false;
  }