teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

文章や質問の明確化

2020/03/20 05:08

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- WebRTCのテキストデータ送信によるフラグ設定方法
1
+ WebRTCのテキストデータ送信を変数として使う方法
body CHANGED
@@ -1,54 +1,52 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- WebRTCを用いた動画ストリーミング兼コントロールのアプリケーションを作成しております。
3
+ WebRTCを用いた動画ストリーミング兼コントロールのwebアプリケーションを作成しております。
4
- アプリケーションの開発に当たってはSkywayのJavascriptSDKチュートリアルのコードを使用させていただき、1:1の通話を想定しています。
4
+ アプリケーションの開発に当たってはSkywayのJavascriptSDKチュートリアルのコードを使用させていただき、ルーム通話を想定しています。
5
- ここで、Peerで表示させたボタンをクリックしたときのイベントとして、もう一つのPeer内部で動いているC++のプログラムでイベントを動作させステータス変数を書き換えたいというのが目標です。
6
5
 
7
6
  ### 発生している問題・エラーメッセージ
8
7
 
9
- WebRTCにはデータを送信可能なDataChannelがあり、Skywayにテキストチャットを行うためのSDKが用意されています。今回の例ではStartボタンクリックでテキストデータの1を、Stopボタンクリックでテキストデータの0を送信したいと考えています。これによりテキストを受け取ったもう一つのPeerは、1か0の受けとったデータによってc++プログラムのイベントでステータス変数書き換えます。
10
- ここで、0や1というデータを送信しPeerブラウザ上で受けとたというフラグをどのように認識るかで困っておりま具体的な方法や参考になージござましたらご教授いただきたく存じます。
8
+ Skywayにて実装されているテキストチャットを行うためのSDKによりテキストデータの10を送信しテキストを受け取ったもう一つのPeerは、1か0の受けとったデータによってifやswitch文等でc++プログラムを動作させるということを行いたいです。
9
+ ここで、javascript後ろの方にあるonClicksend関数により,0や1というデータを送信しのの向にif文trueが判定されずに困ております。peer間経由する際に、メッセージがどういった変数格納れてい把握がておりませんlocalTextはテキストボックスmessagesはhtmlへ出力すメッセージ及びpeerIDだと考えられるので送信アルゴリズムであるか全体像をつかめておりません。これについて、ご教授いただければと存じます。
10
+ また、skywayのテキストデータ送信にはUDPプロトコルが使用されているとの記述があったのですが、チュートリアルコードにはWebsocketという記述がみられます。websocketはTCPで動作するものかと思いますがこれはどういった理由なのかも理解が不十分であるため困っております。どうぞよろしくお願いいたします。
11
11
 
12
12
  ### 該当のソースコード
13
13
 
14
- index.html
15
-
16
14
  <!DOCTYPE html>
17
15
  <html lang="en">
18
16
  <head>
19
17
  <meta charset="UTF-8">
20
18
  <meta name="viewport" content="width=device-width, initial-scale=1">
21
- <title>RTMoviesender</title>
19
+ <title>P2PCommunication!!</title>
22
20
  <link rel="stylesheet" href="../_shared/style.css">
23
21
  </head>
24
-
25
22
  <body>
26
23
  <div class="container">
27
- <h1 class="heading">Check!!</h1>
24
+ <h1 class="heading">Offer</h1>
28
25
  <p class="note">
29
- Enter remote peer ID to call.
26
+ Change Room mode (before join in a room):
27
+ <a href="#">mesh</a> / <a href="#sfu">sfu</a>
30
28
  </p>
31
-
32
- <div class="p2p-media">
29
+ <div class="room">
33
- <div class="remote-stream">
34
- <video id="js-remote-stream"></video>
35
- </div>
30
+ <div>
36
- <div class="local-stream">
37
31
  <video id="js-local-stream"></video>
38
- <p>Your ID: <span id="js-local-id"></span></p>
39
- <input type="text" value="RTMonitor" id="js-remote-id">
40
- <button id="js-call-trigger">Connect</button>
41
- <button id="js-close-trigger">Connect</button>
42
32
  <br>
33
+ <p>Room mode : <span id="js-room-mode"></span></p>
34
+ <p>Your ID: <span id="js-local-Id"></span></p>
35
+ <input type="text" placeholder="Room Name" id="js-room-id">
36
+ <button id="js-join-trigger">Join</button>
43
- <button id="js-start-trigger">Start</button>
37
+ <button id="js-leave-trigger">Leave</button>
44
- <button id="js-stop-trigger">Stop</button>
45
38
  </div>
39
+
46
- </div>
40
+ <div class="remote-streams" id="js-remote-streams"></div>
41
+
47
- <div>
42
+ <div>
48
43
  <pre class="messages" id="js-messages"></pre>
49
44
  <input type="text" id="js-local-text">
50
45
  <button id="js-send-trigger">Send</button>
46
+ <button id="js-start-trigger">Start</button>
47
+ <button id="js-stop-trigger">Stop</button>
51
48
  </div>
49
+ </div>
52
50
  <p class="meta" id="js-meta"></p>
53
51
  </div>
54
52
  <script src="//cdn.webrtc.ecl.ntt.com/skyway-latest.js"></script>
@@ -57,25 +55,36 @@
57
55
  </body>
58
56
  </html>
59
57
 
60
- script.js
58
+ const Peer = window.Peer;
61
59
 
62
60
  (async function main() {
63
61
  const localVideo = document.getElementById('js-local-stream');
64
- const localId = document.getElementById('js-local-id');
65
- const callTrigger = document.getElementById('js-call-trigger');
62
+ const joinTrigger = document.getElementById('js-join-trigger');
66
- const closeTrigger = document.getElementById('js-close-trigger');
63
+ const leaveTrigger = document.getElementById('js-leave-trigger');
67
- const remoteVideo = document.getElementById('js-remote-stream');
64
+ const remoteVideos = document.getElementById('js-remote-streams');
68
- const remoteId = document.getElementById('js-remote-id');
65
+ const roomId = document.getElementById('js-room-id');
66
+ const roomMode = document.getElementById('js-room-mode');
67
+ const localText = document.getElementById('js-local-text');
68
+ const localId= document.getElementById('js-local-Id');
69
+ const sendTrigger = document.getElementById('js-send-trigger');
70
+ const messages = document.getElementById('js-messages');
69
71
  const meta = document.getElementById('js-meta');
70
72
  const sdkSrc = document.querySelector('script[src*=skyway]');
71
- const startTrigger = document.getElementById('js-start-trigger');
73
+ const status = document.getElementById('js-start-trigger');
72
- const stopTrigger = document.getElementById('js-stop-trigger');
73
74
 
74
75
  meta.innerText = `
75
76
  UA: ${navigator.userAgent}
76
77
  SDK: ${sdkSrc ? sdkSrc.src : 'unknown'}
77
78
  `.trim();
78
79
 
80
+ const getRoomModeByHash = () => (location.hash === '#sfu' ? 'sfu' : 'mesh');
81
+
82
+ roomMode.textContent = getRoomModeByHash();
83
+ window.addEventListener(
84
+ 'hashchange',
85
+ () => (roomMode.textContent = getRoomModeByHash())
86
+ );
87
+
79
88
  const localStream = await navigator.mediaDevices
80
89
  .getUserMedia({
81
90
  audio: true,
@@ -89,63 +98,107 @@
89
98
  localVideo.playsInline = true;
90
99
  await localVideo.play().catch(console.error);
91
100
 
101
+ // eslint-disable-next-line require-atomic-updates
92
- const peer = new Peer('RTC', {
102
+ const peer = (window.peer = new Peer({
93
- key: 'XXX',
103
+ key:'e316eaa7-4c1c-468c-b23a-9ce51b074ab7' ,
94
- debug: 3,
104
+ debug: 3,
95
- });
105
+ }));
96
106
 
97
-
98
- // Register caller handler
107
+ // Register join handler
99
- callTrigger.addEventListener('click', () => {
108
+ joinTrigger.addEventListener('click', () => {
100
109
  // Note that you need to ensure the peer has connected to signaling server
101
110
  // before using methods of peer instance.
102
111
  if (!peer.open) {
103
112
  return;
104
113
  }
105
114
 
106
- const mediaConnection = peer.call(remoteId.value, localStream);
115
+ const room = peer.joinRoom(roomId.value, {
116
+ mode: getRoomModeByHash(),
117
+ stream: localStream,
118
+ });
107
119
 
108
- mediaConnection.on('stream', async stream => {
120
+ room.once('open', () => {
109
- // Render remote stream for caller
110
- remoteVideo.srcObject = stream;
111
- remoteVideo.playsInline = true;
112
- await remoteVideo.play().catch(console.error);
121
+ messages.textContent += '=== You joined ===\n';
113
122
  });
123
+ room.on('peerJoin', peerId => {
124
+ messages.textContent += `=== ${peerId} joined ===\n`;
125
+ });
114
126
 
127
+ // Render remote stream for new peer join in the room
128
+ room.on('stream', async stream => {
129
+ const newVideo = document.createElement('video');
130
+ newVideo.srcObject = stream;
131
+ newVideo.playsInline = true;
132
+ // mark peerId to find it later at peerLeave event
133
+ newVideo.setAttribute('data-peer-id', stream.peerId);
134
+ remoteVideos.append(newVideo);
135
+ await newVideo.play().catch(console.error);
136
+ });
137
+
138
+ room.on('data', ({ data, src }) => {
139
+ // Show a message sent to the room and who sent
140
+ messages.textContent += `${src}: ${data}\n`;
141
+ });
142
+
143
+ // for closing room members
115
- mediaConnection.once('close', () => {
144
+ room.on('peerLeave', peerId => {
145
+ const remoteVideo = remoteVideos.querySelector(
146
+ `[data-peer-id=${peerId}]`
147
+ );
116
148
  remoteVideo.srcObject.getTracks().forEach(track => track.stop());
117
149
  remoteVideo.srcObject = null;
150
+ remoteVideo.remove();
151
+
152
+ messages.textContent += `=== ${peerId} left ===\n`;
118
153
  });
119
154
 
155
+ // for closing myself
156
+ room.once('close', () => {
120
- closeTrigger.addEventListener('click', () => mediaConnection.close(true));
157
+ sendTrigger.removeEventListener('click', onClickSend);
158
+ messages.textContent += '== You left ===\n';
159
+ Array.from(remoteVideos.children).forEach(remoteVideo => {
160
+ remoteVideo.srcObject.getTracks().forEach(track => track.stop());
161
+ remoteVideo.srcObject = null;
162
+ remoteVideo.remove();
121
- });
163
+ });
164
+ });
122
165
 
166
+ sendTrigger.addEventListener('click', onClickSend);
167
+ sendTrigger.addEventListener('click', onClickStart);
168
+ sendTrigger.addEventListener('click', onClickStop);
123
- peer.once('open', id => (localId.textContent = id));
169
+ leaveTrigger.addEventListener('click', () => room.close(), { once: true });
124
170
 
171
+ function onClickSend() {
125
- // Register callee handler
172
+ // Send message to all of the peers in the room via websocket
126
- peer.on('call', mediaConnection => {
127
- mediaConnection.answer(localStream);
173
+ room.send(localText.value);
128
174
 
129
- mediaConnection.on('stream', async stream => {
175
+ messages.textContent += `${peer.id}: ${localText.value}\n`;
176
+ localText.value = '';
177
+ if(localText === 1) {
178
+ window.alert('走行を開始します。大丈夫ですか?');
179
+ } else {
180
+ window.alert('trueが読まれていません');
181
+ }
182
+ }
183
+
184
+ /*function onClickStart() {
130
- // Render remote stream for callee
185
+ // Send message to all of the peers in the room via websocket
131
- remoteVideo.srcObject = stream;
186
+ room.send(localText.value);
132
- remoteVideo.playsInline = true;
133
- await remoteVideo.play().catch(console.error);
134
- });
135
187
 
136
- mediaConnection.once('close', () => {
188
+ startx.textContent += `${peer.id}: ${1}\n`;
137
- remoteVideo.srcObject.getTracks().forEach(track => track.stop());
138
- remoteVideo.srcObject = null;
189
+ startx.value = ' ';
139
- });
190
+ } */
140
-
141
- closeTrigger.addEventListener('click', () => mediaConnection.close(true));
191
+
142
192
  });
143
193
 
144
194
  peer.on('error', console.error);
145
195
  })();
146
196
 
147
197
 
198
+
148
199
  ### 試したこと
149
200
 
150
201
 
202
+
203
+
151
204
  ### 補足情報(FW/ツールのバージョンなど)