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

แอปของคุณสามารถสมัครใช้บริการไฟล์แนบบีคอนบลูทูธพลังงานต่ำ (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);
}

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

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

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

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

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