앱은 다른 근처 기기에서 게시한 메시지를 구독하는 데 사용되는 것과 동일한 메커니즘을 사용하여 저전력 블루투스 (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를 호출합니다.
참고:
-
배터리 수명을 절약하려면 활동의
onStop()
함수에서Nearby.getMessagesClient(Activity).unsubscribe()
를 호출하세요. 이는 포그라운드에서 구독할 때만 적용됩니다. -
지연 시간을 줄이려면
Nearby.getMessagesClient(Activity).subscribe()
를 호출할 때Strategy.BLE_ONLY
옵션을 사용합니다. 이 옵션이 설정되면 Nearby Messages API가 기본 블루투스 검색을 트리거하지 않습니다. 이렇게 하면 시스템이 가능한 모든 스캔 유형을 순환하지 않기 때문에 비콘 감지 지연 시간이 개선됩니다. - 비콘에 메시지 페이로드를 첨부하려면 Proximity Beacon API를 사용하세요.