COREBLUETOOTH CENTRAL -> Periférico
-
21-12-2019 - |
Pregunta
Soy bastante nuevo en la comunicación Bluetooth.Mi primer proyecto tiene la intención de transferir datos desde un dispositivo iOS a un blashield (chip pequeño).
Para probar mi código central, decidí configurar un iPhone como periférico (el papel que tendrá el chip, una vez que lo tengo) y un iPad como Central.
Puedo conectar los dispositivos y también enviar datos del periférico a la central.Aunque es bastante fácil:
- (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];
}
Pero no puedo hacer que la otra dirección funcione.Para enviar datos desde el lado central, tengo el siguiente código:
[_activePeripheral writeValue:[@"PONG" dataUsingEncoding:NSUTF8StringEncoding] forCharacteristic:_writeChar type:CBCharacteristicWriteWithoutResponse];
Supongo que se debe llamar a uno de estos métodos en el periférico:
- (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
pero en realidad no pasa nada.Desafortunadamente, mi proyecto de hardware utilizará un chip que solo puede funcionar en modo periférico y, al final, escribiré casi exclusivamente al periférico, ya que es un transmisor para las señales de control.
espero que alguien pueda ayudarme!
Solución
Las propiedades para:
-
_readChar
debe serCBCharacteristicPropertyRead
-
_writeChar
debe serCBCharacteristicPropertyWriteWithoutResponse
Consulte Aquí Para más detalles.CBCharacteristicPropertyNotify
no permite que la característica sea de escritura o legible, solo es notificable (suscribirse / cancelar la suscripción).
Otros consejos
Simplemente use https://github.com/lgbluetooth/lgbluetooth hará que la vida sea más fácil