Широковещательная рассылка сообщений через клиент / сервер iPhone - PullRequest
0 голосов
/ 28 декабря 2010

Я пытался создать простую клиент-серверную сеть через 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 «разрешил» подключение. Это возможно?

Думаешь, мне понадобится маршрутизатор и сеть для чего-то такого простого?

Спасибо

1 Ответ

0 голосов
/ 01 января 2011

Я провел гораздо больше исследований и решил использовать небольшую беспроводную точку доступа 5 В для установки системы связи с несколькими iPod. Материал GameKit отлично подходит для двух iPod, говорящих друг с другом, но он не очень надежен (а диапазон - другая проблема). CocoaAsyncSocket - это фантастика. Похоже, что многие здесь использовали это для трансляции и связи по протоколу TCP.

Вот несколько шагов, которые я предпринял:

  • Я настроил свой «контроллер» iPod на открытие соединения с портом.
  • В моих «клиентских» приложениях iPod они подключаются к «контроллеру» в качестве хоста с использованием статического IP-адреса
  • Затем я отправляю команды клиентам и выполняю различные операции в зависимости от команды

Кто-нибудь имел успех в общении с несколькими iPod в локальной сети? Мне было бы интересно посмотреть, как вы этого добились.

Счастливое кодирование

...