CoreBluetooth Central --> Périphérique
-
21-12-2019 - |
Question
Je suis assez nouveau dans la communication Bluetooth.Mon premier projet vise à transférer des données d'un appareil iOS vers un BLEshield (petite puce).
Pour tester mon code central, j'ai décidé de configurer un iPhone en périphérique (le rôle que jouera la puce une fois que je l'aurai reçue) et un iPad en tant que Central.
Je peux connecter les appareils et également envoyer des données du périphérique vers la centrale.C'est quand même assez simple :
- (void)startService {
_readChar = [[CBMutableCharacteristic alloc] initWithType:[CBUUID ...] properties:CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable];
_writeChar = [[CBMutableCharacteristics alloc] initWithType:[CBUUID ...] properties:CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsWriteable];
_service = [[CBMutableService alloc] initWithType:[CBUUID ...] primary:YES];
[_service setCharacteristics:@[_readChar, _writeChar]];
_peripheral = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
[_peripheral addService:_service];
[_peripheral startAdvertising:@{CBAdvertisementDataServiceUUIDKey: @[[CBUUID ...]], CBAdvertisementDataLocalNameKey: @"ServiceName"}];
}
- (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic {
[_peripheral updateValue:[@"HELLO WORLD" dataUsingEncoding:NSUTF8StringEncoding] forCharacteristic:_readChar onSubscribedCentrals:nil];
}
MAIS je n'arrive pas à faire fonctionner l'autre sens.Pour envoyer des données depuis le côté central, j'ai le code suivant :
[_activePeripheral writeValue:[@"PONG" dataUsingEncoding:NSUTF8StringEncoding] forCharacteristic:_writeChar type:CBCharacteristicWriteWithoutResponse];
Je suppose que l'une ou l'autre de ces méthodes doit être appelée sur le périphérique :
- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request
- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
Mais en réalité rien ne se passe.Malheureusement mon projet matériel utilisera une puce qui ne peut fonctionner qu'en mode périphérique et au final j'écrirai presque exclusivement sur le périphérique car c'est un émetteur de signaux de contrôle.
J'espère que quelqu'un pourra m'aider !
La solution
Les propriétés pour :
_readChar
devrait êtreCBCharacteristicPropertyRead
_writeChar
devrait êtreCBCharacteristicPropertyWriteWithoutResponse
Voir ici pour plus de détails. CBCharacteristicPropertyNotify
ne permet pas que la caractéristique soit inscriptible ou lisible, elle est uniquement notifiable (inscription/désinscription).
Autres conseils
Il suffit d'utiliser https://github.com/lgblueooth/lgbluetooth Cela facilitera la vie