Как подключить Android к AWS IoT с Paho TLS? - PullRequest
0 голосов
/ 04 марта 2020

Добрый день,

Я пытаюсь подключиться к AWS IoT с android, используя его SDK, никаких проблем с Android 7 и выше. Но есть проблема совместимости с версиями ниже. Это подробно описано в этом выпуске . Я пытался использовать Paho в качестве клиентской библиотеки, но не смог понять, как использовать эти сертификаты с фабрикой Socket. Любая идея, как я могу использовать эти сертификаты с некоторой клиентской библиотекой MQTT?

В Java SDK было довольно легко подключиться и никаких проблем, мне не пришлось использовать хранилище ключей для этого. Почему Android необходимо использовать хранилище ключей для управления этими сертификатами? Нужно ли устанавливать эти сертификаты в настройках безопасности?

Я пытался использовать эту оболочку . Но довольно запутанно, как он использует эти хранилища ключей. Это бросает и исключение, поскольку это не может создать это. Используя эту обертку, я смог внести некоторые изменения и заставить ее работать. Но это ничего не вызывает ни onFail, ни onSuccess.

Вот что я сделал:

Класс SocketFactory можно найти здесь


void MqttSetup() {
        CLIENT = new MqttAndroidClient(getBaseContext(), BROKER, MqttClient.generateClientId());
        MQTT_CONNECTION_OPTIONS = new MqttConnectOptions();

        /**
         * SSL broker requires a certificate to authenticate their connection
         * Certificate can be found in resources folder /res/raw/
         */
        SocketFactory.SocketFactoryOptions socketFactoryOptions = new SocketFactory.SocketFactoryOptions();
        try {
            socketFactoryOptions.withCaInputStream(getResources().openRawResource(R.raw.keystore));
            MQTT_CONNECTION_OPTIONS.setSocketFactory(new SocketFactory(socketFactoryOptions));
        } catch (IOException | NoSuchAlgorithmException | KeyStoreException | CertificateException | KeyManagementException | UnrecoverableKeyException e) {
            e.printStackTrace();
        }
    }

    void MqttConnect() {
        try {
            final IMqttToken token = CLIENT.connect(MQTT_CONNECTION_OPTIONS);
            token.setActionCallback(new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    // We are connected
                    Log.d("mqtt:", "connected, token:" + asyncActionToken.toString());
                    subscribe(TOPIC, (byte) 1);
                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    // Something went wrong e.g. connection timeout or firewall problems
                    Log.d("mqtt:", "not connected" + asyncActionToken.toString());
                }
            });
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

Когда я пытаюсь подключиться к брокеру, кажется, что он может установить соединение, как оно зарегистрировано в Monitor of Aws IoT. Но эти слушатели не срабатывают, и нет никаких исключений. Я думал, что я не могу загружать эти сертификаты должным образом.

У меня есть следующие файлы, загруженные из Aws IoT (не знаю, как связать их в хранилище ключей и получить к ним доступ):

  • certificate.pem.crt
  • private.pem.key
  • publi c .pem.key

Спасибо.

...