使用WRITE_TYPE_NO_RESPONSE发送多个数据包时Android BLE连接中断

问题描述:

我对需要使用蓝牙LE将Android设备的固件文件发送到STM32F4芯片的项目感到很头疼。使用WRITE_TYPE_NO_RESPONSE发送多个数据包时Android BLE连接中断

我已经在两端都成功实施了BLE,并且我正在使用它具有几个特性很长一段时间没有任何问题。

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

特性有关STM32F4文件transger被定义为:

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_RESPONSE标志设置为

public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
    ... aServiceCharacteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE); 

编写包在onCharacteristicWrite完成对最多8个数据包的FIFO进行回调函数。

  • 累积到文件中的数据的8个片段,并将其排队中onCharacteristicWrite呼叫一个FIFO

  • wrtCharacteristic.setValue(firstQueueItem);

  • 回:如果接收到的最后分组if queue not empy { wrtCharacteristic.setValue(nextQueueItem);}

  • 在STM32F4中,该组中的所有数据包都经过验证,并且发回一个确认信息,从而在APP中引发一个事件。 该事件然后触发发送接下来的8个数据包。

这看起来很直截了当,似乎有时工作。如果我将连续块的数量设置为1,它总是有效。所有其他大小在几乎所有情况下都不会完成发送文件。

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

我也尝试跳过将接收到的STM32F4数据写入闪存存储器,以避免SPI干扰而没有任何行为改变。

有什么我在这里失踪?我在哪里可以检查错误。任何帮助将非常感激。

+0

你在哪里调用'writeCharacteristic'? – Emil

+0

writeCharacteristic总是跟在setValue之后,并且只有在前面的任何写操作完成时才被调用。 我也尝试过'setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);'但没有成功。 –

+0

您应该检查Android中的Bluetooth hci日志或嗅探器跟踪来查看真正发生的事情。 – Emil

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

谢谢大家谁阅读和评论此条目。