
Наконец мой мессенджер прошёл тест в 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 часов и планшет и телефон приняли и звонок и сообщение мгновенно.