3

我正在使用 IceLink 库进行点对点通信。我们需要为此部署两台服务器 IceLink 和 WebSync,如下所示 http://docs.frozenmountain.com/icelink2/index.html#class=icelink-getting-started-creating-a-conference-10_ios-macosx 但我想要使用 XMPP 而不是 WebSync。以下代码用于 WebSync,现在我只想替换它,以便在使用此 WebSync 时可以使用 XMPP。

[client addOnStreamFailureWithValueBlock:^(FMWebSyncStreamFailureArgs *e)
         {
             [conference unlinkAll];
         }];

        // Add a couple event handlers to the conference to send
        // generated offers/answers and candidates to a peer.
        // The peer ID is something we define later. In this case,
        // it represents the remote WebSync client ID. WebSync's
        // "notify" method is used to send data to a specific client.
        [conference addOnLinkOfferAnswerWithValueBlock:^(FMIceLinkLinkOfferAnswerArgs *e)
         {
             [client notifyWithNotifyArgs:[FMWebSyncNotifyArgs notifyArgsWithClientId:[FMGuid guidWithG:e.peerId]
                                                                             dataJson:[e.offerAnswer toJson]
                                                                                  tag:@"offeranswer"]];
         }];
        [conference addOnLinkCandidateWithValueBlock:^(FMIceLinkLinkCandidateArgs *e)
         {
             [client notifyWithNotifyArgs:[FMWebSyncNotifyArgs notifyArgsWithClientId:[FMGuid guidWithG:e.peerId]
                                                                             dataJson:[e.candidate toJson]
                                                                                  tag:@"candidate"]];
         }];

        // Add an event handler to the WebSync client to receive
        // incoming offers/answers and candidates from a peer.
        // Call the "receiveOfferAnswer" or "receiveCandidate"
        // method to pass the information to the conference.
        [client addOnNotifyWithValueBlock:^(FMWebSyncNotifyReceiveArgs *e)
         {
             NSString *peerId = [e.notifyingClient.clientId toString];
             NSObject *peerState = e.notifyingClient.boundRecords;
             if ([e.tag isEqualToString:@"offeranswer"])
             {
                 [conference receiveOfferAnswerWithOfferAnswer:[FMIceLinkOfferAnswer fromJsonWithOfferAnswerJson:e.dataJson]
                                                        peerId:peerId
                                                     peerState:peerState];
             }
             else if ([e.tag isEqualToString:@"candidate"])
             {
                 [conference receiveCandidateWithCandidate:[FMIceLinkCandidate fromJsonWithCandidateJson:e.dataJson]
                                                    peerId:peerId];
             }
         }];

        // Subscribe to a WebSync channel. When another client joins the same
        // channel, create a P2P link. When a client leaves, destroy it.
        FMWebSyncSubscribeArgs *subscribeArgs = [FMWebSyncSubscribeArgs subscribeArgsWithChannel:@"/mychat"];
        [subscribeArgs setOnSuccessBlock:^(FMWebSyncSubscribeSuccessArgs *e)
         {
             [self writeLine:@"-- Subscribed to %@.", e.channel];
         }];
        [subscribeArgs setOnFailureBlock:^(FMWebSyncSubscribeFailureArgs *e)
         {
             [self writeLine:@"-- Could not subscribe to %@. %@", e.channel, e.exception.message];
         }];
        [subscribeArgs setOnReceiveBlock:^(FMWebSyncSubscribeReceiveArgs *e) { }];
        [subscribeArgs setOnClientSubscribeWithOnClientSubscribeBlock:^(FMWebSyncSubscribersClientSubscribeArgs *e)
         {
             NSString *peerId = [e.subscribedClient.clientId toString];
             NSObject *peerState = e.subscribedClient.boundRecords;
             [conference linkWithPeerId:peerId peerState:peerState];
         }];
        [subscribeArgs setOnClientUnsubscribeWithOnClientUnsubscribeBlock:^(FMWebSyncSubscribersClientUnsubscribeArgs *e)
         {
             NSString *peerId = [e.unsubscribedClient.clientId toString];
             [conference unlinkWithPeerId:peerId];
         }];
        [client subscribeWithSubscribeArgs:subscribeArgs];
4

1 回答 1

1

这里没有问题。无论如何,作为对未来读者的一般回答,您实际上可以使用客户端之间的任何通信方法。您甚至可以通过电子邮件发送并复制/粘贴通过信令通道发送的信息(我实际上为我最早的 WebRTC 所做的事情,以避免拥有信令服务器的复杂性)。

您只需使用您的信令通道来交换以下信息(我使用的是 C# 命名,但其他语言应该具有相似的名称,但遵循语言约定):

  1. 一个对等点的报价(OnLinkOfferAnswer一旦您调用通过回调生成Conference.Link)被发送到另一个对等点。要调用Conference.Link,您需要知道您正在连接的对等 ID,因此可能需要您的信令服务器将此数据发送给我们(在我的使用中,我实际上连接到一个中间服务器进行记录,因此可以使用硬编码的“服务器”对等 ID)。
  2. OnLinkOfferAnswer该对等点的答案(一旦您使用 注册报价,通过回调生成Conference.ReceiveOfferAnswer)被发送到第一个对等点(并以相同的方式注册)。
  3. 两个对等点都将生成带有OnLinkCandidate回调(多次)的 ICE 候选对象,该回调必须发送给另一个对等点并注册到Conference.ReceiveCandidate.

请注意,这一切都是异步发生的,因此可以在收到答案之前生成 ICE 候选。这很好,因为 IceLink 将在内部管理它们。

您必须跟踪这是针对哪个同伴(提议/答案和候选人是特定于同伴的)。这完全取决于您的信令库(此处为 XMPP)来生成某种唯一的对等 ID,以便您可以识别用户(如果您的信令库没有,您可以自己做)。

交换的数据是 JSON,但您不必在典型用法中对其进行修改。OfferAnswerCandidate对象具有处理转换的FromJson方法。ToJson

于 2015-07-31T21:45:16.053 回答