3

ピアツーピア通信に IceLink ライブラリを使用しています。ここにリストされているように、IceLink と WebSync の 2 つのサーバーを展開する必要があり ますhttp://docs.frozenmountain.com/icelink2/index.html#class=icelink-getting-started-creating-a-conference-10_ios-macosx WebSync の代わりに XMPP を使用します。次のコードは 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. 両方のピアがコールバックを使用して ICE 候補を生成しOnLinkCandidate(複数回)、これを他のピアに送信して に登録する必要がありますConference.ReceiveCandidate

これはすべて非同期で行われるため、応答が受信される前に ICE 候補が生成される可能性があることに注意してください。IceLink がそれらを内部で管理するので、それで問題ありません。

これがどのピアを対象としているかを追跡する必要があります (オファー/回答と候補はピア固有です)。ユーザーを識別できるように、ある種の一意のピア ID を生成するのは、シグナリング ライブラリ (ここでは XMPP) 次第です (シグナリング ライブラリがそうでない場合は、自分で行うことができます)。

交換されるデータは JSON ですが、通常の使用法では変更する必要はありません。OfferAnswerandCandidateオブジェクトには、変換を処理するための and メソッドがFromJsonあります。ToJson

于 2015-07-31T21:45:16.053 に答える