2013-02-12 5 views
0

Я использую GKSession, GKSessionDelegate, чтобы реализовать одноранговую связь Bluetooth между несколькими устройствами iX (iPod, iPad, iPhone, ...). Я хочу отобразить список доступных/подключенных устройств в диапазоне.Определение того, когда устройства GKSession bluetooth выходят за пределы допустимого диапазона

Я в настоящее время, опираясь на

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state

, чтобы сделать это. К сожалению, этот метод, похоже, не надежно называется, когда устройство выходит за пределы допустимого диапазона. Есть ли «лучший» способ определить, находится ли устройство в зоне действия?

Некоторый код:

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { 

    NSString* connectionStateString= 
    (state==GKPeerStateAvailable)[email protected]"available": 
    (state==GKPeerStateUnavailable)[email protected]"unavailable": 
    (state==GKPeerStateConnected)[email protected]"connected": 
    (state==GKPeerStateDisconnected)[email protected]"disconnected":@"connecting"; 
    // Add the peer to the Dictionary 
    NSArray* details=[NSArray arrayWithObjects:[session displayNameForPeer:peerID],connectionStateString,nil]; 
    [connectionPeers setObject:details forKey:peerID]; 

    if (state == GKPeerStateAvailable) { 
     NSLog(@"Adding peerID:%@",peerID); 
     [session connectToPeer:peerID withTimeout:60];//'connect' to everything, so data can be sent 
    } 
    else if (state == GKPeerStateUnavailable || state==GKPeerStateDisconnected) { 
     [connectionPeers removeObjectForKey:peerID]; 
    } 
    [self listPlayers]; 
} 

ответ

1

GKSession построен на Bonjour через Bluetooth, и я считаю, что ваша проблема заключается в том, что служба Bonjour все еще показывает как активная, так как Bonjour не отменяет рекламные услуги, когда пэр отключил из сети. Я думаю, что записи mDNS истекают только тогда, когда происходит тайм-аут кэширования mDNS (не то, что вы можете настроить), или когда рекламный пинчер вручную аннулирует эту услугу.

Я не думаю, что GKSession будет легко делать то, что вы хотите здесь, через рекламу. Однако подключенные одноранговые сети должны отключиться, если они вышли из диапазона Bluetooth.

+0

Спасибо за ваш ответ @Mark. Я решил это, периодически отправляя сообщения на все устройства и прослушивая ответ. Если я не получил ответа, я удалил устройство из списка «подключенных». Я не надежно получил «отключенное» изменение состояния, указывающее на то, что устройства, находящиеся вне зоны действия, были всей проблемой. Я все еще думаю, что мое решение довольно ужасно, и я надеюсь, что есть лучший способ. – iPadDeveloper2011

+1

GKSession по bluetooth ужасен;) Я рекомендую смотреть в BTLE и CoreBluetooth API вперёд. –

+0

Спасибо за это @Mark. Я думаю я сделаю. GKSession BT не делал то, что я хотел - диапазон был слишком хорош! Я хотел что-то приблизить прямую видимость. BTLE звучит так, как будто это будет хорошо для этого, а также для связи между различными устройствами (например, Android). – iPadDeveloper2011