표지 메시지 받기

앱은 다른 근처 기기에서 게시한 메시지를 구독하는 데 사용되는 것과 동일한 메커니즘을 사용하여 저전력 블루투스 (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)를 호출하여 정기 결제를 취소해야 합니다.

비콘 메시지 파싱

비콘 첨부파일비콘에 추가할 수 있는 임의의 데이터의 blob입니다. 각 첨부파일은 다음 부분으로 구성됩니다.

  • 네임스페이스: 네임스페이스 식별자입니다.
  • 유형: 데이터 유형입니다.
  • 데이터: 첨부파일의 데이터 값입니다.

다음 코드 스니펫은 메시지 리스너를 사용하여 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를 호출합니다.

참고: