Partage
  • Partager sur Facebook
  • Partager sur Twitter

Objective C : didUpdateValueForCharacteristic

18 avril 2019 à 8:16:49

Bonjour,

desole pour ce titre tout pourri mais je n'ai pas la place d'ecrire.

J'aimerai avoir voir aide/conseil pour resoudre un probleme.
J'ai cree une application iOS qui se connecte a plusieurs transmetteurs afin d'y recuperer les donnees.

J'arrive a recuperer les Bytes envoyes par les transmetteurs. J'arrive egalement a convertir ces Bytes en donnees exploitable (exemple: recuperer le rythme cardiaque, la position dans l'espace, etc...)

Lorsqu'un transmetteur envoie une donnee ; l'iPad la recoit et peut ensuite faire sont traitement.
Le soucis est qu'avec le temps, pour une raison que je crois avoir deviner l'iPad recoit les donnees beaucoup trop lentement.
Du coup, si je bouge mon transmetteur il y a un petit temps de latence qui se produit...

Pour recuperer les donnees envoye par les transmetteurs j'utilise ce code:

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{

// ici je recupere les donnees en analysant characteristic.value

}

Si cette methode n'est pas appelee, je ne peux pas traiter les donnees.

Je suis un peu perdu...

Ce que je pense, mais je me trompe surement (d'ou mon topic), c'est que sans doute ca fonctionne avec une pile (queue).
chaque fois qu'un transmetteur envoie des donnees. ces dernieres sont ajoutes dans la pile, puis l'iPad traite la pile.
Mais dans mon cas, comme il y a plusieurs transmetteurs (environ 10) la pile se remplis plus vite qu'elle n'est traite. C'est ce que je pense.

Si le probleme est lie a cette pile (imaginaire), j'aimerai bien la vider de temps en temps mais je ne vois pas comment faire.

Avez vous des pistes ?

  • Partager sur Facebook
  • Partager sur Twitter
18 avril 2019 à 10:20:30

Bonjour.

Je n'ai jamais utilisé Core Bluetooth (ça a l'air passionnant), mais vu que tu as plusieurs transmetteurs, tu en a peut être qui posent problème.

Peut être dois tu passer par la méthode didUpdateValueForDescriptor afin de voir lesquels de tes transmetteurs ne répond pas.

Documentation: https://developer.apple.com/documentation/corebluetooth/cbperipheraldelegate/1518929-peripheral?language=objc

  • Partager sur Facebook
  • Partager sur Twitter
18 avril 2019 à 10:50:52

Salut,

Ton traitement, tu le fais bien dans un thread asynchrone ?

  • Partager sur Facebook
  • Partager sur Twitter
8 mai 2019 à 15:18:44

Hello,

desole pour le temps de reponse.

Mon traitement se fait bien de maniere asynchrone. Le probleme (je crois) c'est qu'il y a beaucoup trop de donnees envoyes par les transmetteurs.
L'iPad arrive a gerer lorsqu'un seul transmetteur est connecte:

Lorsqu'on a 2 transmetteurs connectes, arrive toujours a gerer mais on voit qu'il galere un peu le pauvre:

Lorsque j'utilise 4 transmetteurs, on voit qu'au debut il gere puis d'un coup il ne peut plus suivre car il y a trop de donnees:

Lorsque j'utilise 10 transmetteurs la c'est du n'importe quoi (l'iPad se met carrement a ignorer des donnees qui lui sont envoyes):

Une petite explication pour comprendre ces graphes.

Les transmetteurs envoient differente donnees a l'iPad. Les graphes que j'ai fournis concerne uniquement les donnees spaciale (X, Y, Z, etc...) envoyes par les transmetteurs. Dans le 1er graphe (qui correspond a l'utilisation d'un seul transmetteur), on peut voir une moyenne 2400.
En gros, en 1 minutes un transmetteur emet 2400 fois.
On remarque que ce nombreux diminue plus il y a de transmetteurs.

J'ai fais un test:

1) j'ai utilise 4 transmetteurs
2) l'iPad gere au debut puis il s'est mit a ne plus gerer du tout les donnees.
3) j'ai donc eteins 3 transmetteurs pour voir si c'etait ca le probleme (trop de transmetteur qui envoi trop de donnees a l'iPad) et effectivement j'ai ce resultat:

On voit bien que 3 transmetteurs n'emettent plus a la fin ce qui permet au 4ieme de pouvoir tranquillement emettre 2400 fois.

QUESTION:

Comment resoudre mon probleme ?

J'aimerai si c'est possible ne pas tenir compte des 2400 envoi (par exemple) mais d'uniquement 100 afin que ca ne provoque pas de probleme.
(A mon avis c'est un probleme de task).

  • Partager sur Facebook
  • Partager sur Twitter
10 mai 2019 à 14:59:12

Pour tenir compte uniquement des 100 premiers tu peux simplement faire un compteur. Sinon, une idée en l'air : ton traitement tu pourrais le faire dans plusieurs thread différent en fonction de l'émetteur. Avoir une dizaine de thread donc qui traitement uniquement un émetteur chacun

Néanmoins, sur ton dernier graphe, je me pose la question : Qu'est ce qui fait que ça marche de manière a peu près stable pendant 30mn et puis plus rien ? C'est long quand même 30 minutes.

  • Partager sur Facebook
  • Partager sur Twitter
13 mai 2019 à 11:59:18

@Geda:

"Néanmoins, sur ton dernier graphe, je me pose la question : Qu'est ce qui fait que ça marche de manière a peu près stable pendant 30mn et puis plus rien ? C'est long quand même 30 minutes."

---> Je me pose exactement la meme question.
(Ca continue de fonctionner mais l'iPad traite un volume de donnees plus faible).

"Pour tenir compte uniquement des 100 premiers tu peux simplement faire un compteur. "

---> Non tu n'y es pas du tout. Sauf erreur, je ne peux pas dire a l'iPad d'ignorer ce qu'un transmetteur envoie une fois que ce dernier est connecte (et a commencer l'envoi de donnees). Je peux certes ne pas traiter les donnees et ne rien faire, je peux deconnecter le transmetteur. En effet, sauf erreur de ma part:

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
    

}

Va etre appele que je le veuille ou non (ensuite libre a moi d'effectuer des actions ou non).
Ce que je pense: 

- l'iPad n'est pas fait pour ca (se connecter a 10 transmetteurs qui on pour but de le bombarder de donnees).
- Les transmetteurs ont ete creer/configurer dans l'optique d'etre seul connecter a l'iPad donc il peut se permettre d'envoyer plein de donnees.
- Il faut limiter le volume de donnees qu'envoi les transmetteurs afin qu'ils ne surchargent pas l'iPad

Ensuite pourquoi il a reussi a tenir 30min ca je l'ignore car l'iPad etait pose sur le bureau et ne faisait rien d'autre durant le test.

  • Partager sur Facebook
  • Partager sur Twitter
13 mai 2019 à 14:20:29

Tu crois vraiment que c'est le fait de recevoir les données qui pose problème ? (Et non le traitement que tu fais de ces données). Je ne trouve pas ça cohérent. Le problème aurait eu lieu de suite, pas au bout de 30 minutes.

Ce serait intéressant de regarder ton graphe sur la mémoire. Peut-être que tu satures la ram.

-
Edité par Geda 13 mai 2019 à 14:20:51

  • Partager sur Facebook
  • Partager sur Twitter
14 mai 2019 à 7:06:21

@Geda

Je pense oui car j'ai ne fais absolument rien des donnees que je recois (hormis les stocker puis les envoyes toutes les minutes sur mon ordinateur afin que celui ci puisse gerer le graphe).

Hier des developpeurs sont passes et on reduit le nombre de donnees envoyes par les transmetteurs et maintenant le graphe donne plutot une ligne (on a fait le test pendant 24h et ca reste contant).

Maintenant n'etant pas du tout un pro, je n'ecarte absolument pas que le probleme vienne de moi (je cherche encore).

-
Edité par Scion 14 mai 2019 à 7:07:07

  • Partager sur Facebook
  • Partager sur Twitter