Receber mensagens de beacon

Seu app pode se inscrever em anexos de sensor (BLE) de Bluetooth de baixa energia (BLE) usando o mesmo mecanismo usado para se inscrever em mensagens publicadas por outros dispositivos próximos. Ao assinar, o app recebe automaticamente mensagens de sensores e dispositivos próximos.

Inscrever-se para receber mensagens de beacon de BLE

Há duas maneiras de o app assinar assinaturas de beacon BLE:

Assinar em primeiro plano

Quando seu app se inscreve em mensagens de beacon em primeiro plano, as verificações são executadas continuamente até que a inscrição seja cancelada. Só inicie uma assinatura em primeiro plano quando o app estiver ativo, normalmente em resposta a uma ação do usuário.

Seu app pode iniciar uma assinatura em primeiro plano chamando Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions) e definindo a opção Strategy como BLE_ONLY.

O snippet de código abaixo demonstra o início de uma assinatura em primeiro plano 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);
}

Quando a assinatura não for mais necessária, o app precisará cancelar a inscrição chamando o método Nearby.getMessagesClient(Activity).unsubscribe(MessageListener).

Assinar em segundo plano

Quando seu app se inscreve em mensagens de beacon em segundo plano, as verificações de baixa potência são acionadas em eventos na tela, mesmo quando o app não está ativo no momento. Você pode usar essas notificações de verificação para ativar seu app em resposta a uma mensagem específica. As assinaturas em segundo plano consomem menos energia do que as assinaturas em primeiro plano, mas têm maior latência e menor confiabilidade.

Seu app pode iniciar uma assinatura em segundo plano chamando Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions) e definindo a opção Strategy como BLE_ONLY.

O snippet de código a seguir demonstra o início de uma assinatura em segundo plano chamando 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);
}

O snippet de código abaixo demonstra como processar a intent na classe 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);
        }
    });
}

Quando a assinatura não for mais necessária, o app precisará cancelar a inscrição chamando o método Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent).

Analisar mensagens de beacon

Anexos de beacon são blobs de dados arbitrários que podem ser adicionados a beacons. Cada anexo consiste nas seguintes partes:

  • Namespace: um identificador de namespace.
  • Tipo: o tipo de dados.
  • Dados: o valor dos dados do anexo.

O snippet de código abaixo demonstra o uso de um listener de mensagens para analisar mensagens recebidas de um beacon 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());
    }

    ...
};

A análise do conteúdo depende do formato dos bytes. Este exemplo pressupõe que os bytes de conteúdo codificam uma string UTF-8, mas a mensagem de beacon pode codificar outros formatos de byte (por exemplo, um buffer de protocolo serializado). Para saber mais, consulte Adicionar anexos a sensores.

Para descobrir quais namespaces estão associados ao projeto, chame namespaces.list.

Observações: