У меня есть приложение, которое обменивается данными со встроенным устройством, используя пользовательский протокол, созданный поверх udp. Чтобы убедиться, что устройство все еще находится в сети, у меня есть принимающая сторона гнезда дейтаграммы с таймаутом в 1 секунду. Если тайм-аут срабатывает, я отправляю эхо-запрос на встроенное устройство и жду еще секунду (если это происходит дважды, я предполагаю, что дальнейшая связь невозможна, и изменяю внутреннее состояние приложения на отключенное).
При тестировании приложения было замечено, что приложение внезапно переключится в отключенное состояние (это может происходить в любом месте от 5 минут до 2,5 часов работы). На встроенном устройстве не было ошибок, и tcpdump показывает, что встроенное устройство ответило в течение 30 мс. tcpdump также показывает, что окончательный набор эхо-запросов был отправлен на сервер менее чем за 10 мс
отображение данных tcpdump с помощью wireshark
Я не знаю, какова вероятность того, что системные часы внезапно перейдут во времени, но это то, что выглядит как происходящее.
Да, и это было проверено на следующих устройствах:
- Пиксель 2
- Sumsung S9
- Основной телефон
- Старое устройство LG
- Samsung Galexy Tab 3
Эта проблема была задокументирована только на вкладке Galaxy
Кто-нибудь еще заметил проблемы с синхронизацией с этим или другими устройствами, где событие будет срабатывать раньше? В частности, где системные часы сообщат, что прошло больше времени, чем на самом деле? Если так, какие-либо предложения о том, как я могу уменьшить это? Если нет, кто-нибудь знает, что еще может быть причиной этих симптомов?
Журналы времени от слушателя udp с использованием SystemClock.elaspedRealtime()
и SystemClock.uptimeMillis()
:
pre recieve: elapsedRealtime: 191128173 uptimemillis: 106498062
pre recieve: elapsedRealtime: 191129199 uptimemillis: 106499088
pre recieve: elapsedRealtime: 191130224 uptimemillis: 106500113
pre recieve: elapsedRealtime: 191131252 uptimemillis: 106501141
pre recieve: elapsedRealtime: 191132278 uptimemillis: 106502167
pre recieve: elapsedRealtime: 191133301 uptimemillis: 106503190
pre recieve: elapsedRealtime: 191134325 uptimemillis: 106504214
pre recieve: elapsedRealtime: 191135350 uptimemillis: 106505239
pre recieve: elapsedRealtime: 191136376 uptimemillis: 106506265
pre recieve: elapsedRealtime: 191137400 uptimemillis: 106507289
post timeout: elapsedRealtime: 191138404 uptimemillis: 106508293
pre recieve: elapsedRealtime: 191138406 uptimemillis: 106508295
post timeout: elapsedRealtime: 191139409 uptimemillis: 106509298