Как исправить "неожиданный нулевой приемник" в Android - PullRequest
1 голос
/ 25 апреля 2019

В моем перцовом роботе есть сервер python, и он отлично работает на машине. Я использую putty для запуска сервера и ncat для отправки моей команды, и нет никаких проблем. В моем фрагменте Connection мне нужно создать канал для отправки команды ssh роботу для запуска сервера, а затем мне нужно создать сокет для сервера. Затем, когда я отправляю пакет для подключения сервера к приложению с помощью этой команды: {'command': '< SYS_CONNECT>'} В ответ сервер должен отправить некоторую информацию о роботе, такую ​​как имя, уровень заряда батареи и т. Д., Но я только что получил нулевой с сервера.

Существует приложение, используемое для запуска в Android 5.1 и несколько лет назад. Теперь я решил создать новое приложение и импортировать некоторые классы и компоненты из старого приложения.

   private boolean connect(){
        state = ConnectionState.CONNECTION_INIT;

        for( String h : hostAdresses ){
            try{
                host = h;
                // create socket
                socket = new Socket( InetAddress.getByName(host).getHostAddress(), port );
                socket.setSoTimeout(defaultReadTimeout);
                in = new BufferedReader( new InputStreamReader( new BufferedInputStream(socket.getInputStream()) ) );
                out = socket.getOutputStream();

                // try to connect
                int tries = connectionMaxTries;
                while(!stop && socket != null && state == ConnectionState.CONNECTION_INIT && tries > 0) {


                    // send connection request

                    DataRequestPackage p = new DataRequestPackage(
                            PepperCommands.SYS_CONNECT,
                            new String[0]);
                    String data = gson.toJson(p);
                    // wait for data
                    //data = in.readLine();
                        try {
                            out.write(data.getBytes());
                            Log.w(TAG, "Sending data =" + data);
                            StringBuilder sb = new StringBuilder();
                            while ((data = in.readLine()) != null) {
                                sb.append(data);
                                Log.d(TAG, "loop data");
                            }
                            data = sb.toString();

                        } catch (Exception e) {
                            Log.d(TAG, "error on reading data");
                        }


                    Log.w(TAG, "Receiving data = " + data);
                    Log.w(TAG, "in.readLine(), data = " + in.readLine());

                    DataResponsePackage response = gson.fromJson(data, DataResponsePackage.class);

                    if( response.request.command == PepperCommands.SYS_CONNECT
                            && response.requestSuccessfull){
                        state = ConnectionState.CONNECTION_ESTABLISHED;
                        notifyDataRecievedListeners(response);
                        return true;
                    }

                    tries--;
                }

            }catch(UnknownHostException e){
                state = ConnectionState.CONNECTION_UNKNOWN_HOST;
                Log.w(TAG, "Host unknown " + host);

                MainActivity.getInstance().runOnUiThread( new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.getInstance().getApplicationContext(),
                                R.string.net_unknown_host, Toast.LENGTH_SHORT).show();
                    }
                });
            } catch (IOException e) {
                state = ConnectionState.CONNECTION_ESTABLISHED_FAILED;
                Log.w(TAG, "IO Exception on connnection with " + host + ":" + port);
            }
        }

        return false;
    }

Пытается запустить удаленный сервер, используя ssh.

    /**
     * Tries to start remote server using ssh.
     * @return {@code true} if server started, {@code false} otherwise.
     */
    private boolean sshServerStart(){

        // show message
        MainActivity.getInstance().runOnUiThread( new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.getInstance().getApplicationContext(),
                        R.string.net_try_server_start, Toast.LENGTH_SHORT).show();
            }
        });

        // send command
        String[] vCommands = new String[]{ SSH_COMMAND_SERVER_START };
        if( sendSSHCommands( vCommands ).size() > 0 ){

            // wait a few seconds for server to start
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {}

            return true;
        }

        return false;
    }

Подключение к серверу ssh

   /**
     * Connecting to ssh server
     * @return          {@code true} if successful connected, {@code false} otherwise.
     */
    private Session connectSSH(){
        for( String host : hostAdresses ){
            try {

                // get user information
                SharedPreferences vPreferences = MainActivity.getPreferences();
                String vUser = vPreferences.getString(PREFERENCES_SSH_USER, "nao");
                String vPassword = vPreferences.getString(PREFERENCES_SSH_PASSWORD, "nao");
                if( mUseCustomLoginData ){
                    vUser = mSSHUser;
                    vPassword = mSSHPassword;
                }

                // create session
                Session vSession = mSSH.getSession(vUser,
                        InetAddress.getByName(host).getHostAddress().toString(),
                        22 );
                vSession.setPassword( vPassword );

                // avoid asking for key auth
                Properties vProperties = new Properties();
                vProperties.put("StrictHostKeyChecking", "no");
                vSession.setConfig(vProperties);

                try{
                    // connect to ssh server
                    vSession.connect();
                } catch( JSchException err ){
                    if( err.getMessage().contains("Auth fail") ){

                        // ask for custom login data
                        if( askForCustomLoginData() ){
                            vSession = connectSSH();
                        } else {
                            return null;
                        }

                    } else {
                        System.out.println("EXCEPTION: " + err.getMessage());
                        err.printStackTrace();
                    }
                }

                return vSession;

            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (JSchException e) {
                e.printStackTrace();
            }

        }

        return null;
    }

Я ожидаю от этого кода response.request.command вернуть SYS_CONNECT и response.requestSuccessfull вернуть true для этой строки, но я получил неожиданный нулевой ответ

if( response.request.command == PepperCommands.SYS_CONNECT && response.requestSuccessfull){
...