2017-07-02 4 views
0

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.

+0

Où appelez-vous 'writeCharacteristic'? – Emil

+0

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. –

+0

Vous devriez vérifier le journal Bluetooth hci dans Android ou une trace de renifleur pour voir ce qui se passe réellement. – Emil

Répondre

0

Pour des raisons inconnues, ce problème se produit plus longtemps. Ma mise en œuvre n'a pas changé par rapport à ce que j'ai déclaré en haut. J'ai essayé de demander une réponse BLE pour le dernier paquet de chaque groupe mais cela ne semble pas faire de différence.

Je remercie tous ceux qui ont lu et commenté cette entrée.