| |
|
|
| import argparse |
| import asyncio |
| import json |
| import logging |
|
|
| import aioice |
| import websockets |
|
|
| STUN_SERVER = ("stun.l.google.com", 19302) |
| WEBSOCKET_URI = "ws://127.0.0.1:8765" |
|
|
|
|
| async def offer(options): |
| connection = aioice.Connection( |
| ice_controlling=True, components=options.components, stun_server=STUN_SERVER |
| ) |
| await connection.gather_candidates() |
|
|
| websocket = await websockets.connect(WEBSOCKET_URI) |
|
|
| |
| await websocket.send( |
| json.dumps( |
| { |
| "candidates": [c.to_sdp() for c in connection.local_candidates], |
| "password": connection.local_password, |
| "username": connection.local_username, |
| } |
| ) |
| ) |
|
|
| |
| message = json.loads(await websocket.recv()) |
| print("received answer", message) |
| for c in message["candidates"]: |
| await connection.add_remote_candidate(aioice.Candidate.from_sdp(c)) |
| await connection.add_remote_candidate(None) |
| connection.remote_username = message["username"] |
| connection.remote_password = message["password"] |
|
|
| await websocket.close() |
|
|
| await connection.connect() |
| print("connected") |
|
|
| |
| data = b"hello" |
| component = 1 |
| print("sending %s on component %d" % (repr(data), component)) |
| await connection.sendto(data, component) |
| data, component = await connection.recvfrom() |
| print("received %s on component %d" % (repr(data), component)) |
|
|
| await asyncio.sleep(5) |
| await connection.close() |
|
|
|
|
| async def answer(options): |
| connection = aioice.Connection( |
| ice_controlling=False, components=options.components, stun_server=STUN_SERVER |
| ) |
| await connection.gather_candidates() |
|
|
| websocket = await websockets.connect(WEBSOCKET_URI) |
|
|
| |
| message = json.loads(await websocket.recv()) |
| print("received offer", message) |
| for c in message["candidates"]: |
| await connection.add_remote_candidate(aioice.Candidate.from_sdp(c)) |
| await connection.add_remote_candidate(None) |
| connection.remote_username = message["username"] |
| connection.remote_password = message["password"] |
|
|
| |
| await websocket.send( |
| json.dumps( |
| { |
| "candidates": [c.to_sdp() for c in connection.local_candidates], |
| "password": connection.local_password, |
| "username": connection.local_username, |
| } |
| ) |
| ) |
|
|
| await websocket.close() |
|
|
| await connection.connect() |
| print("connected") |
|
|
| |
| data, component = await connection.recvfrom() |
| print("echoing %s on component %d" % (repr(data), component)) |
| await connection.sendto(data, component) |
|
|
| await asyncio.sleep(5) |
| await connection.close() |
|
|
|
|
| parser = argparse.ArgumentParser(description="ICE tester") |
| parser.add_argument("action", choices=["offer", "answer"]) |
| parser.add_argument("--components", type=int, default=1) |
| options = parser.parse_args() |
|
|
| logging.basicConfig(level=logging.DEBUG) |
|
|
| if options.action == "offer": |
| asyncio.get_event_loop().run_until_complete(offer(options)) |
| else: |
| asyncio.get_event_loop().run_until_complete(answer(options)) |
|
|