Come sappiamo, iOS 6 supporta i dispositivi in esecuzione (iPhone 4s e versioni successive e il nuovo iPad) come periferiche BLE. C'è una demo in WWDC 2012 Session 705 chiamata "core Bluetooth avanzato". Ho chiesto il codice sorgente di Apple. Mi hanno inviato una versione modificata del codice sorgente (BTLE_Transfer_Draft). Poi ho:Esegui dispositivo iOS 6 come periferica BLE
- eseguire l'applicazione in iPhone 5 (iOS 6) in "modalità Peripheral" e iniziare a "Pubblicità"
- Esegui l'applicazione nel nuovo iPad (iOS 5.1.1) in "modalità centrale"
Il problema è che la periferica non è mai stata scoperta. Quindi uso altre applicazioni di test, incluse alcune scaricate da App Store. Tutti non sono riusciti a scoprire le periferiche. Penso che il problema dovrebbe essere in BTLE_Transfer_Draft. Perché non sono sicuro di poter presentare l'intero codice sorgente. Così ho solo mostrare la parte "modalità di periferica" qui:
- (void)viewDidLoad {
[super viewDidLoad];
// Start up the CBPeripheralManager
_peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
}
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral {
// Opt out from any other state
if (peripheral.state != CBPeripheralManagerStatePoweredOn) {
return;
}
// We're in CBPeripheralManagerStatePoweredOn state...
NSLog(@"self.peripheralManager powered on.");
// ... so build our service.
// Start with the CBMutableCharacteristic
self.transferCharacteristic = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]
properties:CBCharacteristicPropertyNotify
value:nil
permissions:CBAttributePermissionsReadable];
// Then the service
CBMutableService *transferService = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]
primary:YES];
// Add the characteristic to the service
transferService.characteristics = @[self.transferCharacteristic];
// And add it to the peripheral manager
[self.peripheralManager addService:transferService];
}
/** Start advertising
*/
- (IBAction)switchChanged:(id)sender
{
if (self.advertisingSwitch.on) {
// All we advertise is our service's UUID
[self.peripheralManager startAdvertising:@{ CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]] }];
}
else {
[self.peripheralManager stopAdvertising];
}
}
Il BLE è alimentato dallo stato e la startAdvertising si chiama. Ma il centro BLE non potrà mai scoprirlo.
Post aggiornato:
Secondo mttrb 's suggerimento che ho aggiunto "CBAdvertisementDataLocalNameKey" quando startAdvertising. Ma il mio servizio non è ancora stato scoperto dalla maggior parte delle app, incluse alcune app da App Store. L'unica app in grado di scoprire il mio servizio è un'app dall'app store denominata "scanner BLE".
La mia domanda è: questo significa che la mia applicazione funziona come periferica? Ma perché il mio codice non può scoprire il servizio? Come faccio a debuggarlo?
Il mio codice in modalità centrale è come questo:
- (void)viewDidLoad
{
[super viewDidLoad];
// Start up the CBCentralManager
_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
}
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
if (central.state != CBCentralManagerStatePoweredOn) {
return;
}
[self.centralManager scanForPeripheralsWithServices:nil options:nil];
}
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
......
}
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
if (error) {
NSLog(@"Error discovering services: %@", [error localizedDescription]);
return;
}
}
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
// Deal with errors (if any)
if (error) {
NSLog(@"Error discovering characteristics: %@", [error localizedDescription]);
return;
}
}
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
NSLog(@"Peripheral Disconnected");
self.discoveredPeripheral = nil;
}
Il didDiscoverPeripheral e didDiscoverServices non vengono mai chiamati. Cosa potrebbe esserci di sbagliato? Qualche idea? Grazie
Puoi verificare che la proprietà sia pubblicitaria per vedere se stai effettivamente facendo pubblicità quando ti aspetti o hai mai effettuato il callback di peripheralManagerDidStartAdvertising sul delegato? – yuklai
Aggiungo peripheralManagerDidStart Metodo pubblicitario. E controllo la pubblicità in questo metodo. Ritorna SI. Ciò significa che la mia app pubblicizza correttamente? –
Ho cambiato il mio codice per scansionare le periferiche in questo modo: [self.centralManager scanForPeripheralsWithServices: nil options: nil]; Ci sono comunque per indicare che la mia scansione è riuscita? –