Ứ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 ý:
-
Để tiết kiệm pin, hãy gọi
Nearby.getMessagesClient(Activity).unsubscribe()
trong hàmonStop()
của Hoạt động. Lưu ý rằng điều này chỉ áp dụng khi đăng ký trong nền trước. -
Để giảm độ trễ, hãy dùng tuỳ chọn
Strategy.BLE_ONLY
khi gọiNearby.getMessagesClient(Activity).subscribe()
. Khi bạn đặt tuỳ chọn này, Nearby Messages API sẽ không kích hoạt Bluetooth cổ điển quét. Điều này giúp cải thiện độ trễ cho việc phát hiện beacon vì hệ thống không xoay vòng qua tất cả các loại quét có thể có. - Để đính kèm tải trọng tin nhắn vào beacon, hãy sử dụng API Báo hiệu vùng lân cận.