البحث عن أجهزة تتضمّن بلوتوث

باستخدام BluetoothAdapter، يمكنك العثور على أجهزة البلوتوث عن بُعد إما من خلال اكتشاف الجهاز أو من خلال للاستعلام عن قائمة الأجهزة المقترنة.

تأكَّد من توفُّر أذونات البلوتوث المناسبة. وإعداد تطبيقك لاستخدام البلوتوث قبل محاولة العثور على أجهزة بلوتوث.

اكتشاف الجهاز هو إجراء فحص يبحث في المنطقة المحلية عن الأجهزة المزوّدة ببلوتوث وطلب بعض المعلومات حول كل جهاز هذا النمط أحيانًا على أنه الاكتشاف أو الاستعلام أو الفحص. لا يستجيب جهاز مجاور يتضمّن بلوتوث لطلب اكتشاف إلا إذا كان تقبل حاليًا طلبات المعلومات كونها قابلة للاكتشاف. إذا كان أحد الأجهزة قابلة للاكتشاف، فإنها تستجيب لطلب الاكتشاف من خلال مشاركة بعض المعلومات، مثل اسم الجهاز وفئته وعنوان MAC الفريد الخاص به. استخدام هذا فيمكن للجهاز الذي يجري عملية الاكتشاف اختيار لبدء الاتصال بالجهاز الذي تم اكتشافه

وبما أنّ الأجهزة القابلة للاكتشاف قد تكشف عن معلومات حول الموقع الجغرافي للمستخدم، تتطلب عملية اكتشاف الجهاز الوصول إلى الموقع الجغرافي. في حال استخدام التطبيق على جهاز يعمل بالإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات) أو إصدار أحدث، ننصحك باستخدام أداة إدارة الأجهزة المصاحبة API بدلاً من ذلك. واجهة برمجة التطبيقات هذه يتم اكتشاف الجهاز نيابةً عن تطبيقك، لذلك لا يحتاج تطبيقك إلى طلب أذونات تحديد الموقع الجغرافي

بعد إجراء اتصال باستخدام جهاز بعيد لأول مرة، سيؤدي تقديم طلبه تلقائيًا إلى المستخدم. عندما يتم إقران جهاز، المعلومات الأساسية عن هذا الجهاز - مثل اسم الجهاز وفئته وعنوان MAC العنوان — ويمكن قراءته باستخدام واجهات برمجة تطبيقات البلوتوث. استخدام عنوان MAC المعروف لجهاز بعيد، يمكن بدء اتصال معه في أي وقت دون اكتشاف الجهاز، على افتراض أن الجهاز لا يزال ضمن النطاق.

تجدر الإشارة إلى أنّ هناك فرقًا بين الإقران والربط:

  • ويعني الاقتران أن هناك جهازين على دراية بوجود بعضهما البعض، مفتاح رابط مشترك يمكن استخدامه للمصادقة ويستطيع وإنشاء اتصال مشفّر مع بعضهما البعض.
  • تعني كلمة متصل أنّ الأجهزة تتشارك حاليًا قناة RFCOMM. قادرة على نقل البيانات مع بعضها البعض. البلوتوث الحالي تتطلب واجهات برمجة التطبيقات إقران الأجهزة قبل التمكن من اتصال RFCOMM التأسيس. يتم تنفيذ الاقتران تلقائيًا عند بدء عملية تشفير الاتصال بواجهات برمجة تطبيقات البلوتوث.

توضّح الأقسام التالية طريقة العثور على الأجهزة التي تم إقرانها و كيفية اكتشاف الأجهزة الجديدة باستخدام ميزة اكتشاف الأجهزة.

الاستعلام عن الأجهزة المقترنة

قبل إجراء استكشاف الجهاز، يُستحسن الاستعلام عن مجموعة الأجهزة المقترنة الأجهزة لمعرفة ما إذا كان الجهاز المطلوب معروفًا بالفعل. لإجراء ذلك، اتصل 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 والنية. يبث النظام هذا الغرض لكل جهاز. يحتوي الغرض على الحقول الإضافية 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 والنية. يؤدي هذا إلى إصدار طلب لتفعيل وضع قابلية اكتشاف النظام بدون الاضطرار إلى الانتقال إلى تطبيق الإعدادات، مما قد يوقف تطبيقك. من افتراضيًا، يصبح الجهاز قابلاً للاكتشاف لمدة دقيقتين. يمكنك تحديد مدة مختلفة، تصل إلى ساعة واحدة، عن طريق إضافة EXTRA_DISCOVERABLE_DURATION المزيد.

يعمل مقتطف الرمز التالي على ضبط الجهاز ليكون قابلاً للاكتشاف لمدة خمس دقائق:

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() بحيث يكون رمز النتيجة مساويًا للمدة التي يقضيها الجهاز قابلة للاكتشاف. إذا رد المستخدم بـ "الرفض"، أو إذا حدث خطأ، فإن النتيجة الرمز هو RESULT_CANCELED.

يظل الجهاز في وضع اكتشاف الجهاز بدون تنبيه طوال الوقت المخصَّص. لتكون يجب تسجيل BroadcastReceiver عند تغيير الوضع "قابل للاكتشاف". بالنسبة إلى ACTION_SCAN_MODE_CHANGED والنية. يحتوي هذا الغرض على الحقول الإضافية EXTRA_SCAN_MODE أو EXTRA_PREVIOUS_SCAN_MODE, وهما يوفران وضعي البحث الجديد والقديم، على التوالي. القيم المحتملة لكل إضافية هي على النحو التالي:

SCAN_MODE_CONNECTABLE_DISCOVERABLE
الجهاز في وضع قابل للاكتشاف.
SCAN_MODE_CONNECTABLE
الجهاز ليس في وضع الاكتشاف ولكن لا يزال بإمكانه تلقي الاتصالات.
SCAN_MODE_NONE
الجهاز ليس في وضع قابل للاكتشاف ولا يمكنه تلقّي الاتصالات.

في حال بدء الاتصال بجهاز بعيد، لن تحتاج إلى تمكين قابلية اكتشاف الجهاز. لا يكون تفعيل قابلية الاكتشاف ضروريًا إلا عندما كنت تريد أن يستضيف تطبيقك مقبس خادم يقبل الطلبات الواردة للاتصالات، حيث يجب أن تتمكن الأجهزة البعيدة من اكتشاف الأجهزة الأخرى قبل بدء الاتصالات بتلك الأجهزة الأخرى.