ご存じのように、iOS 6 は実行中のデバイス (iPhone 4s 以降、および新しい iPad) を BLE ペリフェラルとしてサポートしています。WWDC 2012 セッション 705 に「高度なコア bluetooth」と呼ばれるデモがあります。Appleにソースコードをお願いしました。ソース コードの修正版 (BTLE_Transfer_Draft) が送られてきました。その後私は:
- iPhone 5 (iOS 6) でアプリを「ペリフェラル モード」で実行し、「広告」を開始します。
- 「セントラルモード」で新しいiPad(iOS 5.1.1)でアプリを実行します
問題は、周辺機器がまったく検出されないことです。そのため、App Store からダウンロードしたものを含め、他のテスト アプリケーションを使用しています。周辺機器の検出にすべて失敗しました。問題は BTLE_Transfer_Draft にあるはずだと思います。ソースコード全体を提示してよいかどうかわからないからです。したがって、ここでは「周辺モード」の部分のみを示します。
- (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];
}
}
BLE が電源オンの状態になり、startAdvertising が呼び出されます。しかし、BLE セントラルはそれを発見できません。
投稿が更新されました:
mttrbの提案に従って、 Advertisingを開始するときに「CBAdvertisementDataLocalNameKey」を追加しました。しかし、私のサービスは、アプリストアからのいくつかのアプリを含むほとんどのアプリでまだ発見できません. 私のサービスを発見できる唯一のアプリは、「BLEスキャナー」というアプリストアのアプリです。
私の質問は次のとおりです。これは、私のアプリケーションが周辺機器として機能していることを意味しますか? しかし、なぜ自分のコードでサービスを検出できないのでしょうか? どうすればデバッグできますか?
セントラル モードでの私のコードは次のようになります。
- (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;
}
didDiscoverPeripheral と didDiscoverServices が呼び出されることはありません。何が間違っている可能性がありますか?何か案が?ありがとう