برنامه شما میتواند بااستفاده از همان سازوکاری که برای مشترک شدن در پیامهای منتشرشده توسط دیگر دستگاههای اطراف استفاده میشود، در پیوستهای فانوس «بلوتوث کممصرف» (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()«فعالیت» خود فراخوانی کنید. توجه داشته باشید که این فقط زمانی اعمال میشود که در پیشزمینه مشترک شوید. -
برای کاهش تأخیر، هنگام فراخوانی
Nearby.getMessagesClient(Activity).subscribe()از گزینهStrategy.BLE_ONLYاستفاده کنید. وقتی این گزینه تنظیم شود، «میانای برنامهسازی کاربردی پیامهای اطراف» اسکنهای بلوتوث کلاسیک را راهاندازی نمیکند. این کار تأخیر در تشخیص فانوسک را بهبود میبخشد زیرا سیستم همه انواع اسکن ممکن را بهصورت چرخهای انجام نمیدهد. - برای پیوست کردن بار پیام به چراغ راهنما، از میانای برنامهسازی کاربردی «چراغ راهنمای مجاورت» استفاده کنید.