Delphi WebRTC ライブラリ — P2P、ICE、STUN、TURN、DataChannel

WebRTC ピア・ツー・ピアスタックのネイティブ Pascal 実装: RTCPeerConnection、ICE 候補収集と接続性チェック、STUN と TURN のクライアント + サーバー、DTLS-SRTP 鍵合意、SCTP データチャネル — WebSocket シグナリングも既に結線済み。

Pascal のためのピア・ツー・ピア、エンド・ツー・エンド

Chromium をバンドルせずに、ブラウザグレードの P2P を Delphi にもたらします。

Delphi WebRTC ライブラリにより、2 つの Delphi プロセス(または Delphi プロセスとブラウザ)が、ペイロードを中央サーバー経由でルーティングすることなく、直接、NAT を越えて、エンド・ツー・エンドで暗号化されたチャネルを確立できます。sgcWebSockets はすべての WebRTC 構成要素を Pascal コンポーネントとして提供します: TsgcRTCPeerConnection は W3C の RTCPeerConnection API をミラーし、TsgcSTUNClient / TsgcSTUNServer は RFC 8489 を実装し、TsgcTURNClient / TsgcTURNServer は RFC 8656 を実装し、完全な ICE エージェントである TsgcICEClient がそれらを結びつけます。

ブラウザベースのスタック(Chromium または libwebrtc — 数十メガバイトのネイティブコードと複雑なビルドを必要とする)と異なり、sgcWebSockets 実装は OpenSSL の上の純粋な Pascal で、バイナリにコンパイルされます。Delphi 7 から Delphi 13 まで動作し、Win32/Win64、Linux64、macOS、iOS、Android 用のネイティブバイナリを出荷します。

ピア接続

TsgcRTCPeerConnection

ICE / STUN / TURN

P2P コンポーネント

標準

RFC 8825 / 8445 / 8489 / 8656 / 6347 / 4960 / 8831

エディション

コンポーネントには Enterprise が必要です。offer と answer、DataChannels、トラックには、さらに sgcWebRTC パックが必要です。どちらも All-Access に含まれます。

すべての WebRTC コンポーネントを公開

ピア接続が主役ですが、補助部品も第一級コンポーネントです。

RTCPeerConnection

TsgcRTCPeerConnection は W3C API をミラーします: CreateOffer、CreateAnswer、SetLocalDescription、SetRemoteDescription、AddIceCandidate、CreateDataChannel、AddTrack。RTCPeerConnection 参照。

SDP オファー / アンサー

組み込みの SDP シリアライザーとパーサー。Chrome と Firefox が生成するのと同じワイヤー形式で、オファーを生成、アンサーを受け入れ、ICE 候補をトリクル送信。

ICE エージェント

完全な候補収集: host、server-reflexive(STUN で発見)、relayed(TURN で割り当て)。RFC 8445 に従ったペアリング、優先順位付け、接続性チェック。ICE ページ。

STUN クライアント + サーバー

NAT 発見とキープアライブのためのスタンドアロン STUN クライアントと STUN サーバー。Pascal の 2 行で独自の STUN エンドポイントを実行。

TURN クライアント + サーバー

リレー割り当て用の TURN クライアントとセルフホスト用の TURN サーバー。長期資格情報、IPv4 + IPv6。

DTLS-SRTP

必須の WebRTC 鍵合意プロトコル。同じ ICE ネゴシエート UDP パス上の DTLS 1.2 ハンドシェイクで、SRTP 用の鍵生成材料をエクスポート。

SCTP データチャネル

WebRTC メディアトランスポート上の信頼性/非信頼性、順序/非順序メッセージ — 任意のアプリケーションデータをピア・ツー・ピアで送信する標準方法。

WebSocket シグナリング

同梱の TsgcWebSocketClient / TsgcWebSocketHTTPServer をシグナリングチャネルとして使用するか、すぐに使えるプロトコルのペア TsgcWSPClient_RTCPeerConnection と TsgcWSPServer_RTCPeerConnection を利用できます。すべてに 1 つのライブラリで対応します。

WebSocket シグナリング: 標準パターン

WebRTC はシグナリングプロトコルを定義しません — 自分で用意します。慣例的な選択は、3 つのメッセージタイプを運ぶ WebSocket チャネルです: offer(呼び出し側からの SDP)、answer(着信側からの SDP)、ice-candidate(どちらかの側からトリクルされる候補)。sgcWebSockets は、そのチャネルの両端を既に含んでいます。TsgcWSPServer_RTCPeerConnection は呼び出し側と着信側をペアリングし、双方の description と候補を中継します。TsgcWSPClient_RTCPeerConnection は対応するクライアントで、TsgcWSPServer_WebRTC はブラウザのピアに対して同じ役割を果たし、参加するたびに ICE サーバーのリストを各ピアへ送信します。

ピア接続コンポーネントとシグナリングサーバーは同じライブラリ内に存在するため、サードパーティ SDK を 1 つも統合せずに、完全な WebRTC アプリケーション — 協調的発見、NAT 越え、暗号化された P2P ペイロード — を立ち上げられます。

ICE サーバーの構成

ブラウザが使用するのと同じ iceServers リストを、RTCOptions.ICEServers として公開します — 公開サーバーと独自のプライベート TURN の両方を指定できます。

uses
  sgcP2P, sgcP2P_DataChannel;

// TFormPeer は FPeer、FChannel、FIncoming: TStringList を保持します

procedure TFormPeer.CreatePeer;
begin
  FPeer := TsgcRTCPeerConnection.Create(nil);
  FPeer.RTCOptions.ICEServers.AddURL('stun:stun.l.google.com:19302');
  FPeer.RTCOptions.ICEServers.AddURL('turn:turn.example.com:3478',
    'alice', 's3cret');

  FPeer.OnLocalDescription := OnLocalDescription;
  FPeer.OnIceCandidate     := OnIceCandidate;
  FPeer.OnDataChannel      := OnDataChannel;

  // 発信側。CreateDataChannel は RTCOptions.DTLS を有効にします
  FChannel := FPeer.CreateDataChannel('chat');
  FChannel.OnMessage := OnChannelMessage;
  FPeer.CreateOffer;
end;

procedure TFormPeer.OnLocalDescription(Sender: TObject;
  const aType, aSDP: string);
begin
  // aType は 'offer' または 'answer' です
  SignalToPeer(aType, aSDP);
end;

procedure TFormPeer.OnIceCandidate(Sender: TObject;
  const aCandidate, aSdpMid: string; aSdpMLineIndex: Integer);
begin
  SignalCandidate(aCandidate, aSdpMid, aSdpMLineIndex);
end;

procedure TFormPeer.OnDataChannel(Sender: TObject;
  aChannel: TsgcRTCDataChannel);
begin
  FChannel := aChannel;
  FChannel.OnMessage := OnChannelMessage;
end;

procedure TFormPeer.OnChannelMessage(Sender: TObject;
  const aText: string);
begin
  // ワーカースレッドで発生します。コントロールを操作する前にマーシャリングしてください
  FIncoming.Add(aText);
end;

// ピアツーピアでメッセージを送信します
FChannel.Send('Hello from Delphi');

Delphi で独自の STUN / TURN を実行

ほとんどのチームは、公開されている Google の STUN とサードパーティの TURN サービス(Twilio、Xirsys、coturn)から始めます。トラフィックが増えれば、リレーの帯域費用も増えます — 実際のところ、TURN は WebRTC の中で唯一バイト単位の課金が発生する部分です。このライブラリならセルフホストできます: TsgcSTUNServer と TsgcTURNServer はコンソールアプリケーションや Windows サービスに組み込むことができ、既定では UDP 3478 で応答し、Bindings に指定した任意のポートとアドレスでも応答します。長期認証情報、IPv4 と IPv6、TURNOptions.Allocation によるリレーポート範囲、ユーザーごとの割り当てクォータは、すべて組み込みです。

sgcWebSockets での P2P 詳細

P2P / WebRTC ハブ

すべてのピア・ツー・ピアコンポーネントのランディングページ。

RTCPeerConnection

詳細なコンポーネントリファレンス。

ICE エージェント

候補収集と接続性チェック。

STUN と TURN

NAT 発見とリレーサーバー。

ブログ: RTCPeerConnection P2P

Delphi-to-Delphi データチャネルのエンド・ツー・エンドウォークスルー。

ブログ: STUN + TURN サーバーとクライアント

Delphi での独自 STUN/TURN インフラのセルフホスティング。

ブログ: Windows での coturn

相互運用性テストのためのリファレンス C 実装の相互参照。

最もお得な選択: All-AccesseSeGeCe の全製品にプレミアムサポートが付いて、年間 €1,059 からご利用いただけます。
All-Access の価格を見る

最初の P2P チャネルを構築

トライアルをダウンロード — WebRTC、STUN、TURN デモはコンパイル可能な Delphi プロジェクトとして同梱。