【问题标题】:Best option for streaming data between iPhones在 iPhone 之间传输数据的最佳选择
【发布时间】:2014-01-20 17:14:02
【问题描述】:

我想为多部 iPhone 之间的流数据设置客户端-服务器架构。例如,“服务器”iPhone 拥有一个动物主列表。任意数量的客户端 iPhone 可以连接到服务器 iPhone,然后读取和编辑列表。我尝试过的一些方法:

  • 多点连接 - 最多仅支持 8 个客户端。如果有办法解决这个问题,这正是我正在寻找的东西
  • GameKit - 我读到蓝牙连接在处理多个客户端时可能会出现问题
  • BLE - 蓝牙的特征值限制为 512 个八位字节。我假设动物列表在归档后可能会增长到大于最大特征值。
  • 套接字 - 我宁愿不必依赖外部服务器

我愿意接受“hacky”解决方案。我曾考虑将每种动物作为一个单独的特征进行广播,但这可能会减慢发现速度,而且我觉得这会引起其他一些麻烦。任何帮助将不胜感激

【问题讨论】:

    标签: ios iphone bluetooth gamekit multipeer-connectivity


    【解决方案1】:

    Multipeer Connectivity 每个会话仅支持 8 个对等点,但它支持多个会话。在您的情况下,如果有一个带有许多客户端的“服务器”设备,并且客户端不需要互相看到,那么“服务器”可以根据需要创建新会话。

    因此,“服务器”对等方充当广告商并接受邀请,具有返回现有会话或创建新会话的方法:

    - (MCSession *)availableSession {
    
       //Try and use an existing session (_sessions is a mutable array)
       for (MCSession *session in _sessions)
           if ([session.connectedPeers count]<kMCSessionMaximumNumberOfPeers)
               return session;
    
        //Or create a new session
        MCSession *newSession = [self newSession];
        [_sessions addObject:newSession];
    
        return newSession;
    }
    
    - (MCSession *)newSession {
    
        MCSession *session = [[MCSession alloc] initWithPeer:_myPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone];
        session.delegate = self;
    
        return session;
    }
    
    - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void (^)(BOOL, MCSession *))invitationHandler {
    
        MCSession *session = [self availableSession];
        invitationHandler(YES,session);
    }
    

    然后我有这个发送方法:

    - (void)sendData:(NSData *)data toPeers:(NSArray *)peerIDs reliable:(BOOL)reliable error:(NSError *__autoreleasing *)error {
    
        if ([peerIDs count]==0)
            return;
    
        NSPredicate *peerNamePred = [NSPredicate predicateWithFormat:@"displayName in %@", [peerIDs valueForKey:@"displayName"]];
    
        MCSessionSendDataMode mode = (reliable) ? MCSessionSendDataReliable : MCSessionSendDataUnreliable;
    
        //Need to match up peers to their session
        for (MCSession *session in _sessions){
    
            NSError __autoreleasing *currentError = nil;
    
            NSArray *filteredPeerIDs = [session.connectedPeers filteredArrayUsingPredicate:peerNamePred];
    
            [session sendData:data toPeers:filteredPeerIDs withMode:mode error:&currentError];
    
            if (currentError && !error)
                *error = currentError;
        }
    }
    

    当然可以对这种方法进行性能优化,但对于我向同行发送数据的频率来说,这已经足够好了。

    【讨论】:

    • 太棒了。您是否有任何关于在后台模式下保持多对等连接蓝牙处于活动状态的信息?
    • 您将无法在后台发现对等点,但我已经能够在已连接的对等点之间传输数据。我在这里回答了一个类似的问题:stackoverflow.com/questions/20480600/…
    • @ChrisH 你能推荐一个解决方案,让所有 45 台设备都能看到彼此并聊天吗?该解决方案看起来只有服务器才能看到所有设备,并且设备可能必须在近距离范围内。我正在寻找可以将数百名用户分散并链接在一起,能够聊天的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多