
Наконец мой мессенджер прошёл тест в Google Play . За время тестирования он научился совершать звонки по udp. Это позволило по udp получать не только голос, но и пинок от сервера на проверку сообщений в реальном времени. Осталось придумать как без внешних сервисов, вроде FCM, не засыпать вместе с системой и не давать андроиду прибить процесс приложения, чтоб принять udp пендаль в любое время. Так как мессенджер ориентирован на пользователей роутеров Mikrotik, на роутер и была возложена такая задача. Не давать телефону спать :). В качестве энергетика будет выступать DHCP Lease. В приложении я подписываюсь на изменения параметров сети, и выполняю задачу в обычном executor.
private void registerNetworkCallback() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivityManager != null) { connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(@NonNull Network network) { isNetworkActive.set(true); if (userId > 0) { tickUdp(); startDownloadNewMsg(true); } offlineHandler.removeCallbacks(resetStatusesRunnable); Log.d(LOG_TAG, "Network: WiFi Connected. " + network); } @Override public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) { Log.d(LOG_TAG, "LINK CHANGED DNS=" + linkProperties.getDnsServers()); if (userId > 0 && isNetworkActive.get()) { tickUdp(); startDownloadNewMsg(true); } } @Override public void onLost(@NonNull Network network) { isNetworkActive.set(false); offlineHandler.postDelayed(resetStatusesRunnable, 15000); Log.d(LOG_TAG, "Network lost. Scheduled offline reset in 15s..."); } }); } }
который тригерится в том числе и на изменение списка DNS серверов. В роутере я указываю время аренды DHCP для подключённых устройств 6 минут. Соответственно устройства будут обновлять аренду каждые 3 минуты. С таким же интервалом 3 минуты, скриптом меняем список DNS серверов для локальной сети.
:local netId [/ip dhcp-server network find address="192.168.88.0/24"]; :local currentDns [/ip dhcp-server network get $netId dns-server]; :if ($currentDns = "192.168.88.1,8.8.8.8") do={ /ip dhcp-server network set $netId dns-server="192.168.88.1,8.8.4.4"; } else={ /ip dhcp-server network set $netId dns-server="192.168.88.1,8.8.8.8"; }
Этих трёх минут вполне хватает чтоб не заснуть, и пингануть разочек сервер для прогрева udp порта.
Расход заряда в планшете с таким энергетиком от роутера я специальными приборами не замерял. Но на глазок, за 12 часов бездействия ни одного процента зарядка не потяряла, и через 12 часов и планшет и телефон приняли и звонок и сообщение мгновенно.