Добрый день,
Я пытаюсь подключиться к 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
Спасибо.