docs: private boolean hello(InetAddress broadcast) {
          if (socket == null) return false;
          Command hello = new Command();
          byte[] helloMsg = hello.create();
          DatagramPacket packet;
          if (ip == null){
              if (this.acceptableModels == null) return false;
              packet = new DatagramPacket(helloMsg, helloMsg.length, broadcast, PORT);
          } else {
              packet = new DatagramPacket(helloMsg, helloMsg.length, ip, PORT);
          }
          try {
              socket.send(packet);
          } catch (IOException e) {
              return false;
          }
          packet = new DatagramPacket(rcv, rcv.length);
          try {
              socket.receive(packet);
          } catch (IOException e) {
              return false;
          }
          if (ip == null){
              ip = packet.getAddress();
          }
          byte[] worker = new byte[2];
          System.arraycopy(rcv, 2, worker, 0, 2);
          int length = (int)ByteArray.fromBytes(worker);
          worker = new byte[length];
          System.arraycopy(rcv, 0, worker, 0, length);
          Response response;
          try {
              response = new Response(worker, null);
          } catch (CommandExecutionException e) {
              return false;
          }
          if (token == null){
              if (!(response.getToken().equals(new Token("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",16)) || response.getToken().equals(new Token("00000000000000000000000000000000",16)))) {
                  token = response.getToken();
              } else {
                  return false;
              }
          }
          if (!((response.getDeviceID() == -1) || (response.getTimeStamp() == -1))){
              deviceID = response.getDeviceID();
              timeStamp = response.getTimeStamp();
              methodID = timeStamp & 0b1111111111111; // Possible collision about every 2 hours > acceptable
              if (this.acceptableModels != null){
                  boolean modelOk = false;
                  for (String s: this.acceptableModels) {
                      try {
                          if (s.equals(model())) modelOk = true;
                      } catch (CommandExecutionException ignored) {
                      }
                  }
                  return modelOk;
              }
              return true;
          }
          return false;
      }