Android 4.3 Bluetooth Low Energy ไม่เสถียร


189

ฉันกำลังพัฒนาแอพพลิเคชั่นที่จะใช้ Bluetooth Low Energy (ทดสอบกับ Nexus 4) หลังจากเริ่มต้นด้วย BLE API อย่างเป็นทางการใน Android 4.3 ฉันสังเกตเห็นว่าหลังจากฉันเชื่อมต่ออุปกรณ์เป็นครั้งแรกฉันแทบจะไม่สามารถเชื่อมต่อ / สื่อสารกับอุปกรณ์นั้นหรืออุปกรณ์อื่นใดได้สำเร็จ

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

เมื่อสิ่งนี้เกิดขึ้นฉันต้องถอนการติดตั้งแอปพลิเคชั่นปิดการใช้งานบลูทู ธ และรีสตาร์ทโทรศัพท์ก่อนที่มันจะเริ่มทำงานอีกครั้ง

เมื่อใดก็ตามที่อุปกรณ์ถูกตัดการเชื่อมต่อฉันต้องแน่ใจว่าได้โทรปิด () บนวัตถุ BluetoothGatt และตั้งค่าเป็นโมฆะ ข้อมูลเชิงลึกใด ๆ


แก้ไข:
ทิ้งบันทึก: สำหรับบันทึกเหล่านี้ฉันรูทโทรศัพท์ของฉันและเพิ่มระดับการติดตามของรายการที่เกี่ยวข้องใน /etc/bluetooth/bt_stack.conf

การเชื่อมต่อสำเร็จ - ความพยายามครั้งแรกหลังจากรีบู๊ตโทรศัพท์และติดตั้งแอพ ฉันสามารถเชื่อมต่อค้นพบบริการ / คุณลักษณะทั้งหมดและอ่าน / เขียน

ล้มเหลวในการพยายาม 1 - นี่เป็นความพยายามครั้งถัดไปหลังจากยกเลิกการเชื่อมต่อจากการเชื่อมต่อที่สำเร็จด้านบน ดูเหมือนว่าฉันสามารถค้นพบลักษณะเฉพาะได้ แต่ความพยายามครั้งแรกในการอ่านจะคืนค่าเป็นศูนย์และยกเลิกการเชื่อมต่อหลังจากนั้นไม่นาน

ล้มเหลวในการพยายาม 2 - ตัวอย่างที่ฉันไม่สามารถค้นพบบริการ / คุณลักษณะ


แก้ไข 2:
อุปกรณ์ที่ฉันพยายามเชื่อมต่อขึ้นอยู่กับชิป CC2541 ของ TI ฉันได้รับTI SensorTag (ตาม CC2541) เพื่อเล่นกับและค้นพบว่า TI เปิดตัวแอพ Androidสำหรับ SensorTag เมื่อวาน อย่างไรก็ตามแอพนี้มีปัญหาเดียวกัน ฉันทดสอบสิ่งนี้บน Nexus 4s อีกสองตัวด้วยผลลัพธ์เดียวกัน: การเชื่อมต่อกับ SensorTag ประสบความสำเร็จในครั้งแรกหรือครั้งที่สอง แต่ (ตามบันทึก) ไม่สามารถค้นพบบริการหลังจากนั้นทำให้เกิดปัญหาทุกประเภท ฉันเริ่มสงสัยว่าเป็นปัญหาของชิปเฉพาะนี้หรือไม่


โปรดโพสต์บันทึกที่สมบูรณ์ของโทรศัพท์ของคุณจากการบูทขึ้นจนกระทั่งคุณพบปัญหา
AAnkit

3
ฉันใช้งาน Samsung Galaxy S4 พร้อมติดตั้ง Google 4.3 Android edition แล้ว หลังจากผ่านการเชื่อมต่อ / ตัดการเชื่อมต่อหลายครั้งเมื่อฉันค้นหาบริการฉันจะสุ่ม 129 (GATT_INTERNAL_ERROR) และรับ onConnectionStateChange ด้วยสถานะ 133 (GATT_ERROR) สถานะ = BluetoothProfile.DEVICE_DISCONNECTED
reTs

1
ฉันได้รับสถานะการโทรกลับจำนวน 129 และ 133 หลายครั้งในช่วงเวลาสั้น ๆ และสองครั้งและฉันไม่สามารถรับการติดต่อกลับใน BluetoothGattCallback จนกว่าฉันจะรีบูทอุปกรณ์ของฉัน
reTs

1
ลืมบอกไปเลยว่าฉันกำลังทดสอบกับอุปกรณ์ประมาณสิบเครื่องที่ใช้ชิป TI (ขออภัยฉันไม่รู้จักรุ่นของพวกเขา) และอุปกรณ์หนึ่งชิ้นที่มีชิปของนอร์ดิก อุปกรณ์ที่มีชิปของ Nordic ไม่เคยรายงานข้อผิดพลาด (ยังไม่เพียงพอที่จะพิสูจน์ว่าเป็นปัญหาเฉพาะของ TI)
reTs

1
ฉันสามารถยืนยันได้ว่าปัญหานี้ยังคงมีอยู่ใน Samsung Galaxy S5 (ทั้งรุ่นบิลด์ G900VVRU2BOG5และG900VVRU2BOA8 ) หากฉันล้างข้อมูลจากการตั้งค่า> ตัวจัดการแอปพลิเคชั่น >> ทั้งหมด >> บลูทู ธมันจะใช้งานได้ชั่วขณะ
IronBlossom

คำตอบ:


184

คำแนะนำการใช้งานที่สำคัญ

(บางทีคำแนะนำเหล่านั้นอาจไม่จำเป็นอีกต่อไปเนื่องจากการอัปเดต Android OS)

  1. อุปกรณ์บางอย่างเช่น Nexus 4 กับ Android 4.3 ใช้เวลา 45 + วินาทีในการเชื่อมต่อโดยใช้อินสแตนซ์แกตต์ที่มีอยู่ วิธีแก้ไข: ปิดอินสแตนซ์ของ 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) กับพารามิเตอร์ในการกรอง UUID ของบริการบางอย่างเพราะนี่ใช้งานไม่ได้ใน Samsung Galaxy S3 กับ Android 4.3 และไม่สามารถใช้งานได้กับ 128 บิต UUIDทั่วไป
  6. Gatt สามารถประมวลผลคำสั่งในช่วงเวลาหนึ่ง หากหลายคำสั่งเรียกสั้น ๆ คำสั่งแรกจะถูกยกเลิกเนื่องจากลักษณะการซิงโครนัสของการใช้ gatt
  7. ฉันมักจะเห็นแม้ในอุปกรณ์ที่ทันสมัยกับ Android 5, Wifi ที่รบกวนบลูทู ธ และในทางกลับกัน เป็นทางเลือกสุดท้ายปิด wifi เพื่อบลูทู ธ ที่เสถียร

บทช่วยสอนสำหรับผู้เริ่มต้น

จุดเริ่มต้นที่ค่อนข้างโอเคสำหรับผู้มาใหม่อาจเป็นแบบฝึกหัดวิดีโอนี้: การพัฒนาแอพพลิเคชั่นบลูทู ธ แบบสมาร์ทโฟนสำหรับ Android http://youtu.be/x1y4tEHDwk0

ปัญหาและการแก้ไขที่อธิบายไว้ด้านล่างอาจได้รับการแก้ไขในขณะนี้โดยการอัปเดตระบบปฏิบัติการ

หลีกเลี่ยง: ฉันสามารถ "ทำให้เสถียร" แอพของฉันทำเช่นนั้น ...

  1. ฉันให้ผู้ใช้ตั้งค่า "รีสตาร์ทบลูทู ธ " หากเปิดใช้งานการตั้งค่านั้นฉันจะรีสตาร์ทบลูทู ธ ในบางจุดที่ระบุว่าจุดเริ่มต้นของสแตก BLE ไม่เสถียร เช่นถ้า startScan ส่งคืนค่าเท็จ จุดที่ดีอาจเป็นเช่นกันหาก serviceDiscovery ล้มเหลว ฉันเพิ่งปิดและเปิดบลูทู ธ
  2. ฉันให้การตั้งค่าอื่น "ปิด WiFi" หากเปิดใช้งานการตั้งค่านั้นแอพของฉันจะปิด Wifi เมื่อแอพทำงานอยู่ (และจะเปิดอีกครั้งในภายหลัง)

งานนี้มีพื้นฐานมาจากประสบการณ์ follwoing ...

  • การรีสตาร์ทบลูทู ธ ช่วยแก้ไขปัญหาเกี่ยวกับ BLE ในกรณีส่วนใหญ่
  • หากคุณปิด Wifi สแต็ค BLE จะมีเสถียรภาพมากขึ้น อย่างไรก็ตามมันยังใช้งานได้ดีกับอุปกรณ์ส่วนใหญ่ที่เปิด WiFi
  • หากคุณปิด Wifi การรีสตาร์ทบลูทู ธ จะกู้ BLE สแต็กอย่างสมบูรณ์โดยไม่จำเป็นต้องรีบูตอุปกรณ์ในกรณีส่วนใหญ่

33
Google คุณต้องแก้ไขในตอนนี้ วิธีนี้ใช้ได้ผล (ฉันทำบวกเพราะใช้งานได้) ไร้สาระ
Chris Herbert

4
บางครั้งการค้นพบบริการจะประสบความสำเร็จด้วยสถานะ 0 (สมมติว่าไม่มีปัญหา) แต่การอ่านคุณสมบัติจะให้ค่า NULL เพราะไม่ได้เชื่อมต่อจริง ๆ หรือไม่พบคุณลักษณะ (ฉันเห็นสิ่งนี้ในบันทึก: 11-01 18:37: 32.131: WARN / BluetoothGatt (20119): ข้อยกเว้นที่ไม่สามารถจัดการได้: java.lang.NullPointerException)
Lo-Tan

2
@ Lo-Tan ฉันจะตรวจสอบบริการหลังการค้นพบอยู่เสมอหากรวมบริการที่คาดไว้ คุณไม่สามารถมั่นใจได้หากการค้นพบบริการให้ผลลัพธ์ใด ๆ บางครั้งฉันไม่ได้รับการติดต่อกลับ ดังนั้นฉันจึงใช้การหมดเวลาสำหรับการค้นพบบริการ
OneWorld

2
ประสบการณ์ของฉันคือ: Samsung S3 (4.3) เชื่อมต่อใหม่สำเร็จหลังจากปิดไคลเอ็นต์ Gatt ตามที่อธิบายไว้ในวรรค 2 ข้างต้น ใช้ Nexus 4 & 7 (4.4.2) ฉันไม่สามารถเชื่อมต่อใหม่ได้หลังจากการเชื่อมต่อหลุดแม้จะเริ่มต้นอะแดปเตอร์ BL ใหม่ แต่สามารถเชื่อมต่อใหม่ได้โดยอัตโนมัติหลังจาก 2 นาที
Konstantin Konopko

1
ทุกคนสามารถยืนยันว่า android.bluetooth.BluetoothGatt สามารถจัดการอย่างใดอย่างหนึ่งที่รอการดำเนินการ GATT อุปกรณ์ PER , แต่ละกระบวนการหรือระยะเวลา (เช่น: ทั่วทุกขั้นตอน) ฉันคิดว่ามันเป็นอุปกรณ์ต่อ แต่ปัญหานี้มีความผิดพลาดมากจนไม่แปลกใจเลยถ้ามันเป็นอย่างอื่น หากข้อ จำกัด เป็นเพียงอุปกรณ์ต่อเท่านั้นระบบปฏิบัติการ / อุปกรณ์ที่สามารถจัดการการทำงานหลายอย่างพร้อมกันก็คือการสูบปืนพิสูจน์ว่าปัญหานี้เกิดขึ้นเนื่องจากการใช้งานไร้เดียงสาที่อ่อนแอในอินสแตนซ์ BluetoothAdapter ที่ระบบปฏิบัติการแต่ละกระบวนการ ซิงเกิลตันในทุกกระบวนการ)
swooby

18

ปิด WiFi:

ฉันสามารถยืนยันได้เช่นกันว่าการปิด WiFi ทำให้บลูทู ธ 4.0 มีเสถียรภาพมากขึ้นโดยเฉพาะใน Google Nexus (ฉันมี Nexus 7)

ปัญหา

คือแอปพลิเคชันที่ฉันกำลังพัฒนาต้องการทั้งWiFiและการสแกน Bluetooth LEอย่างต่อเนื่อง ดังนั้นการปิด WIFI ก็ไม่มีตัวเลือกสำหรับฉัน

ยิ่งไปกว่านั้นฉันได้ตระหนักว่าการสแกน Bluetooth LE อย่างต่อเนื่องสามารถฆ่าการเชื่อมต่อ WiFiและทำให้อแด็ปเตอร์ไร้สายไม่สามารถเชื่อมต่อกับเครือข่าย WIFI ใด ๆ ได้อีกต่อไปจนกว่า BLE scan จะเปิดอยู่ (ฉันไม่แน่ใจเกี่ยวกับเครือข่ายมือถือและอินเทอร์เน็ตบนมือถือ)
สิ่งนี้เกิดขึ้นแน่นอนในอุปกรณ์ต่อไปนี้:

  • Nexus 7
  • โมโตโรล่าโมโตจี

อย่างไรก็ตามการสแกน BLE ด้วย WiFi เปิดดูเหมือนค่อนข้างเสถียรเมื่อ:

  • ซัมซุง S4
  • HTC One

วิธีแก้ปัญหาของฉัน

ผมสแกน BLE สำหรับช่วงเวลาสั้นของเวลา3-4 วินาทีแล้วฉันหันสแกน OFF 3-4 วินาที จากนั้นเปิดใหม่อีกครั้ง

  • เห็นได้ชัดว่าฉันปิดการสแกน BLE เสมอเมื่อฉันเชื่อมต่อกับอุปกรณ์ BLE
  • เมื่อฉันตัดการเชื่อมต่อจากอุปกรณ์ฉันรีสตาร์ท BLE (ปิดอะแดปเตอร์แล้วเปิด) เพื่อรีเซ็ตสแต็กก่อนเริ่มการสแกนอีกครั้ง
  • ฉันยังรีเซ็ต BLE เมื่อค้นพบservicesหรือcharacteristicsล้มเหลว
  • เมื่อฉันได้รับข้อมูลการโฆษณาจากอุปกรณ์ที่แอปควรเชื่อมต่อ (ให้บอก 500 ครั้งโดยไม่สามารถเชื่อมต่อ - นั่นคือประมาณ 5-10 วินาทีของการโฆษณา) ฉันรีเซ็ต BLE อีกครั้ง

คุณบอกว่าฉันรีสตาร์ท BLE หลังจากที่อุปกรณ์ถูกตัดการเชื่อมต่อ สมมติว่าหากผู้ใช้ถ่ายโอนไฟล์ผ่านการเชื่อมต่อบลูทู ธ จากนั้นคุณจะทำให้การถ่ายโอนบลูทู ธ นั้นล้มเหลวได้ตลอดเวลา
ราหุล Rastogi

1
คุณหมายถึงอะไรโดย "ปิดอะแดปเตอร์แล้วเปิด"
แมเรียนPaździoch

ฉันเห็นด้วย Wifi และ Bluetooth ด้วยกันกำลังฆ่าประสิทธิภาพของแอพใน Moto G.
Nigilan

@ MarianPaździochโดย "ปิดอะแดปเตอร์แล้วเปิด" @ benka หมายถึง BluetoothAdapter
Anup

9

ตรวจสอบว่า Nexus ของคุณจับคู่กับอุปกรณ์ ฉันไม่สามารถตรวจสอบได้ว่าการสื่อสารทำงานอย่างถูกต้องหรือไม่ แต่คุณจะสามารถเชื่อมต่อได้มากกว่าหนึ่งครั้งโดยไม่ต้องรีบูต ดูเหมือนว่าการเชื่อมต่อครั้งแรกจะไม่ต้องการการจับคู่ แต่ความพยายามที่ตามมาทั้งหมดทำ

ฉันจะอัปเดตคำตอบนี้ในอีกสองสามวันเมื่อฉันทดสอบการค้นพบบริการและรับคำขออ่านและเขียนโดยไม่ต้องรีบูต

แก้ไข: ปรากฎว่าฉันกำลังทดสอบรุ่นพัฒนาเฟิร์มแวร์ (เซ็นเซอร์ของเรา) ที่ทำให้เกิดปัญหาหากไม่ได้จับคู่ การสร้างเฟิร์มแวร์การผลิตล่าสุดของเราทำงานได้ดีในปี 2540 และ 2541

แก้ไข: ฉันได้สังเกตเห็นว่าใน Nexus 7 2013 การเชื่อมต่อมีเสถียรภาพมากขึ้นเมื่อปิด WiFi ฉันอยากรู้ว่าสิ่งนี้ช่วยคนอื่นได้หรือไม่

แก้ไข: ฉันดูเหมือนจะมีมันย้อนกลับด้วยการจับคู่ ทุกอย่างทำงานได้ดีเมื่อไม่ได้จับคู่ หลังจากจับคู่ฉันพบอาการเดียวกับ OP ยังไม่เป็นที่ทราบหากเกี่ยวข้องกับเฟิร์มแวร์ของเราหรือ Android BLE API ระวังหากทำการทดสอบนี้เพราะเมื่อจับคู่แล้วคุณอาจไม่สามารถยกเลิกการจับคู่ได้เนื่องจากข้อผิดพลาดที่อธิบายไว้ใน 3b ของโพสต์นี้


ฉันกำลังเชื่อมต่อและเชื่อมต่อกับอุปกรณ์ CC2541 อย่างต่อเนื่องโดยไม่มีการจับคู่หรือรีบูตด้วยตนเอง
dgel

สำหรับความเห็นของฉันไม่จำเป็นต้องมีการจับคู่ เอกสารอย่างเป็นทางการไม่แสดงความคิดเห็นการจับคู่ด้วย ฉันยังสามารถทำการเขียนอ่านอ่านการแจ้งเตือนการเปลี่ยนแปลงลักษณะโดยไม่ต้องจับคู่ใด ๆ อย่างไรก็ตามเพียงช่วงเวลาสั้น ๆ ตอนนี้มันสั่นคลอนอีกครั้ง ... SAMSUNG BLE SKD v2.0 ยังไม่ต้องการการจับคู่และทำงานได้ค่อนข้างดี
OneWorld

3
ฉันสามารถยืนยันได้มันมีเสถียรภาพมากขึ้นหลังจากปิด Wifi ทุกคนควรลองสิ่งนั้น
OneWorld

1
ต้องการการจับคู่หรือไม่นั้นขึ้นอยู่กับการใช้งานอุปกรณ์ อุปกรณ์ nrf8002 ต้องการการจับคู่และทั้ง Samsung 2.0 และ 1.2 API รองรับสิ่งนี้ ดูเหมือนว่าการสนับสนุน API อย่างเป็นทางการกำลังมีปัญหากับด้านการจับคู่หลังจากที่ฉันจับคู่อุปกรณ์เบลอดูเหมือนว่าเป็นไปไม่ได้ที่จะเลิกจับคู่!
Chris Herbert

2
ฉันมีงานทำที่ไม่สามารถเลิกการจับคู่ 1) ไปที่เมนู bt ของคุณเลือก unpair ลบอุปกรณ์ ble ออกจากพื้นที่หรือทำการถอดออกเลือกอุปกรณ์ ble ในเมนู bt และจะพยายามจับคู่และล้มเหลวจากนั้นรีเซ็ตบลูทู ธ เมื่อรีเซ็ตอุปกรณ์จะไม่ถูกจับคู่
Chris Herbert

7

ในบางรุ่นมีข้อบกพร่อง: https://code.google.com/p/android/issues/detail?id=180440

ในอีกทางหนึ่งในกรณีของฉันปัญหาคือว่าการเชื่อมต่อของฉันไม่ได้ปิดอย่างถูกต้องในวิธีการทำลาย หลังจากปิดถูกต้องปัญหาสำหรับฉันไม่มีอยู่ไม่ว่าจะเปิดหรือปิด wifi

btGatt.disconnect();
btGatt.close();

ทำไมถึงcloseจำเป็น?
IgorGanapolsky

3
ขั้นตอนการปิดที่ถูกต้องคือคีย์เมื่อคุณต้องการเชื่อมต่อบลูทู ธ หลายครั้ง จากประสบการณ์ของฉันมันจะทำงานได้ดีที่สุดถ้าคุณใช้การเชื่อมต่อ Ble ในบริการ UNBOUND แยกต่างหากเพื่อให้คุณสามารถเริ่มและหยุดด้วยตนเอง และคุณเรียก mConnectedGatt.disconnect (); ble_device = null; ใน inDestroy ของคุณ () ในกรณีของฉันรูปแบบนี้ทำงานได้อย่างไม่มีปัญหา
medTech

4

ฉันกำลังเผชิญกับปัญหาที่คล้ายกัน การแก้ไขของฉันคือ

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

& โทรใกล้หลังจากยกเลิกการเชื่อมต่อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.