#kotlin #webrtc #kotlin-coroutines
Вопрос:
В настоящее время я пытаюсь открыть канал связи WebRTC между Raspberry Pi и мобильным устройством. Приложение разрабатывается в Котлине на основе существующей демо-версии: https://github.com/shepeliev/webrtc-kmp-demo.
Для сервера сигнализации я использовал код из следующего примера: https://kotlinlang.org/docs/mobile/connect-to-platform-specific-apis.html#example-send-and-receive-messages-from-a-websocket
Это та часть кода, с которой у меня возникли проблемы:
appSocket.messageListener = {
Log.d(tag,"Mensagem recebida: $it")
msg = Json.decodeFromString(it)
when(msg.what){
"offer" -> {
val description = SessionDescription(SessionDescriptionType.Offer, msg.data)
localPeerConnection?.setRemoteDescription(description)
val answer = localPeerConnection?.createAnswer(OfferAnswerOptions())
Log.d(tag, "Answer to raspPi is: $answer")
appSocket.send(Json.encodeToString(answer))
localPeerConnection?.setLocalDescription(answer!!)
}
}
}
Каждый раз, когда я получаю сообщение, мне нужны эти функции в операторе when, но они взяты из другого контекста и могут вызываться только внутри области сопрограммы. Я получаю ошибку: Suspension functions can be called only within coroutine body
. Тело сопрограммы находится за пределами appSocket.messageListener
.
Я должен добавить, чтобы уточнить, что localPeerConnection?.setRemoteDescription(description)
localPeerConnection?.createAnswer(OfferAnswerOptions())
и localPeerConnection?.setLocalDescription(answer!!)
являются рассматриваемыми функциями приостановки. Если я напишу код так:
appSocket.messageListener = {
Log.d(tag,"Mensagem recebida: $it")
msg = Json.decodeFromString(it)
}
when(msg.what){
"offer" -> {
val description = SessionDescription(SessionDescriptionType.Offer, msg.data)
localPeerConnection?.setRemoteDescription(description)
val answer = localPeerConnection?.createAnswer(OfferAnswerOptions())
Log.d(tag, "Answer to raspPi is: $answer")
appSocket.send(Json.encodeToString(answer))
localPeerConnection?.setLocalDescription(answer!!)
}
}
функции приостановки вызываются правильно, но не выполняют работу, когда я получаю сообщение websocket. Есть ли какой-нибудь способ, которым я могу прослушивать каждый раз appSocket.messagelistener
, когда получаю сообщение, и when
активировать инструкцию? Или я могу каким-то образом унаследовать контекст сопрограммы внутри appSocket.messagelistener
и иметь when
там оператор?
Спасибо вам за вашу помощь.
Комментарии:
1. Я не знаю, какая функция приостановлена в вашем примере, но вам нужно запустить ее в сопрограмме, в зависимости от функции это должна быть ваша сетевая или веб-сокетная сопрограмма или что-то еще.