RXBleConnection ลดลงเรื่อยๆ หลังจากสร้างการเชื่อมต่อแล้ว (สถานะ 19)

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

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

 fun connectToDevice(device: BraincareDevice, pairColor: Int) {
    BleLogHelper.writeLog("Connecting to ${device.name}")
    isConnecting = true
    val deviceType = if (device is Sensor) DeviceType.SENSOR else DeviceType.DONGLE
    if (deviceType == DeviceType.SENSOR) {
        sensorConnectionSubscription?.dispose()
    } else {
        dongleConnectionSubscription?.dispose()
    }


    val connectionSubscription = device.device.establishConnection(false)
            .flatMapSingle { connection ->

                if (device is Sensor) {
                    sensorConnection = connection
                    connectedSensor = device
                } else if (device is Dongle) {
                    dongleConnection = connection
                    connectedDongle = device
                }

                connection.queue(CustomRefresh())
                        ?.observeOn(Schedulers.io())
                        ?.doOnComplete{
                            BleLogHelper.writeLog("GATT REFRESHED")
                        }
                        ?.subscribe ({
                            BleLogHelper.writeLog("GATT REFRESHED")
                        },{
                            BleLogHelper.writeLog("FAIL REFRESHING GATT")
                        })

                BleLogHelper.writeLog("Send Request Connection Command $deviceType")
                val command = BraincareBluetoothCommandProtocol.createRequestConnectionCommandFrame(deviceType)
                connection.writeCharacteristic(BraincareBluetoothProtocol.rxCharacteristicUUID, command)
            }
            .delay(300, TimeUnit.MILLISECONDS)
            .subscribe({
                BleLogHelper.writeLog("Connection Established ${device.type}")
                val iscon= this.isConnecting
                startBlinkingDeviceLed(deviceType, pairColor)
                connectionFlowListeners.forEach { it.onConnectionEstablished(device) }
            }, {
                BleLogHelper.writeError("Connection Lost ${device.type}", it)
                BleLogHelper.writeError("Retrying...", it)
                val iscon= this.isConnecting
                if (isMonitoring || isConnecting || deviceType == DeviceType.DONGLE){
                    connectionStateListeners.forEach {
                        if (deviceType == DeviceType.SENSOR) {
                            sensorNotificationSubscription?.dispose()
                            sensorRssiSubscription?.dispose()
                            blinkingDeviceLedsSubscription?.dispose()
                            disconnectFromDevice(DeviceType.SENSOR)
                        } else {
                            dongleRssiSubscription?.dispose()
                            disconnectFromDevice(DeviceType.DONGLE)
                        }
                        isConnecting = false
                        it.onConnectionLost(device)
                    }
                }else{
                    reconnectToDevice(device, pairColor)
                }
            })

    if (deviceType == DeviceType.SENSOR) {
        sensorConnectionSubscription = connectionSubscription
    } else {
        dongleConnectionSubscription = connectionSubscription
    }
}

ข้อยกเว้นเริ่มทำงานหลังจากการเชื่อมต่อ writeCharacteristic(BraincareBluetoothProtocol.rxCharacteristicUUID, คำสั่ง)

บันทึกข้อผิดพลาด:

2019-05-21 10:54:11.816 11797-11889/io.b4c.brain4care.debug E/BLEBC: 21/05/2019 10:54:11.810 - Connection Lost SENSOR
com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from D4:57:4F:53:44:E7 with status 19 (UNKNOWN)
    at com.polidea.rxandroidble2.internal.connection.RxBleGattCallback$2.onConnectionStateChange(RxBleGattCallback.java:77)
    at android.bluetooth.BluetoothGatt$1$4.run(BluetoothGatt.java:268)
    at android.bluetooth.BluetoothGatt.runOrQueueCallback(BluetoothGatt.java:789)
    at android.bluetooth.BluetoothGatt.-wrap0(Unknown Source:0)
    at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:264)
    at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:70)
    at android.os.Binder.execTransact(Binder.java:682)

person Shermano    schedule 21.05.2019    source แหล่งที่มา


คำตอบ (1)


status=19 คือ GATT_CONN_TERMINATE_PEER_USER ไลบรารีนี้ตั้งแต่เวอร์ชัน 1.8.1 แสดงรายการเหตุผลอย่างถูกต้อง ขอแนะนำให้ใช้ไลบรารี่เวอร์ชันใหม่ล่าสุดที่มีอยู่โดยทั่วไปเมื่อมีการปรับปรุงเมื่อเวลาผ่านไป

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

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

  1. อุปกรณ์ต่อพ่วง A เริ่มการจับคู่
  2. อุปกรณ์ต่อพ่วง A เสร็จสิ้นการจับคู่
  3. อุปกรณ์ต่อพ่วง B เริ่มการจับคู่
  4. อุปกรณ์ต่อพ่วง B จับคู่เสร็จแล้ว

อุปกรณ์ต่อพ่วงอาจเชื่อมต่อพร้อมกันได้ แต่อาจดำเนินการจับคู่ได้ครั้งละหนึ่งขั้นตอนเท่านั้น

person Dariusz Seweryn    schedule 03.06.2019
comment
ขอบคุณสำหรับความช่วยเหลือ Dariusz! ฉันไม่รู้ว่านี่เป็นปัญหาการจับคู่พร้อมกันหรือไม่ เพราะทั้งคู่ทำงานได้ดีในการจับคู่ครั้งแรก ปัญหาเกิดขึ้นหลังจากที่ฉันยกเลิกการเชื่อมต่อโดยปิดแอปแล้วจับคู่อีกครั้ง ดังนั้นฉันจึงคิดว่ามีปัญหาการเชื่อมต่อแคชอยู่บ้าง อาจมีปัญหากับเซ็นเซอร์ของเรา เราจับคู่ทั้งคู่กับแอป และทั้งคู่ก็จับคู่กัน ดังนั้นเซ็นเซอร์ตัวหนึ่งจึงมีบทบาทเป็นทาสและมาสเตอร์ในเวลาเดียวกัน อาจมีข้อบกพร่องบางประการในการเชื่อมต่อนี้ - person Shermano; 03.06.2019
comment
ขณะที่เราอยู่ที่นี่ ฉันขอถามคำถามเพิ่มอีกข้อได้ไหม เมื่อเซ็นเซอร์ทั้งสองจับคู่กัน เราจะสูญเสียข้อมูลจำนวนมาก เราเห็นการสูญเสียประสิทธิภาพอย่างมาก ฉันไม่พบปัญหาใดๆ ในฝั่ง Android ในการจัดการการเชื่อมต่อสองรายการในเวลาเดียวกัน เซ็นเซอร์ A ใช้งานได้ดีเมื่อจับคู่กับแอปเพียงอย่างเดียว แต่เมื่อฉันจับคู่เซ็นเซอร์ B ซึ่งก็จับคู่ตัวเองกับเซ็นเซอร์ A ด้วย แพ็คเกจที่หายไปคือ แย่จัง มันแปลกเพราะเซนเซอร์ B ไม่ได้ส่งข้อมูลใดๆ แค่รับข้อมูลมาเท่านั้น คุณรู้ไหมว่ามีข้อ จำกัด ของ Android หรือไม่? เราได้พัฒนาโปรโตคอลบลูทูธสำหรับเซ็นเซอร์ ดังนั้นบางทีปัญหาอาจอยู่ที่นั่น - person Shermano; 03.06.2019
comment
เป็นเรื่องปกติที่ถ้าคุณมีทรัพยากร (วิทยุ) และได้รับการแบ่งปัน ส่วนหนึ่งของทุกฝ่ายที่เกี่ยวข้องก็จะลดลง การสื่อสาร BLE เป็นแบบสองทางเสมอ แม้ว่าข้อมูลแอปพลิเคชันจะถูกส่งเพียงทางเดียว แต่ท้ายที่สุดแล้วจะมีการตอบกลับ/ACK หากคุณมีอุปกรณ์สามเครื่องที่เชื่อมต่อถึงกันในเวลาเดียวกัน สิ่งต่างๆ อาจเกิดขึ้นได้ — ข้อบกพร่องในการใช้งานในเครื่องเดียวจะส่งผลกระทบต่ออุปกรณ์อื่นๆ ทั้งหมด - person Dariusz Seweryn; 03.06.2019
comment
คุณหมายถึงอะไรกับการสูญเสียแพ็กเก็ต? อย่างน้อยสำหรับการแจ้งเตือน Android จะไม่ทิ้งมัน - person Emil; 03.06.2019
comment
เซ็นเซอร์กำลังส่งสัญญาณนั้นด้วยหมายเลขตามลำดับ เมื่อเซ็นเซอร์ทั้งสองเชื่อมต่อกัน เราจะเห็นว่าหลายจุดไม่ได้รับการประมวลผล ฉันเพิ่งพบเบาะแส ฉันกำลังทดสอบกับแท็บเล็ต Samsung SM-T820 และตอนนี้ฉันเพิ่งทดสอบกับ Xiaomi A2 และใช้งานได้ดี - person Shermano; 03.06.2019