Je deviens fou avec un projet où je dois envoyer des fichiers de firmware d'un appareil Android à une puce STM32F4 en utilisant Bluetooth LE.La connexion Android BLE casse lors de l'envoi de nombreux paquets avec WRITE_TYPE_NO_RESPONSE
J'ai déjà implémenté BLE sur les deux extrémités avec succès et je travaille avec lui avec plusieurs caractéristiques sur une longue période sans aucun problème.
Maintenant, un transfert de fichiers doit être mis en œuvre qui doit être en mesure d'envoyer des fichiers d'une taille d'environ 250K. Ma mise en œuvre semble fonctionner mais seulement dans l'un des 10 cas. Il commence à envoyer des paquets en blocs de 20 octets, mais arrête la communication dans 90% des cas de test sur un point indéterminé. J'ai besoin de déconnecter/réinitialiser et redémarrer pour relancer les choses.
Caractéristique pour transger de fichier sur le STM32F4 sont définis comme:
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
Dans Andoid Je suis en train de le drapeau WRITE_TYPE_NO_RESPONSE dans la caractéristique de service
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
... aServiceCharacteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
L'écriture des paquets est fait dans le onCharacteristicWrite fonction de rappel pour une FIFO de 8 paquets maximum.
construire jusqu'à 8 fragments de données de fichiers et la file d'attente à un fifo
wrtCharacteristic.setValue(firstQueueItem);
dans l'appel onCharacteristicWrite retour:
if queue not empy { wrtCharacteristic.setValue(nextQueueItem);
}Si le dernier paquet est reçu dans le STM32F4, tous les paquets de ce groupe sont vérifiés et un accusé de réception est renvoyé provoquant un événement dans l'APP. L'événement déclenche ensuite l'envoi des 8 paquets suivants.
Cela me semble assez simple et semble parfois fonctionner. Cela fonctionne toujours si je mets le nombre de blocs consécutifs à 1. Toutes les autres tailles ne complètent pas l'envoi des fichiers dans presque tous les cas.
Il n'y a aucune preuve du moment où le transfert est interrompu, parfois immédiatement, parfois après l'envoi de plus de 80% des données.
J'ai également essayé de passer l'écriture des données reçues sur le STM32F4 à la mémoire flash pour éviter les interférences SPI sans aucun changement de comportement.
Y a-t-il quelque chose qui me manque ici? Où puis-je vérifier les erreurs? Toute aide sera la bienvenue.
Où appelez-vous 'writeCharacteristic'? – Emil
La propriété writeCharacteristic suit toujours setValue et n'est appelée que si une écriture précédente a été effectuée. J'ai également essayé 'setWriteType (BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);' mais pas de succès aussi. –
Vous devriez vérifier le journal Bluetooth hci dans Android ou une trace de renifleur pour voir ce qui se passe réellement. – Emil