code: @Override
      public Message buildMessage(byte[] messageBody) {
          String firmwareName;
  
          // Error handling
          if (messageBody.length < 2) {
              log.error("Invalid message body length for SysexReportFirmware. Length: {}.", messageBody.length);
              return null;
          }
  
          if (messageBody.length == 2) {
              // No name was given
              firmwareName = "";
          }
          else {
              try {
                  firmwareName = FirmataHelper.decodeTwoSevenBitByteString(messageBody, 2, messageBody.length - 2);
              } catch (UnsupportedEncodingException e) {
                  log.error("Unable to decode firmware name. Bytes: {}. E: {}.",
                          FirmataHelper.bytesToHexString(messageBody),
                          e.getMessage());
                  e.printStackTrace();
                  firmwareName = null;
              }
          }
  
          return new SysexReportFirmwareMessage(
                  (int) messageBody[0],
                  (int) messageBody[1],
                  firmwareName
          );
      }
docs: Build a SysexReportFirmwareMessage from the given byte array.
  The protocol dictates the packet should be byte 0 = Major version int, byte 1 = Minor version int,
  bytes 2-n = Firmware name in ASCII (Firmata 'TwoSevenBitBytes' format).
  
  @param messageBody byte array representing the SysexReportFirmwareMessage response from the SerialPort.
  @return SysexReportFirmwareMessage built from the byte array.