Резюме:
postNegotiateSecurity()
никогда не завершается negotiateSecurity.postNegotiateSecurityLength()
может излучать один или несколько раз negotiateSecurity.postNegotiateSecurityPGKData()
может излучать один или несколько раз
Анализ (пропущены журналы для удобства чтения):
it.take(1)
.flatMapCompletable { connection ->
postLength
.flatMapSingle { connection.write(it.bytes.toByteArray()) }
.flatMap {
postPGK // may emit more than one value
.flatMapSingle { connection.write(it.bytes.toByteArray()) }
}
.take(1) // first emission from the above `flatMap` will finish the upstream
.ignoreElements()
}
Каждый выброс с postLength
будет начинать характеристическую запись.Каждая успешная запись запускает подписку на postPGK
.Если postLength
будет излучаться более одного раза - будет сделано больше подписок на postPGK
.
Каждая подписка на postPGK
, скорее всего, приведет к множественным выбросам.Каждая эмиссия будет затем отображена на характеристическую запись.Каждая запись, успешная запись, будет выдавать значение.
После первого выброса из вышеупомянутой записи записи будет удален восходящий поток (из-за оператора .take(1)
).
Если postNegotiateSecurity()
фактически запущен, он также завершит работу или выдаст ошибку (учитывая, что и postLength
, и postPGK
будут излучать хотя бы одно значение), поскольку здесь нет дополнительной логики.
Заключение
postNegotiateSecurity()
скорее всего завершится (но не по назначению), поскольку первый пакет из postPGK
завершит его.Я бы предположил, что периферийное устройство ожидает полных данных, прежде чем оно будет уведомлять что-либо, поэтому оно ожидает полной передачи PGK, что не произойдет, как показано выше.
Журналы из приложения с установленным RxBleLog.setLogLevel(RxBleLog.VERBOSE)
могутпомочь с пониманием того, что на самом деле произошло.