2015-08-17 3 views
0

Я новичок в разработке Apple и занимаюсь проблемой Bluetooth. Я пытаюсь написать базовое приложение OSX, которое будет проверять соседние устройства и заполнять PopupList списком обнаруженных устройств.OSX Bluetooth-сканирование обнаруживает дублирующиеся периферийные устройства

Просто, чтобы немного сменить сцену. У меня есть кнопка «startStopScanBut», которая запускает «startStopScan» У меня также есть два журнала. Журнал подключений для информации о подключении. stateLog для информации о состоянии телефона.

ViewController.h

// ViewController.h 
// F4STestHarness 
// 
// Created by Nicholas Hayward on 26/06/2015. 
// Copyright (c) 2015 Nicholas Hayward. All rights reserved. 
// 
#import <Cocoa/Cocoa.h> 
#import <CoreBluetooth/CoreBluetooth.h> 

@interface ViewController : NSViewController 
<CBCentralManagerDelegate, 
CBPeripheralDelegate> 
@end 

ViewController.m

// ViewController.m 
// F4STestHarness 
// 
// Created by Nicholas Hayward on 26/06/2015. 
// Copyright (c) 2015 Nicholas Hayward. All rights reserved. 
// 

#import "ViewController.h" 

@interface ViewController() 

@property (nonatomic) IBOutlet NSTextView *stateLogTextView; 
@property (nonatomic) IBOutlet NSTextView *bluetoothLogTextView; 
@property BOOL bluetoothOn; 

@property BOOL isScanning; 
@property (nonatomic) IBOutlet NSButton *startStopScanBut; 
@property (strong, nonatomic) CBCentralManager *centralManager; 
@property (nonatomic) IBOutlet CBPeripheral *foundPeripheral; 
@property (nonatomic) IBOutlet NSPopUpButton *foundPeripheralsPop; 


/*@property BOOL isAdvertising; 
@property BOOL isAdvertisingInitialised; 
@property (nonatomic) IBOutlet NSButton *startStopAdvertisingButton; 
@property (strong, nonatomic) CBPeripheralManager *peripheralManager; 
@property (strong, nonatomic) CBMutableCharacteristic *myCharacteristic; 
@property (strong, nonatomic) NSDictionary *advertisingData;*/ 

#define SERVICE_UUID  @ "1f9f7e9d-7a83-4053-87f9-2c328b8f315a" 
#define CHARACTERISTIC_UUID @ "FFF3" 

@end 

@implementation ViewController 

//Write to log function 
-(void)conLog:(NSString *)msg 
{ 
    self.bluetoothLogTextView.string = [@"\r\n" stringByAppendingString:self.bluetoothLogTextView.string]; 
    self.bluetoothLogTextView.string = [msg stringByAppendingString:self.bluetoothLogTextView.string]; 
} 
-(void)stateLog:(NSString *)msg 
{ 
    self.stateLogTextView.string = [@"\r\n" stringByAppendingString:self.stateLogTextView.string]; 
    self.stateLogTextView.string = [msg stringByAppendingString:self.stateLogTextView.string]; 
} 

//form events 

//form load 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    //Initialise flags 
    self.bluetoothOn = NO; 
    self.isScanning = NO; 
    //self.isAdvertising = NO; 
    //self.isAdvertisingInitialised = NO; 

    //initialise bluetooth central manager 
    self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:Nil]; 

    //initialise bluetooth perihperl manager 
    //self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:Nil]; 

} 

- (void)setRepresentedObject:(id)representedObject { 
    [super setRepresentedObject:representedObject]; 

    // Update the view, if already loaded. 
} 



//Bluetooth Central events 
- (IBAction)startStopScan:(id)sender 
{ 
    //check bluetooth 
    if (!self.bluetoothOn){ 
     [self conLog:@"Bluetooth is OFF, Cannot start scan"]; 
     return; 
    } 

    //Do we need to start or stop the scan? 
    if (!self.isScanning) 
    { 
     //We are not scanning, but we are starting a new scan 
     //empty the foundPeripheralsPop 
     [_foundPeripheralsPop removeAllItems]; 

     //Start the scan. (we scan for the service uuid used when advertising services) 
     [self.centralManager scanForPeripheralsWithServices: Nil 
               options: @{ CBCentralManagerScanOptionAllowDuplicatesKey : @NO }]; 

     //update flag 
     self.isScanning = YES; 

     //change button text to say stop Scanning 
     [self.startStopScanBut setTitle:@"Stop Scanning"]; 

     //update log 
     [self conLog:@"Starting scan for Peripherals"]; 
    } 
    else 
    { 
     //We are scanning, Stop the scan 
     [self.centralManager stopScan]; 

     //update flag 
     self.isScanning = NO; 

     //change button text to say start Scanning 
     [self.startStopScanBut setTitle:@"Get Advertising Peripherals"]; 

     //update log 
     [self conLog:@"Stopped scan for peripherals"]; 
    } 
} 

//the state of the adapter has changedA(su1 enabled or disabled bluetooth 
-(void)centralManagerDidUpdateState:(CBCentralManager *)central 
{ 
    if (central.state != CBCentralManagerStatePoweredOn) 
    { 
     [self stateLog:@"Bluetooth OFF"]; 
     self.bluetoothOn = NO; 
    } 
    else 
    { 
     [self stateLog:@"Bluetooth ON"]; 
     self.bluetoothOn = YES; 
    } 
} 

//We have found a peripheral device while scanning. 
-(void) centralManager:(CBCentralManager *)central 
didDiscoverPeripheral:(CBPeripheral *)peripheral 
    advertisementData:(NSDictionary *)advertisementData 
        RSSI:(NSNumber *)RSSI 
{ 
    NSString *deviceName = [advertisementData objectForKey:@"kCBAdvDataLocalName"]; 
    if (deviceName == nil || [deviceName isEqual: @""]) deviceName = @"No Name"; 

    //log what device we discovered 
    [self conLog:[NSString stringWithFormat:@"Discovered %@, RSSI: %@\n", deviceName, RSSI]]; 

    //Add device to select list 
    [_foundPeripheralsPop addItemWithTitle:deviceName]; 


    self.foundPeripheral = peripheral; 
    //[self.centralManager connectPeripheral:peripheral options:nil]; 
} 

Проблема, которую я имею, что это приложение OSX будет постоянно находить тот же периферийное снова и сбрасывая функции didFindPeripheral постоянно. Я создал отдельный проект IOS, основанный на этом коде выше, и он не находит дубликатов.

Периферийные устройства, которые я пытаюсь найти, это ...
1. Примеры периферийных устройств Lynda.com, запущенные на моем подключенном устройстве ios.
2. Fitbit фитнес-трекер. (http://www.fitbit.com)

Есть ли что-то, что мне не хватает в OSX, чтобы остановить эти дубликаты? У кого-нибудь есть идеи, почему его поиск этих устройств снова и снова?

ответ

0

Действительно ли вы сохраняете только одно обнаруженное периферийное устройство? Не следует ли хранить его в массиве?

Если это не проблема, то это может быть неисправное устройство, багги-прошивка Bluetooth на Mac или просто может быть только на краю диапазона, и компьютер может отказаться от него, а затем повторное обнаружение. (Я полагаю, вы также внедрили метод - centralManager: didDisconnectPeripheral: error: delegate?) Или вы можете остановить сканирование и перезапустить его на Mac, но не делать этого в iOS, из-за различий в другом месте приложения ,

Предполагая, что ошибка не указана в коде, я хотел бы попытаться распознать избыточные устройства путем сравнения свойства идентификатора на CBPeripheral и затем обновить этот элемент в пользовательском интерфейсе с последней информацией для устройства, когда компьютер заново открывает его, а не добавляет новый элемент. (Я предполагаю, что эти устройства имеют уникальные UUID, конечно.)

Смежные вопросы