Я пытался создать простую клиент-серверную сеть через Bluetooth с 5 iPod. Один iPod будет отправлять базовые строки, такие как «стоп» или «идти», на четыре iPod, которые затем будут выполнять различные действия при получении команд. В настоящее время я использую GameKit без PeerPicker, и было ненадежно и сложно даже запускать соединения. После подключения я могу просто отлично передавать данные между двумя устройствами, но не более.
Я хотел бы иметь возможность транслировать простые, короткие сообщения на «клиенты» iPod с «сервера» iPod без сети (например, с пульта дистанционного управления). Я посмотрел на многочисленные примеры, включая примеры танков и wiTap, но я удивлен, что нет ничего более простого, если не нужна сеть.
Вот как я запускаю соединение:
- (IBAction) btnConnect:(id)sender
{
if (sender == connectServer) {
self.currentSession = [[GKSession alloc] initWithSessionID:@"0000"
displayName:nil
sessionMode:GKSessionModeServer];
NSLog(@"Setup Server Connection");
} else { //connectClient
// Peers discover themselves ...
self.currentSession = [[GKSession alloc] initWithSessionID:@"0000"
displayName:nil
sessionMode:GKSessionModeClient];
NSLog(@"Setup Client Connection");
}
amAcceptingConnections = YES;
[self.currentSession peersWithConnectionState:GKPeerStateAvailable];
self.currentSession.delegate = self;
self.currentSession.disconnectTimeout = 30;
[self.currentSession setDataReceiveHandler:self withContext:nil];
// Advertise the session to peers
self.currentSession.available = YES;
}
И я обрабатываю соединение с didChangeState в делегате
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state {
thePeerID = [session displayNameForPeer:peerID];
NSLog(@"didChangeState was called from peerID: %@.", thePeerID);
self.currentSession = session;
switch (state) {
case GKPeerStateAvailable:
thePeerID = [session displayNameForPeer:peerID];
NSLog(@"Peer %@ Available", thePeerID);
[session connectToPeer:peerID withTimeout:30];
NSLog(@"Issued Peer Connection");
//session.available = NO; //TODO: Look at this
break;
case GKPeerStateUnavailable:
NSLog(@"Peer %@ Unavailable", thePeerID);
break;
case GKPeerStateConnected:
NSLog(@"Peer %@ Connected", thePeerID);
break;
case GKPeerStateDisconnected:
NSLog(@"Peer %@ Disconnected", thePeerID);
[self.currentSession release];
currentSession = nil;
break;
}
}
Проблема в том, что метод didChangeState срабатывает, когда он хорош и готов, а поведение непредсказуемо. Возможно, это проблема с Bluetooth или GameKit, но я бы хотел подключиться без того, чтобы другой iPod «разрешил» подключение. Это возможно?
Думаешь, мне понадобится маршрутизатор и сеть для чего-то такого простого?
Спасибо