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

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