code: protected ServiceRequest getServiceRequest(final KNXnetIPHeader h, final byte[] data, final int offset)
  		throws KNXFormatException
  	{
  		try {
  			return PacketHelper.getServiceRequest(h, data, offset);
  		}
  		catch (final KNXFormatException e) {
  			// check if at least the connection header of the service request
  			// is correct and try to get its values
  			final ServiceRequest req = PacketHelper.getEmptyServiceRequest(h, data, offset);
  			logger.warn("received request with unknown cEMI data " + DataUnitBuilder.toHex(
  					Arrays.copyOfRange(data, offset + 4, offset + h.getTotalLength() - h.getStructLength()),
  					" "), e);
  			return req;
  		}
  	}
docs: Extracts the service request out of the supplied packet data.
  
  @param h packet KNXnet/IP header
  @param data contains the data following the KNXnet/IP header
  @param offset offset into <code>data</code> to message structure past KNXnet/IP header
  @return the service request
  @throws KNXFormatException on failure to extract (even an empty) service request