login Bluetooth entre 2 appareils iOS

J'essaie le framework Core Bluetooth introduit dans iOS 5.0. Selon beaucoup de threads ( un de beaucoup ) sur StackOverflow lui-même:

  1. Le framework Bluetooth Core peut être utilisé pour communiquer avec n'importe quel matériel, supporté par le matériel Bluetooth Low Energy (4.0).
  2. Nous pouvons oublier le programme Made For iPhone / iPod (MFI), si vous utilisez la technologie Core Bluetooth.

J'ai un iPhone 5, iPhone 4S, Google Android Nexus 7 avec moi, et je suis sûr qu'au less 2 premiers a le support matériel pour BLE.

Ma question est

Eh bien, j'ai essayé ci-dessous le code donné sur mon iPhone 4S / iPhone 5, mais il a échoué à numériser et à find l'iPhone5 / iPhone 4S assis à proximité. Je peux confirmer, les deux appareils avaient bluetooth allumé. La méthode déléguée didDiscoverPeripheral n'a jamais été appelée. Quelles pourraient être les raisons? Est-ce que je manque quelque chose?

Ceci est mon code (dépouillé d'un petit projet de test).

ViewController.h

 @interface ViewController:UIViewController<CBCentralManagerDelegate, CBPeripheralDelegate{ } @property (strong, nonatomic) CBCentralManager *mCentralManager; @end 

ViewController.m

 @implementation ViewController @synthesize mCentralManager; - (void)viewDidLoad{ [super viewDidLoad]; mCentralManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil]; [self scanForPeripherals]; } - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { NSLog(@"Received periferal :%@",peripheral); } - (int) scanForPeripherals { if (self.mCentralManager.state != CBCentralManagerStatePoweredOn) { NSLog(@"self.mCentralManagerState : %d",self.mCentralManager.state); return -1; } //Getting here alright.. bluetooth is powered on. NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; //Documentation says passind nil as device UUID, scans and finds every peripherals [self.mCentralManager scanForPeripheralsWithServices:nil options:options]; return 0; } @end 

Comme l'a commenté Spamsink, un périphérique doit agir comme périphérique, et un comme central pour qu'ils puissent communiquer.

Il y a un excellent exemple d'application d'Apple qui fait cela. En outre, consultez les sessions WWDC 2012 703 – CoreBluetooth 101 et 705 – Advanced CoreBluetooth pour une excellente explication et des exemples d'utilisation du framework CoreBluetooth.

Notez également que pour que le périphérique soit en mode périphérique, il doit être mis à jour vers iOS 6.0 ou version ultérieure.

Eh bien, ma compréhension de Bluetooth Low Energy (BLE) général était pauvre. Comme l'a souligné la réponse acceptée, un appareil doit agir comme central et l'autre doit agir comme périphérique pour que la communication ait lieu .

Un bon exemple de code source pour la communication iOS vers iOS et iOS vers Mac OS BLE est ici .

Quelques points importants à considérer

  1. sur iOS 5.0 -> L'iPhone peut uniquement agir en tant que Central, donc la communication entre 2 appareils iOS n'est pas possible.
  2. sur iOS 6.0 -> L'iPhone peut aussi servir de périphérique. Donc, pour que la communication ait lieu, au less un appareil doit fonctionner sur iOS 6.0 (et probablement plus tard).
  3. Le premier appareil iPhone avec du matériel BLE ajouté est l'iPhone 4S. Ainsi, même si l'iPhone 4 peut fonctionner sous iOS 5, la communication BLE n'est pas possible.

Eh bien quelques informations ..

Si vous appelez la fonction scanForPeripherals dans le délégué de didUpdateState, cela fonctionne car les fonctions déléguées ne peuvent pas returnner.