پیام های Beacon را دریافت کنید

برنامه شما می‌تواند با استفاده از مکانیزم مشابهی که برای اشتراک پیام‌های منتشر شده توسط سایر دستگاه‌های اطراف استفاده می‌شود، در پیوست‌های چراغ کم مصرف بلوتوث (BLE) مشترک شود. هنگام اشتراک، برنامه شما به طور خودکار پیام‌هایی را هم از چراغ‌ها و هم از دستگاه‌های اطراف دریافت می‌کند.

مشترک شدن در پیام های BLE beacon

دو راه وجود دارد که برنامه شما می تواند در پیام های 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 استفاده کنید. وقتی این گزینه تنظیم شود، Nearby Messages API اسکن‌های کلاسیک بلوتوث را راه‌اندازی نمی‌کند. این امر تأخیر برای تشخیص چراغ را بهبود می بخشد زیرا سیستم در تمام انواع اسکن ممکن نمی چرخد.
  • برای پیوست کردن بار پیام به یک چراغ، از Proximity Beacon API استفاده کنید.