고급 기능

메시지 유형

기본적으로 구독은 앱의 Google Cloud Console 프로젝트와 연결된 모든 메시지를 찾습니다. 여기에는 다음이 포함됩니다.

  • 다른 기기의 동일한 앱에서 게시한 메시지
  • 해당 프로젝트가 소유하고 비콘에 연결된 메시지 비콘에 첨부파일 추가를 참조하세요.

앱은 MessageFilter를 사용하여 공개 비콘 첨부파일과 원시 블루투스 저전력 (BLE) 비콘 ID를 비롯한 더 많은 유형의 주변 메시지를 구독할 수 있습니다.

공개 비콘 첨부파일

개발자는 비콘 첨부파일 네임스페이스를 PUBLIC로 표시할 수 있습니다. 이렇게 하면 Cloud 콘솔 프로젝트에 관계없이 모든 앱에서 파일을 검색할 수 있습니다. 연결 네임스페이스를 공개로 설정하는 방법에 대한 자세한 내용은 첨부파일 공개 상태를 참조하세요.

예:

// Subscribe for two different public beacon attachment types.
MessageFilter messageFilter = new MessageFilter.Builder()
  .includeNamespacedType(EXAMPLE_PUBLIC_NAMESPACE_A, EXAMPLE_PUBLIC_TYPE_A)
  .includeNamespacedType(EXAMPLE_PUBLIC_NAMESPACE_B, EXAMPLE_PUBLIC_TYPE_B)
  .build();
SubscribeOptions options = new SubscribeOptions.Builder()
  .setStrategy(Strategy.BLE_ONLY)
  .setFilter(messageFilter)
  .build();

MessageListener messageListener = new MessageListener() {
  @Override
  public void onFound(final Message message) {
    // We may want to handle the two types of message differently.
    if (EXAMPLE_PUBLIC_NAMESPACE_A.equals(message.getNamespace())
        && EXAMPLE_PUBLIC_TYPE_A.equals(message.getType())) {
      // Handle a "type A" message.
    } else if (EXAMPLE_PUBLIC_NAMESPACE_B.equals(message.getNamespace())
        && EXAMPLE_PUBLIC_TYPE_B.equals(message.getType())) {
      // Handle a "type B" message.
    }
  }
};

Nearby.getMessagesClient(this).subscribe(messageListener, options);

BLE 비콘 ID

Google의 비콘 플랫폼을 사용하여 클라우드에 있는 임의의 데이터를 비콘에 첨부하여 BLE 패킷에서 광고하는 실제 비콘 ID를 추상화할 수 있습니다. 이러한 첨부파일은 기본적으로 검색됩니다 (메시지 유형 참고).

하지만 자체 비콘 레지스트리 등을 사용하기 위해 원시 비콘 ID를 찾아야 하는 경우에는 가능합니다. 현재 다음과 같은 두 가지 형식이 지원됩니다.

예:

// Subscribe for all Eddystone UIDs whose first 10 bytes (the "namespace")
// match MY_EDDYSTONE_UID_NAMESPACE.
//
// Note that the Eddystone UID namespace is separate from the namespace
// field of a Nearby Message.
MessageFilter messageFilter = new MessageFilter.Builder()
  .includeEddystoneUids(MY_EDDYSTONE_UID_NAMESPACE, null /* any instance */)
  .build();
SubscribeOptions options = new SubscribeOptions.Builder()
  .setStrategy(Strategy.BLE_ONLY)
  .setFilter(messageFilter)
  .build();

MessageListener messageListener = new MessageListener() {
  @Override
  public void onFound(final Message message) {
    // Note: Checking the type shown for completeness, but is unnecessary
    // if your message filter only includes a single type.
    if (Message.MESSAGE_NAMESPACE_RESERVED.equals(message.getNamespace())
        && Message.MESSAGE_TYPE_EDDYSTONE_UID.equals(message.getType())) {
      // Nearby provides the EddystoneUid class to parse Eddystone UIDs
      // that have been found nearby.
      EddystoneUid eddystoneUid = EddystoneUid.from(message);
      Log.i(TAG, "Found Eddystone UID: " + eddystoneUid);
    }
  }
};

Nearby.getMessagesClient(this).subscribe(messageListener, options);

RSSI 및 거리 콜백

Nearby가 메시지와 연결된 BLE 신호에 관한 새로운 정보를 보유하고 있는 경우 포그라운드 구독은 찾기 및 손실된 콜백 외에도 MessageListener를 업데이트할 수 있습니다.

  • 이러한 추가 콜백은 현재 BLE 비콘 메시지(첨부파일 및 비콘 ID 모두)에 대해서만 전달됩니다.
  • 이러한 추가 콜백은 백그라운드 (PendingIntent) 구독으로 전달되지 않습니다.

예:

MessageListener messageListener = new MessageListener() {
  /**
   * Called when a message is discovered nearby.
   */
  @Override
  public void onFound(final Message message) {
    Log.i(TAG, "Found message: " + message);
  }

  /**
   * Called when the Bluetooth Low Energy (BLE) signal associated with a message changes.
   *
   * This is currently only called for BLE beacon messages.
   *
   * For example, this is called when we see the first BLE advertisement
   * frame associated with a message; or when we see subsequent frames with
   * significantly different received signal strength indicator (RSSI)
   * readings.
   *
   * For more information, see the MessageListener Javadocs.
   */
  @Override
  public void onBleSignalChanged(final Message message, final BleSignal bleSignal) {
    Log.i(TAG, "Message: " + message + " has new BLE signal information: " + bleSignal);
  }

  /**
   * Called when Nearby's estimate of the distance to a message changes.
   *
   * This is currently only called for BLE beacon messages.
   *
   * For more information, see the MessageListener Javadocs.
   */
  @Override
  public void onDistanceChanged(final Message message, final Distance distance) {
    Log.i(TAG, "Distance changed, message: " + message + ", new distance: " + distance);
  }

  /**
   * Called when a message is no longer detectable nearby.
   */
  @Override
  public void onLost(final Message message) {
    Log.i(TAG, "Lost message: " + message);
  }
};