รับข้อความบีคอน

แอปของคุณสามารถสมัครรับไฟล์แนบบีคอนบลูทูธพลังงานต่ำ (BLE) โดยใช้กลไกเดียวกันกับที่ใช้ในการสมัครรับข้อมูลข้อความที่อุปกรณ์ใกล้เคียงอื่นๆ เผยแพร่ เมื่อสมัครใช้บริการ แอปจะได้รับข้อความ จากทั้งบีคอนและอุปกรณ์ที่อยู่ใกล้เคียงโดยอัตโนมัติ

สมัครรับข้อความบีคอน BLE

แอปของคุณสามารถสมัครรับข้อความบีคอน BLE ได้ 2 วิธีดังนี้

สมัครใช้บริการเบื้องหน้า

เมื่อแอปติดตามข้อความบีคอนในเบื้องหน้า การสแกนจะทํางานอย่างต่อเนื่องจนกว่าแอปจะยกเลิกการสมัคร เริ่มการสมัครใช้บริการเบื้องหน้าเฉพาะเมื่อแอปทํางานอยู่ ซึ่งโดยปกติแล้วจะตอบสนองต่อการดําเนินการของผู้ใช้

แอปของคุณเริ่มการสมัครใช้บริการเบื้องหน้าได้ด้วยการโทร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)

ติดตามในเบื้องหลัง

เมื่อแอปสมัครรับข้อมูลจากข้อความบีคอนในเบื้องหลัง การสแกนพลังงานต่ําจะทํางานที่เหตุการณ์บนหน้าจอ แม้ว่าแอปจะไม่ได้ใช้งานอยู่ในปัจจุบัน คุณใช้การแจ้งเตือนการสแกนเหล่านี้เพื่อ "ปลุก" แอปให้ตอบสนองต่อข้อความเฉพาะได้ การสมัครใช้บริการที่ทํางานอยู่เบื้องหลังจะใช้พลังงานน้อยกว่าการสมัครใช้บริการเบื้องหน้า แต่มีเวลาในการตอบสนองสูงกว่าและความเสถียรต่ํากว่า

แอปสามารถเริ่มการสมัครใช้บริการในเบื้องหลังได้ด้วยการโทร 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);
}

ข้อมูลโค้ดต่อไปนี้สาธิตการจัดการ Intent ในคลาส 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)

แยกวิเคราะห์ข้อความบีคอน

ไฟล์แนบบีคอนคือกลุ่มข้อมูลที่กําหนดเองซึ่งคุณเพิ่มลงในบีคอนได้ ไฟล์แนบแต่ละรายการประกอบด้วยส่วนต่างๆ ต่อไปนี้

  • Namespace: ตัวระบุเนมสเปซ
  • ประเภท: ประเภทข้อมูล
  • ข้อมูล: ค่าของข้อมูลสําหรับไฟล์แนบ

ข้อมูลโค้ดต่อไปนี้สาธิตโดยใช้ 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 แต่ข้อความบีคอนสามารถเข้ารหัสรูปแบบอื่นๆ แบบไบต์ได้ (เช่น บัฟเฟอร์โปรโตคอลแบบอนุกรม) โปรดดูข้อมูลเพิ่มเติมที่หัวข้อเพิ่มไฟล์แนบลงในบีคอน

หากต้องการดูว่าเนมสเปซใดเชื่อมโยงกับโปรเจ็กต์ ให้เรียกใช้ namespaces.list

หมายเหตุ

  • หากต้องการยืดอายุการใช้งานแบตเตอรี่ ให้เรียกใช้ Nearby.getMessagesClient(Activity).unsubscribe() ในฟังก์ชัน onStop() ของกิจกรรม โปรดทราบว่าการดำเนินการนี้จะมีผลต่อเมื่อมีการสมัครใช้บริการในเบื้องหน้าเท่านั้น
  • หากต้องการลดเวลาในการตอบสนอง ให้ใช้ตัวเลือก Strategy.BLE_ONLY เมื่อโทรหา Nearby.getMessagesClient(Activity).subscribe() เมื่อตั้งค่าตัวเลือกนี้แล้ว Nearby Messages API จะไม่เรียกใช้การสแกนบลูทูธแบบคลาสสิก ซึ่งจะช่วยปรับปรุงเวลาในการตอบสนองของการตรวจจับบีคอน เนื่องจากระบบไม่ได้หมุนเวียนผ่านการสแกนทุกประเภทที่เป็นไปได้
  • หากต้องการแนบเพย์โหลดข้อความกับบีคอน ให้ใช้ Proximity Beacon API