it-swarm.dev

أندرويد 4.3 بلوتوث منخفضة الطاقة غير مستقرة

أقوم حاليًا بتطوير تطبيق سيستخدم Bluetooth Low Energy (اختبار على Nexus 4). بعد بدء استخدام واجهات برمجة التطبيقات الرسمية لـ BLE في Android 4.3 ، لاحظت أنه بعد توصيل جهاز لأول مرة ، نادراً ما أكون قادرًا على الاتصال/الاتصال مع هذا الجهاز أو أي جهاز آخر بنجاح.

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

بمجرد حدوث ذلك ، يتعين علي إلغاء تثبيت التطبيق ، وتعطيل Bluetooth ، وإعادة تشغيل الهاتف قبل أن يبدأ العمل مرة أخرى.

عندما يتم قطع اتصال جهاز ما ، تأكد من الاتصال بإغلاق () على كائن BluetoothGatt واضبطه على أنه فارغ. أي رؤى؟


تصحيح:
مقالب السجل: بالنسبة لهذه السجلات ، قمت بتجذير هاتفي وزاد من مستويات التتبع للعناصر ذات الصلة في /etc/bluetooth/bt_stack.conf

اتصال ناجح - أول محاولة بعد إعادة تشغيل الهاتف وتثبيت التطبيق. أنا قادر على الاتصال ، واكتشاف جميع الخدمات/الخصائص ، والقراءة/الكتابة.

فشل المحاولة 1 - هذه هي المحاولة التالية بعد قطع الاتصال الناجح أعلاه. يبدو أنني كنت قادرًا على اكتشاف الخصائص ، لكن المحاولة الأولى للقراءة أعادت قيمة فارغة وتم قطع اتصالها بعد ذلك بوقت قصير.

المحاولة الفاشلة 2 - مثال حيث لا أستطيع حتى اكتشاف الخدمات/الخصائص.


تحرير 2:
يعتمد الجهاز الذي أحاول الاتصال به على رقاقة CC2541 من TI. حصلت على TI SensorTag (استنادًا إلى CC2541) للعب بها واكتشفت أن TI أصدر تطبيق Android لـ SensorTag أمس. ومع ذلك ، فإن هذا التطبيق لديه نفس المشكلة. لقد اختبرت ذلك على جهازي Nexus 4s الآخرين بنفس النتيجة: الاتصال بـ SensorTag ناجح في المرة الأولى أو الثانية ، ولكن (وفقًا للسجلات) فشل في اكتشاف الخدمات بعد ذلك ، مما تسبب في حدوث جميع أنواع الأعطال. لقد بدأت أتساءل عما إذا كانت مشكلة في هذه الشريحة المحددة؟

185
sa.shadow

تلميحات التنفيذ الهامة

(ربما لم تعد بعض هذه التلميحات ضرورية بسبب تحديثات نظام التشغيل Android.)

  1. بعض الأجهزة مثل Nexus 4 مع Android 4.3 تستغرق 45+ ثانية للاتصال باستخدام مثيل gatt موجود . الحل البديل: قم دائمًا بإغلاق مثيلات gatt على قطع الاتصال وإنشاء مثيل جديد من gatt على كل اتصال.
  2. لا تنسَ الاتصال بـ Android.bluetooth.BluetoothGatt#close()
  3. بدء سلسلة جديدة داخل onLeScan(..) ثم الاتصال. السبب: BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback) يفشل دائمًا ، إذا تم استدعاؤه LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) في نفس الموضوع في Samsung Galaxy S3 مع Android 4.3 (على الأقل للبناء JSS15J.I9300XXUGMK6)
  4. معظم أجهزة تصفية الإعلانات
  5. من الأفضل عدم استخدام Android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback) مع المعلمة لتصفية UUIDs خدمة معينة لأن هذا هو كسر تماما في Samsung Galaxy S3 مع Android 4.3 و لا يعمل ل UUID 128bit في جنرال لواء.
  6. يستطيع Gatt دائمًا معالجة أمر واحد في المرة الواحدة . إذا تم استدعاء العديد من الأوامر باختصار ، فسيتم إلغاء الأمر الأول بسبب الطبيعة المتزامنة لتطبيق gatt.
  7. غالبًا ما أراه حتى على الأجهزة الحديثة التي تعمل بنظام Android 5 ، والتي تتداخل فيها خدمة Wifi مع البلوتوث والعكس. كحل أخير ، قم بإيقاف تشغيل wifi لاستقرار البلوتوث.

البرنامج التعليمي للمبتدئين

يمكن أن يكون مدخل الفيديو "OK" جيدًا للقادمين الجدد هو الفيديو التعليمي: تطوير تطبيقات Bluetooth الذكية لنظام Android http://youtu.be/x1y4tEHDwk0

ربما تم حل المشكلة والعمل حولها الموضحة أدناه من خلال تحديثات نظام التشغيل

حل بديل: يمكنني "تثبيت" تطبيقي عند القيام بذلك ...

  1. أقدم للمستخدم إعداد "إعادة تشغيل Bluetooth". إذا تم تمكين هذا الإعداد ، فأعد تشغيل Bluetooth في بعض النقاط التي تشير إلى أن بداية تكدس بليه تصبح غير مستقرة. مثلا إذا startScan إرجاع كاذبة. قد تكون هناك نقطة جيدة أيضًا في حالة فشل serviceDiscovery. أنا فقط إيقاف تشغيل بلوتوث وتشغيله.
  2. أقدم إعدادًا آخر "إيقاف تشغيل WiFi". إذا تم تمكين هذا الإعداد ، فسيقوم تطبيقي بإيقاف تشغيل Wifi عندما يكون التطبيق قيد التشغيل (ويعيد تشغيله بعد ذلك)

ويستند هذا العمل حول الخبرات التالية ...

  • تساعد إعادة تشغيل Bluetooth على حل المشكلات المتعلقة بـ BLE في معظم الحالات
  • إذا قمت بإيقاف تشغيل Wifi ، فإن مكدس BLE يصبح أكثر استقرارًا. ومع ذلك ، فإنه يعمل أيضًا بشكل جيد على معظم الأجهزة مع تشغيل wifi.
  • إذا قمت بإيقاف تشغيل Wifi ، فإن إعادة تشغيل Bluetooth تستعيد مكدس BLE بالكامل دون الحاجة إلى إعادة تشغيل الجهاز في معظم الحالات.
175
OneWorld

إيقاف تشغيل WiFi:

يمكنني أن أؤكد أيضًا أن تشغيل WIFI OFF يجعل Bluetooth 4.0 أكثر استقرارًا وخاصة على Google Nexus (لدي Nexus 7).

المشكلة

هو أن التطبيق الذي أطوره يحتاج كلاهماWIFIومستمر مسح Bluetooth LE . حتى تحول WIFI OFF لم يكن هناك خيار بالنسبة لي.

علاوةً على ذلك ، فقد أدركت أن مسح Bluetooth LE المستمر يمكن فعليًا قتل اتصال WIFI وجعل محول WIFI غير قادر على إعادة الاتصال إلى أي شبكة WIFI حتى مسح BLE قيد التشغيل. (لست متأكدا من شبكات المحمول والإنترنت المحمول).
حدث هذا بالتأكيد على الأجهزة التالية:

  • نيكزس 7
  • موتورولا موتو جي

ومع ذلك بدا بليه المسح مع WIFI على مستقرة جدا على:

  • سامسونج اس 4
  • HTC واحد

بلدي الحل

I مسح BLE لـ فترة زمنية قصيرة 3-4 ثوانٍ ثم I قم بإيقاف تشغيل المسح الضوئي لمدة 3-4 ثوانٍ . ثم مرة أخرى.

  • من الواضح أنني أقوم دائمًا بإيقاف تشغيل BLE scan عندما أقوم بالاتصال بجهاز BLE.
  • عندما أقوم بالاتصال بجهاز ، أعد تشغيل BLE (إيقاف تشغيل المحول ثم تشغيل) لإعادة ضبط المكدس قبل بدء المسح مرة أخرى.
  • أقوم أيضًا بإعادة تعيين BLE عند فشل اكتشاف services أو characteristics.
  • عندما أحصل على بيانات الإعلان من جهاز يجب أن يتصل به التطبيق (دعنا نقول 500 مرة دون التمكن من الاتصال - أي حوالي 5 إلى 10 ثوانٍ من الإعلان) أعيد تعيين BLE مرة أخرى.
15
benka

تأكد من أن جهاز Nexus مقترن بالجهاز. لا يمكنني التحقق مما إذا كان الاتصال يعمل بشكل صحيح أم لا ، ولكن ستتمكن من الاتصال أكثر من مرة دون إعادة تشغيل الكمبيوتر. يبدو أن الاتصال الأول لا يتطلب الاقتران ولكن كل المحاولات اللاحقة تفعل.

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

تحرير: اتضح أنني كنت أختبر إصدارًا من برامج التطوير الثابتة (المستشعر) الذي تسبب في حدوث مشكلات إذا لم يتم إقرانها. يعمل أحدث إصدار من البرامج الثابتة الخاصة بالإنتاج لدينا بشكل جيد في 2540 و 2541.

تحرير: لقد لاحظت أنه في جهاز Nexus 7 2013 ، أصبحت الاتصالات أكثر استقرارًا عند إيقاف تشغيل شبكة WiFi. أود أن أعرف إذا كان هذا يساعد أي شخص آخر.

تحرير: يبدو أنه كان لي الوراء مع الاقتران. كل شيء يعمل بشكل جيد عندما لا يقترن. بعد الاقتران ، أعاني نفس الأعراض بالضبط مثل OP. لا يُعرف حتى الآن ما إذا كان هذا مرتبطًا بالبرامج الثابتة أو Android BLE API. كن حذرًا في حالة اختبار هذا لأنه بمجرد إقرانه ، قد لا تتمكن من إلغاء الإقران نظرًا لوجود خطأ موضح في 3b من هذا بعد .

6
Mikt25

في بعض النماذج ، هناك عيب: https://code.google.com/p/Android/issues/detail؟id=180440

من ناحية أخرى في حالتي كانت المشكلة ، أن الاتصال لم يغلق بشكل صحيح في طريقة onDestroy. بعد الإغلاق الصحيح ، المشكلة بالنسبة لي غير موجودة ، بغض النظر عن تشغيل wifi أو إيقافه.

btGatt.disconnect();
btGatt.close();
4
Krystian

كنت أواجه مشكلة مماثلة. إصلاح بلدي كان

if (Build.VERSION.SDK_INT >= 23) {
  mBluetoothGatt = device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE);
} else {
  mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
}

والاتصال وثيق بعد قطع الاتصال.

0
Sam Reyes