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

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

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