Delphi WebRTC ライブラリ — P2P、ICE、STUN、TURN、DataChannel
WebRTC ピア・ツー・ピアスタックのネイティブ Pascal 実装: RTCPeerConnection、ICE 候補収集と接続性チェック、STUN と TURN のクライアント + サーバー、DTLS-SRTP 鍵合意、SCTP データチャネル — WebSocket シグナリングも既に結線済み。
WebRTC ピア・ツー・ピアスタックのネイティブ Pascal 実装: RTCPeerConnection、ICE 候補収集と接続性チェック、STUN と TURN のクライアント + サーバー、DTLS-SRTP 鍵合意、SCTP データチャネル — WebSocket シグナリングも既に結線済み。
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
RFC 8825 / 8445 / 8489 / 8656 / 6347 / 4960 / 8831
コンポーネントには Enterprise が必要です。offer と answer、DataChannels、トラックには、さらに sgcWebRTC パックが必要です。どちらも All-Access に含まれます。
ピア接続が主役ですが、補助部品も第一級コンポーネントです。
TsgcRTCPeerConnection は W3C API をミラーします: CreateOffer、CreateAnswer、SetLocalDescription、SetRemoteDescription、AddIceCandidate、CreateDataChannel、AddTrack。RTCPeerConnection 参照。
組み込みの SDP シリアライザーとパーサー。Chrome と Firefox が生成するのと同じワイヤー形式で、オファーを生成、アンサーを受け入れ、ICE 候補をトリクル送信。
完全な候補収集: host、server-reflexive(STUN で発見)、relayed(TURN で割り当て)。RFC 8445 に従ったペアリング、優先順位付け、接続性チェック。ICE ページ。
NAT 発見とキープアライブのためのスタンドアロン STUN クライアントと STUN サーバー。Pascal の 2 行で独自の STUN エンドポイントを実行。
リレー割り当て用の TURN クライアントとセルフホスト用の TURN サーバー。長期資格情報、IPv4 + IPv6。
必須の WebRTC 鍵合意プロトコル。同じ ICE ネゴシエート UDP パス上の DTLS 1.2 ハンドシェイクで、SRTP 用の鍵生成材料をエクスポート。
WebRTC メディアトランスポート上の信頼性/非信頼性、順序/非順序メッセージ — 任意のアプリケーションデータをピア・ツー・ピアで送信する標準方法。
同梱の TsgcWebSocketClient / TsgcWebSocketHTTPServer をシグナリングチャネルとして使用するか、すぐに使えるプロトコルのペア TsgcWSPClient_RTCPeerConnection と TsgcWSPServer_RTCPeerConnection を利用できます。すべてに 1 つのライブラリで対応します。
WebRTC はシグナリングプロトコルを定義しません — 自分で用意します。慣例的な選択は、3 つのメッセージタイプを運ぶ WebSocket チャネルです: offer(呼び出し側からの SDP)、answer(着信側からの SDP)、ice-candidate(どちらかの側からトリクルされる候補)。sgcWebSockets は、そのチャネルの両端を既に含んでいます。TsgcWSPServer_RTCPeerConnection は呼び出し側と着信側をペアリングし、双方の description と候補を中継します。TsgcWSPClient_RTCPeerConnection は対応するクライアントで、TsgcWSPServer_WebRTC はブラウザのピアに対して同じ役割を果たし、参加するたびに ICE サーバーのリストを各ピアへ送信します。
ピア接続コンポーネントとシグナリングサーバーは同じライブラリ内に存在するため、サードパーティ SDK を 1 つも統合せずに、完全な WebRTC アプリケーション — 協調的発見、NAT 越え、暗号化された P2P ペイロード — を立ち上げられます。
ブラウザが使用するのと同じ 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');
ほとんどのチームは、公開されている Google の STUN とサードパーティの TURN サービス(Twilio、Xirsys、coturn)から始めます。トラフィックが増えれば、リレーの帯域費用も増えます — 実際のところ、TURN は WebRTC の中で唯一バイト単位の課金が発生する部分です。このライブラリならセルフホストできます: TsgcSTUNServer と TsgcTURNServer はコンソールアプリケーションや Windows サービスに組み込むことができ、既定では UDP 3478 で応答し、Bindings に指定した任意のポートとアドレスでも応答します。長期認証情報、IPv4 と IPv6、TURNOptions.Allocation によるリレーポート範囲、ユーザーごとの割り当てクォータは、すべて組み込みです。
すべてのピア・ツー・ピアコンポーネントのランディングページ。
詳細なコンポーネントリファレンス。
候補収集と接続性チェック。
Delphi-to-Delphi データチャネルのエンド・ツー・エンドウォークスルー。
Delphi での独自 STUN/TURN インフラのセルフホスティング。
相互運用性テストのためのリファレンス C 実装の相互参照。