• AppTractor.ru
  • Главная
  • iTunes
  • SoundCloud
  • Podster
  • Чат в Telegram
Подкасты Android Dev
Подкасты Android Dev
  • AppTractor.ru
  • Главная
  • iTunes
  • SoundCloud
  • Podster
  • Чат в Telegram
Соединяем Android Things со смартфоном при помощи Nearby Connections 2.0

Соединяем Android Things со смартфоном при помощи Nearby Connections 2.0

Одна из первых вещей, которые пользователи захотят сделать с новым домашним “умным” устройством – это подключить его к беспроводной сети. Но на многих IoT-устройствах отсутствует экран или клавиатура, поэтому одним из способов сделать это является предоставление пользователям возможности соединять смартфон с устройством, чтобы они могли контролировать и настраивать устройство. Вот, например, как работает Nest и Google Home с Nearby Connections 2.0 API.

В этой статье вы познакомитесь с Nearby Connections 2.0 API и с тем, как его можно использовать для подключения Android-смартфона к устройству на Android Things.

Что такое Nearby Connections API?

Nearby Connections API позволяет двум устройствам взаимодействовать друг с другом напрямую по Bluetooth или беспроводной сети без использования централизованной точки доступа. Существует две роли, которые может принять на себя устройство: рекламодатель (advertiser), который позволяет другим устройствам знать, что он доступен для подключения, и первооткрыватель (discoverer), который пытается найти рекламодателей и подключиться к ним. Когда набор устройств соединяется вместе (этот набор на данном этапе называется конечной точкой), он может отправлять данные в любую другую конечную точку в сети Nearby Connections.

Существует две стратегии, которые Nearby Connections API может использовать для соединения устройств. Первый, P2P_STAR, является самым простым для понимания и работы. Он состоит из одного рекламодателя, который может поддерживать несколько первооткрывателей, подключающихся к нему. Второй, P2P_CLUSTER, позволяет любому числу устройств подключаться и принимать соединения от любого другого числа устройств. Это создает децентрализованную и более отказоустойчивую mesh-сеть, хотя она и потребляет больше трафика. Эта стратегия идеально подходит для небольшой полезной нагрузки, которая не должна проходить через центральное устройство, например, для игр.

В этом туториале основное внимание будет уделено использованию более простой стратегии STAR для подключения устройства IoT в качестве рекламодателя и использования смартфона пользователя в качестве первооткрывателя.

Начнем!

Для этого туториала будут использованы два модуля: мобильное приложение и приложение Android Things. После того, как вы создали их в Android Studio, вам нужно будет включить зависимость Google Play Services для Nearby Connections в файл build.gradle.

compile ‘com.google.android.gms:play-services-nearby:11.6.2’

После запуска синхронизации gradle, откройте файлы AndroidManifest.xml для обоих модулей и включите следующие разрешения в нодах приложения.

<uses-permission
   android:name="android.permission.BLUETOOTH"/>    
<uses-permission
   android:name="android.permission.BLUETOOTH_ADMIN"/>    
<uses-permission
   android:name="android.permission.ACCESS_WIFI_STATE"  />
<uses-permission
   android:name="android.permission.CHANGE_WIFI_STATE" />    
<uses-permission  
   android:name="android.permission.ACCESS_COARSE_LOCATION" />

У устройств Android Things эти разрешения будут предоставлены устройству после перезагрузки, также вам потребуется запросить разрешение на получение данных о локации пользователя в телефонном приложении.

В классе MainActivity как для вещи, так и для мобильного приложения, потребуется реализовать интерфейсы, используемые для обратных вызовов сервисов Google Play, например:

public class MainActivity extends FragmentActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
    @Override   
    public void onConnected(@Nullable Bundle bundle) {}
     
    @Override
    public void onConnectionSuspended(int i) {}
     
    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {}
 
}

После того как вы подтвердили, что у пользователя есть соответствующие разрешения на локацию в onCreate (), вы можете начать подключение к Google Play Services для использования Nearby Connections API.

mGoogleApiClient = new GoogleApiClient
   .Builder(this, this, this)                
   .addApi(Nearby.CONNECTIONS_API)                
   .enableAutoManage(this, this)                
   .build();

Когда GoogleApiClient завершит соединение, вызывается метод onConnected (). Здесь вы начнете отправлять рекламу или обнаруживать другие устройства. Кроме того, для обоих приложений потребуется идентификатор службы, который является уникальной строкой.

private static final String SERVICE_ID = "UNIQUE_SERVICE_ID";

Реклама в Nearby Connections

При работе с Nearby Connections API вам необходимо создать ConnectionLifecycleCallback, который, как следует из названия, будет запускаться в различных событиях жизненного цикла соединения. Для этой демонстрации мы будем использовать только метод onConnectionInitiated (). Он сохранит ссылку на первую конечную точку, которая попытается подключиться, примет соединение и затем остановит рекламу. Если соединение не выполнено, приложение может перезапустить рекламу.

private final ConnectionLifecycleCallback mConnectionLifecycleCallback =
    new ConnectionLifecycleCallback() {
        @Override
        public void onConnectionInitiated(String endpointId, ConnectionInfo connectionInfo) {
            endpoint = endpointId;
 
            Nearby.Connections.acceptConnection(mGoogleApiClient, endpointId, mPayloadCallback)
                    .setResultCallback(new ResultCallback<com.google.android.gms.common.api.Status>() {
                        @Override
                        public void onResult(@NonNull com.google.android.gms.common.api.Status status) {
                            if( status.isSuccess() ) {
                                //Connection accepted
                            }
                        }
                    });
 
            Nearby.Connections.stopAdvertising(mGoogleApiClient);
        }
 
        @Override
        public void onConnectionResult(String endpointId, ConnectionResolution result) {}
 
        @Override
        public void onDisconnected(String endpointId) {}
    };

Возможно, вы заметили, что вышеупомянутый метод также ссылается на объект PayloadCallback. Этот объект имеет методы, которые вызываются, когда полезные данные отправляется от рекламодателя к конечной точке, а также когда данные принимаются от конечной точки. Метод onPayloadReceived () – это то, где мы будем обрабатывать любые данные, отправляемые на наше устройство Android Things. Этот метод содержит объект Payload, который можно преобразовать в массив байтов, и строку, представляющую адрес конечной точки отправляющего устройства.

private PayloadCallback mPayloadCallback = new PayloadCallback() {
    @Override
    public void onPayloadReceived(String endpoint, Payload payload) {
        Log.e("Tuts+", new String(payload.asBytes()));
    }
 
    @Override
    public void onPayloadTransferUpdate(String endpoint, PayloadTransferUpdate payloadTransferUpdate) {}
};

На этом этапе вы можете начать рекламу своего IoT-устройства следующим образом:

Nearby.Connections.startAdvertising(
    mGoogleApiClient,
    "Device Name",
    SERVICE_ID,
    mConnectionLifecycleCallback,
    new AdvertisingOptions(Strategy.P2P_STAR));

Вы можете заметить, что именно здесь мы применяем стратегию P2P_STAR к сети Nearby Connections.

Когда вы хотите отправить payload на другое устройство, вы можете использовать метод Near.Connections.sendPayload () с помощью ссылки на клиентский интерфейс Google API, имени конечной точки и массива байтов данных, которые вы хотите отправить.

Nearby.Connections.sendPayload(mGoogleApiClient, endpoint, Payload.fromBytes("Message".getBytes()));

Совет. Включите Wi-Fi при перезагрузке

Один трюк, который я нашел полезным во время работы с Nearby Connections API на устройстве Android Things – перезапустить WiFi при перезагрузке, так как устройство может отключиться от беспроводной сети, если устройство выключено или теряет питание во время рекламы. Вы можете сделать это, обращаясь к системной службе WifiManager и вызывая setWifiEnabled ().

 

wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);

Обнаружение устройств с Nearby Connections

Обнаружение устройства следует в основном аналогичной схеме. Устройство подключится к Google API Client и начнет обнаружение. Когда рекламодатель будет найден, первооткрыватель запросит подключение к рекламодателю. Если рекламодатель одобряет запрос, то два устройства соединяться и будут иметь возможность отправлять сообщения туда и обратно. Первооткрыватель будет использовать PayloadCallback так же, как рекламодатель.

private PayloadCallback mPayloadCallback = new PayloadCallback() {
    @Override
    public void onPayloadReceived(String s, Payload payload) {
        Log.e("Tuts+", new String(payload.asBytes()));
    }
 
    @Override
    public void onPayloadTransferUpdate(String s, PayloadTransferUpdate payloadTransferUpdate) {}
};

ConnectionLifecycleCallback первооткрывателя (мобильное приложение) также будет похоже на рекламодателя:

private final ConnectionLifecycleCallback mConnectionLifecycleCallback =
        new ConnectionLifecycleCallback() {
            @Override
            public void onConnectionInitiated(String endpointId, ConnectionInfo connectionInfo) {
                Nearby.Connections.acceptConnection(mGoogleApiClient, endpointId, mPayloadCallback);
                mEndpoint = endpointId;
                Nearby.Connections.stopDiscovery(mGoogleApiClient);
            }
 
            @Override
            public void onConnectionResult(String endpointId, ConnectionResolution result) {}
 
            @Override
            public void onDisconnected(String endpointId) {}
        };

Другое дело, что первооткрывателям потребуется EndpointDiscoveryCallback, который будет использоваться, когда рекламодатель будет найден, но еще не подключен. Этот объект инициирует запрос для подключения к рекламодателю.

private final EndpointDiscoveryCallback mEndpointDiscoveryCallback =
    new EndpointDiscoveryCallback() {
        @Override
        public void onEndpointFound(
                String endpointId, DiscoveredEndpointInfo discoveredEndpointInfo) {
            if( discoveredEndpointInfo.getServiceId().equalsIgnoreCase(SERVICE_ID)) {
                Nearby.Connections.requestConnection(
                        mGoogleApiClient,
                        "Name",
                        endpointId,
                        mConnectionLifecycleCallback);
            }
        }
 
        @Override
        public void onEndpointLost(String endpointId) {
            Log.e("Tuts+", "Disconnected");
        }
    };

Как только ваш первооткрыватель подключился к Google Play Services, вы можете инициировать обнаружение с помощью следующей команды:

Nearby.Connections.startDiscovery(
        mGoogleApiClient,
        SERVICE_ID,
        mEndpointDiscoveryCallback,
        new DiscoveryOptions(Strategy.P2P_STAR));

Наконец, когда вы хотите отключиться от рекламодателя, вы можете использовать метод disconnectFromEndpoint () из Nearby Connections API. Как правило, лучше сделать это в обратном вызове onDestroy () вашей активности.

Nearby.Connections.disconnectFromEndpoint(mGoogleApiClient, mEndpoint);

Вывод

В этой статье вы узнали о работе с Nearby Connections 2.0 API для Android в контексте создания сопутствующего приложения для устройства Android Things.

Стоит отметить, что этот API можно использовать для любых Android-устройств, которые вы хотели бы объединить вместе, от телефонов и планшетов до Android-телевизоров и умных часов Android Wear. API обеспечивает простой способ подключения и общения без использования интернета или централизованного маршрутизатора и добавляет интересный функционал в вашу коллекцию инструментов для Android-разработки.

 

Facebook Twitter Google+ LinkedIn VKontakte

Facebook Comments

Другие записи

Трудоустройство Android-разработчиков в России и за рубежом: собеседования, знания, деньги — часть 1.1 Статья
18/06/2018

Трудоустройство Android-разработчиков в России и за рубежом: собеседования, знания, деньги — часть 1.1

38 лучших Open Source Android-проектов на Java Статья
13/04/2018

38 лучших Open Source Android-проектов на Java

Начинаем работать с Firebase Cloud Storage на Android Статья
21/03/2018

Начинаем работать с Firebase Cloud Storage на Android

Слушайте
itunes-podcast-app-logo soundcloud-icon thumb17
Подпишитесь на рассылку Дайджест интересных материалов для разработчиков
Facebook
Apptractor

  • AppTractor.ru
  • Главная
  • Обратная связь
  • О проекте
  • RSS
  • Back to top
Android Dev — подкаст о разработке под Android и всем, что с этим связано. Гости программы — разработчики с большим опытом и стажем, которые помнят Android, когда он еще был версии 1.5, и за годы написали приложения для миллионов пользователей по всему миру.
Последние записи
Интересные материалы для Android-разработчика #256

Интересные материалы для Android-разработчика #256

Интересные материалы для Android-разработчика #255

Интересные материалы для Android-разработчика #255

Метки
Android Android O Android Pay Android Things ConstraintLayout Continuous Delivery Continuous Integration Dagger Droidcon Firebase Flutter Google Assistant Google I/O Gradle I/O Instant apps Java Jrebel Kotlin Mobius NDK open source React Native RXJava TensorFlow анимация архитектура аудио безопасность видео дайджест дизайн дополненная реальность интернет вещей исходный код конференция кроссплатформенная разработка машинное обучение новости обучение программирование работа разработка статья тестирование
© AppTractor.ru 2019