ค้นหาอุปกรณ์บลูทูธ

การใช้ BluetoothAdapter, คุณสามารถค้นหาอุปกรณ์บลูทูธระยะไกลผ่านการค้นหาอุปกรณ์หรือโดย การค้นหารายการอุปกรณ์ที่จับคู่แล้ว

ตรวจสอบว่าคุณมีสิทธิ์บลูทูธที่เหมาะสม และตั้งค่าแอปสำหรับบลูทูธ ก่อนจะพยายามหาอุปกรณ์บลูทูธ

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

เพราะอุปกรณ์ที่ค้นพบได้อาจเปิดเผยข้อมูลตำแหน่งของผู้ใช้ กระบวนการค้นหาอุปกรณ์จำเป็นต้องมีการเข้าถึงตำแหน่ง หากมีการใช้งานแอป ในอุปกรณ์ที่ใช้ Android 8.0 (API ระดับ 26) ขึ้นไป ให้พิจารณาใช้ โปรแกรมจัดการอุปกรณ์ที่ใช้ร่วมกัน API แทน API นี้ ค้นพบอุปกรณ์ในนามของแอป แอปของคุณจึงไม่ต้อง ขอสิทธิ์เข้าถึงตำแหน่ง

เมื่อเชื่อมต่อกับอุปกรณ์ระยะไกลเป็นครั้งแรกแล้ว การจับคู่ แสดงให้ผู้ใช้เห็นโดยอัตโนมัติ เมื่อมีการจับคู่อุปกรณ์แล้ว ข้อมูลพื้นฐานเกี่ยวกับอุปกรณ์นั้น เช่น ชื่อ ชั้นเรียน และ MAC ของอุปกรณ์ ที่อยู่ - ได้รับการบันทึกและสามารถอ่านได้โดยใช้ Bluetooth API การใช้ MAC ที่รู้จัก ที่อยู่สำหรับอุปกรณ์ระยะไกล ซึ่งสามารถเริ่มการเชื่อมต่อได้ทุกเมื่อ โดยไม่ต้องค้นหา ในกรณีที่อุปกรณ์ยังอยู่ในระยะที่กำหนด

โปรดทราบว่าการมีการจับคู่กับการเชื่อมต่อกันนั้นมีความแตกต่างกันดังนี้

  • การจับคู่หมายถึงการที่อุปกรณ์ 2 เครื่องรับรู้ถึงการมีอยู่ของกันและกัน มีคีย์ลิงก์ที่แชร์ ซึ่งสามารถใช้สำหรับการตรวจสอบสิทธิ์ และ กำลังสร้างการเชื่อมต่อที่เข้ารหัสระหว่างกัน
  • การเชื่อมต่อหมายความว่าขณะนี้อุปกรณ์แชร์ช่องทาง RFCOMM และ สามารถส่งข้อมูลระหว่างกัน บลูทูธปัจจุบัน API ต้องมีการจับคู่อุปกรณ์ก่อนจึงจะเชื่อมต่อ RFCOMM ได้ แล้ว การจับคู่จะดำเนินการโดยอัตโนมัติเมื่อคุณเริ่มการเข้ารหัส กับ Bluetooth API แล้ว

ส่วนต่อไปนี้จะอธิบายวิธีค้นหาอุปกรณ์ที่จับคู่แล้ว และ วิธีค้นพบอุปกรณ์ใหม่ๆ โดยใช้การค้นพบอุปกรณ์

ค้นหาอุปกรณ์ที่จับคู่แล้ว

ก่อนที่จะดำเนินการค้นหาอุปกรณ์ คุณควรค้นหาชุดอุปกรณ์ที่จับคู่แล้ว เพื่อดูว่าอุปกรณ์ที่ต้องการรู้จักอุปกรณ์นั้นแล้วหรือไม่ โดยโทร getBondedDevices() ซึ่งจะแสดงชุดของ ออบเจ็กต์ BluetoothDevice รายการ หมายถึงอุปกรณ์ที่จับคู่แล้ว เช่น ค้นหาอุปกรณ์ที่จับคู่ทั้งหมดและ ดูชื่อและที่อยู่ MAC ของอุปกรณ์แต่ละเครื่อง เป็นข้อมูลโค้ดต่อไปนี้ แสดงให้เห็น:

Kotlin

val pairedDevices: Set<BluetoothDevice>? = bluetoothAdapter?.bondedDevices
pairedDevices?.forEach { device ->
   val deviceName = device.name
   val deviceHardwareAddress = device.address // MAC address
}

Java

Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();

if (pairedDevices.size() > 0) {
   // There are paired devices. Get the name and address of each paired device.
   for (BluetoothDevice device : pairedDevices) {
       String deviceName = device.getName();
       String deviceHardwareAddress = device.getAddress(); // MAC address
   }
}

หากต้องการเริ่มเชื่อมต่อกับอุปกรณ์บลูทูธ ทุกอย่างที่ต้องใช้จาก ออบเจ็กต์ BluetoothDevice ที่เชื่อมโยงคือที่อยู่ MAC ซึ่งคุณเรียกดูได้โดย การโทร getAddress() คุณ ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างการเชื่อมต่อในเชื่อมต่อบลูทูธ อุปกรณ์

สำรวจอุปกรณ์

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

หากต้องการรับข้อมูลเกี่ยวกับอุปกรณ์แต่ละเครื่องที่ค้นพบ แอปของคุณต้องลงทะเบียน BroadcastReceiver สำหรับ ACTION_FOUND Intent ระบบจะเผยแพร่ Intent นี้สำหรับอุปกรณ์แต่ละเครื่อง Intent มี ฟิลด์เพิ่มเติม EXTRA_DEVICE และ EXTRA_CLASS ซึ่ง และจะมี BluetoothDevice และ BluetoothClass ตามลำดับ ตัวอย่างข้อมูลโค้ดต่อไปนี้แสดงวิธีการลงทะเบียนเพื่อจัดการการออกอากาศ เมื่อพบอุปกรณ์

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
   ...

   // Register for broadcasts when a device is discovered.
   val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
   registerReceiver(receiver, filter)
}

// Create a BroadcastReceiver for ACTION_FOUND.
private val receiver = object : BroadcastReceiver() {

   override fun onReceive(context: Context, intent: Intent) {
       val action: String = intent.action
       when(action) {
           BluetoothDevice.ACTION_FOUND -> {
               // Discovery has found a device. Get the BluetoothDevice
               // object and its info from the Intent.
               val device: BluetoothDevice =
                       intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
               val deviceName = device.name
               val deviceHardwareAddress = device.address // MAC address
           }
       }
   }
}

override fun onDestroy() {
   super.onDestroy()
   ...

   // Don't forget to unregister the ACTION_FOUND receiver.
   unregisterReceiver(receiver)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
   ...

   // Register for broadcasts when a device is discovered.
   IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
   registerReceiver(receiver, filter);
}

// Create a BroadcastReceiver for ACTION_FOUND.
private final BroadcastReceiver receiver = new BroadcastReceiver() {
   public void onReceive(Context context, Intent intent) {
       String action = intent.getAction();
       if (BluetoothDevice.ACTION_FOUND.equals(action)) {
           // Discovery has found a device. Get the BluetoothDevice
           // object and its info from the Intent.
           BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
           String deviceName = device.getName();
           String deviceHardwareAddress = device.getAddress(); // MAC address
       }
   }
};

@Override
protected void onDestroy() {
   super.onDestroy();
   ...

   // Don't forget to unregister the ACTION_FOUND receiver.
   unregisterReceiver(receiver);
}

หากต้องการเริ่มการเชื่อมต่อกับอุปกรณ์บลูทูธ โปรดโทรหา getAddress() ใน BluetoothDevice เพื่อดึงข้อมูลที่อยู่ MAC ที่เชื่อมโยง

เปิดใช้การค้นพบได้

หากต้องการให้อุปกรณ์อื่นๆ ค้นพบอุปกรณ์ในเครือข่ายเดียวกัน โปรดโทร startActivityForResult(Intent, int) พร้อมด้วย ACTION_REQUEST_DISCOVERABLE Intent การดำเนินการนี้จะออกคำขอเปิดใช้โหมดที่ค้นพบได้ของระบบ คุณต้องไปที่แอปการตั้งค่า ซึ่งจะทำให้แอปของคุณหยุดทำงาน โดย โดยค่าเริ่มต้น อุปกรณ์จะสามารถค้นพบได้เป็นเวลาสองนาที คุณสามารถกำหนด ระยะเวลาที่แตกต่างถึง 1 ชั่วโมงด้วยการเพิ่ม EXTRA_DISCOVERABLE_DURATION เพิ่มเติม

ข้อมูลโค้ดต่อไปนี้จะตั้งค่าอุปกรณ์ให้ค้นพบได้เป็นเวลา 5 นาที

Kotlin

val requestCode = 1;
val discoverableIntent: Intent = Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE).apply {
   putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300)
}
startActivityForResult(discoverableIntent, requestCode)

Java

int requestCode = 1;
Intent discoverableIntent =
       new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivityForResult(discoverableIntent, requestCode);


รูปที่ 2: กล่องโต้ตอบการเปิดใช้การค้นพบได้

กล่องโต้ตอบจะปรากฏขึ้นเพื่อขอสิทธิ์จากผู้ใช้ในการสร้างอุปกรณ์ ค้นพบได้ ดังที่แสดงในรูปที่ 2 หากผู้ใช้ตอบกลับว่า "อนุญาต" แล้ว ค้นพบอุปกรณ์ได้ในระยะเวลาที่ระบุ จากนั้นกิจกรรม รับสายที่โทรไปยัง onActivityResult() Callback ซึ่งมีรหัสผลลัพธ์เท่ากับระยะเวลาที่อุปกรณ์ ค้นพบได้ หากผู้ใช้ตอบว่า "ปฏิเสธ" หรือหากเกิดข้อผิดพลาด ผลลัพธ์ รหัสคือ RESULT_CANCELED

อุปกรณ์จะอยู่ในโหมดค้นพบโดยไม่มีเสียงในช่วงเวลาที่กำหนดไว้ เพื่อให้ ได้รับแจ้งเมื่อโหมดที่ค้นพบได้มีการเปลี่ยนแปลง ให้ลงทะเบียน BroadcastReceiver สำหรับ ACTION_SCAN_MODE_CHANGED Intent Intent นี้มีช่องเพิ่มเติม EXTRA_SCAN_MODE และ EXTRA_PREVIOUS_SCAN_MODE, ซึ่งจะมอบโหมดสแกนแบบใหม่และเก่าตามลำดับ ค่าที่เป็นไปได้สำหรับแต่ละรายการ มีดังนี้

SCAN_MODE_CONNECTABLE_DISCOVERABLE
อุปกรณ์อยู่ในโหมดค้นพบได้
SCAN_MODE_CONNECTABLE
อุปกรณ์ไม่ได้อยู่ในโหมดค้นพบได้ แต่ยังคงรับการเชื่อมต่อได้
SCAN_MODE_NONE
อุปกรณ์ไม่ได้อยู่ในโหมดค้นพบได้และไม่สามารถรับการเชื่อมต่อ

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