web-dev-qa-db-fra.com

Bluetooth Core annonce et analyse en arrière-plan

J'ai essayé de configurer une application pour que l'appareil recherche à la fois des périphériques et fasse de la publicité en tant que périphérique. L'objectif est que deux appareils soient réveillés en arrière-plan lorsqu'ils se rapprochent via la découverte Bluetooth. À partir de la documentation Apple Documentation, il semble que vous devriez pouvoir exécuter BLE en arrière-plan (avec les modes d'arrière-plan bluetooth-central et bluetooth-périphérique activés), et mon application fonctionne quand un appareil est en au premier plan. Premièrement, j'annonce des données comme ceci:

NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey:@"my-peripheral",
                              CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:identifier]]};

// Start advertising over BLE
[peripheralManager startAdvertising:advertisingData]; 

J'ai ensuite configuré l'appareil pour rechercher des données:

NSArray *services = @[[CBUUID UUIDWithString:identifier]];

[centralManager scanForPeripheralsWithServices:services options:nil];

Cependant, lorsque les deux passent en arrière-plan (l'appareil doit être verrouillé), le bluetooth ne peut pas découvrir et

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

n'est jamais appelé sur aucun appareil. Comment puis-je réparer cela? Merci

30
Kyle Rosenbluth

Je crains que ce que vous essayez de faire ne fonctionne pas. J'ai essayé de réaliser la même chose.

Le problème est la différence de numérisation au premier plan et en arrière-plan. Lorsque vous recherchez des appareils au premier plan, vous pouvez rechercher n'importe quoi. En arrière-plan, vous devez spécifier l'UUID de service réel que vous recherchez. Ok, ce n'est pas vraiment un problème car vous connaissez l'UUID que vous recherchez.

Périphérique: la diffusion en tant que périphérique fonctionne à nouveau différemment en premier plan et en arrière-plan. Au premier plan, il fonctionne comme n'importe quel périphérique BT normal. En arrière-plan, il dispose d'un espace très limité pour travailler, de sorte que votre UUID périphérique est caché et non diffusé. Ce n'est que lorsqu'un appareil central (un iPhone au premier plan) en demandera les informations qu'il réveillera votre application et affichera son UUID.

Donc les 2 s'annulent. Comme votre analyse en arrière-plan ne peut rechercher que des appareils avec un UUID spécifique et que votre périphérique en arrière-plan ne peut pas annoncer son UUID, ils ne peuvent pas se voir.

1 de vos appareils (périphériques ou centraux) doit être au premier plan pour fonctionner.

Cela a été discuté à plusieurs reprises sur la liste de messagerie Bluetooth Apple Bluetooth.

45
Darren

Vous devriez expliquer comment vous testez cela, car en théorie, il semble que cela devrait fonctionner. Vous pouvez être confronté à deux problèmes principaux:

1.) La numérisation est limitée lorsque les appareils iOS sont en arrière-plan.

  • Alors que la numérisation au premier plan découvrira probablement immédiatement un appareil publicitaire à côté, la découverte en arrière-plan peut prendre jusqu'à 60 fois plus longtemps. Le système iOS ne fait aucune supposition que l'utilisateur préférerait qu'une application ait une meilleure fonctionnalité Bluetooth qu'une autre (ou qu'une seule application souhaite l'utiliser). Et comme il s'agit d'une fonctionnalité partagée, ils souhaitent que les utilisateurs aient une expérience uniforme dans toutes les applications. Vous devriez vérifier les spécifications techniques concernant les intervalles de publicité et de numérisation pour avoir une meilleure idée de ce que Apple doit faire sous les couvertures.

2.) Vos appareils se sont peut-être déjà découverts avant d'entrer en arrière-plan.

  • Nous devons nous rappeler que Apple désactive l'indicateur de numérisation CBCentralManagerScanOptionAllowDuplicatesKey lorsque nous entrons en arrière-plan. Comme vous ne spécifiez même pas cet indicateur, il est par défaut NON de toute façon. Donc, s'ils " Nous ne nous sommes même pas vus une fois, vous ne recevrez aucun autre rappel lorsqu'ils seront en arrière-plan.
8
Tommy Devoy

J'ai personnellement eu besoin d'une telle fonctionnalité et j'ai développé un composant open source: https://github.com/omergul123/Discovery

Il peut être très utile d'échanger un identifiant même si les applications homologues s'exécutent en arrière-plan.

5
Ömer Faruk Gül