Получить сообщения маяка

Ваше приложение может подписаться на вложения маяка Bluetooth Low Energy (BLE), используя тот же механизм, который используется для подписки на сообщения, публикуемые другими близлежащими устройствами. При подписке ваше приложение будет автоматически получать сообщения как от маяков, так и от устройств поблизости.

Подпишитесь на сообщения маяка BLE

Ваше приложение может подписаться на сообщения маяка BLE двумя способами:

Подписка на переднем плане

Когда ваше приложение подписывается на сообщения маяка на переднем плане, сканирование выполняется непрерывно, пока ваше приложение не откажется от подписки. Запускайте активную подписку только тогда, когда ваше приложение активно, обычно в ответ на действие пользователя.

Ваше приложение может инициировать подписку переднего плана, вызвав Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions) и задав для параметра Strategy значение BLE_ONLY .

Следующий фрагмент кода демонстрирует запуск подписки переднего плана Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions) :

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    mMessageListener = new MessageListener() {
        @Override
        public void onFound(Message message) {
            Log.d(TAG, "Found message: " + new String(message.getContent()));
        }

        @Override
        public void onLost(Message message) {
            Log.d(TAG, "Lost sight of message: " + new String(message.getContent()));
        }
    }
}

// Subscribe to receive messages.
private void subscribe() {
    Log.i(TAG, "Subscribing.");
    SubscribeOptions options = new SubscribeOptions.Builder()
            .setStrategy(Strategy.BLE_ONLY)
            .build();
    Nearby.getMessagesClient(this).subscribe(mMessageListener, options);
}

Когда подписка больше не требуется, ваше приложение должно отказаться от подписки, вызвав Nearby.getMessagesClient(Activity).unsubscribe(MessageListener) .

Подпишись в фоновом режиме

Когда ваше приложение подписывается на сообщения маяка в фоновом режиме, сканирование с низким энергопотреблением запускается при появлении экрана, даже если ваше приложение в данный момент не активно. Вы можете использовать эти уведомления о сканировании, чтобы «разбудить» ваше приложение в ответ на определенное сообщение. Фоновые подписки потребляют меньше энергии, чем активные подписки, но имеют более высокую задержку и более низкую надежность.

Ваше приложение может инициировать фоновую подписку, вызвав Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions) и задав для параметра Strategy значение BLE_ONLY .

Следующий фрагмент кода демонстрирует запуск фоновой подписки путем вызова Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions) .

// Subscribe to messages in the background.
private void backgroundSubscribe() {
    Log.i(TAG, "Subscribing for background updates.");
    SubscribeOptions options = new SubscribeOptions.Builder()
            .setStrategy(Strategy.BLE_ONLY)
            .build();
    Nearby.getMessagesClient(this).subscribe(getPendingIntent(), options);
}

private PendingIntent getPendingIntent() {
    return PendingIntent.getBroadcast(this, 0, new Intent(this, BeaconMessageReceiver.class),
            PendingIntent.FLAG_UPDATE_CURRENT);
}

Следующий фрагмент кода демонстрирует обработку намерения в классе BeaconMessageReceiver .

@Override
public void onReceive(Context context, Intent intent) {
    Nearby.getMessagesClient(context).handleIntent(intent, new MessageListener() {
        @Override
        public void onFound(Message message) {
            Log.i(TAG, "Found message via PendingIntent: " + message);
        }

        @Override
        public void onLost(Message message) {
            Log.i(TAG, "Lost message via PendingIntent: " + message);
        }
    });
}

Когда подписка больше не требуется, ваше приложение должно отказаться от подписки, вызвав Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent) .

Разобрать сообщения маяка

Вложения маяков — это блоки произвольных данных, которые можно добавить в маяки . Каждая приставка состоит из следующих частей:

  • Пространство имен: идентификатор пространства имен.
  • Тип: тип данных.
  • Данные: значение данных для вложения.

Следующий фрагмент кода демонстрирует использование прослушивателя сообщений для разбора сообщений, полученных от маяка BLE:

mMessageListener = new MessageListener() {
    @Override
    public void onFound(Message message) {
        // Do something with the message here.
        Log.i(TAG, "Message found: " + message);
        Log.i(TAG, "Message string: " + new String(message.getContent()));
        Log.i(TAG, "Message namespaced type: " + message.getNamespace() +
                "/" + message.getType());
    }

    ...
};

Разбор содержимого зависит от формата байтов. В этом примере предполагается, что байты содержимого кодируют строку UTF-8, но ваше маяковое сообщение может кодировать другие форматы байтов (например, сериализованный буфер протокола). Дополнительные сведения см. в разделе Добавление вложений к маякам .

Чтобы узнать, какие пространства имен связаны с вашим проектом, вызовите namespaces.list .

Примечания:

  • Чтобы продлить срок службы батареи, вызовите Nearby.getMessagesClient(Activity).unsubscribe() в функции onStop() вашего Activity. Обратите внимание, что это применимо только при подписке на переднем плане .
  • Чтобы уменьшить задержку, используйте параметр Strategy.BLE_ONLY при вызове Nearby.getMessagesClient(Activity).subscribe() . Если этот параметр установлен, API сообщений поблизости не будет запускать классическое сканирование Bluetooth. Это уменьшает задержку обнаружения маяков, поскольку система не перебирает все возможные типы сканирования.
  • Чтобы прикрепить полезную нагрузку сообщения к маяку, используйте API Proximity Beacon .