SlideShare ist ein Scribd-Unternehmen logo
1 von 27
Chromebook 「だけ」で
WebRTCを動かそう
2015.03.11
インフォコム株式会社
がねこまさし
@massie_g
Chromebook で WebRTC
• Chrome動く
• カメラ、マイクついている
• getUserMeida()できる
• PeerConnectionも使える
• USBカメラも認識する
WebRTC端末として使える
※WebRTC Conference Japan のLTでも言及
– 実際に遠隔作業支援にWebRTCを使ってみた
– http://www.slideshare.net/hondahiroyuki/web-rtc-con
Chromebook 「だけ」で WebRTC
• どんなとき?
– ネットワークにつながらなくても、デモしたい!
問題1: Webサーバー
• 問題1
– getUserMedia()は、file:// では使えない
→ http:// にはWebサーバーが必要
Webサーバー
マッチョな対策
• Chromebookを開発者モードに変更
– 時間かかります
– 初期化されます
– セキュリティ警告多発します
• crouton を導入
– Crouton Integration Chrome Extensionを使うと、
Chrome OSのシェルと同居できるらしい
– http://www.softantenna.com/wp/hard/linux-
in-chrome-os/
• Linuxをインストール
※私は怖くなって、途中で引き返しました
別の方法を探す
• Chrome App というのがある
• Chrome.sockets.tcpServer というのが使える
– https://developer.chrome.com/apps/sockets_tcpS
erver
• なら、Webサーバーも作れるはず!
Webサーバー作りました
• Simple Web Server (Chrome ウェブストアで)
– 非常に簡易的なWebサーバー
– http://goo.gl/4sxGy9
静的なファイルを
数個だけホストできる
http://localhost:3000/
/page1.html ~ /page4.html
/script1.js, /script2.js
/sytle1.css, /style2.css
※こちらを参考にさせていだだきました。どうもありがとうございます!
Chrome Appsで簡易Webサーバ構築 http://blog.asial.co.jp/1267
Appインストールには
ネットワーク接続必要
です。あしからず
DEMO
• SWS 起動
• http://localhost:3000/ に Chromeでアクセス
• SWSの page1.html に、下記内容をコピー
– https://gist.github.com/mganeko/ee1f644b08fdca
6970ca
• http://localhost:3000/page1.html に Chrome
でアクセス
– Start video
ちなみに、もっと良さげなのもあります
• Web Server for Chrome
– http://goo.gl/LI63mj
問題2:シグナリング
• Peer-to-Peer通信の前に、情報交換が必要
– SDP, ICE candidate
• 手動(コピペ)で交換、という手もあるけど…
– http://html5experts.jp/mganeko/5181/
• 今回はWebSocketでやりたい
シグナリング
サーバー
Webサーバー
WebScoketサーバー作りました
• Simple Message Server (Chrome ウェブストアで)
– 非常に簡易的なWebSocketサーバー
– http://goo.gl/ekvQDy
簡易メッセージサーバー、
WebSocketサーバー
・5クライアントまで同時接続
・サーバーメッセージを送信す
ると、他のクライアントに配信
・テキストデータのみ対応
Appインストールには
ネットワーク接続必要
です。あしからず
参考にさせていただきました
どうもありがとうございます!
• Google のサンプル
– Chrome Commando TCP server
– https://github.com/GoogleChrome/chrome-app-
samples/tree/master/samples/tcpserver
• WebSocket サーバの実装とプロトコル解説 (by Jxckさん)
– http://jxck.hatenablog.com/entry/20120725/1343174392
– https://gist.github.com/Jxck/3171239
• RFC 6455 - The WebSocket Protocol (日本語訳)
– http://www.hcn.zaq.ne.jp/___/WEB/RFC6455-ja.html
Simple Message Serverの動き
• 3001/tcpで待ち受け
• Upgradeに対応
• メッセージを送ると、他のクライアントに転送
• 制約
– 対応するメッセージはテキストのみ
– メッセージ長は、16bitまで。64bitには未対応
– フラグメントの分割には未対応
クライアント側のコード抜粋
// WebSocketサーバーに接続
var url = 'ws://localhost:3001/';
var ws = new WebSocket(url);
// SDP送信
var msg = JSON.stringify(sessionDescription);
ws.send(msg);
// ICE Candidate送信
var candidate = {type: "candidate",
sdpMLineIndex: evt.candidate.sdpMLineIndex,
sdpMid: evt.candidate.sdpMid,
candidate: evt.candidate.candidate
};
var msg = JSON.stringify(candidate);
ws.send(msg);
クライアント側のコード抜粋2
ws.onmessage = onMessage;
// メッセージハンドラ
function onMessage(raw_evt) {
var msg = raw_evt.data;
var evt = JSON.parse(msg);
if (evt.type === 'offer') {
// SDP offerを受け取った場合
} else if (evt.type === 'answer' && peerStarted) {
// SDP answerを受け取った場合
} else if (evt.type === 'candidate' && peerStarted) {
// ICE candidate を受け取った場合
}
}
DEMO
• SWS 起動, SMS起動
• SWSのpage2.htmlに、次の内容をコピー
– https://gist.github.com/mganeko/4d0f84c383722
d1fb963
• http://localhost:3000/page2.html
– Chromeの2つのタブで開く
• 通信してみる
– Start video, Start video, Connect
問題3:NAT越え
• NAT越えには、STUN/TURNサーバーが必要
• Chrome.sockets.udp がある
• なら、これも作れるはず!
問題3:NAT越え
• NAT越えには、STUN/TURNサーバーが必要
• Chrome.sockets.udp がある
• なら、これも作れるはず!
→作りません!
今回はChromebook「だけ」なので、NAT越えは発生し
ない
※誰か挑戦してみませんか?
まとめ
• Chromebook「だけ」でWebRTC通信してみた
– Chrome Appを作成
– 簡易Webサーバー、簡易WebSocketサーバー
• もちろん、他のプラットフォームでも利用可能
– Windows, Mac OS X
• 一般的なサーバーアプリ、サーバ言語不要
– No IIS, No Apache, No Nginx, No python, No node.js
• WebRTC体験、ハンズオンにも最適
→ 社内勉強会などで、ぜひ使ってください!
おまけ
ちょっとサーバー側の
ソースを見てみましょう
Web サーバー
ソケット作成、待ち受け
// server
chrome.sockets.tcpServer.create({}, function(createInfo) {
// サーバ用のソケット
serverSocketId = createInfo.socketId;
// 3000番ポートをlisten
chrome.sockets.tcpServer.listen(serverSocketId, '0.0.0.0', 3000, function(resultCode){
if (resultCode < 0) {
console.log("Error listening:" + chrome.runtime.lastError.message);
}
});
});
// socket
chrome.sockets.tcpServer.onAccept.addListener(function(info) {
if (info.socketId === serverSocketId) {
chrome.sockets.tcp.setPaused(info.clientSocketId, false);
}
});
GET Requestの処理
chrome.sockets.tcp.onReceive.addListener(function(info) {
var requestText = ab2str(info.data);
var getpath = splitGetPath(requestText); // GET のパスを取得
var type = getMIMEType(getpath); // パスの拡張子から、MIMEタイプを推定
// --- make response ---
var socketId = info.socketId;
var message = getContentByPath(getpath); // 内容はchrome.storage.localに保存
var utf8message = unescape(encodeURIComponent(message)); // utf8に変換
var responseText = [
' HTTP/1.1 200 OK',
'Content-Type: ' + type,
'Content-Length: ' + utf8message.length,
'',
utf8message
].join("n");
// --- send response ---
chrome.sockets.tcp.send(socketId, str2ab(responseText), function(info) {
if (info.resultCode < 0) { console.log("Error:" + chrome.runtime.lastError.message); }
chrome.sockets.tcp.disconnect(socketId); // 成功しても、すぐに切断する
chrome.sockets.tcp.close(socketId);
});
});
WebSokcet サーバー
コードの一部:データ長16bitまで対応
/**
* Payload Length
* xaaa aaaa second byte
* 0111 1111 mask with 0x7f
* ---------
* 0000 0100 4(4)
* 0111 1110 126(next UInt16)
* 0111 1111 127(next UInt64)
*/
var payloadLength = (secondByte & 0x7f); // 0x00~0x7c → その7bit値が長さ
if (payloadLength === 0x7e) { // 0x7e → 続く16bit値が長さ
console.log('next 16bit is length');
payloadLength = dataView.getUint16(dataOffset);
dataOffset += 2;
}
if (payloadLength === 0x7f) { // 0x7f → 続く64bit値が長さ
console.error('next 64bit is length but not supported');
}
コードの一部:mask処理の可変長対応
var maskingArray = new Uint8Array( [
dataView.getUint8(dataOffset),
dataView.getUint8(dataOffset+1),
dataView.getUint8(dataOffset+2),
dataView.getUint8(dataOffset+3)
]);
dataOffset += 4;
for(payloadIndex = 0, maskOffset=0; payloadIndex < payloadLength;
payloadIndex++, maskOffset = (maskOffset + 1) % 4) { // maskを4バイト毎に繰返す
var applicationByte = dataView.getUint8(dataOffset + payloadIndex);
/**
* unmask the data
* application data XOR mask
*/
var unmaskedByte = applicationByte ^ maskingArray[maskOffset];
applicationText += String.fromCharCode( unmaskedByte );
}
END
ありがとうございました!

Weitere ähnliche Inhalte

Was ist angesagt?

Seasar2で作った俺たちのサービスの今
Seasar2で作った俺たちのサービスの今Seasar2で作った俺たちのサービスの今
Seasar2で作った俺たちのサービスの今
Koichi Sakata
 

Was ist angesagt? (20)

Seasar2で作った俺たちのサービスの今
Seasar2で作った俺たちのサービスの今Seasar2で作った俺たちのサービスの今
Seasar2で作った俺たちのサービスの今
 
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
 
これからのネイティブアプリにおけるOpenID Connectの活用
これからのネイティブアプリにおけるOpenID Connectの活用これからのネイティブアプリにおけるOpenID Connectの活用
これからのネイティブアプリにおけるOpenID Connectの活用
 
Allocators@C++11
Allocators@C++11Allocators@C++11
Allocators@C++11
 
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
 
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語るOracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
ただしくHTTPSを設定しよう!
ただしくHTTPSを設定しよう!ただしくHTTPSを設定しよう!
ただしくHTTPSを設定しよう!
 
DynamoDBによるソーシャルゲーム実装 How To
DynamoDBによるソーシャルゲーム実装 How ToDynamoDBによるソーシャルゲーム実装 How To
DynamoDBによるソーシャルゲーム実装 How To
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
 
ネットワークコンフィグ分析ツール Batfish との付き合い方
ネットワークコンフィグ分析ツール Batfish との付き合い方ネットワークコンフィグ分析ツール Batfish との付き合い方
ネットワークコンフィグ分析ツール Batfish との付き合い方
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
 
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
 
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
 
Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解
 
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
 

Ähnlich wie Chromebook 「だけ」で WebRTCを動かそう

サーバーの初歩的な話セミナー@大阪20120901
サーバーの初歩的な話セミナー@大阪20120901サーバーの初歩的な話セミナー@大阪20120901
サーバーの初歩的な話セミナー@大阪20120901
Masayuki Abe
 
Windows Azure for PHP Developers
Windows Azure for PHP DevelopersWindows Azure for PHP Developers
Windows Azure for PHP Developers
fumios
 

Ähnlich wie Chromebook 「だけ」で WebRTCを動かそう (20)

これから利用拡大?WebSocket
これから利用拡大?WebSocketこれから利用拡大?WebSocket
これから利用拡大?WebSocket
 
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...
 
Magic Leap で WebRTC 触ってみた
Magic Leap で WebRTC 触ってみたMagic Leap で WebRTC 触ってみた
Magic Leap で WebRTC 触ってみた
 
Mvc conf session_5_isami
Mvc conf session_5_isamiMvc conf session_5_isami
Mvc conf session_5_isami
 
10th jan 2013_miyazaki
10th jan 2013_miyazaki10th jan 2013_miyazaki
10th jan 2013_miyazaki
 
Webrtc bootcamp handson
Webrtc bootcamp handsonWebrtc bootcamp handson
Webrtc bootcamp handson
 
クラウドサービスを使って作る動画サイト?
クラウドサービスを使って作る動画サイト?クラウドサービスを使って作る動画サイト?
クラウドサービスを使って作る動画サイト?
 
App012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をApp012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_を
 
App012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をApp012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_を
 
[Japan Tech summit 2017] DEP 005
[Japan Tech summit 2017] DEP 005[Japan Tech summit 2017] DEP 005
[Japan Tech summit 2017] DEP 005
 
マルチクラウド環境でモビンギはどのようにコンテナを動かしているか
マルチクラウド環境でモビンギはどのようにコンテナを動かしているかマルチクラウド環境でモビンギはどのようにコンテナを動かしているか
マルチクラウド環境でモビンギはどのようにコンテナを動かしているか
 
JavaScript And Keywords
JavaScript And KeywordsJavaScript And Keywords
JavaScript And Keywords
 
サーバーの初歩的な話セミナー@大阪20120901
サーバーの初歩的な話セミナー@大阪20120901サーバーの初歩的な話セミナー@大阪20120901
サーバーの初歩的な話セミナー@大阪20120901
 
WebSocket + Node.jsでつくるチャットアプリ
WebSocket + Node.jsでつくるチャットアプリWebSocket + Node.jsでつくるチャットアプリ
WebSocket + Node.jsでつくるチャットアプリ
 
websocket-survery
websocket-surverywebsocket-survery
websocket-survery
 
ブラウザからWeb OSへ〜Web - TV連携事例からその可能性を探る〜
ブラウザからWeb OSへ〜Web - TV連携事例からその可能性を探る〜ブラウザからWeb OSへ〜Web - TV連携事例からその可能性を探る〜
ブラウザからWeb OSへ〜Web - TV連携事例からその可能性を探る〜
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
PlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocketPlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocket
 
Windows Azure for PHP Developers
Windows Azure for PHP DevelopersWindows Azure for PHP Developers
Windows Azure for PHP Developers
 
Let's begin WebRTC
Let's begin WebRTCLet's begin WebRTC
Let's begin WebRTC
 

Mehr von mganeko

WebRTC multistream
WebRTC multistreamWebRTC multistream
WebRTC multistream
mganeko
 

Mehr von 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
 
Node.js with WebRTC DataChannel
Node.js with WebRTC DataChannelNode.js with WebRTC DataChannel
Node.js with WebRTC DataChannel
 
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 multitrack / multistream
WebRTC multitrack / multistreamWebRTC multitrack / multistream
WebRTC multitrack / multistream
 
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
 

Kürzlich hochgeladen

Kürzlich hochgeladen (10)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介: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
 
新人研修 後半 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の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介: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...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介: 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
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

Chromebook 「だけ」で WebRTCを動かそう

  • 2. Chromebook で WebRTC • Chrome動く • カメラ、マイクついている • getUserMeida()できる • PeerConnectionも使える • USBカメラも認識する WebRTC端末として使える ※WebRTC Conference Japan のLTでも言及 – 実際に遠隔作業支援にWebRTCを使ってみた – http://www.slideshare.net/hondahiroyuki/web-rtc-con
  • 3. Chromebook 「だけ」で WebRTC • どんなとき? – ネットワークにつながらなくても、デモしたい!
  • 4. 問題1: Webサーバー • 問題1 – getUserMedia()は、file:// では使えない → http:// にはWebサーバーが必要 Webサーバー
  • 5. マッチョな対策 • Chromebookを開発者モードに変更 – 時間かかります – 初期化されます – セキュリティ警告多発します • crouton を導入 – Crouton Integration Chrome Extensionを使うと、 Chrome OSのシェルと同居できるらしい – http://www.softantenna.com/wp/hard/linux- in-chrome-os/ • Linuxをインストール ※私は怖くなって、途中で引き返しました
  • 6. 別の方法を探す • Chrome App というのがある • Chrome.sockets.tcpServer というのが使える – https://developer.chrome.com/apps/sockets_tcpS erver • なら、Webサーバーも作れるはず!
  • 7. Webサーバー作りました • Simple Web Server (Chrome ウェブストアで) – 非常に簡易的なWebサーバー – http://goo.gl/4sxGy9 静的なファイルを 数個だけホストできる http://localhost:3000/ /page1.html ~ /page4.html /script1.js, /script2.js /sytle1.css, /style2.css ※こちらを参考にさせていだだきました。どうもありがとうございます! Chrome Appsで簡易Webサーバ構築 http://blog.asial.co.jp/1267 Appインストールには ネットワーク接続必要 です。あしからず
  • 8. DEMO • SWS 起動 • http://localhost:3000/ に Chromeでアクセス • SWSの page1.html に、下記内容をコピー – https://gist.github.com/mganeko/ee1f644b08fdca 6970ca • http://localhost:3000/page1.html に Chrome でアクセス – Start video
  • 10. 問題2:シグナリング • Peer-to-Peer通信の前に、情報交換が必要 – SDP, ICE candidate • 手動(コピペ)で交換、という手もあるけど… – http://html5experts.jp/mganeko/5181/ • 今回はWebSocketでやりたい シグナリング サーバー Webサーバー
  • 11. WebScoketサーバー作りました • Simple Message Server (Chrome ウェブストアで) – 非常に簡易的なWebSocketサーバー – http://goo.gl/ekvQDy 簡易メッセージサーバー、 WebSocketサーバー ・5クライアントまで同時接続 ・サーバーメッセージを送信す ると、他のクライアントに配信 ・テキストデータのみ対応 Appインストールには ネットワーク接続必要 です。あしからず
  • 12. 参考にさせていただきました どうもありがとうございます! • Google のサンプル – Chrome Commando TCP server – https://github.com/GoogleChrome/chrome-app- samples/tree/master/samples/tcpserver • WebSocket サーバの実装とプロトコル解説 (by Jxckさん) – http://jxck.hatenablog.com/entry/20120725/1343174392 – https://gist.github.com/Jxck/3171239 • RFC 6455 - The WebSocket Protocol (日本語訳) – http://www.hcn.zaq.ne.jp/___/WEB/RFC6455-ja.html
  • 13. Simple Message Serverの動き • 3001/tcpで待ち受け • Upgradeに対応 • メッセージを送ると、他のクライアントに転送 • 制約 – 対応するメッセージはテキストのみ – メッセージ長は、16bitまで。64bitには未対応 – フラグメントの分割には未対応
  • 14. クライアント側のコード抜粋 // WebSocketサーバーに接続 var url = 'ws://localhost:3001/'; var ws = new WebSocket(url); // SDP送信 var msg = JSON.stringify(sessionDescription); ws.send(msg); // ICE Candidate送信 var candidate = {type: "candidate", sdpMLineIndex: evt.candidate.sdpMLineIndex, sdpMid: evt.candidate.sdpMid, candidate: evt.candidate.candidate }; var msg = JSON.stringify(candidate); ws.send(msg);
  • 15. クライアント側のコード抜粋2 ws.onmessage = onMessage; // メッセージハンドラ function onMessage(raw_evt) { var msg = raw_evt.data; var evt = JSON.parse(msg); if (evt.type === 'offer') { // SDP offerを受け取った場合 } else if (evt.type === 'answer' && peerStarted) { // SDP answerを受け取った場合 } else if (evt.type === 'candidate' && peerStarted) { // ICE candidate を受け取った場合 } }
  • 16. DEMO • SWS 起動, SMS起動 • SWSのpage2.htmlに、次の内容をコピー – https://gist.github.com/mganeko/4d0f84c383722 d1fb963 • http://localhost:3000/page2.html – Chromeの2つのタブで開く • 通信してみる – Start video, Start video, Connect
  • 18. 問題3:NAT越え • NAT越えには、STUN/TURNサーバーが必要 • Chrome.sockets.udp がある • なら、これも作れるはず! →作りません! 今回はChromebook「だけ」なので、NAT越えは発生し ない ※誰か挑戦してみませんか?
  • 19. まとめ • Chromebook「だけ」でWebRTC通信してみた – Chrome Appを作成 – 簡易Webサーバー、簡易WebSocketサーバー • もちろん、他のプラットフォームでも利用可能 – Windows, Mac OS X • 一般的なサーバーアプリ、サーバ言語不要 – No IIS, No Apache, No Nginx, No python, No node.js • WebRTC体験、ハンズオンにも最適 → 社内勉強会などで、ぜひ使ってください!
  • 22. ソケット作成、待ち受け // server chrome.sockets.tcpServer.create({}, function(createInfo) { // サーバ用のソケット serverSocketId = createInfo.socketId; // 3000番ポートをlisten chrome.sockets.tcpServer.listen(serverSocketId, '0.0.0.0', 3000, function(resultCode){ if (resultCode < 0) { console.log("Error listening:" + chrome.runtime.lastError.message); } }); }); // socket chrome.sockets.tcpServer.onAccept.addListener(function(info) { if (info.socketId === serverSocketId) { chrome.sockets.tcp.setPaused(info.clientSocketId, false); } });
  • 23. GET Requestの処理 chrome.sockets.tcp.onReceive.addListener(function(info) { var requestText = ab2str(info.data); var getpath = splitGetPath(requestText); // GET のパスを取得 var type = getMIMEType(getpath); // パスの拡張子から、MIMEタイプを推定 // --- make response --- var socketId = info.socketId; var message = getContentByPath(getpath); // 内容はchrome.storage.localに保存 var utf8message = unescape(encodeURIComponent(message)); // utf8に変換 var responseText = [ ' HTTP/1.1 200 OK', 'Content-Type: ' + type, 'Content-Length: ' + utf8message.length, '', utf8message ].join("n"); // --- send response --- chrome.sockets.tcp.send(socketId, str2ab(responseText), function(info) { if (info.resultCode < 0) { console.log("Error:" + chrome.runtime.lastError.message); } chrome.sockets.tcp.disconnect(socketId); // 成功しても、すぐに切断する chrome.sockets.tcp.close(socketId); }); });
  • 25. コードの一部:データ長16bitまで対応 /** * Payload Length * xaaa aaaa second byte * 0111 1111 mask with 0x7f * --------- * 0000 0100 4(4) * 0111 1110 126(next UInt16) * 0111 1111 127(next UInt64) */ var payloadLength = (secondByte & 0x7f); // 0x00~0x7c → その7bit値が長さ if (payloadLength === 0x7e) { // 0x7e → 続く16bit値が長さ console.log('next 16bit is length'); payloadLength = dataView.getUint16(dataOffset); dataOffset += 2; } if (payloadLength === 0x7f) { // 0x7f → 続く64bit値が長さ console.error('next 64bit is length but not supported'); }
  • 26. コードの一部:mask処理の可変長対応 var maskingArray = new Uint8Array( [ dataView.getUint8(dataOffset), dataView.getUint8(dataOffset+1), dataView.getUint8(dataOffset+2), dataView.getUint8(dataOffset+3) ]); dataOffset += 4; for(payloadIndex = 0, maskOffset=0; payloadIndex < payloadLength; payloadIndex++, maskOffset = (maskOffset + 1) % 4) { // maskを4バイト毎に繰返す var applicationByte = dataView.getUint8(dataOffset + payloadIndex); /** * unmask the data * application data XOR mask */ var unmaskedByte = applicationByte ^ maskingArray[maskOffset]; applicationText += String.fromCharCode( unmaskedByte ); }