Check Yourself

8 хв. читання

З чого все почалося

Одного сонячного дня, переглядаючи сотні додатків у Google Play у пошуках музи для створення свого власного застосунку, наштовхнувся на один, який обіцяв мені надати мені всю можливу інформацію про моє інтернет-підключення. Звісно ж мене така пропозиція заінтригувала, і я погодився віддати 5 mb пам'яті мого смартфону під додаток.

Це виявився сіренький, невиразний додаток, зі стандартною кольоровою гамою (вирви око) та шрифтами (сіренький Droid Sans 14sp), який дійсно містив безліч корисної, але представленої в дуже жахливому вигляді, інформації.

Дослідивши маркет у пошуках гідного мережевого-інструменту, виявилось, що всі вони виглядають погано: одні були дуже прості - тільки один екран з неструктурованою інформацію, та й то на якому не було обіцяних даних. Інші навпаки - занадто складними - безліч кнопок, полів для введення, сила-силенна варіацій налаштувань, які були незрозумілі звичайному користувачу.

Тож я вирішив створити свій додаток, який відповідав би трьом основним вимогам: зручність, функціональність та чудовий вигляд. Про терміни UI, UX я чув тільки на гугловських перезентаціях та вважав, що цими речами мають перейматися дізайнери-хіпстери, катаючи на своїх гіроскутерах.

З цими думками я запустив Android Studio и почав творити. Отямившись через 2 години я мав це:

IP Checker Template

Звірившись зі своїми основними вимогами, я зрозумів, що це не зовсім те, чого я прагнув, точніше зовсім не те. Яжпрограміст, а не дизайнер :)

Дякуючи долі, яка познайомила мене з талановитим хлопцем, і, за сумісництвом, дизайнером, я мав до кого звернутися.

Через декілька днів пошуків істинного рішення, ми вивели концепцію 4-х кнопок, до яких буде прикручуватись весь додатковий функціонал. Ось таким я отримав перший макет нашої концепції:

IP Checker Template

Ось так й почав зароджуватись IP Checker. Якщо ви ще не заснули, то далі я розповім як саме він створювався.

Кнопка перша — інформаційна

IP Info

Перша кнопка «IP Info» - саме тут надається вся інформація про Ваше інтернет-підключення, незалежно від його типу, WiFi це, чи стільниковий зв'язок.

Реалізовано все дуже просто, частина даних таких, як локальний IP, DNS, Gateway, MAC, SSID, сила зв'язку, заповнюється стандартними засобами платформи, інша частина за допомогою сервісу, який при коректному запиті видає Вам відповідь в json-форматі. Ця відповідь парситься гугловською бібліотекою GSON, яка в свою чергу створює об'єкт підготовленого класу та заповнює його Json-даними, в кінці Android Data Binding зв'язує наш об'єкт з нашим layout-файлом.

Якщо названі мною бібліотеки Вам ще невідомі, раджу з ними ознайомитись, дуже пришвидшують розробку :)

Ви зараз можете задатися питанням: «А де ж тут костилі? Все стандартними засобами та бібліотеками. Я теж так можу!».

Звісно ж без костилів тут не обійшлось. Здавалося б, отримати МАС-адресу девайса не складно, викликаєш:

WifiInfo wifiInfo = wifiManager.getConnectionInfo();
return wifiInfo.getMacAddress();

І все. Але виникла проблема на Android 6.0 та вище, розробники системи попіклувались про інформаційну безпеку пристроїв так, що тепер цей метод завжди буде повертати Вам заглушку ("02:00:00:00:00:00").

Довелося писати таке:

public String getMacAddr() {
try {
      List<networkinterface> all =
Collections.list(NetworkInterface.getNetworkInterfaces());
      for (NetworkInterface nif : all) {
           if (!nif.getName().equalsIgnoreCase("wlan0")) continue;
           byte[] macBytes = nif.getHardwareAddress();
           if (macBytes == null) {
                 return "";
           }
           StringBuilder res1 = new StringBuilder();
           for (byte b : macBytes) {
                res1.append(String.format("%02X:",b));
           }
           if (res1.length() > 0) {
                res1.deleteCharAt(res1.length() - 1);
           }
           return res1.toString();
      }
   } catch (Exception ex) {
   }
   return "02:00:00:00:00:00";
}

В двух словах, ми пробігаємося по всім Network-інтерфейсам, шукаємо потрібний та в буквальному сенсі, збираємо МАС-адресу побітово.

Я вже не буду казати про те, що всі стандартні засоби надання Network-даних(local ip, dns, gateway, тощо) надають інформацію в перевернутому вигляді та для її нормалізації потрібно використовувати побітові зсуви... Ох нелегка доля Android-розробника :)

Кнопка друга - відслідковуюча

IP Tracker

Скільки раз ми чули фразу «Я тебе по IP знайду!», зараз у Вас є реальний шанс це зробити:)

Тут принцип дуже схожий на роботу «Інформаційної кнопки», але з тим нюансом, що вся інформація береться тільки з серверної частини.

Єдине, що вимагало уваги, це поле вводу, щоб користувач ввів туди коректні дані. Не варто цим нехтувати, ми ж не хочемо, щоб додаток вилітав кожен раз при взаємодії з користувачем.

  1. Трошки модифікований EditText:
<edittext android:background="@drawable/edit_text_border" android:digits="0123456789." android:id="@+id/ip_input" android:inputtype="numberDecimal" android:layout_height="@dimen/ip_tracker_edit_text_height" android:layout_width="match_parent" android:maxlength="15" android:maxlines="1" android:textalignment="center" android:textcolor="#fff" android:textcolorhint="#9e9e9e" android:textsize="@dimen/ip_tracker_edit_text_text_size">

Введеня тільки цифр та крапок, ліміт на введеня 15 символів.

  1. Зроблений на швидку руку Pattern:
Pattern ipPattern = Pattern.compile("^[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}$");

Цим патерном перевіряємо коректність введеної інформації. Наголошую на тому, що все робилось дуже швидко, так, що цей шаблон не заслуговує звання "Універсального бракувальника ip"

Кнопка третя — моніторингова

Peers

Як часто Ви стикалися з ситуацією, коли помічали, що Ваше WiFi-підключення настільки тупить, що здається, що до нього підключена рота солдатів?

З IP Checker'oм Ви можете дізнатися правду хто використовує Ваш WiFi :)

Реалізація цього моменту була найважчою в проекті. Після триденних пошуків сторонніх бібліотек, які б мені як на тарілочці виводили локальні підключення, я не знайшов нічого корисного. Вирішив створити самостійно.

І я його все-таки зробив! За допомогою arp-таблиці.

Шо воно така за таблиця?

Трохи інфи з вікіпедії:

ARP (англ. Address Resolution Protocol — протокол визначення адрес) — мережевий протокол, призначений для перетворення IP-адрес (адрес мережевого рівня) в MAC-адреси (адреси канального рівня) в мережах TCP/IP.

Ну а якщо простими словами, це звичайна мапа(словник\пара-ключ тощо) яка має формат IP-address — MAC-address. Заповнюється вона при будь-якій взаємодії пристрою з іншими девайсами в локальній мережі.

Тож механізм пошуку всіх пристроїв у локалці, наступний:

  1. Відомо, що пристроїв в підмережі може бути максимум 255, тому на максимальній швидкості (timeout = 10 ms) намагаємось до кожного "дозвонитись":
for (int i = 0; i < 256; i++) {
InetAddress.getByName(getSubNetAddres()+i).isReachable(timeout);
}

Я навів дуже спрощену схему як саме це працює, сподіваюся сенс зрозумілий.

  1. У нас вже сформувалась ARP-таблиця, нам треба ії отримати:
public static List<arpinfo> fetchArpList() {
List<arpinfo> arpInfos = new LinkedList<>();
   try {
List<string> arpList = FileUtils.readLines(new File("/proc/net/arp"));
for(String s : arpList) {
String[] splitted = s.split(" +");
if(splitted[0].equals("IP")) continue;
String ip = splitted[0];
String mac = splitted[3];
ArpInfo arpInfo = new ArpInfo();
arpInfo.setIpAddress(ip);
arpInfo.setMacAddress(mac);
arpInfos.add(arpInfo);
      }
  } catch (IOException io) {
io.printStackTrace();
  }
return arpInfos;
}
  1. Перевірити чи дійсно IP-адресі відповідає реальний фізичний пристрій, тобто MAC-адреса не дорівнює "00:00:00:00:00:00"
if (!arpInfo.getMacAddress().equals("00:00:00:00:00:00")
{
//виводимо перелік дійсних пристроїв
}

Вуаля, перелік підключених пристроїв у нас на екрані!

Кнопка четверта — роутерна

Router

Ви тепер зможете виконати настройку Вашого ( або не Вашого :) роутера не випускаючи телефон із рук. Під час розробки, за допомогою цієї фічі було "хакнуто" дві кафешки, якщо звичайно введення логіна — admin та пароля — admin, можна назвати хакерством :)

Механізм нескладний, ця сторінка містить WebView, яка отримуючи адресу підмережі, переходить на сторінку роутера, єдина проблема, треба знати від нього пароль:)

Підсумок

Для створення та доведення додатка до релізного стану було витрачено близько 25 днів, вивчено багато нових методик розробки UX-орієнтованих додатків та здобуто безцінний досвід. Розробка — це весело й якщо Ви вагаєтесь, просто почніть, далі Вас захопить неймовірна течія!

Google Play: IP Checker

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 6.2K
Приєднався: 7 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація