Мир новых технологий (обзоры, новинки)
Содержание
Одна из первых вещей, которые пользователи захотят сделать с новым домашним “умным” устройством – это подключить его к беспроводной сети. Но на многих IoT-устройствах отсутствует экран или клавиатура, поэтому одним из способов сделать это является предоставление пользователям возможности соединять смартфон с устройством, чтобы они могли контролировать и настраивать устройство. Вот, например, как работает Nest и Google Home с Nearby Connections 2.0 API.
В этой статье вы познакомитесь с Nearby Connections 2.0 API и с тем, как его можно использовать для подключения Android-смартфона к устройству на Android Things.
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.
1 | 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 (). Здесь вы начнете отправлять рекламу или обнаруживать другие устройства. Кроме того, для обоих приложений потребуется идентификатор службы, который является уникальной строкой.
1 | private static final String SERVICE_ID = «UNIQUE_SERVICE_ID»; |
При работе с Nearby Connections API вам необходимо создать ConnectionLifecycleCallback, который, как следует из названия, будет запускаться в различных событиях жизненного цикла соединения. Для этой демонстрации мы будем использовать только метод onConnectionInitiated (). Он сохранит ссылку на первую конечную точку, которая попытается подключиться, примет соединение и затем остановит рекламу. Если соединение не выполнено, приложение может перезапустить рекламу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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, имени конечной точки и массива байтов данных, которые вы хотите отправить.
1 | 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); |
Обнаружение устройства следует в основном аналогичной схеме. Устройство подключится к 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 первооткрывателя (мобильное приложение) также будет похоже на рекламодателя:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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, который будет использоваться, когда рекламодатель будет найден, но еще не подключен. Этот объект инициирует запрос для подключения к рекламодателю.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 () вашей активности.
1 | Nearby.Connections.disconnectFromEndpoint(mGoogleApiClient, mEndpoint); |
В этой статье вы узнали о работе с Nearby Connections 2.0 API для Android в контексте создания сопутствующего приложения для устройства Android Things.
Стоит отметить, что этот API можно использовать для любых Android-устройств, которые вы хотели бы объединить вместе, от телефонов и планшетов до Android-телевизоров и умных часов Android Wear. API обеспечивает простой способ подключения и общения без использования интернета или централизованного маршрутизатора и добавляет интересный функционал в вашу коллекцию инструментов для Android-разработки.
Статью нашли по запросам: