SlideShare a Scribd company logo
1 of 32
Download to read offline
Node.js with
WebRTC DataChannel
東京Node学園祭2016
2016.11.12
がねこまさし
@massie_g
自己紹介
• 所属
– インフォコム(株)の調査研究チーム Web担当
• Node学園の過去の発表
– 東京Node学園祭2014
• Nodeで操るKurentoメディアサーバー
• http://www.slideshare.net/mganeko/nodekurento
– 東京Node学園祭2013
• WebRTCを始めよう
• http://www.slideshare.net/mganeko/2013-web-rtcnode
• Web記事
– HTML5Experts.jp WebRTC入門2016
• https://html5experts.jp/series/webrtc2016/
WebRTCとは
• Web Real-Time Communication の略
• Webブラウザ上のリアルタイム通信の規格
– ビデオ/オーディオ … MediaStream
– 任意のデータ … DataChannel
• どこで使えるか?
– PCブラウザ (Chrome, Firefox, もうすぐEdgeでも)
– Androidブラウザ (Chrome, Firefox)
– ネイティブアプリ (PC, Android, iOS, other)
– Node.js 用モジュール
Node.jsでWebRTCを使う方法
• Node.js × ブラウザ
– NW.js (node-webkit) … http://nwjs.io
– Electron … http://electron.atom.io
– どちらもデスクトップアプリケーション
• 中にChromiumを丸ごと持っているようなもの
• Node.js × libwebrtc
– Chromiumの中から、WebRTCのライブラリのみ利用
– wrtc (node-webrtc) ... DataChannel のみ対応
• https://github.com/js-platform/node-webrtc
– webrtc-native … DataChannel、MediaStream両対応
• https://github.com/vmolsa/webrtc-native
やりたいこと
P2Pのデータ通信
Webブラウザ Node.jsのアプリ
Part 1
wrtc (node-webrtc)
インストール方法
• Mac OS X 10.10.x / 10.11.x のケース
– npm install wrtc
• Ubutnu 16でも同様
• npm install wrtc
使い方(1) 読み込み
var WebRTC = require('wrtc');
var RTCPeerConnection = WebRTC.RTCPeerConnection;
var RTCIceCandidate= WebRTC.RTCIceCandidate;
var RTCSessionDescription = WebRTC.RTCSessionDescription;
var RTCDataChannel = WebRTC.RTCDataChannel;
使い方(2) シグナリング
• シグナリングとは
– P2P通信をするために必要な情報を交換すること
• 今日はシグナリングの処理は省略
– 通常シグナリングサーバーを介して行う
• WebSocketが使われることが多い(Socket.IOも含む)
• 今回は、Socket.IOを利用
• 参考
– WebRTCハンズオン 概要編
• http://qiita.com/massie_g/items/916694413353a3293f73
– WebRTC入門2016
• https://html5experts.jp/mganeko/19814/
• https://html5experts.jp/mganeko/20013/
• https://html5experts.jp/mganeko/20112/
今回は手順は省略
シグナリングサーバーとの関係
P2Pのデータ通信
シグナリングサーバー
Node.js + Socket.IO接続情報
(SDP)
を交換
Node.jsのアプリ
Socket.IOクライアント
Webブラウザ
DataChannelを利用する(1)
始める側:ブラウザ
var peer = new RTCPeerConnection(config);
// P2P通信を始める前(シグナリング前)に、DataChannelを用意する
var dataChannel = peer.createDataChannel('channelName', option);
dataChannel.onopen = function () { // 接続時の処理
};
dataChannel.onmessage = function (evt) { // データ受信時の処理
var data = evt.data;
};
dataChannel.onerror = function (error) { // エラー時の処理
};
dataChannel.onclose = function () { // 切断時の処理
dataChannel = null;
};
DataChannelを利用する(2)
受ける側: Node.js
var peer = new RTCPeerConnection(config);
var dataChannel = null;
peer.ondatachannel = function(event) {
dataChannel = event.channel; // DataChannelを作るのではなく、渡されたものを使う
dataChannel.onopen = function () { // 接続時の処理
};
dataChannel.onmessage = function (evt) { // データ受信時の処理
var data = evt.data;
};
dataChannel.onerror = function (error) { // エラー時の処理
};
dataChannel.onclose = function () { // 切断時の処理
dataChannel = null;
};
};
DataChannelを利用する(3)
メッセージを送る: ブラウザ/Node.js
• dataChannel.send( data );
– dataの型
• DOMString, Blob, ArrayBuffer, ArrayBufferView
– dataChannelは双方向
Demo 1: Echoサーバー
Demo2:ターミナルソフト
ターミナルの全体の構成
Node.jsのアプリ側Webブラウザ側
pty.jsxterm.js
DataChannelDataChannel
on.('data, … )
send()onmessage()
write()on.('data, … )
send()
onmessage()
write()
ユーザー bash
ターミナルソフト Node.js側
• pty.js を利用 https://github.com/chjj/pty.js/
• インストール
– npm install wrtc
– npm install socket.io-client
– npm install pty.js
• 利用
var WebRTC = require('wrtc');
var IOClient = require('socket.io-client');
var pty = require('pty.js');
参考
pty.jsでターミナルを準備
var ptyTerm;
function setupTerminal(cols, rows) {
ptyTerm = pty.spawn(process.platform === 'win32' ? 'cmd.exe' : 'bash', [],
{
name: 'xterm-color',
cols: cols || 80,
rows: rows || 24,
cwd: process.env.PWD,
env: process.env
});
ptyTerm.on('data', function(data) {
dataChannel.send(data); // ターミナルから来たデータをDataChannelに送る
});
}
参考
DataChannel接続の処理
var dataChannel = null;
peer.ondatachannel = function(event) {
dataChannel = event.channel;
// … 略 …
dataChannel.onmessage = function (evt) {
ptyTerm.write(evt.data); // ターミナルに送る
};
// ターミナルを準備
setupTerminal(80, 25);
};
参考
ターミナルソフト ブラウザ側
• xterm.js を利用 https://github.com/sourcelair/xterm.js
• 利用
<link rel="stylesheet" href="xterm.css" /> <!—CSS必須 -->
<script src="xterm.js"></script>
参考
xterm.jsでターミナルの準備
var container = document.getElementById('containerDiv'); // <div>
Var term = null;
function prepareTerminal() {
term = new Terminal({
cols: 80, rows: 24, convertEol: true,
//useStyle: true,
//screenKeys: true,
cursorBlink: true
});
term.on('data', function(data) {
dataChannel.send(data); // ユーザの入力をデータチャネルに送る
});
term.on('title', function(title) {
document.title = title;
});
term.open(container); // ターミナルのUIを生成
}
参考
xterm.jsで応答を表示
var dataChannel = peer.createDataChannel(
'channelName', dataOpt
);
// … 省略 …
dataChannel.onmessage = function (evt) {
term.write(evt.data);
// DataCannelで受け取ったデータをターミナルに表示
};
参考
どうしてWebRTC DataChannelを使うの?
• sshで良いんじゃない? … ブラウザで色々やりたい
• WebSocketで良いんじゃない?
– Node.js アプリが「外側」にあるときはOK
– では、Node.jsアプリもNATの「内側」にある時は??
Node.jsのアプリ
WebSocket「サーバー」
Web
ブラウザ
NAT
Node.js
アプリ
Web
ブラウザ
NAT NAT
どうしてWebRTC DataChannelを使うの?
• WebRTC DataChannel なら NAT越えの仕組みがある
– STUNサーバー
– UDP ホールパンチング
• WiFiにプライバシーセパレーターがあっても通信可能
Node.js
アプリ
Web
ブラウザ
STUN サーバー
参考:
• WebRTCハンズオン 概要編 - P2P通信行うまで(2-1):NAT越え https://goo.gl/FVYOkA
• WebRTCの裏側にあるNATの話 - 答えの前にUDPホールパンチング https://goo.gl/P64kGX
NAT NAT
どうしてWebRTC DataChannelを使うの?
• WebRTC DataChannel なら Firewall/Proxy越えの仕組みもある
– TURN, TURN over TCP
• …が、いまのところNode.js アプリ側のFirewall越えが成功して
ません
Node.js
アプリ
Web
ブラウザ TURN サーバー
参考:
• WebRTCハンズオン 概要編 - P2P通信行うまで(3):Firewall越え https://goo.gl/MJWxR9
Fire-
wall
Proxy
Fire-
wall
Proxy
あれ? WebSocketでもできるのでは?
• WebSocketサーバーを外に立てればできる
Node.js +
WebSocket
クライアント
Web
ブラウザ
WebSocket
サーバー
Fire-
wall
Proxy
Fire-
wall
Proxy
WebRTC DataChannel との違い
• DataChannelの場合、ネットワーク環境が許せば、P2Pで繋がる
→ レイテンシーが小さくなる
• DataChannelの場合、End-to-End で暗号化される
⇔ WebSocketの場合、サーバで暗号解除される。悪意があれば、見たり改変したりできる
Part 2
webrtc-native
インストール方法
• Mac OS X 10.10.x 、 Xcode 7.x のケース
– git clone https://github.com/vmolsa/webrtc-native
– cd webrtc-native
– export BUILD_WEBRTC=true
– npm install
• 注意
– npm install で非常に時間がかかる(数時間?)
• webrtcのソース取得、ビルドを実施するため
• proxyがある場合は、 ~/.boto ファイルに proxy設定が必要
• Ubuntu 16 でも同様の手順
インストール方法(2)
• Mac OS X 10.11.x 、 Xcode 8.x のケース
– git clone https://github.com/vmolsa/webrtc-native
– cd webrtc-native
– export BUILD_WEBRTC=true
– npm install
• → libwebrtc のビルドに失敗
• 原因
– QTKit (QuickTime Kit) が見つからない、というエラー
– Xcode 8 から QuickTime廃止、AVFoundationを利用
– Webrtc-native は Chromium 50 ベースでQTKitに依存
• Chromium 51〜 QTKit不要になっているが…
• 対策
– 最新Chromiumのソースを取得するようにビルドスクリプトを修正
• → 挫折
– Xcode 7.x でビルドした build/Release/webrtc.node をコピーしてくる
• → なんとか動いた
使い方 読み込み
// webrtc-native をインストールしたディレクトリで
var WebRTC = require('./');
var RTCPeerConnection = WebRTC.RTCPeerConnection;
var RTCIceCandidate= WebRTC.RTCIceCandidate;
var RTCSessionDescription = WebRTC.RTCSessionDescription;
var RTCDataChannel = WebRTC.RTCDataChannel;
// あとの使い方は、wrtcと同じ
まとめ
• WebRTC は Webブラウザだけじゃない
• DataChannel なら Node.js からも使える
• NATの内側のNode.jsアプリにも接続できる
• Node.js で P2P アプリが作れる
– センサーデータの送受信?
– コンテンツ配信、ファイル共有?
– きっと、もっと楽しいことができるはず!
Thank you!
@massie_g

More Related Content

What's hot

What's hot (20)

C言語なWebSocketの遊び方。
C言語なWebSocketの遊び方。C言語なWebSocketの遊び方。
C言語なWebSocketの遊び方。
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
 
コールバックと戦う話
コールバックと戦う話コールバックと戦う話
コールバックと戦う話
 
UnityによるHoloLens用UWPアプリケーション開発の勘所
UnityによるHoloLens用UWPアプリケーション開発の勘所UnityによるHoloLens用UWPアプリケーション開発の勘所
UnityによるHoloLens用UWPアプリケーション開発の勘所
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
 
WebRTCのオーディオ処理の謎、誰か教えて!
WebRTCのオーディオ処理の謎、誰か教えて!WebRTCのオーディオ処理の謎、誰か教えて!
WebRTCのオーディオ処理の謎、誰か教えて!
 
WebRTCで動かす“テレイグジスタンス”ロボット
WebRTCで動かす“テレイグジスタンス”ロボットWebRTCで動かす“テレイグジスタンス”ロボット
WebRTCで動かす“テレイグジスタンス”ロボット
 
世界最強のソフトウェアアーキテクト
世界最強のソフトウェアアーキテクト世界最強のソフトウェアアーキテクト
世界最強のソフトウェアアーキテクト
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
WebRTC multitrack / multistream
WebRTC multitrack / multistreamWebRTC multitrack / multistream
WebRTC multitrack / multistream
 
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
 
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
 
リアルタイムコマンドバトルのゲームで PlayFab を使ってみた
リアルタイムコマンドバトルのゲームで PlayFab を使ってみたリアルタイムコマンドバトルのゲームで PlayFab を使ってみた
リアルタイムコマンドバトルのゲームで PlayFab を使ってみた
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテスト
 
MQTTとAMQPと.NET
MQTTとAMQPと.NETMQTTとAMQPと.NET
MQTTとAMQPと.NET
 
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 

Viewers also liked

Maglica - A Simple Internal Cloud Tool at #techkayac
Maglica - A Simple Internal Cloud Tool at #techkayacMaglica - A Simple Internal Cloud Tool at #techkayac
Maglica - A Simple Internal Cloud Tool at #techkayac
Gosuke Miyashita
 

Viewers also liked (8)

Webrtc最新動向
Webrtc最新動向Webrtc最新動向
Webrtc最新動向
 
Maglica - A Simple Internal Cloud Tool at #techkayac
Maglica - A Simple Internal Cloud Tool at #techkayacMaglica - A Simple Internal Cloud Tool at #techkayac
Maglica - A Simple Internal Cloud Tool at #techkayac
 
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
 
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
 
とある小売IT企業での新卒仮想プロジェクト(工具共有サービス)
とある小売IT企業での新卒仮想プロジェクト(工具共有サービス)とある小売IT企業での新卒仮想プロジェクト(工具共有サービス)
とある小売IT企業での新卒仮想プロジェクト(工具共有サービス)
 
Tokyo nodefestival workshop_20161112
Tokyo nodefestival workshop_20161112Tokyo nodefestival workshop_20161112
Tokyo nodefestival workshop_20161112
 
大規模Perl初心者研修を支える技術
大規模Perl初心者研修を支える技術大規模Perl初心者研修を支える技術
大規模Perl初心者研修を支える技術
 
Node.jsに縁のない職場でnode.jsを使い始める戦術
Node.jsに縁のない職場でnode.jsを使い始める戦術Node.jsに縁のない職場でnode.jsを使い始める戦術
Node.jsに縁のない職場でnode.jsを使い始める戦術
 

Similar to Node.js with WebRTC DataChannel

WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
Yoshiaki Sugimoto
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
 
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうChromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそう
mganeko
 

Similar to Node.js with WebRTC DataChannel (20)

2013 WebRTC node
2013 WebRTC node2013 WebRTC node
2013 WebRTC node
 
Let's begin WebRTC
Let's begin WebRTCLet's begin WebRTC
Let's begin WebRTC
 
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
 
WebRTC meetup Tokyo 1
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1
 
2013 WebRTC 概説 & ワークショップ
2013 WebRTC 概説 & ワークショップ2013 WebRTC 概説 & ワークショップ
2013 WebRTC 概説 & ワークショップ
 
[db tech showcase Tokyo 2014] D33: Prestoで実現するインタラクティブクエリ by トレジャーデータ株式会社 斉藤太郎
[db tech showcase Tokyo 2014] D33: Prestoで実現するインタラクティブクエリ  by トレジャーデータ株式会社 斉藤太郎[db tech showcase Tokyo 2014] D33: Prestoで実現するインタラクティブクエリ  by トレジャーデータ株式会社 斉藤太郎
[db tech showcase Tokyo 2014] D33: Prestoで実現するインタラクティブクエリ by トレジャーデータ株式会社 斉藤太郎
 
Prestoで実現するインタラクティブクエリ - dbtech showcase 2014 Tokyo
Prestoで実現するインタラクティブクエリ - dbtech showcase 2014 TokyoPrestoで実現するインタラクティブクエリ - dbtech showcase 2014 Tokyo
Prestoで実現するインタラクティブクエリ - dbtech showcase 2014 Tokyo
 
20141017 introduce razor
20141017 introduce razor20141017 introduce razor
20141017 introduce razor
 
WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発
 
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LTWebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
 
Node.jsでブラウザメッセンジャー
Node.jsでブラウザメッセンジャーNode.jsでブラウザメッセンジャー
Node.jsでブラウザメッセンジャー
 
Webrtc bootcamp handson
Webrtc bootcamp handsonWebrtc bootcamp handson
Webrtc bootcamp handson
 
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみたADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
 
160705-02 RTミドルウエア講習会・名城大
160705-02 RTミドルウエア講習会・名城大160705-02 RTミドルウエア講習会・名城大
160705-02 RTミドルウエア講習会・名城大
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
 
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
 
201111 04
201111 04201111 04
201111 04
 
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうChromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそう
 

More from mganeko

WebRTC multistream
WebRTC multistreamWebRTC multistream
WebRTC multistream
mganeko
 

More from mganeko (20)

Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
 
Amazon Kinesis Video Streams WebRTC 使ってみた
Amazon Kinesis Video Streams WebRTC 使ってみたAmazon Kinesis Video Streams WebRTC 使ってみた
Amazon Kinesis Video Streams WebRTC 使ってみた
 
Build Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.jsBuild Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.js
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
Skywayのビデオチャットを録画しよう。そう、ブラウザでねSkywayのビデオチャットを録画しよう。そう、ブラウザでね
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
 
WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3
 
WebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updateWebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample update
 
ブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみたブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみた
 
WebRTC SFU mediasoup sample
WebRTC SFU mediasoup sampleWebRTC SFU mediasoup sample
WebRTC SFU mediasoup sample
 
Inside of 聖徳玉子 by O2
Inside of 聖徳玉子 by O2Inside of 聖徳玉子 by O2
Inside of 聖徳玉子 by O2
 
WebRTC Build MCU on browser
WebRTC Build MCU on browserWebRTC Build MCU on browser
WebRTC Build MCU on browser
 
PeerConnectionリレーとMediaRecorder
PeerConnectionリレーとMediaRecorderPeerConnectionリレーとMediaRecorder
PeerConnectionリレーとMediaRecorder
 
ここがつらいよWebRTC - WebRTC開発の落とし穴
ここがつらいよWebRTC - WebRTC開発の落とし穴ここがつらいよWebRTC - WebRTC開発の落とし穴
ここがつらいよWebRTC - WebRTC開発の落とし穴
 
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみようWebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
 
WebRTC multistream
WebRTC multistreamWebRTC multistream
WebRTC multistream
 
Inside WebM
Inside WebMInside WebM
Inside WebM
 
MediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live StreamingMediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live Streaming
 
Infocom webrtc conference japan
Infocom webrtc conference japanInfocom webrtc conference japan
Infocom webrtc conference japan
 
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
 
WebRTC Summit 2014 NewYork 参加報告
WebRTC Summit 2014 NewYork 参加報告WebRTC Summit 2014 NewYork 参加報告
WebRTC Summit 2014 NewYork 参加報告
 

Recently uploaded

Recently uploaded (10)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

Node.js with WebRTC DataChannel

  • 2. 自己紹介 • 所属 – インフォコム(株)の調査研究チーム Web担当 • Node学園の過去の発表 – 東京Node学園祭2014 • Nodeで操るKurentoメディアサーバー • http://www.slideshare.net/mganeko/nodekurento – 東京Node学園祭2013 • WebRTCを始めよう • http://www.slideshare.net/mganeko/2013-web-rtcnode • Web記事 – HTML5Experts.jp WebRTC入門2016 • https://html5experts.jp/series/webrtc2016/
  • 3. WebRTCとは • Web Real-Time Communication の略 • Webブラウザ上のリアルタイム通信の規格 – ビデオ/オーディオ … MediaStream – 任意のデータ … DataChannel • どこで使えるか? – PCブラウザ (Chrome, Firefox, もうすぐEdgeでも) – Androidブラウザ (Chrome, Firefox) – ネイティブアプリ (PC, Android, iOS, other) – Node.js 用モジュール
  • 4. Node.jsでWebRTCを使う方法 • Node.js × ブラウザ – NW.js (node-webkit) … http://nwjs.io – Electron … http://electron.atom.io – どちらもデスクトップアプリケーション • 中にChromiumを丸ごと持っているようなもの • Node.js × libwebrtc – Chromiumの中から、WebRTCのライブラリのみ利用 – wrtc (node-webrtc) ... DataChannel のみ対応 • https://github.com/js-platform/node-webrtc – webrtc-native … DataChannel、MediaStream両対応 • https://github.com/vmolsa/webrtc-native
  • 7. インストール方法 • Mac OS X 10.10.x / 10.11.x のケース – npm install wrtc • Ubutnu 16でも同様 • npm install wrtc
  • 8. 使い方(1) 読み込み var WebRTC = require('wrtc'); var RTCPeerConnection = WebRTC.RTCPeerConnection; var RTCIceCandidate= WebRTC.RTCIceCandidate; var RTCSessionDescription = WebRTC.RTCSessionDescription; var RTCDataChannel = WebRTC.RTCDataChannel;
  • 9. 使い方(2) シグナリング • シグナリングとは – P2P通信をするために必要な情報を交換すること • 今日はシグナリングの処理は省略 – 通常シグナリングサーバーを介して行う • WebSocketが使われることが多い(Socket.IOも含む) • 今回は、Socket.IOを利用 • 参考 – WebRTCハンズオン 概要編 • http://qiita.com/massie_g/items/916694413353a3293f73 – WebRTC入門2016 • https://html5experts.jp/mganeko/19814/ • https://html5experts.jp/mganeko/20013/ • https://html5experts.jp/mganeko/20112/ 今回は手順は省略
  • 11. DataChannelを利用する(1) 始める側:ブラウザ var peer = new RTCPeerConnection(config); // P2P通信を始める前(シグナリング前)に、DataChannelを用意する var dataChannel = peer.createDataChannel('channelName', option); dataChannel.onopen = function () { // 接続時の処理 }; dataChannel.onmessage = function (evt) { // データ受信時の処理 var data = evt.data; }; dataChannel.onerror = function (error) { // エラー時の処理 }; dataChannel.onclose = function () { // 切断時の処理 dataChannel = null; };
  • 12. DataChannelを利用する(2) 受ける側: Node.js var peer = new RTCPeerConnection(config); var dataChannel = null; peer.ondatachannel = function(event) { dataChannel = event.channel; // DataChannelを作るのではなく、渡されたものを使う dataChannel.onopen = function () { // 接続時の処理 }; dataChannel.onmessage = function (evt) { // データ受信時の処理 var data = evt.data; }; dataChannel.onerror = function (error) { // エラー時の処理 }; dataChannel.onclose = function () { // 切断時の処理 dataChannel = null; }; };
  • 13. DataChannelを利用する(3) メッセージを送る: ブラウザ/Node.js • dataChannel.send( data ); – dataの型 • DOMString, Blob, ArrayBuffer, ArrayBufferView – dataChannelは双方向
  • 17. ターミナルソフト Node.js側 • pty.js を利用 https://github.com/chjj/pty.js/ • インストール – npm install wrtc – npm install socket.io-client – npm install pty.js • 利用 var WebRTC = require('wrtc'); var IOClient = require('socket.io-client'); var pty = require('pty.js'); 参考
  • 18. pty.jsでターミナルを準備 var ptyTerm; function setupTerminal(cols, rows) { ptyTerm = pty.spawn(process.platform === 'win32' ? 'cmd.exe' : 'bash', [], { name: 'xterm-color', cols: cols || 80, rows: rows || 24, cwd: process.env.PWD, env: process.env }); ptyTerm.on('data', function(data) { dataChannel.send(data); // ターミナルから来たデータをDataChannelに送る }); } 参考
  • 19. DataChannel接続の処理 var dataChannel = null; peer.ondatachannel = function(event) { dataChannel = event.channel; // … 略 … dataChannel.onmessage = function (evt) { ptyTerm.write(evt.data); // ターミナルに送る }; // ターミナルを準備 setupTerminal(80, 25); }; 参考
  • 20. ターミナルソフト ブラウザ側 • xterm.js を利用 https://github.com/sourcelair/xterm.js • 利用 <link rel="stylesheet" href="xterm.css" /> <!—CSS必須 --> <script src="xterm.js"></script> 参考
  • 21. xterm.jsでターミナルの準備 var container = document.getElementById('containerDiv'); // <div> Var term = null; function prepareTerminal() { term = new Terminal({ cols: 80, rows: 24, convertEol: true, //useStyle: true, //screenKeys: true, cursorBlink: true }); term.on('data', function(data) { dataChannel.send(data); // ユーザの入力をデータチャネルに送る }); term.on('title', function(title) { document.title = title; }); term.open(container); // ターミナルのUIを生成 } 参考
  • 22. xterm.jsで応答を表示 var dataChannel = peer.createDataChannel( 'channelName', dataOpt ); // … 省略 … dataChannel.onmessage = function (evt) { term.write(evt.data); // DataCannelで受け取ったデータをターミナルに表示 }; 参考
  • 23. どうしてWebRTC DataChannelを使うの? • sshで良いんじゃない? … ブラウザで色々やりたい • WebSocketで良いんじゃない? – Node.js アプリが「外側」にあるときはOK – では、Node.jsアプリもNATの「内側」にある時は?? Node.jsのアプリ WebSocket「サーバー」 Web ブラウザ NAT Node.js アプリ Web ブラウザ NAT NAT
  • 24. どうしてWebRTC DataChannelを使うの? • WebRTC DataChannel なら NAT越えの仕組みがある – STUNサーバー – UDP ホールパンチング • WiFiにプライバシーセパレーターがあっても通信可能 Node.js アプリ Web ブラウザ STUN サーバー 参考: • WebRTCハンズオン 概要編 - P2P通信行うまで(2-1):NAT越え https://goo.gl/FVYOkA • WebRTCの裏側にあるNATの話 - 答えの前にUDPホールパンチング https://goo.gl/P64kGX NAT NAT
  • 25. どうしてWebRTC DataChannelを使うの? • WebRTC DataChannel なら Firewall/Proxy越えの仕組みもある – TURN, TURN over TCP • …が、いまのところNode.js アプリ側のFirewall越えが成功して ません Node.js アプリ Web ブラウザ TURN サーバー 参考: • WebRTCハンズオン 概要編 - P2P通信行うまで(3):Firewall越え https://goo.gl/MJWxR9 Fire- wall Proxy Fire- wall Proxy
  • 26. あれ? WebSocketでもできるのでは? • WebSocketサーバーを外に立てればできる Node.js + WebSocket クライアント Web ブラウザ WebSocket サーバー Fire- wall Proxy Fire- wall Proxy WebRTC DataChannel との違い • DataChannelの場合、ネットワーク環境が許せば、P2Pで繋がる → レイテンシーが小さくなる • DataChannelの場合、End-to-End で暗号化される ⇔ WebSocketの場合、サーバで暗号解除される。悪意があれば、見たり改変したりできる
  • 28. インストール方法 • Mac OS X 10.10.x 、 Xcode 7.x のケース – git clone https://github.com/vmolsa/webrtc-native – cd webrtc-native – export BUILD_WEBRTC=true – npm install • 注意 – npm install で非常に時間がかかる(数時間?) • webrtcのソース取得、ビルドを実施するため • proxyがある場合は、 ~/.boto ファイルに proxy設定が必要 • Ubuntu 16 でも同様の手順
  • 29. インストール方法(2) • Mac OS X 10.11.x 、 Xcode 8.x のケース – git clone https://github.com/vmolsa/webrtc-native – cd webrtc-native – export BUILD_WEBRTC=true – npm install • → libwebrtc のビルドに失敗 • 原因 – QTKit (QuickTime Kit) が見つからない、というエラー – Xcode 8 から QuickTime廃止、AVFoundationを利用 – Webrtc-native は Chromium 50 ベースでQTKitに依存 • Chromium 51〜 QTKit不要になっているが… • 対策 – 最新Chromiumのソースを取得するようにビルドスクリプトを修正 • → 挫折 – Xcode 7.x でビルドした build/Release/webrtc.node をコピーしてくる • → なんとか動いた
  • 30. 使い方 読み込み // webrtc-native をインストールしたディレクトリで var WebRTC = require('./'); var RTCPeerConnection = WebRTC.RTCPeerConnection; var RTCIceCandidate= WebRTC.RTCIceCandidate; var RTCSessionDescription = WebRTC.RTCSessionDescription; var RTCDataChannel = WebRTC.RTCDataChannel; // あとの使い方は、wrtcと同じ
  • 31. まとめ • WebRTC は Webブラウザだけじゃない • DataChannel なら Node.js からも使える • NATの内側のNode.jsアプリにも接続できる • Node.js で P2P アプリが作れる – センサーデータの送受信? – コンテンツ配信、ファイル共有? – きっと、もっと楽しいことができるはず!