使用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干扰而没有任何行为改变。
有什么我在这里失踪?我在哪里可以检查错误。任何帮助将非常感激。
由于未知的原因,此问题不再发生。与我在上面所说的相比,我的实施没有改变。我试图为每个组的最后一个数据包请求BLE响应,但这似乎没有任何区别。
谢谢大家谁阅读和评论此条目。
你在哪里调用'writeCharacteristic'? – Emil
writeCharacteristic总是跟在setValue之后,并且只有在前面的任何写操作完成时才被调用。 我也尝试过'setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);'但没有成功。 –
您应该检查Android中的Bluetooth hci日志或嗅探器跟踪来查看真正发生的事情。 – Emil