برنامه شما میتواند با استفاده از همان مکانیزمی که برای اشتراک در پیامهای منتشر شده توسط سایر دستگاههای مجاور استفاده میشود، در پیوستهای بیکن بلوتوث کممصرف (BLE) مشترک شود. هنگام اشتراک، برنامه شما به طور خودکار پیامها را از بیکنها و دستگاههای مجاور دریافت میکند.
مشترک شدن در پیامهای بیکن BLE
دو راه وجود دارد که برنامه شما می تواند در پیام های BLE beacon مشترک شود:
اشتراک در پیش زمینه
هنگامی که برنامه شما مشترک پیامهای بیکن در پیشزمینه میشود، اسکنها به طور مداوم انجام میشود تا زمانی که اشتراک برنامه شما لغو شود. اشتراک پیش زمینه را فقط زمانی شروع کنید که برنامه شما فعال است، معمولاً در پاسخ به یک اقدام کاربر.
برنامه شما میتواند با تماس با 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) لغو اشتراک کند.
در پسزمینه مشترک شوید
هنگامی که برنامه شما مشترک پیامهای beacon در پسزمینه میشود، اسکنهای کم مصرف در رویدادهای روی صفحه فعال میشوند، حتی زمانی که برنامه شما در حال حاضر فعال نیست. می توانید از این اعلان های اسکن برای "بیدار کردن" برنامه خود در پاسخ به یک پیام خاص استفاده کنید. اشتراکهای پسزمینه انرژی کمتری نسبت به اشتراکهای پیشزمینه مصرف میکنند، اما تأخیر بالاتر و قابلیت اطمینان کمتری دارند.
برنامه شما میتواند با تماس با 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) لغو اشتراک کند.
پیام های فانوس دریایی را تجزیه کنید
پیوست های Beacon حباب هایی از داده های دلخواه هستند که می توانید به بیکن ها اضافه کنید . هر پیوست شامل بخش های زیر است:
- Namespace: شناسه فضای نام.
- نوع: نوع داده
- داده: مقدار داده برای پیوست.
قطعه کد زیر استفاده از شنونده پیام را برای تجزیه پیام های دریافتی از یک چراغ 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 را رمزگذاری میکنند، اما پیام چراغ شما میتواند فرمتهای بایت دیگر را رمزگذاری کند (مثلاً یک بافر پروتکل سریالی). برای اطلاعات بیشتر، به افزودن پیوست به Beacon ها مراجعه کنید.
برای اینکه بفهمید کدام فضاهای نام با پروژه شما مرتبط هستند، namespaces.list را فراخوانی کنید.
یادداشتها:
- برای صرفهجویی در مصرف باتری، تابع
Nearby.getMessagesClient(Activity).unsubscribe()را در تابعonStop()مربوط به Activity خود فراخوانی کنید. توجه داشته باشید که این مورد فقط زمانی اعمال میشود که در پیشزمینه مشترک شوید. - برای کاهش تأخیر، هنگام فراخوانی
Nearby.getMessagesClient(Activity).subscribe()از گزینهStrategy.BLE_ONLYاستفاده کنید. وقتی این گزینه تنظیم شده باشد، API پیامهای نزدیک، اسکنهای بلوتوث کلاسیک را آغاز نمیکند. این امر تأخیر تشخیص بیکن را بهبود میبخشد زیرا سیستم تمام انواع اسکن ممکن را بررسی نمیکند. - برای اتصال یک پیام به یک بیکن، از API مربوط به Proximity Beacon استفاده کنید.