Universal Mobile Electronic Key

Не можу сказати, що я відчув велику наснагу, коли мені запропонували взяти участь у проекті «Device Lab від Google», однак без сумніву інтерес був присутній. Коли я робив проект з різними взаємодіями через Bluetooth і у мене вийшли вкрай цікаві реалізації. Однак виявилося, що в ході маніпуляцій з Bluetooth всі телефони, власники яких за недогляд відставили їх включеними в радіусі роботи Bluetooth, втрачали заряд в три рази швидше, ніж зазвичай. Колеги, само собою, не дуже раділи. Проект довелося закрити. У зв'язку з цим мені давно хотілося потримати в «чіпких» руках маячки останнього покоління. І проект Device Lab мені таку можливість надав.


Стаття автора Дмитра Сенашенко, в рамках конкурсу <a href=«special.habrahabr.ru/google/lab>Device Lab від Google».

На ринку зараз є безліч маячків та їх виробників. І в більшості своїй вони призначені для визначення геолокації всередині будівель. Є цікаві ідеї з розряду вбудовування маячків у валізи, щоб за їх сигналу шукати їх в аеропорту. Але, враховуючи потужності, це виглядає як іграшка. Хотілося придумати і реалізувати щось оригінальне і корисне одночасно. Отже, трохи формальностей на сайті і в офісі Хабра, і маячок iBKS у мене в руках:


Про маячки написано багато. Наприклад: «google's beacon platform. Частина 1» або «google's beacon platform. Частина 2». Повторюватися не буду, проте скажу, що передбачалося використовувати маячок з google's beacon platform і працювати з нею по API. Реальність розставила свої крапки над «i», про що я розповім трохи пізніше.

За життя я працюю з телефонією і інтелектуальними IVR з підтримкою email, html, sms і т. д. Тому є готові стенди, легко дістати необхідне обладнання і т. д. І саме до цієї тематики мені і хотілося пристосувати маячки.

Ідея
Отже, мені прийшла в голову ідея використовувати маячки як ключ авторизації до дверей в офісі. Як всім відомо, в кожному офісі є двері з електронними замками і зчитувачем при вході. У кожного співробітника є ключ у вигляді картки, і для входу в двері йому необхідно докласти цю картку до зчитувача, після чого двері відчиняться. У світі кількість таких дверей обчислюється багатьма мільярдами, а кількість карток, напевно, трильйонами. Хоча насправді користуватися ними не дуже зручно. Якщо ти поспішаєш на важливу нараду, то втрачати час на те, щоб витягти картку (або витягти предмет, в якому лежить ця картка – гаманець, папку з документами) втомлює.

Однак у кожної людини в кишені тепер є телефон. І у деяких – навіть носиться на руці електроніка. Простіше зустріти людину, яка забула картку, ніж забув свій телефон. Тому зручніше і економічно доцільніше замінити картку на телефон, а зчитувач – на маячок. Звичайно, існують непогані ідеї в цьому напрямку.

Наприклад, дверна ручка зі зчитувачем відбитків пальців, NFC на телефоні і т. д. Але технологія NFC так і не з'явилася в кожному смартфоні, а ось Bluetooth якраз в кожному смартфоні є. Тому технологічно ця ідея вже фактично готова до реалізації.

До того ж, таке рішення підвищує ступінь комфорту співробітників. Підходячи до дверей, досить натиснути на іконку програми, і після проходження авторизації двері відчиняться. Тобто її можна відкрити ще з ліфта або на підході до дверей. Крім того, можна відкрити двері з годин або сказавши про це в навушники з мікрофоном персонального асистента. Важливим фактором є авторизація. Давайте поглянемо на це детальніше. См. малюнок 1.

Принципова схема роботи
Телефон входить в зону видимості маячка, знаходить його, використовуючи Beacon Discover і через Nearby messages API отримує з Google Beacons Registry його attachment. Далі через Wifi або мобільний інтернет в шифрованого сесії телефон відсилає цей аттачмент і свій IMEI або інший унікальний код, заданий при установці програми, на сервер авторизації. Сервер авторизації ідентифікує права на доступ і в разі позитивного рішення дає команду на сервер управління електронними замками відкрити замок, грунтуючись на даних з attachment, які унікальним чином характеризують двері. Сервер управління електронними замками дає команду виконавчому пристрою відкрити двері.


Малюнок 1. Схема організації взаємодії

Ось таке рішення прийшло мені в голову, і тепер давайте спробуємо його реалізувати.

Втілюємо ідею в залозі
У моєму розпорядженні була АТС компанії Avaya зі шлюзом G250. Це старий шлюз, давно знятий з виробництва. Але його нова заміна — шлюз G450/G430 — має також необхідні нам компоненти, а саме привід керування електронним замком двері. В даний шлюз для потреб малих офісів вбудовано сухе реле — так званий Contact Closure Adjunct (див. малюнок 2).


Малюнок 2. Шлюз G430 виробництва Avaya

Цим роз'ємом можна керувати набором довільного переднастроєні телефонного номера. При наборі номера шлюз замикає реле і дає сигнал на відкриття електронного замку.

Далі, у мене був в наявності робочий стенд з IVR (Interactive Voice Response) виробництва компанії Avaya. Це повністю програмний сервіс, що володіє можливостями обробки не тільки голосових запитів, але і email, смс і, що в даному рішенні і знадобиться, html-запитів. Також цей IVR вміє ініціювати не лише email та смс, але і голосові дзвінки. Тобто по відношенню до даного проекту цей IVR може отримати запит html з передачею змінних і за результатами обробки цих змінних ініціювати вихідний голосовий дзвінок на певний номер. Обробка запиту в IVR може бути проведена як вбудованими засобами, так і з використанням мови програмування Java. У зв'язку з цим в ролі сервера авторизації був застосований як раз цей IVR. В ролі сервера керування електронним замком використовувалася АТС Avaya Aura Communication Manager зі шлюзом G250. Електронний замок також був в наявності.

Таким чином, програма на мобільному телефоні потрібно було отримати ідентифікатор маячка, зв'язатися з Google Beacons Registry і отримати його аттачмент, після чого в html запиті надіслати цю інформацію і свій IMEI на IVR, який, перевіривши її, зробить набір на АТС, давши таким чином сигнал для замикання на шлюзі G250 сухого реле Contact Closure і відкривши таким чином двері.

Ну і останнім кроком підготовки до реалізації стало отримання мобільного телефону під управлінням операційної системи Android. Це був HTC Desire c Android Lollipop 5.1.1. Ну і, звичайно, необхідна була також установка Android Studio на свій ноутбук.

Все було готове, і я приступив. Як звичайно, реальність розставила крапки на «i».

Підводні камені
Для початку маячок потрібно зареєструвати в Google Beacon Registry. Найпростіше це зробити через мобільний додаток Google Beacon Tools, доступне як в Google Play Market, так і в Apple App Store.

Я включив маячок, видаливши пластиковий роз'єднувач між мікросхемою і батарейкою, встановив Google Beacon Tools і став шукати маячок. Він не з'являвся. Тоді я скачав додаток виробника iBKS Config Tool. Це додатку теж доступно для Android і IOS пристроїв. І — о диво! Маячок з'явився.


Малюнок 3. iBKS Config Tool

Однак, в Google Beacon Tools він наполегливо з'являтися не хотів. Простудіювавши інтернет, я вичитав, що потрібно увійти в режим редагування на iBKS Config Tool і змінити тип трансляції маячка. У режим редагування додаток наполегливо входити відмовлялося, як на Android, так і на iOS. Увійти в цей режим вдалося тільки після вимкнення та повторного увімкнення маячка шляхом видалення батарейки. На все про все було близько 30 секунд, далі маячок знову блокувався. Зрозуміти, це фіча або бага, мені не вдалося. Це ніде не повідомлялося. См. малюнок 4.


Малюнок 4. Режим редагування iBKS Config Tool

Помінявши Advertising Mode c 1 на 7 (див. малюнок 5), я нарешті побачив маячок в Google Beacon Tools (див. малюнок 6). Але реєструватися він вперто відмовлявся.


Малюнок 5. Вибір Advertising Mode


Малюнок 6. Google Beacon Tools

Google Beacon Tools для реєстрації вимагав, щоб маячок знаходився в режимі iBeacon або Eddystone UUID., але в цьому режимі він вперто не бачив. У режимі ж Eddystone URL він його бачив, але відмовлявся реєструвати. Поведінка цієї програми на Android і IOS було однакове, хоча на Android додаток спочатку обирало проект, і тільки потім відмовлялося реєструвати маячок.

Що стало причиною такої поведінки маячка, з'ясувати в ході проекту не вдалося. Таке враження, що сам маячок був проблемний. Варто було його, звичайно, замінити, але реалізація проекту була обмежена часовими рамками, і на нову поїздку в офіс Хабра часу не було. З дослідів з iBKS Config Tool і Google Beacon Tools було зрозуміло, що маячок випромінює, причому передаючи свій унікальний ідентифікатор. Тому було прийнято рішення проводити ідентифікацію маячка для демонстраційного стенду не за attachment, отриманого від Google Beacons Registry, а по його ідентифікатору. В цілому для прототипу рішення така заміна цілком адекватна.

Отже, залишилося тільки знайти бібліотеку Java, яка дозволяла б в Android Studio організувати виявлення ідентифікатора маячка. На допомогу, звичайно, припав GitHub і бібліотека Radiusnetwork.com.eddystonedemo. Ця бібліотека дозволяє бачити трансльований маячком його ідентифікатор, який також видно через iBKS Config Tool. Опис дано тут.

Був організований Activity (див. малюнок 7), який мав велику сіру кнопку. Ця кнопка після знаходження маячка змінювала колір, ім'я та властивість Clickable. Тобто, поки маячок не знайдений, при натисканні на кнопку нічого не відбувається. Як тільки маячок знайдений, то кнопка стає червоною і дозволяє на себе натиснути. При натисканні на кнопку викликається URL, ведучий на додаток IVR з передачею IMEI, який перевіряє його, і у разі успішності формує виклик по протоколу SIP сервер управління електронним замком. У разі втрати сигналу маячка (збільшення відстані до нього чи його виключення) кнопка змінює колір і властивість Clickable назад.


Малюнок 7. Скріншоти програми

Код і кінцева реалізація
Цілком проект можна знайти Github тут. Зупинимося на деталях. Нижче приведена функція, що викликається при знаходженні маячка:

public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
for (Beacon beacon: beacon) {
if (beacon.getServiceUuid() == 0xfeaa && beacon.getBeaconTypeCode() == 0x00) {
// This is a Eddystone-frame UID
Identifier namespaceId = beacon.getId1();
Identifier instanceId = beacon.getId2();
foundBeacon = namespaceId.toString();
//перевірка ідентифікатора маячка для спрощення проекту проводиться тут. Нижче перевіряється саме ідентифікатор мого конкретного маячка.
if (foundBeacon.equals("0xba1c51bab3147efee8e5")) {
Log.d("Found beacon", foundBeacon);
//Це необхідно, щоб змінювати властивість назад при втраті маячка
found = true;
runOnUiThread(new Runnable() {
public void run() {
//Тут проводиться зміна напису, кольору і властивості Clickable при знаходженні маячка.
mainButton.setText("You can open the door now");
mainButton.setBackgroundColor(0xffef0606);
mainButton.setClickable(true);
}
});
}
Log.d("RangingActivity", "I see a beacon transmitting namespace id: " + namespaceId +
" and instance id: " + instanceId +
" approximately " + beacon.getDistance() + " meters away.");
runOnUiThread(new Runnable() {
public void run() {
((TextView) RangingActivity.this.findViewById(R. id.foundbeacon)).setText("Found beacon - " + foundBeacon);
}
});
}
}
}

Нижче приведена функція виклику URL на IVR:

public void buttonClick(View view) {
//Виклик цієї функції повертає IMEI телефону
String ret = telephonyManager.getDeviceId();
Log.d("IMEI", ret);
//URL нижче веде IP адреса IVR і викликає додаток обробки HTML запитів під назвою OpenTheDoor і передає туди ідентифікатор маячка і IMEI
webview.loadUrl("http://192.168.0.204:7080/Redirector/?AVAYAEP__LaunchId=OpenTheDoor&beacon=" +
foundBeacon + "&imei=" + ret.toString());
}

Таймер у даному додатку потрібен, щоб гасити кнопку при втраті доступності телефону через 5 секунд після втрати.

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R. layout.activity_ranging);
mainButton = (Button) findViewById(R. id.mainbutton);
telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
webview = (WebView)findViewById(R. id.webView);
//таймер деактивації кнопки
mTimer = new Timer();
mMyTimerTask = new MyTimerTask();
mTimer.schedule(mMyTimerTask, 1000, 5000);
}

class MyTimerTask extends TimerTask {
@Override
public void run() {
if (found) {
found = false;
}
else {
runOnUiThread(new Runnable() {
public void run() {
//Зміна властивостей кнопки по втраті доступності маячка
mainButton.setText("Open the door");
mainButton.setBackgroundColor(0xffcfc3c3);
mainButton.setClickable(false);
((TextView) RangingActivity.this.findViewById(R. id.foundbeacon)).setText("");
}
});
}
}
}
}

Розробка додатків для IVR проводиться в середовищі Avaya Aura Orchestration Designer і базується на середовищі розробки Eclipse. По суті під кожним елементом ховається Java код. Складання програми для спрощення розробки проводиться в стилі Drag<&>Drop. На рисунку 8 наведено скріншот екрану середовища розробки додатків для IVR.


Малюнок 8. Середовище розробки Avaya Aura Orchestration Designer

Цей додаток має два головних модуля: Data1 і Outcalling. Скріншоти цих модулів наведені на рисунках 9 і 10.


Малюнок 9. Модуль Data1


Малюнок 10. Модуль Outcalling

У модулі Data1 проводиться фактично авторизація ідентифікатора маячка і IMEI: якщо обидва правильні, то проводиться переведення на модуль Outcalling, в якому формується вихідний дзвінок на преднастроенный номер, що зберігається в змінної CalledNumber. В даній змінної встановлюється номер, налаштований на АТС для спрацьовування сухого реле ContactClosure, підключеного до електронного замка двері.

Повний проект можна знайти на тут.

Ну і на закінчення по ось цьому за адресою викладено відео, в якому дано опис проекту і проведена демонстрація вже готового проекту. Спасибі за увагу!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.