2017-02-11 2 views
0

Le périphérique est configuré pour faire de la publicité avec un service auquel deux caractéristiques sont ajoutées. Une caractéristique a la propriété notifier et l'autorisation lisible. L'autre caractéristique a la propriété write et la permission writable. La deuxième caractéristique mentionnée est utilisée pour la communication du central au périphérique et c'est là que se situe le problème.Les données de central sont reçues seulement toutes les 10 secondes, pourquoi?

Il semble qu'il y ait 10 deuxième cycle. Jamais plus d'un des paquets attendus ne peut être reçu plus d'une fois dans une période de 10 secondes. Aussi, si le central envoie des données 10 secondes après avoir envoyé des données avant que le périphérique ne reçoive le paquet attendu instantanément, moins d'une seconde.

Vous pouvez voir ce que je veux dire avec la sortie du débogueur.

Every 4 seconds data is trying to be sent to peripheral.

Modifié le 15 février 2017 * Pour clarifier cette question un peu mieux, je donnerai plus d'informations sur la sortie du débogueur. Ce que vous voyez ici est le centre étant débogué. Le libellé "writeValue" indique que les données ont été envoyées et que le libellé "didWriteValueFor" indique la confirmation que les données ont bien atteint le périphérique. Cette confirmation est appelée dans la méthode déléguée:

func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) 

*

Il est comme si la communication dans le sens décrit est bloqué pendant 10 secondes après la dernière réception de données, puis ouvert à nouveau. Est-il possible d'empêcher ce blocage? Le (s) périphérique (s) doit (doivent) être informé (s) instantanément et pas seulement toutes les 10 secondes. Je suis sûr que je configure quelque chose de mal ou j'ai oublié quelque chose d'essentiel.

L'aide est très appréciée.

+0

Votre description ne précise pas si vous êtes connecté au périphérique ou si vous dépendez simplement d'événements publicitaires. Les événements publicitaires sont de faible rapport cyclique et 10,25 secondes est le temps de cycle maximum. La plupart des périphériques annoncent à des taux approchant ce maximum pour la conservation d'énergie. – CuriousRabbit

+0

Ils sont connectés.Je n'ai pas mentionné que le périphérique et le central sont connectés, parce que je ne sais pas que le central peut transmettre des données au périphérique lorsqu'il n'est pas connecté. Merci pour l'info sur le cycle de service de 10 secondes. – BCI

+0

Quel est l'intervalle de connexion de votre appareil? Cela va déterminer à quelle fréquence vous pouvez communiquer avec l'appareil. (Je ne connais aucun moyen de l'obtenir via CoreBluetooth, vous l'obtenez généralement en sachant comment vous avez configuré le firmware sur le périphérique.Il peut être disponible via IOBluetooth, mais je n'ai jamais essayé sur iOS.) –

Répondre

0

Enfin, le transfert de données de la centrale iOS vers le périphérique iOS atteint une vitesse décente. Pour y parvenir, il y a eu deux changements à faire, ils sont directement liés les uns aux autres. Du côté des périphériques iOS, du côté central iOS, les modifications ont été apportées. Une partie de la solution est la configuration de l'objet CBMutableCharacteristic du côté périphérique iOS. J'avais défini ses propriétés sur Writable With Response, bien que pour pouvoir communiquer aussi vite que j'en ai besoin, je l'ai maintenant défini sur Writable Without Response. Ainsi l'instanciation de l'objet CBMutableCharacteristic ressemble à ceci:

let characteristicWritableWithoutResponseCBMutableCharacteristic.init(type: CBUUID.init(string: TRANSFER_CHARACTERISTIC_UUID), properties: CBCharacteristicProperties.writeWithoutResponse, value: nil, permissions: CBAttributePermissions.writeable) 

L'autre partie de la solution est du côté de la centrale. Puisque l'objet CBMutableCharacteristic est instancié avec "writeWithoutResponse", j'ai dû changer le type de paramètre pour la méthode writeValue de CBCharacteristicWriteType.withResponse à CBCharacteristicWriteType.withoutResponse. Cela ressemble à ceci maintenant:

currentPeripheral.writeValue(newPayload, for: writableCharacteristic, type: CBCharacteristicWriteType.withoutResponse) 

Le temps pour le transfert de données du central au périphérique est maintenant bien en moins d'une seconde. Bien que je dois mentionner le central envoie très peu de données (à l'origine une valeur de type de données double). J'espère que cela aidera aussi les autres.