קבלת הודעות ב-Beacon

האפליקציה שלך יכולה להירשם לקבצים מצורפים של Bluetooth עם צריכת אנרגיה נמוכה (BLE) באמצעות אותו מנגנון שמשמש לרישום הודעות שפורסמו על ידי מכשירים אחרים בקרבת מקום. בזמן ההרשמה, האפליקציה תקבל באופן אוטומטי הודעות ממכשירי Bluetooth וממכשירים קרובים.

הרשמה להודעות לגבי משׂואת רשת (beacon) BLE

יש שתי דרכים שבהן האפליקציה שלך יכולה להירשם לקבלת הודעות של חיישן BLE:

  • בחזית, בתגובה לפעולה או לאירוע של משתמש.
  • ברקע, כשהאפליקציה לא פועלת.

הרשמה בחזית

כשהאפליקציה נרשמת להודעות של איתות Bluetooth בחזית, הסריקות מתבצעות באופן רציף עד שהאפליקציה מבוטלת. להפעיל מינוי בחזית רק כשהאפליקציה פעילה, בדרך כלל בתגובה לפעולה של המשתמש.

האפליקציה שלך יכולה ליזום מינוי בחזית על ידי התקשרות ל-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).

הרשמה ברקע

כשהאפליקציה נרשמת להודעות של איתות Bluetooth ברקע, סריקות צריכת חשמל נמוכה מופעלות באירועים במסך, גם כשהאפליקציה לא פעילה כרגע. תוכלו להשתמש בהתראות הסריקה האלה כדי "להעיר" את האפליקציה בתגובה להודעה מסוימת. מינויים ברקע מפחיתים את צריכת האנרגיה בהשוואה למינויים בחזית, אבל זמן האחזור ארוך יותר והאמינות שלהם נמוכה יותר.

האפליקציה שלך יכולה להפעיל מינוי ברקע על ידי התקשרות ל-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

קבצים מצורפים של משואות רשת (beacon) הם בליטות של נתונים שרירותיים שאפשר להוסיף למשואות רשת. כל קובץ מצורף מכיל את החלקים הבאים:

  • מרחב שמות: מזהה של מרחב שמות.
  • סוג: סוג הנתונים.
  • נתונים: ערך הנתונים של הקובץ המצורף.

קטע הקוד הבא מדגים איך משתמשים ב- listener של הודעה כדי לנתח הודעות שהתקבלו מחיישן 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() בפעילות שלך. הערה: האפשרות הזאת רלוונטית רק כאשר בהרשמה בחזית.
  • כדי לקצר את זמן האחזור, מומלץ להשתמש באפשרות Strategy.BLE_ONLY כשאתם מתקשרים אל Nearby.getMessagesClient(Activity).subscribe(). כשההגדרה הזו מוגדרת, Nearby Messages API לא יפעיל את הגרסה הקלאסית של Bluetooth סריקות. זה משפר את זמן האחזור לזיהוי איתות מכיוון שהמערכת לא עובר בין כל סוגי הסריקה האפשריים.
  • כדי לצרף מטען ייעודי (payload) של הודעה לחיישן, צריך להשתמש Proximity Beacon API.