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

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

הרשמה להודעות מ-beacon של 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)

הרשמה ברקע

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

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

קטע הקוד הבא מדגים שימוש ב-Message 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 רגילות. כך משתפרת זמן האחזור לזיהוי משואות, כי המערכת לא עוברת על כל סוגי הסריקה האפשריים.
  • כדי לצרף עומס נתונים של הודעה למשואה, משתמשים ב-Proximity Beacon API.