게시 및 구독

Nearby Messages는 근처 기기에서 소량의 데이터 페이로드를 교환할 수 있게 해주는 게시-구독 API입니다. 기기에서 메시지를 게시하면 근처 기기에서 메시지를 수신할 수 있습니다. 이 가이드에서는 Nearby Messages API를 사용하여 메시지를 게시하고 메시지를 구독하기 위해 앱에서 구현해야 하는 모든 기능을 설명합니다.

근처 기기 집합은 블루투스를 통한 작은 토큰 교환에 의해 결정됩니다. 기기가 근처 기기에서 토큰을 감지하면 Nearby Messages 서버로 토큰을 전송하여 유효성을 검사하고 애플리케이션의 현재 구독 세트에 전송할 메시지가 있는지 확인합니다.

애플리케이션은 기기 검색에 사용되는 매체 집합 및 토큰을 브로드캐스트하거나 토큰을 스캔하는 데 매체가 사용되는지 여부를 제어할 수 있습니다. 기본적으로 브로드캐스팅과 스캔은 모든 매체에서 실행됩니다. 하위 집합 또는 매체를 검색하고 브로드캐스트나 스캔 여부를 제어하려면 게시 및 구독을 만들 때 추가 매개변수를 전달해야 합니다.

적극적으로 게시하고 구독할 때 'Nearby 사용 중' 알림이 표시되어 Nearby가 활성 상태임을 사용자에게 알립니다. 이 알림은 하나 이상의 앱이 Nearby를 사용 중일 때만 표시되므로 Nearby가 필요하지 않은 경우 사용자에게 배터리 수명을 절약할 수 있습니다. 이 파일은 사용자에게 다음 옵션을 제공합니다.

  • 앱으로 이동하여 Nearby를 사용 중지하세요.
  • 앱에서 Nearby 사용을 강제로 중지합니다.
  • Nearby 설정 화면으로 이동합니다.

PublishCallback()SubscribeCallback()를 사용하여 사용자가 앱에서 Nearby 사용을 중지하도록 강제하는 경우를 수신 대기할 수 있습니다. 이 경우 onExpired() 메서드가 트리거됩니다.

Nearby Messages API는 배터리 수명에 영향을 줄 수 있으므로 포그라운드 활동에서만 사용해야 합니다 (BLE 백그라운드 구독 제외).

Nearby Messages API를 사용하려면 publish() 또는 subscribe()를 호출합니다. 앱은 onStop()에서 항상 unpublish()unsubscribe()를 대칭적으로 사용해야 합니다.

@Override
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()));
        }
    }

    mMessage = new Message("Hello World".getBytes());
}

@Override
public void onStart() {
    super.onStart();
    ...
    Nearby.getMessagesClient(this).publish(mMessage);
    Nearby.getMessagesClient(this).subscribe(mMessageListener);
}

@Override
public void onStop() {
    Nearby.getMessagesClient(this).unpublish(mMessage);
    Nearby.getMessagesClient(this).unsubscribe(mMessageListener);
    ...
    super.onStop();
}

메시지 게시

메시지를 게시하려면 메시지 바이트 배열을 전달하는 Nearby.getMessagesClient(Activity).publish()를 호출합니다. 메시지를 3KB 미만으로 유지하는 것이 좋습니다. 이러한 메시지는 더 빠르게 전달할 수 있지만 필요한 앱에서 최대 100KB까지 지원할 수 있습니다. 이 서비스는 사진이나 동영상과 같이 더 큰 물체를 교환하기 위한 것이 아닙니다.

필요한 경우 PublishOptions.setStrategy()를 호출하여 사용할 전략을 설정할 수 있습니다.

다음 예에서는 publish()를 호출하여 작은 문자 메시지를 보내는 방법을 보여줍니다.

private void publish(String message) {
    Log.i(TAG, "Publishing message: " + message);
    mActiveMessage = new Message(message.getBytes());
    Nearby.getMessagesClient(this).publish(mActiveMessage);
}

메시지 게시 취소하기

메시지를 게시 취소하려면 unpublish()를 호출합니다. 앱은 최소한 onStop() 메서드에서 게시 취소를 호출해야 합니다. 게시하는 데 사용된 것과 동일한 Message 객체 (이 예에서는 mActiveMessage)를 전달합니다.

다음 코드 예는 unpublish()를 호출하는 방법을 보여줍니다.

private void unpublish() {
    Log.i(TAG, "Unpublishing.");
    if (mActiveMessage != null) {
        Nearby.getMessagesClient(this).unpublish(mActiveMessage);
        mActiveMessage = null;
    }
}

메시지 구독

다른 기기의 메시지를 구독하려면 Nearby.getMessagesClient(Activity).subscribe()를 호출합니다. 구독한 메시지 수신을 처리하려면 MessageListener를 전달해야 합니다.

필요한 경우 SubscribeOptions.setStrategy()를 호출하여 사용할 전략을 설정할 수 있습니다.

다음 예시에서는 메시지 구독을 보여줍니다.

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.");
    Nearby.getMessagesClient(this).subscribe(mMessageListener, options);
}

구독 취소

구독을 취소하고 기기 메시지 수신을 중지하려면 Nearby.getMessagesClient(Activity).unsubscribe()를 호출합니다. 구독에 사용된 동일한 MessageListener 객체 (이 예에서는 mMessageListener)를 전달합니다.

다음 코드 예는 구독 취소를 보여줍니다.

private void unsubscribe() {
    Log.i(TAG, "Unsubscribing.");
    Nearby.getMessagesClient(this).unsubscribe(mMessageListener);
}