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