Nhận tin nhắn báo hiệu

Ứng dụng của bạn có thể đăng ký tệp đính kèm báo hiệu Bluetooth năng lượng thấp (BLE) sử dụng chính cơ chế được dùng để đăng ký nhận thông báo được đăng bởi các thiết bị lân cận khác. Khi bạn đăng ký, ứng dụng của bạn sẽ tự động nhận được tin nhắn từ cả beacon và thiết bị lân cận.

Đăng ký nhận thông báo báo hiệu BLE

Có hai cách mà ứng dụng của bạn có thể đăng ký nhận thông báo báo hiệu BLE:

  • nền trước, để phản hồi một hành động của người dùng hoặc sự kiện.
  • Trong chế độ nền, khi ứng dụng của bạn đang đang không chạy.

Đăng ký trong nền trước

Khi ứng dụng của bạn đăng ký nhận thông báo beacon ở nền trước, quá trình quét sẽ được thực hiện liên tục cho đến khi ứng dụng của bạn huỷ đăng ký. Chỉ bắt đầu ở nền trước khi ứng dụng của bạn đang hoạt động, thường là để phản hồi một hành động của người dùng.

Ứng dụng của bạn có thể bắt đầu gói thuê bao trên nền trước bằng cách gọi Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions) và đặt tuỳ chọn Strategy thành BLE_ONLY.

Đoạn mã sau đây minh hoạ việc khởi tạo gói thuê bao trên nền trước 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);
}

Khi không còn cần gói thuê bao, ứng dụng của bạn sẽ huỷ đăng ký bằng cách gọi điện Nearby.getMessagesClient(Activity).unsubscribe(MessageListener).

Đăng ký trong nền

Khi ứng dụng của bạn đăng ký nhận thông báo beacon trong nền, tính năng quét tiết kiệm pin được kích hoạt tại các sự kiện màn hình, ngay cả khi ứng dụng của bạn hiện không hoạt động. Bạn có thể dùng các thông báo quét này để "đánh thức" ứng dụng của bạn nhằm đáp ứng một tin nhắn cụ thể. Gói thuê bao ở chế độ nền tốn ít pin hơn gói thuê bao trên nền trước nhưng có độ trễ cao hơn và độ tin cậy thấp hơn.

Ứng dụng của bạn có thể bắt đầu gói thuê bao ở chế độ nền bằng cách gọi Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions) và đặt tuỳ chọn Strategy thành BLE_ONLY.

Đoạn mã sau đây minh hoạ việc khởi tạo gói thuê bao ở chế độ nền bằng đang gọi 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ạn mã sau đây minh hoạ cách xử lý ý định trong Lớp 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);
        }
    });
}

Khi không còn cần gói thuê bao, ứng dụng của bạn sẽ huỷ đăng ký bằng cách gọi điện Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent).

Phân tích cú pháp thông báo beacon

Tệp đính kèm báo hiệu là các blob dữ liệu tuỳ ý mà bạn có thể thêm vào beacon. Mỗi tệp đính kèm bao gồm các phần sau:

  • Không gian tên: Giá trị nhận dạng không gian tên.
  • Loại: Loại dữ liệu.
  • Dữ liệu: Giá trị dữ liệu cho tệp đính kèm.

Đoạn mã sau đây minh hoạ cách sử dụng trình nghe thông báo để phân tích cú pháp tin nhắn nhận được từ 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());
    }

    ...
};

Việc phân tích cú pháp nội dung phụ thuộc vào định dạng của các byte. Ví dụ này giả định rằng các byte nội dung mã hoá một chuỗi UTF-8, nhưng thông báo beacon của bạn có thể mã hoá các định dạng byte khác (ví dụ: vùng đệm giao thức tuần tự). Để biết thêm thông tin, hãy xem Thêm tệp đính kèm vào báo hiệu.

Để tìm hiểu không gian tên nào được liên kết với dự án của bạn, hãy gọi namespaces.list.

Lưu ý: