当发送多个具有WRITE_TYPE_NO_响应的数据包时,Android BLE连接中断

当发送多个具有WRITE_TYPE_NO_响应的数据包时,Android BLE连接中断,android,bluetooth-lowenergy,file-transfer,stm32f4,Android,Bluetooth Lowenergy,File Transfer,Stm32f4,我对一个需要使用蓝牙LE将固件文件从Android设备发送到STM32F4芯片的项目非常着迷 我已经在两端成功地实现了BLE,并且我正在使用它,并且在很长一段时间内没有任何问题 现在应该实现文件传输,该传输应能够发送大小约为250K的文件。我的实现似乎有效,但仅在10种情况中的一种情况下有效。它确实开始发送20字节的数据包,但是 在90%的测试用例中,在未确定的点上停止通信。我需要断开/重置并重新启动才能重新启动 STM32F4上文件转换器的特性定义为: ret = aci_gatt_add_

我对一个需要使用蓝牙LE将固件文件从Android设备发送到STM32F4芯片的项目非常着迷

我已经在两端成功地实现了BLE,并且我正在使用它,并且在很长一段时间内没有任何问题

现在应该实现文件传输,该传输应能够发送大小约为250K的文件。我的实现似乎有效,但仅在10种情况中的一种情况下有效。它确实开始发送20字节的数据包,但是 在90%的测试用例中,在未确定的点上停止通信。我需要断开/重置并重新启动才能重新启动

STM32F4上文件转换器的特性定义为:

 ret = aci_gatt_add_char(fileServiceHandle,
                            UUID_TYPE_128,                      // File xfer  UUID 
                            uuid,                               // Char UUID
                            FILEIO_RECORD_LEN,                  // Maximum length of the characteristic value (20)
                            CHAR_PROP_WRITE|CHAR_PROP_WRITE_WITHOUT_RESP|CHAR_PROP_NOTIFY,   // WRITE NOTIFY me
                            ATTR_PERMISSION_NONE,               // Nothing special
                            GATT_NOTIFY_ATTRIBUTE_WRITE,        // The application will be notified when a client writes to this attribute.
                                                                // An @ref EVT_BLUE_GATT_ATTRIBUTE_MODIFIED will be issued.
                            16,                                 // Encryption key size
                            0,                                  // is fixed length (1== variable size)
                            &fileRequestHandle);                // ReturnValue als handle
在Andoid中,我将服务特性中的WRITE_TYPE_NO_响应标志设置为

public void onServicesDiscovered(BluetoothGatt gatt, int status) {
   ... aServiceCharacteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
对于最多8个数据包的FIFO,在onCharacteristicWrite回调函数中写入数据包

  • 构建多达8个文件数据片段,并将其排入fifo队列

  • wrtCharacteristic.setValue(firstQueueItem)

  • 在onCharacteristicWrite回调中:
    如果队列不是empy{wrtCharacteristic.setValue(nextqueitem);
    }

  • 如果STM32F4中接收到最后一个数据包,则验证该组中的所有数据包,并发送回应答,从而在应用程序中引发事件。 然后,该事件触发发送接下来的8个数据包

在我看来,这很直接,有时似乎很有效。如果我将连续块数设置为1,则它始终有效。几乎在所有情况下,所有其他大小的文件都无法完成发送

没有证据表明传输何时中断,有时是立即中断,有时是在发送超过80%的数据之后中断

我还尝试跳过将STM32F4上接收到的数据写入闪存,以避免SPI干扰,而不改变行为


这里有我遗漏的东西吗?我在哪里可以检查错误。非常感谢您的帮助。

由于未知原因,此问题不再出现。与我在上面所说的相比,我的实现并没有改变。我试图为每组的最后一个数据包请求一个BLE响应,但这似乎没有任何区别


我感谢所有阅读和评论此条目的人。

由于未知原因,此问题不再出现。与我在上面所说的相比,我的实现并没有改变。我试图为每组的最后一个数据包请求一个BLE响应,但这似乎没有任何区别


我感谢所有阅读和评论此条目的人。

您在哪里调用
writeCharacteristic
?writeCharacteristic始终跟随设置值,并且仅在以前的任何写入操作完成时才会调用。我还尝试了
setWriteType(BluetoothGattCharacteristic.WRITE\u TYPE\u DEFAULT)但也没有成功。你应该检查Android中的蓝牙hci日志或嗅探器跟踪,看看到底发生了什么。我添加了很多跟踪,从中我怀疑STM32设备是问题的根源。看起来它在与SPI接口通信时遇到了问题。如果我能解决这个问题,我会更新它。感谢您的回复。您在哪里调用
writeCharacteristic
?writeCharacteristic始终跟随设置值,并且仅在以前的任何写入操作已完成时才会调用。我还尝试了
setWriteType(BluetoothGattCharacteristic.WRITE\u TYPE\u DEFAULT)但也没有成功。你应该检查Android中的蓝牙hci日志或嗅探器跟踪,看看到底发生了什么。我添加了很多跟踪,从中我怀疑STM32设备是问题的根源。看起来它在与SPI接口通信时遇到了问题。如果我能解决这个问题,我会更新它。谢谢你的回复。