CoreBluetooth Central -> Peripherie
-
21-12-2019 - |
Frage
Ich bin ziemlich neu in der Bluetooth-Kommunikation.Mein erstes Projekt zielt darauf ab, Daten von einem iOS-Gerät auf ein BLEshield (kleiner Chip) zu übertragen.
Um meinen zentralen Code zu testen, habe ich beschlossen, ein iPhone als Peripheriegerät (die Rolle, die der Chip spielen wird, sobald ich ihn habe) und ein iPad als zentrales Gerät einzurichten.
Ich kann die Geräte anschließen und auch Daten von der Peripherie an die Zentrale senden.Dabei ist es ganz einfach:
- (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];
}
ABER ich kann die andere Richtung nicht zum Laufen bringen.Um Daten von der zentralen Seite zu senden, habe ich folgenden Code:
[_activePeripheral writeValue:[@"PONG" dataUsingEncoding:NSUTF8StringEncoding] forCharacteristic:_writeChar type:CBCharacteristicWriteWithoutResponse];
Ich gehe davon aus, dass eine dieser Methoden auf dem Peripheriegerät aufgerufen werden sollte:
- (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
Aber eigentlich passiert nichts.Leider wird mein Hardwareprojekt einen Chip verwenden, der nur im Peripheriemodus arbeiten kann, und am Ende werde ich fast ausschließlich auf die Peripherie schreiben, da diese ein Sender für Steuersignale ist.
Ich hoffe, jemand kann mir helfen!
Lösung
Die Eigenschaften für:
_readChar
sollte seinCBCharacteristicPropertyRead
_writeChar
sollte seinCBCharacteristicPropertyWriteWithoutResponse
Sehen Hier für mehr Details. CBCharacteristicPropertyNotify
Das Merkmal ist weder beschreibbar noch lesbar, es ist nur benachrichtigbar (abonnieren/abmelden).
Andere Tipps
Verwenden Sie einfach https://github.com/lgbluetooth/lgbluetooth Es wird das Leben leichter machen